2016-06-14 64 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) 

這僅僅是頂部的代碼。底部需要類似的處理。還可以在循環中打印一些打印語句,看看他們是否在做你認爲他們應該做的事情

相關問題