【问题标题】:Python: Set the maximum of a function and loop around to find the maximum of the next value in an arrayPython:设置函数的最大值并循环查找数组中下一个值的最大值
【发布时间】:2016-06-14 13:42:18
【问题描述】:

当我给它一个值范围时,我试图找到函数的最大值,然后将相同的值放入一个数组中以供以后使用。在这种情况下,我有 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()

【问题讨论】:

  • 您的 return 语句不会缩进到它们返回的函数中。您还可以在循环内定义 kl(两次!?)、积分和 U。在循环上方定义它们,如果需要,在循环中调用它们
  • 你的缩进问题太多了。该代码不会运行。仔细查看它,并修复缩进 E() 和 Denom() 必须缩进它们的代码套件。您的返回需要缩进,您的函数内部函数定义很奇怪,应该删除并放入主代码块中
  • 您能详细说明“缩进到函数中”是什么意思吗?

标签: python arrays function loops


【解决方案1】:

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

def myfunction(x):
  return x+ 3

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

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

【讨论】:

    【解决方案2】:

    这是您在上面要求的详细说明:

    您的代码:

    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)
    

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

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 2022-09-29
      • 1970-01-01
      • 2019-09-18
      • 2013-09-28
      相关资源
      最近更新 更多