Sympy bug?即使使用`evaluate = False`方程也会自动处理

问题描述 投票:1回答:1

考虑以下交际密码:

from sympy import Add
from sympy.abc import x

t1 = 2+2*x
t2 = x
myeq = sp.UnevaluatedExpr(Add(sp.UnevaluatedExpr(t1), sp.UnevaluatedExpr(t2), evaluate=False))

# BUG! Will print: x + 2*x + 2
# Yet it should print: 2+2*x+x
print(myeq)

此代码段改编自this答案。那里的条款比较简单,所以Add保留了这个命令。但是,如何在这种情况下让Add保持秩序呢?

(备注:如果我们将条款更改为t1=xt2=x**2我的方法使用sp.UnevaluatedExpr作品,但没有这些条款的原始答案没有。唉,对于我的具体情况,甚至没有使用sp.UnevaluatedExpr作品。)

python python-3.x sympy evaluation
1个回答
1
投票

这不是一个错误......

......但更多的缺失功能。所有这些都记录在案。

这就是unevaluated所说的SymPy。

未评估意味着它内部的值不会与其外部的表达式相互作用以提供简化的输出。

在您的示例中,术语2*xx未按预期进行简化。

输入顺序

你所看到的是SymPy没有保留你输入你的条款的顺序。这是documented under the expression tree section

交换操作AddMul的参数以任意(但一致!)的顺序存储,该顺序与输入的顺序无关。

这应该不是问题,因为AddMul是可交换的。

虽然,如果由于某种原因你想保留由于乘法的非交换性而导致的输入顺序,你可以这样做。

在SymPy中,您可以使用Symbol('A', commutative=False)创建非交换符号,非交换符号的乘法顺序与输入保持相同)

至于现在,似乎没有非交换性的加法。

© www.soinside.com 2019 - 2024. All rights reserved.