我想禁用 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
从 sympy 手册中,我找到了用于此目的的 UnevaluatedExpr,但它为给定的示例返回空列表
from sympy import UnevaluatedExpr
expr1 = UnevaluatedExpr(x)*UnevaluatedExpr(y)-UnevaluatedExpr(x)
sympy.solve(expr1,y)
=> []
我的问题是
- 给出的例子有什么问题?
- 我怎样才能保持表达式不被评估/不被简化?
禁用自动评估的一种更简单的方法是使用上下文管理器评估 https://github.com/sympy/sympy/blob/3099b707e45f5abce01045de39415ee961eb09d5/sympy/core/evaluate.py#L19。例如,
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]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)