python - 同情错误?即使使用 `evaluate=False` 方程也会自动处理
问题描述
考虑以下 sympy 代码:
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)
此代码片段改编自此答案。那里的条款更简单,所以Add
保留了顺序。Add
但是在这种情况下,我怎样才能保留订单呢?
(备注:如果我们将条款更改为t1=x
和t2=x**2
我使用sp.UnevaluatedExpr
作品的方法,但没有这些条款的原始答案没有。唉,对于我的具体情况,甚至不使用sp.UnevaluatedExpr
作品。)
解决方案
这不是错误...
...但更多的是缺少的功能。所有这些都被记录在案。
这就是 SymPy 所指的unevaluate。
未评估意味着它内部的值不会与它外部的表达式交互以提供简化的输出。
在您的示例中,术语2*x
并x
没有像预期的那样简化。
输入顺序
您看到的是 SymPy 没有保留您输入术语的顺序。这记录在表达式树部分下。
交换操作的参数
Add
和Mul
以任意(但一致!)顺序存储,该顺序与输入顺序无关。
这应该不是问题,因为Add
并且Mul
是可交换的。
虽然,如果由于某种原因,由于乘法的不可交换性,您想保留输入的顺序,您可以这样做。
在 SymPy 中,您可以使用 来创建非交换符号
Symbol('A', commutative=False)
,并且非交换符号的乘法顺序与输入保持相同)
至于现在,似乎没有非交换加法。
推荐阅读
- android - 使用 unix 时间戳显示正确的日出/日落时间
- haskell - 列出从 Haskell 到 SML 的 colgebra 转换代码
- node.js - OpenAPI java生成的客户端类未找到错误
- reactjs - 私有 S3 + CloudFront 反应应用程序:“XML 文件似乎没有任何与之关联的样式信息”
- c# - 如何从 C# windows 窗体调用 Powershell 脚本并传递参数
- python - 如何在每次出现给定字符串时拆分 Python 数组?
- sql - SQL 按 CASE WHEN 聚合记录
- java - 如何修复我的 java 程序不停止运行?
- r - 如何为列中的重复值生成增加数字的后缀?
- python - K 均值聚类:更新每个聚类的质心并选择颜色的功能