2016-06-14 65 views
1

我试图在给它一个值的范围时找到函数的最大值,然后将相同的值放入数组供以后使用。在这种情况下,我有2个参数,一个是x,另一个是theta。我的问题是它没有循环到列表中的下一个x值。有没有办法让它循环并将最大值设置为数组?Python:设置一个函数的最大值并循环找到数组中下一个值的最大值

import sympy.mpmath as mp 
import numpy as np 
import scipy.optimize as sc 
from scipy.optimize import fmin 
import matplotlib.pyplot as plt 


#INPUT 
c = 299792458. #speed of light 
f = 300e6 #frequency 
lmda = c/f #lambda 
C = 0.5772 #Euler's constant 

def E(x): 

     i = [] #creates an empty list 

     for z in x: 

      def kl(x): 
      return (2*np.pi/lmda)*x*lmda/2 

      def U(theta): 
       u = (np.cos(kl(z)*np.cos(theta))-np.cos(kl(z)))/np.sin(theta) 
      return u 

      theta = np.linspace(0.0001,np.pi,1000) 
      E_max = fmin(lambda theta: -U(theta), 0) 

      i+=[E_max] 

return np.array(i) 

def Denom(x): 

y = [] #creates an array 

for z in x: 

    def kl(x): 
     return (2*np.pi/lmda)*x*lmda 

    def Integrand(x): 
     f =np.abs(mp.ci(kl(x)) + 0.5*np.sin(kl(x))*(mp.si(2*kl(x))-2*mp.si(kl(x))) + 0.5*np.cos(kl(x))*(2*mp.ci(kl(x)) - mp.ci(2*kl(x)))) 
     return f 

    PWR_tot = Integrand(z) 
    y+=[PWR_tot] 

return np.array(y) 


x = np.linspace(0.0001,5.,1000) 

Directivity = E(x)/Demon(x) 

plt.plot(x,Directivity) 
plt.ylim(ymin = 0) 
plt.show() 
+1

你的返回语句没有缩进到他们返回的函数中。你也定义了kl(两次!?),Integrand和U循环。将它们定义在循环上方,如果需要,在循环中调用它们。 –

+0

您有许多缩进问题。该代码不会运行。仔细看看它,并修正缩进E()和Denom()必须缩进它们的代码套件。你的退货需要缩进,你的函数里面的函数很奇怪,应该删除并放在主代码块 –

+0

你可以详细说明你的意思是“缩进到函数中”吗? –

回答

1

你的代码结构不正确,这就是为什么你没有得到任何结果。首先,你在for循环中定义函数。这不会产生一个错误,但是你真正想要做的是定义功能早些时候,然后调用它在for循环,因为这样的:

def myfunction(x): 
    return x+ 3 

for y in range(0,4): 
    print(myfunction(y)) 

还要注意,return语句是为了缩进正如joel goldstick所指出的那样,属于功能。否则,该函数将不会返回任何内容。 E(x)函数中的每个语句都是一样的。

0

这是你自找的上述论述:

您的代码:

def E(x): 

i = [] #creates an empty list 

for z in x: 

    def kl(x): 
     return (2*np.pi/lmda)*x*lmda/2 

    def U(theta): 
     u = (np.cos(kl(z)*np.cos(theta))-np.cos(kl(z)))/np.sin(theta) 
     return u 

    theta = np.linspace(0.0001,np.pi,1000) 
    E_max = fmin(lambda theta: -U(theta), 0) 

    i+=[E_max] 

return np.array(i) 

你一些修改代码来解决缺口问题:

def kl(x): 
    return (2*np.pi/lmda)*x*lmda/2 

def U(theta): 
    u = (np.cos(kl(z)*np.cos(theta))-np.cos(kl(z)))/np.sin(theta) 
    return u 


def E(x): 

    i = [] #creates an empty list 

    for z in x: 
     theta = np.linspace(0.0001,np.pi,1000) 
     E_max = fmin(lambda theta: -U(theta), 0) 

     i+=[E_max] # this line looks weird is E_max an list? 
     #perhaps: 
     i.append(E_max) 

    return np.array(i) 

这仅仅是顶部的代码。底部需要类似的处理。还可以在循环中打印一些打印语句,看看他们是否在做你认为他们应该做的事情

相关问题