Sympy w Pythonie
Kiedy używam „x” i „z” jako symboli, nie mam problemu z tym kodem:
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})
Ale kiedy używam "q" i "a", funkcjaolve nie daje mi żadnego rozwiązania.
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})
Jak widać, używam „subs”, aby sprawdzić, czy w funkcji celu nie ma literówki.
AKTUALIZACJA: Użyłem „Symbol”, aby ustawić każdą zmienną indywidualnie, ale ponownie użycie „q” i „a” nie działa.
# 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)))
Dziękuję Ci.
Odpowiedzi
Rozumiem!
Wszystko zależy od kolejności alfabetycznej twoich zmiennych.
Jeśli zamienisz xna zi zna xw pierwszym przykładzie będzie to również przestać działać.
Wewnętrznie rozwiązać wysyła wyraz funkcji _solvew sympy.solversktóry następnie próbuje rozwiązać równanie, ale zaniechał wielokrotnie.
W końcu, jako ostatnia próba, próbuje rozwiązać -sqrt(a) + qlub wybrać x - sqrt(z)z nich symbole za pomocą funkcji wewnętrznej _ok_syms, z argumentem, który sortuje je alfabetycznie (nawet bez tego argumentu nadal by reversedto robił , ale jeśli jest nim owinięty magicznie, twoje przykłady działają w dokładnie odwrotny sposób).
I tak rozwiązuje x - sqrt(z)jako x: sqrt(z)i -sqrt(a) + qjako a: q**2.
Podczas gdy w pierwszym przypadku kończy się to łatwo rozwiązalnym 50 - 10*sqrt(z), w drugim przypadku gubi się, -12*q + 2*sqrt(q**2) + 50ponieważ nie jest w stanie uprościć sqrt(q**2).
źródło: dużo testów na: https://github.com/sympy/sympy/blob/master/sympy/solvers/solvers.py