2016-03-25 14 views
0

Sagen wir, ich habe eine Gleichung f(x) = x**2 + 1, ich muss den Wert f(2) finden.Python: Wie finde ich den Wert einer Gleichung für einen gegebenen Eingang

Der einfachste Weg ist, eine Funktion zu erstellen, einen Parameter zu akzeptieren und den Wert zurückzugeben.

Aber das Problem ist, f(x) wird dynamisch erstellt und so, eine Funktion kann nicht im Voraus geschrieben werden, um den Wert zu erhalten.

Ich verwende cvxpy für einen Optimierungswert. Die Gleichung würde wie folgt aussehen:

x = cvx.Variable() 
Si = [(cvx.square(prev[i] + cvx.sqrt(200 - cvx.square(x))) for i in range(3)] 

prev ist ein Array von Zahlen. Es wird eine Si[0] Si[1] Si[2] sein.

Wie finde ich den Wert von Si[0] for x=20?

Grundsätzlich gibt es eine Möglichkeit, die genannte Variable zu ersetzen und den Wert der Gleichung zu finden, wenn Sie cvxpy verwenden?

+1

Versuchen Sie [sympy.sympify] (http://docs.sympy.org/dev/tutorial/basic_operations.html#converting-strings-to-sympy-expressions) und 'sympy.evalf'. – msw

+0

@msw Danke für die schnelle Antwort. Ich benutze cvxpy zum Erstellen der Gleichung und sympy ist keine Option für mich. Kann sympy.sympify nicht in der mit cvxpy erstellten Gleichung verwenden. – Sanjay

+0

Was ist das größere Problem, das Sie versuchen zu lösen? cvxpy dient zum Finden von Maxima und Minima, nicht einfach zum Auswerten eines Ausdrucks. –

Antwort

2

den Wert der Variablen einstellen und dann können Sie den Wert des Ausdrucks erhalten, etwa so:

>>> x.value = 3 
>>> Si[0].value 
250.281099844341 

(obwohl es nicht für x = 20 funktionieren wird, denn dann würde man die Quadratwurzel werden einer negativen Zahl).

0

Die allgemeine Lösung Code on-the-fly in Python zu der Interpretation ist die eingebauten in eval() aber eval ist mit Benutzereingaben gefährlich zu verwenden, die alle Arten von bösen zu Ihrem System tun könnten.

Glücklicherweise gibt es Möglichkeiten, eval mit seinen zusätzlichen Parametern zu "sandboxen", um dem Ausdruck nur Zugriff auf bekannte "sichere" Operationen zu geben. Es gibt an example wie der Zugriff von eval nur auf White-Listed-Operationen beschränkt werden kann und es den Zugriff auf die integrierten Instanzen ausdrücklich verweigert. Ein kurzer Blick auf diese Implementierung scheint nahe zu sein, aber ich werde nicht behaupten, dass es narrensicher ist.

Die sympy.sympify Ich erwähnte in meinem Kommentar verwendet eval() innerhalb und trägt die gleiche Warnung.

+0

Wie sage ich eval(), um einen bestimmten Wert für eine Variable x zu verwenden? – Sanjay

+0

Einfach zuweisen. 'x = 3; eval ('x + 2') # => 5 '. –

0

Parallel zu Ihrer cvx Versionen können Sie Lambda-Funktionen verwenden on the fly zu definieren:

f=[lambda x,i=j : (prev[i] + (200 - x*x)**.5)**2 for j in range(3)] #(*) 

Dann können Sie f[0](20) bewerten, f[1](20), und so weiter.

(*) Die i=j wird benötigt, um jede j in die zugehörige Funktion zu passen.