Симпозиционные символы Python

Nov 01 2020

Когда я использую «x» и «z» в качестве символов, у меня нет проблем с этим кодом:

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})

Но когда я использую «q» и «a», решение не дает мне никакого решения.

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})

Как видите, я использую «подпрограммы», чтобы проверить, нет ли опечаток в целевой функции.

ОБНОВЛЕНИЕ: я использовал «Символ», чтобы установить каждую переменную отдельно, но опять же использование «q» и «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)))

Спасибо.

Ответы

5 Marcin Nov 02 2020 at 00:00

Понял!

Все зависит от алфавитного порядка ваших переменных.

Если заменить xна zи zдля xв первом примере это также перестанет работать.

Внутреннее решение отправляет выражение в функцию, _solveв sympy.solversкоторой затем пытается решить ваше уравнение и много раз терпит неудачу.

Наконец, в качестве последнего усилия он пытается решить -sqrt(a) + qили x - sqrt(z)выбирает символы из него через внутреннюю функцию _ok_symsс аргументом, который сортирует их в алфавитном порядке (даже без этого аргумента он все равно будет, но если его обернуть с reversedним, волшебным образом заставляет ваши примеры работать прямо противоположным образом).

И так оно решает x - sqrt(z)как x: sqrt(z)и -sqrt(a) + qкак a: q**2.

В то время как в первом случае это приводит к легко решаемому 50 - 10*sqrt(z), во втором случае он теряется, -12*q + 2*sqrt(q**2) + 50поскольку не может упростить sqrt(q**2).

источник: много тестирования: https://github.com/sympy/sympy/blob/master/sympy/solvers/solvers.py