Símbolos de Python Sympy

Nov 01 2020

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

5 Marcin Nov 02 2020 at 00:00

¡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 al -12*q + 2*sqrt(q**2) + 50no poder simplificar sqrt(q**2).

fuente: muchas pruebas en: https://github.com/sympy/sympy/blob/master/sympy/solvers/solvers.py