2016-07-03 19 views
2

Wie kann ich eine mathematische Funktion als Argument einer Funktion in Python einfügen?Gibt es eine Möglichkeit, eine mathematische Funktion als Argument einer Funktion in Python 3 zu haben?

In meinem speziellen Fall, ich bin einen Riemann Summe Rechner zu schreiben, die im Idealfall aussehen würde:

def riemann_sum(func_x, minvalue, maxvalue, partitions) 
... 
return riemannSum 

wo func_x eine Funktion von x ist, so dass ich diese die Riemannsche Summe von jeder beliebigen Funktion finden konnte, :

func_x = x**2 
minvalue = 1 
maxvalue = 2 
partitions = 100 
a = riemann_sum(func_x,minvalue,maxvalue,partitions) 
print(a) 

Jedoch kann ich die obige Prozedur nicht tun, weil x nicht definiert ist.

kann ich die Riemann Summe für bestimmte Funktionen von x erhalten, indem es manuell in einer Linie meiner Funktion eingeben, die wie folgt aussieht: Hier

someList = [x**2 for x in someOtherList] 

, die Funktion x ** 2, aber ich kann ändere es nicht, ohne physisch hineinzugehen und die Funktion zu ändern.

Meine einzige Lösung im Moment ist es, jedes Mal eine neue Riemann-Summenfunktion zu definieren, wenn ich das bestimmte Integral einer neuen Funktion finden will, was funktioniert, aber ich habe das Gefühl, dass es einen besseren Weg gibt.

(Bearbeiten: Meine Frage unterscheidet sich von der Riemann-Summenfrage als mögliches Duplikat. Ihre Frage ist eine Implementierung speziell für eine Riemann-Summe. Meine Frage ist, wie man eine mathematische Funktion als Argument einer Funktion einbaut und ich verwende zufällig Riemann Summe als ein bestimmtes Beispiel)

+1

Mögliches Duplikat von [Integration mit Riemann Sum Python] (http://stackoverflow.com/questions/29318682/integration-mit-riemann-sum-python). Es gibt viele Möglichkeiten: nur Google "python Riemann sum". Hier ist ein weiteres Beispiel: https://www.youtube.com/watch?v=b8BvG5MKpzu. Oder das: http://rojok.github.io/riemann-sums-in-python.html – paulsm4

+2

Sprechen Sie über 'func_x = Lambda x: x ** 2'? – pah

+0

yeah ... Ich habe die Lambda-Funktion irgendwie vergessen. Das habe ich vermisst. –

Antwort

1

In Python-Funktionen sind Objekte der ersten Klasse, so dass Sie beispielsweise Funktionen als Argumente an andere Funktionen übergeben können. Das heißt, die Art und Weise, wie Sie Ihre riemann_sum Funktionsdeklaration geschrieben haben, ist in Ordnung.

Was nicht funktioniert ist Ihre Definition von func_x, da Sie func_x als eine Funktion definieren müssen. Dafür können Sie entweder tun:

func_x = lambda x: x**2 

oder, für eine allgemeinere mehrzeilige (oder einzeilig) Funktion

def func_x(x): 
    temp = x**2 # just to stretch this out to another line for demonstration 
    return temp 

Dann kann man sagen, so etwas wie:

def riemann_sum(func_x, minvalue, maxvalue, partitions): 
    # below just demos calling func_x, and is a bad way to do the sum 
    riemannSum = 0 
    step = 1.0*(maxvalue-minvalue)/partitions 
    value = minvalue 
    while value<maxvalue: 
     riemannSum == step*func_x(value) # here's where func_x is called 
     value += step 
    return riemannSum 

Das heißt , der Hauptpunkt hier ist, dass zeigt, wie func_x innerhalb der riemann_sum Funktion aufrufen. Auf diese Weise können Sie func_x mit verschiedenen x-Werten auswerten, um die Summe auszuwerten.

+0

Okay, ich denke, das ist es, was ich wollte. Python hat jetzt kein Problem mit meiner Funktion von x, aber aus irgendeinem Grund hat dies ein Problem mit einem anderen Code hervorgebracht, der vorher gut funktioniert hat. Ich nehme an, ich kann das Problem selbst beheben. Die Lambda-Funktion scheint der Schlüssel zu sein, den ich vermisse, danke! –

+3

'Lambda' funktioniert, aber bedenken Sie, dass die allgemeine und vielseitige ist nur eine Funktion zu definieren. Ich gebe es einfach als vollständig ein, aber ich benutze fast immer die reguläre Funktion und benutze nur lambdas, wenn ich die Funktion in der gleichen Zeile verwende, in der ich schreibe, wie zum Beispiel ein einmaliger Aufruf, wie 'riemannSum (Lambda x: x ** 2, 1, 2, 100) '. – tom10

+0

Ja, ich denke, das ist ein anderes (weniger prominentes) Problem, das ich lösen wollte. Ich möchte faul sein und einfach die Funktion von X direkt in meine Riemannsummenfunktion eingeben, ohne jedes Mal eine neue Funktion definieren zu müssen, wenn ich eine neue Funktion von X einstelle. Lambda hilft mir, etwas fauler zu sein, aber die Funktion zu definieren ist das eigentliche Problem, das ich hatte. –

0
# Replace with whatever your function is 
def func_x(x): 
    return x**2 


def riemann_sum(func_x(3), minvalue, maxvalue, partitions) 
... 
return riemannSum 

Dies sollte es tun. Sie können die Funktion an anderer Stelle erstellen und dann in Ihrem Riemann_sum als Eingabe initialisieren.

+1

Ich glaube nicht, dass dies mein Problem löst ... indem ich sage func_x (3) Ich habe angegeben, dass ich meine Funktion nur bei x = 3 ... oder 3 ** 2 = 9 auswerte Funktion bei einer bestimmten Anzahl (gegeben durch das Partitionsargument) von Positionen zwischen minvalue und maxvalue. Das Setzen von x = 3 (oder einer beliebigen Zahl) beschränkt x auf einen einzelnen Wert, wenn es bei vielen Werten abgetastet werden muss. –

0

Ich hatte ein ähnliches Problem vor ein paar Jahren, als ich etwas für meine Klasse der Differentialgleichungen schrieb. Hier ist ein Beispiel dafür, was für mich gearbeitet:

func_x = "(x**2)+x+1" 
paramList = [(1+(1/k),(1/k)-(1/(k+1))) for k in range(1,101)] 
# paramList holds the tuple (x,changeInX) for the riemann sum 
def riemann_sum(str_func_x,paramList): 
    theSum=0 
    for tup in paramList: 
     x=tup[0] 
     diff=tup[1] 
     theSum+=eval(str_func_x)*diff 
    return theSum 
riemannSumValue = riemann_sum(func_x,paramList) 

Vergewissern Sie sich, dass param Liste ist wirklich von 1,1 + 1/100. . ., 2 für den ersten Index der Tupel in paramList. . . Ich denke es ist von 1.01 zu 2 so wie es jetzt ist (ich habe vor 20 Minuten etwas tylenol pm genommen und jetzt bin ich zu müde um mich selbst zu überprüfen.)

+0

Okay danke! Während jemand meine Hauptfrage bereits beantwortet hat, löst das ein sekundäres Problem, das ich hatte. Die "eval" -Funktion hilft nämlich sehr, weil sie mir erlaubt, die Funktion als eine Zeichenkette einzugeben und sie dann "entwirren", wenn sie ausgewertet werden muss. –

Verwandte Themen