SymPy中表达式的抽象表示

时间:2017-05-30 22:31:01

标签: python sympy

考虑这两个方程:

x ^ y + xy

a ^ b + ab

我希望能够将这些视为相同的符号表达。 "简化"不会工作。 "替补" (代替x代替等)不会因为变量的顺序可能发生变化等原因而无法正常工作。

那么,有没有办法获得一个独立于所用符号的SymPy表达式的抽象表示?

2 个答案:

答案 0 :(得分:4)

与所使用的符号无关的表示是函数。例如,

f1 = lambda x, y: (2*x+y)**2 

定义了一个与x和y无关的函数,除了作为此函数内部的占位符之外,它们不存在。 (这是一个Python函数;也可以定义一个SymPy函数对象,但这里的区别并不重要。)

如果有人问你(2*x+y)**2是否与a**2 + 4*b*(a+b)“相同”,你会怎么做?我知道的唯一方法是简化两者并尝试在所有可能的排列下匹配变量。这是以下代码的作用。

from sympy import *
from itertools import permutations
f1 = lambda x, y: (2*x+y)**2
f2 = lambda a, b: a**2 + 4*b*(a+b)
vars = symbols("v0:2")    # auxiliary variables to plug in f1 and f2
identical = any([simplify(f1(*vars) - f2(*p)) == 0 for p in permutations(vars)])

现在identical为True,因为表达式在您描述的意义上是相同的。

如果你有表达式而不是函数,那么可以使用subs代替:

x, y, a, b = symbols("x y a b")
expr1 = (2*x+y)**2
expr2 = a**2 + 4*b*(a+b)
vars = symbols("v0:2")
identical = any([simplify(expr1.subs(zip((x, y), vars)) - expr2.subs(zip((a, b), p))) for p in permutations(vars)]) 

答案 1 :(得分:0)

只是详细说明一下:

我对置换方法不太满意。所以,我一直在挖掘,我注意到SymPy会生成一个树形图来表示符号表达式。树的结构是表达式的结构,它独立于符号。但是,一旦有了相应的图形,就需要确定它们是否是同构的(即两个表达式是否相同),即very non-trivial problem