测试是否存在涉及非交换符号的子表达式

时间:2018-01-27 02:15:36

标签: python sympy

我有以下Sympy表达式

expr=b0*d0*u0 - b0*d1*u1 - b1*d0*u1 - b1*d1*u0 + d0*b0*u0 - d0*b1*u1 - d1*b0*u1 - d1*b1*u0

我想知道,例如,产品

d0*u0

在此表达式中。为此,我使用

print(expr.has(d0*u0))

但结果是

False

但是,如果我替换此子表达式而不询问它是否在表达式中,Sympy会毫无问题地执行此操作,例如。

print(expr.subs(d0*u0,x0))
b0*x0 - b0*d1*u1 - b1*d0*u1 - b1*d1*u0 + d0*b0*u0 - d0*b1*u1 - d1*b0*u1 - d1*b1*u0

那么,我怎么知道我想要找到的子表达式是否在表达式中?

1 个答案:

答案 0 :(得分:0)

这似乎是非交换符号的问题,否则expr.has(d0*u0)将返回True。

只要subs可以识别子表达式,就会发生以下情况:

dummy = Dummy()
print(expr.subs(d0*u0, dummy).has(dummy))

即,用虚拟变量替换子表达式,并测试该虚拟变量的存在。

但是,当修复此错误时,SymPy(1.2+)的未来版本将不再需要此解决方法。