繁体   English   中英

禁用sympy中的自动简化

[英]disabling automatic simplification in sympy

我想在sympy中禁用自动简化,例如求解等式x*yx我想获得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) 
=> []

我的问题是

  • 给出的例子有什么问题?
  • 如何保持表达式未评估/未简化?

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

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 您可以禁用评估(可以使用UnevaluatedExpr evaluate(False)或使用UnevaluatedExpr ),但是可能无法获得解决方案。

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

>>> expr = Dummy("x")*y - Dummy("x")
>>> solve(expr, y)
[_x/_x]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM