Отключение автоматического упрощения в симпы
Я хочу отключить автоматическое упрощение в Simpy, например, решение уравнения x*y-x
я хочу получить x/x
вместо 1
import sympy
from sympy.abc import x,y,z
expr = x*y-x
sympy.solve(expr,y)
=> 1 # i want unsimplified x/x instead of 1
Из руководства Simpy я нашел для этой цели UnevaluatedExpr, но он возвращает пустой список для данного примера.
from sympy import UnevaluatedExpr
expr1 = UnevaluatedExpr(x)*UnevaluatedExpr(y)-UnevaluatedExpr(x)
sympy.solve(expr1,y)
=> []
мой вопрос
- что не так с приведенным примером?
- как сохранить выражения не оцененными / не упрощенными?
1 ответ
Более простой способ отключить автоматическую оценку - использовать оценку менеджера контекста. Например,
from sympy.core.evaluate import evaluate
from sympy.abc import x,y,z
with evaluate(False):
print(x/x)
Это печатает 1/x * x
вместо 1
Однако, как говорит строка документации менеджера контекста, большая часть кода SymPy ожидает автоматической оценки. Все, что находится за пределами простых вычислений, может сломаться, когда автоматическая оценка отключена. Это происходит для solve
даже для простых уравнений. Вы можете отключить оценку (либо с evaluate(False)
или с помощью UnevaluatedExpr
), но вы, вероятно, не получите решение.
Частичный обходной путь для конкретного уравнения заключается в использовании Dummy("x")
вместо UnevaluateExpr(x)
, Фиктивные символы рассматриваются как разные, даже если они имеют разные имена, поэтому они не будут отменены.
>>> expr = Dummy("x")*y - Dummy("x")
>>> solve(expr, y)
[_x/_x]