在 sympy 中禁用自动简化

Hak*_*kci 2 python sympy simplification

我想在 sympy 中禁用自动简化,例如求解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
Run Code Online (Sandbox Code Playgroud)

从 sympy 手册中,我找到了 UnevaluatedExpr 用于此目的,但它返回给定示例的空列表

from sympy import UnevaluatedExpr
expr1 = UnevaluatedExpr(x)*UnevaluatedExpr(y)-UnevaluatedExpr(x)
sympy.solve(expr1,y) 
=> []
Run Code Online (Sandbox Code Playgroud)

我的问题是

  • 给出的例子有什么问题?
  • 我怎样才能保持表达式不被评估/不被简化?

小智 5

禁用自动评估的更简单方法是使用上下文管理器评估。例如,

from sympy.core.evaluate import evaluate
from sympy.abc import x,y,z
with evaluate(False):
    print(x/x)
Run Code Online (Sandbox Code Playgroud)

这将打印1/x * x而不是 1

但是,正如上下文管理器的文档字符串所说,大多数 SymPy 代码都需要自动评估。当禁用自动评估时,任何超出直接计算的东西都可能会崩溃。solve即使对于简单的方程,也会发生这种情况。您可以禁用评估(使用evaluate(False)或使用UnevaluatedExpr),但您可能不会得到解决方案。

特定方程的部分解决方法是使用Dummy("x")代替UnevaluateExpr(x)。即使它们具有相同的名称,虚拟符号也被视为不同的,因此它们不会相互抵消。

>>> expr = Dummy("x")*y - Dummy("x")
>>> solve(expr, y)
[_x/_x]
Run Code Online (Sandbox Code Playgroud)