sy.sympify (str (expression)) не равно выражению - PullRequest
0 голосов
/ 05 июня 2018

Насколько я понимаю, str преобразует выражение SymPy в строку, а sympify преобразует строку в выражение SymPy.Таким образом, я ожидаю, что будет выполнено следующее (для разумных выражений).

>>> sy.sympify(str(expr)) == expr
True

Я пробовал это, и действительно, это так для простых примеров (например, expr = x+y).Однако, когда я попробовал это со следующим выражением, оно не работало:

import sympy as sy
a = sy.symbols("a")
A = sy.Matrix(3,3, a)
c0,c1,c2 = sy.symbols("c0 c1 c2", positive = True)
c1*c2**2*a(0, 1)**2*a(1, 2)*a(2, 2) - c1*c2**2*a(0, 1)**2*a(2, 2)**2 - c1*c2**2*a(0, 1)*a(0, 2)*a(1, 1)*a(2, 2) + c1*c2**2*a(0, 1)*a(0, 2)*a(2, 1)*a(2, 2) - c1*c2**2*a(0, 1)*a(1, 1)*a(1, 2)*a(2, 2) + c1*c2**2*a(0, 1)*a(1, 1)*a(2, 2)**2 + c1*c2**2*a(0, 2)*a(1, 1)**2*a(2, 2) - c1*c2**2*a(0, 2)*a(1, 1)*a(2, 1)*a(2, 2) - c1*a(0, 0)**2*a(1, 1)*a(2, 1) + c1*a(0, 0)**2*a(2, 1)**2 + c1*a(0, 0)*a(0, 1)*a(1, 1)*a(2, 0) - c1*a(0, 0)*a(0, 1)*a(2, 0)*a(2, 1) + c1*a(0, 0)*a(1, 0)*a(1, 1)*a(2, 1) - c1*a(0, 0)*a(1, 0)*a(2, 1)**2 - c1*a(0, 0)*a(1, 1)**2*a(2, 0) + c1*a(0, 0)*a(1, 1)*a(2, 0)*a(2, 1) - c2**2*a(0, 0)*a(0, 1)*a(1, 2)*a(2, 2) + c2**2*a(0, 0)*a(0, 1)*a(2, 2)**2 + c2**2*a(0, 0)*a(0, 2)*a(1, 1)*a(2, 2) - c2**2*a(0, 0)*a(0, 2)*a(2, 1)*a(2, 2) + c2**2*a(0, 1)*a(1, 0)*a(1, 2)*a(2, 2) - c2**2*a(0, 1)*a(1, 0)*a(2, 2)**2 - c2**2*a(0, 2)*a(1, 0)*a(1, 1)*a(2, 2) + c2**2*a(0, 2)*a(1, 0)*a(2, 1)*a(2, 2) + c2*a(0, 0)**2*a(1, 2)*a(2, 1) - c2*a(0, 0)**2*a(2, 1)*a(2, 2) - c2*a(0, 0)*a(0, 1)*a(1, 2)*a(2, 0) + c2*a(0, 0)*a(0, 1)*a(2, 0)*a(2, 2) - c2*a(0, 0)*a(1, 0)*a(1, 2)*a(2, 1) + c2*a(0, 0)*a(1, 0)*a(2, 1)*a(2, 2) + c2*a(0, 0)*a(1, 1)*a(1, 2)*a(2, 0) - c2*a(0, 0)*a(1, 1)*a(2, 0)*a(2, 2)

Может кто-нибудь сказать мне, почему это не работает для этого выражения?

PS: я знаю, яЯ должен был привести минимальный рабочий пример, но я просто не нашел, какая часть выражения вызывает проблему.

1 Ответ

0 голосов
/ 05 июня 2018

Минимальным примером будет

x = sy.symbols("x", positive=True)
expr = 2*x
sy.sympify(str(expr)) == expr   # False

Что имеет смысл: строковое представление expr, а именно "2*x", не имеет информации о том, что x положительный.Соответственно, sy.sympify(str(expr)) создает новый символ с именем «x» и допущениями по умолчанию.Это отличается от оригинального символа.

Без предположения о положительности сравнение вернет True.

Чтобы сохранить предположение о положительности, нужно явно сказать, что символ "x" в строке означает существующий символ x, используя словарь locals:

x = sy.symbols("x", positive=True)
expr = 2*x
sy.sympify(str(expr), locals={"x": x}) == expr    # True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...