2016-06-14 8 views
1

Ich versuche, das Maximum der Funktion zu finden, wenn ich ihm einen Bereich von Werten geben und dann denselben Wert in ein setzen Array für die spätere Verwendung. In diesem Fall habe ich 2 Parameter, von denen einer das x und der andere das Theta ist. Mein Problem ist, dass es nicht zum nächsten x-Wert in der Liste springt. Gibt es eine Möglichkeit, die Schleife zu umkreisen und das Maximum in ein Array zu setzen?Python: Legen Sie das Maximum einer Funktion und Schleife um das Maximum des nächsten Wertes in einem Array zu finden

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

Ihre Return-Anweisungen sind nicht eingerückt, in den Funktionen zu leben, die sie zurückgeben. Sie definieren auch kl (zweimal !?), Integrand und U innerhalb Schleifen. Definieren Sie sie über der Schleife und rufen Sie sie bei Bedarf in der Schleife auf –

+0

Sie haben zu viele Einrückungsprobleme. Dieser Code wird nicht ausgeführt. Schauen Sie es sich genau an und korrigieren Sie die Einrückungen E() und Denom() muss ihre Code-Suite eingerückt haben. Ihre Returns müssen eingerückt werden, Ihre Funktion defs innerhalb Funktionen sind ungerade und sollte entfernt werden und in den Hauptblock des Codes –

+0

setzen Können Sie näher auf das, was Sie mit "eingerückt, um in der Funktion leben" bedeuten? –

Antwort

1

Die Struktur Ihres Codes ist nicht korrekt, deshalb erhalten Sie kein Ergebnis. Zuerst definieren Sie Funktionen innerhalb von for-Schleifen. Dies bedeutet keinen Fehler ergeben, aber was Sie wirklich wollen, ist die Funktion früher zu definieren und es dann für Schleife in den Anruf, als solche:

def myfunction(x): 
    return x+ 3 

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

Beachten Sie auch, dass die return-Anweisung eingerückt werden muss, um zu der Funktion gehören, wie Joel Goldstick darauf hingewiesen hat. Andernfalls gibt die Funktion nichts zurück. Dasselbe gilt für jede Aussage in Ihrer E (x) -Funktion.

0

Dies ist die Ausarbeitung Sie oben gestellt:

Ihr Code:

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) 

Ihr Code mit einigen Änderungen Einzug Probleme zu beheben:

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) 

das ist nur der obere Teil deines Codes. Der untere Teil benötigt eine ähnliche Behandlung. Geben Sie auch einige print-Anweisungen in Ihren Schleifen ein, um zu sehen, ob sie tun, was Sie denken, sie sollten

Verwandte Themen