gpt4 book ai didi

python - SymPy 中表达式的抽象表示

转载 作者:太空宇宙 更新时间:2023-11-03 14:53:42 27 4
gpt4 key购买 nike

考虑这两个等式:

x^y + xy

a^b + ab

我希望能够将这些识别为相同的符号表达式。 “简化”行不通。 “Subs”(用 a 代替 x 等)并不总是有效,因为变量的顺序可能会改变等。

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

最佳答案

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

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

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

如果有人问你 (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 为真,因为表达式在您描述的意义上是相同的。

如果您有表达式而不是函数作为开始,则可以使用 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)])

关于python - SymPy 中表达式的抽象表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44272916/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com