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是真的,因为表达式在您描述的意义上是相同的。你知道吗
如果要开始使用表达式而不是函数,则可以使用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)])
与所用符号无关的表示是函数。例如
定义一个未绑定到x和y的函数,它们除了作为占位符之外不存在。(这是一个Python函数;也可以定义SymPy函数对象,但区别在这里并不重要。)
如果有人问你
(2*x+y)**2
是否与a**2 + 4*b*(a+b)
相同,你会怎么做?我所知道的唯一方法是将两者简化,并尝试在所有可能的排列下匹配变量。下面的代码就是这么做的。你知道吗现在
identical
是真的,因为表达式在您描述的意义上是相同的。你知道吗如果要开始使用表达式而不是函数,则可以使用
subs
:再详细说明一下:
我对排列法不太满意。所以,我继续挖掘,我注意到SymPy生成了一个树图来表示符号表达式。树的结构就是表达的结构,它独立于符号。但是,一旦有了相应的图,就需要确定它们是否同构(即,如果两个表达式相同),即very non-trivial problem。你知道吗
相关问题 更多 >
编程相关推荐