2016-06-14 18 views
1

範囲の値を与えたときに最大の関数を見つけようとしています。後で使用するための配列。この場合、2つのパラメータがあります.1つはx、もう1つは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

return文は、返される関数の中にインデントされていません。また、kl(2回!?)、Integrand、Uループを内部ループとして定義します。それらをループの上に定義し、必要に応じてループ内でそれらを呼び出す –

+0

インデントの問題が多すぎます。そのコードは実行されません。それを注意深く見て、インデントを修正してください。E()とDenom()は、コードスイートをインデントしなければなりません。あなたのリターンは字下げする必要があります。あなたの関数defは内部関数が奇数であり、コードのメインブロックに置かなければなりません。 –

+0

"関数の中に入るためにインデントされる"ということを詳しく説明できますか? –

答えて

1

コードの構造が正しくないため、結果が得られません。まず、forループ内の関数を定義します。これは、エラーをもたらすが、何あなたが実際にやってみたいことなど、以前の関数を定義して、ループのためにそれを呼び出すではありません。

def myfunction(x): 
    return x+ 3 

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

はまた、return文が順にインデントする必要があることに気づきますジョエル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) 

をあなたのコードの。底部も同様の処理が必要です。また、あなたのループ内のいくつかのprint文を振りかけて、あなたが思うことをしているかどうかを確認してください。

関連する問題