Python-Sympysymbole
Wenn ich "x" und "z" als Symbole verwende, habe ich kein Problem mit diesem Code:
from sympy import *
x, z = symbols('x z')
y = -6*x**2 + 2*x*z**0.5 + 50*x - z
solve((diff(y, x), diff(y, z)))
y.subs({x: 5, z: 25})
Aber wenn ich "q" und "a" benutze, gibt mir lösen keine Lösung.
q, a = symbols('q a')
y = -6*q**2 + 2*q*a**0.5 + 50*q - a
solve((diff(y, q), diff(y, a)))
y.subs({q: 5, a: 25})
Wie Sie sehen können, verwende ich "subs", um zu überprüfen, ob die Zielfunktion keinen Tippfehler enthält.
UPDATE: Ich habe "Symbol" verwendet, um jede Variable einzeln festzulegen, aber auch hier funktioniert die Verwendung von "q" und "a" nicht.
# This works
x = Symbol('x')
z = Symbol('z')
y = -6*x**2 + 2*x*z**0.5 + 50*x - z
solve((diff(y, x), diff(y, z)))
# This does not work
q = Symbol('q')
a = Symbol('a')
y = -6*q**2 + 2*q*a**0.5 + 50*q-a
solve((diff(y, q), diff(y, a)))
Vielen Dank.
Antworten
Ich habs!
Es hängt alles von einer alphabetischen Reihenfolge Ihrer Variablen ab.
Wenn Sie ersetzen xfür zund zfür xin Ihrem ersten Beispiel wird es auch aufhören zu arbeiten.
Intern lösen löst den Ausdruck an die Funktion, _solvein sympy.solversder dann versucht wird, Ihre Gleichung zu lösen, und schlägt viele Male fehl.
Als letzte Anstrengung versucht es schließlich, Symbole zu lösen -sqrt(a) + qoder x - sqrt(z)durch Auswahl über eine interne Funktion auszuwählen _ok_syms, mit einem Argument, das diese alphabetisch sortiert (auch ohne dieses Argument würde es immer noch funktionieren , aber wenn reversedes magisch verpackt wird, funktionieren Ihre Beispiele in genau entgegengesetzter Weise).
Und so löst es sich x - sqrt(z)wie x: sqrt(z)und -sqrt(a) + qwie a: q**2.
Während es im ersten Fall leicht lösbar ist 50 - 10*sqrt(z), geht es im zweiten Fall verloren, -12*q + 2*sqrt(q**2) + 50da es nicht vereinfacht werden kann sqrt(q**2).
Quelle: viele Tests auf: https://github.com/sympy/sympy/blob/master/sympy/solvers/solvers.py