我想禁用同意中的自动简化,例如解决等式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
从sympy手册中,我为此找到了UnevaluatedExpr,但它返回了给出示例的空列表
from sympy import UnevaluatedExpr
expr1 = UnevaluatedExpr(x)*UnevaluatedExpr(y)-UnevaluatedExpr(x)
sympy.solve(expr1,y)
=> []
我的问题是
答案 0 :(得分:2)
禁用自动评估的一种简单方法是使用context manager evaluate。例如,
from sympy.core.evaluate import evaluate
from sympy.abc import x,y,z
with evaluate(False):
print(x/x)
这会打印1/x * x
而不是1
但是,正如上下文管理器的docstring所说,大多数SymPy代码都需要自动评估。当禁用自动评估时,除了直接计算之外的任何事情都可能会崩溃。即使对于简单的方程式,solve
也会发生这种情况。您可以禁用评估(使用evaluate(False)
或使用UnevaluatedExpr
),但您可能无法获得解决方案。
特定等式的部分解决方法是使用Dummy("x")
而不是UnevaluateExpr(x)
。虚拟符号即使具有不同的名称也被视为不同,因此它们不会被取消。
>>> expr = Dummy("x")*y - Dummy("x")
>>> solve(expr, y)
[_x/_x]