Skip to main content
 首页 » 编程设计

Python- Sympy 问题,当 evaluate=False 时进行表达式相等性检查

2025年05月04日10kerrycode

在我的项目中,当我创建任何 Add 或 Mul 对象时,我必须使用 evaluate=false。在这种情况下,我在对这些对象应用相等性检查时遇到了问题。问题是因为参数的顺序。

请考虑以下示例:

k2=Mul(*[x,y,2],evaluate=False) 
k1=Mul(*[x,2,y],evaluate=False) 
print k1==k2  

结果是 false 因为 k2.args 是 (x,y,2) 和 k1.args 是 (x,2,y)。 因此,当比较检查元组是否相等时,它返回 false。 有什么办法可以获得想要的结果吗?

另外,如果我对元组进行一些操作(比如颠倒顺序然后检查),当 k1 和 k2 由不同的 Mul 对象(比如 k1.args = 2*x,y 和 k2.args = 2 *y,x)

我不能在这里使用排序,因为在这种情况下 Add([x+y,z],evaluate=False) 和 Add([x+z,y], evaluate=False) 将是两个不同的表达式。另外,如果我使用 evalaute=True,在这种情况下 Add([x+y],x]) 和 Add([2*x+y]) 将是相同的,这是我不想要的。

请您参考如下方法:

Mul 不知道 x 和 y 都表示标量。矩阵乘法取决于参数的顺序,因此在您的示例中 k1 和 k2 不一定相等。 如果您知道在您的程序中 x 和 y 将始终是标量(或乘法可交换和关联的其他类型的值),则可能有一种方法可以从每个项中分解出常量,比较常量并比较排序列表条款。