Símbolos Sympy Python
Quando uso "x" e "z" como símbolos, não tenho problemas com este código:
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})
Mas quando eu uso "q" e "a", solve não me dá nenhuma solução.
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})
Como você pode ver, eu uso "subs" para verificar se não há erro de digitação na função objetivo.
ATUALIZAÇÃO: usei "Symbol" para definir cada variável individualmente, mas novamente usando "q" e "a" não funciona.
# 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)))
Obrigado.
Respostas
Entendi!
Tudo depende de uma ordem alfabética de suas variáveis.
Se você substituir xpara ze zpara xem seu primeiro exemplo que também irá parar de funcionar.
Resolver internamente envia a expressão para a função _solvena sympy.solversqual tenta resolver sua equação e falha muitas vezes.
Finalmente, como um último esforço, o que ele faz é tentar resolver -sqrt(a) + qou x - sqrt(z)escolher símbolos dele por meio de uma função interna _ok_syms, com um argumento que os classifica em ordem alfabética (mesmo sem este argumento ele ainda faria, mas se embrulhado reversednele magicamente faz seus exemplos funcionarem exatamente da maneira oposta).
E assim resolve x - sqrt(z)como x: sqrt(z)e -sqrt(a) + qcomo a: q**2.
Enquanto no primeiro caso acaba sendo facilmente resolvível 50 - 10*sqrt(z), no segundo caso perde -12*q + 2*sqrt(q**2) + 50-se por não ser capaz de simplificar sqrt(q**2).
fonte: muitos testes em: https://github.com/sympy/sympy/blob/master/sympy/solvers/solvers.py