Python:设置函数的最大值并循环以查找数组中下一个值的最大值

时间:2016-06-14 13:42:18

标签: python arrays function loops

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

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()

2 个答案:

答案 0 :(得分:1)

您的代码结构不正确,这就是您没有得到任何结果的原因。首先,在for循环中定义函数。这不会产生错误,但您实际想要做的是先提前定义函数,然后在for循环中调用它,如下所示:

def myfunction(x):
  return x+ 3

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

另请注意,返回语句必须缩进才能属于函数,正如joel goldstick所指出的那样。否则,该函数将不返回任何内容。对于E(x)函数中的每个语句都是如此。

答案 1 :(得分: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)

这只是代码的顶部。底部需要类似的处理。还要在循环中添加一些打印语句,以查看它们是否正在执行您认为应该执行的操作