Símbolos de Python Sympy
Cuando uso "x" y "z" como símbolos, no tengo ningún problema con 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})
Pero cuando uso "q" y "a", solve no me da ninguna solución.
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 puede ver, utilizo "subs" para comprobar que no hay errores tipográficos en la función objetivo.
ACTUALIZACIÓN: Usé "Símbolo" para configurar cada variable individualmente, pero nuevamente usar "q" y "a" no 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)))
Gracias.
Respuestas
¡Entendido!
Todo depende del orden alfabético de sus variables.
Si sustituye xpor zy zpor xen su primer ejemplo, también dejará de funcionar.
Resolver internamente envía la expresión a la función _solveen la sympy.solversque luego intenta resolver su ecuación y falla muchas veces.
Finalmente, como último esfuerzo, lo que hace es intentar resolver -sqrt(a) + qo x - sqrt(z)seleccionar símbolos de él a través de una función interna _ok_syms, con un argumento que los ordena alfabéticamente (incluso sin este argumento lo haría, pero si se envuelve con reversedél, mágicamente hace que sus ejemplos funcionen). de forma exactamente opuesta).
Y así se resuelve x - sqrt(z)como x: sqrt(z)y -sqrt(a) + qcomo a: q**2.
Mientras que en el primer caso termina con una solución fácilmente 50 - 10*sqrt(z), en el segundo caso se pierde -12*q + 2*sqrt(q**2) + 50ya que no es capaz de simplificar sqrt(q**2).
fuente: muchas pruebas en: https://github.com/sympy/sympy/blob/master/sympy/solvers/solvers.py