在同情中禁用自动简化

时间:2018-02-17 08:57:57

标签: python sympy simplification

我想禁用同意中的自动简化,例如解决等式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) 
=> []

我的问题是

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

1 个答案:

答案 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]