gpt4 book ai didi

python - 如何用Python(Sympy)实现一个函数,在Wolfram Mathematica中实现与 '_'相同的替换规则?

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

在 Wolfram Mathematica 中,我可以定义命名模式,其中 _(称为 Blank)匹配任何表达式,然后在 replacement rule 中使用匹配.

一个例子:

    testexpr = p1[MM]*p2[NN] + p1[XX]*p2[MM] + p1[XX]^2;

FunTest[expr_] := Expand[expr] /. {(p1[l1_]*p2[l2_]) -> FF1[l1]*FF2[l2],
p1[l1_]^n_ -> 0, p2[l1_]^n_ -> 0}

FunTest[testexpr]

结果是FF1[XX] FF2[MM] + FF1[MM] FF2[NN]

但是,我不知道如何在 Python 中使用 sympy 来做同样的事情。

    import sympy as sp

p1 = sp.IndexedBase("p1")
p2 = sp.IndexedBase("p2")

FF1 = sp.IndexedBase("FF1")
FF2 = sp.IndexedBase("FF2")

MM,NN,XX=sp.symbols('MM NN XX')
SSlist=[MM,NN,XX]

testexpr=p1[MM]*p2[NN] + p1[XX]*p2[MM] + p1[XX]**2

def FunTest(expr):
expr=expr.subs([(p1[SS]*p2[SS2],FF1[SS]*FF2[SS2]) for SS in SSlist
for SS2 in SSlist]+[(p1[SS]**2,0) for SS in SSlist]+[(p2[SS]**2,0)
for SS in SSlist],simultaneous=True)
return expr

rest=FunTest(testexpr)
print(rest)

所以结果也是 FF1[MM]*FF2[NN] + FF1[XX]*FF2[MM]

但我想知道是否有一种简单的方法可以使它更通用,就像在 Wolfram Mathematica 中一样。如果 SSlist 是一个大列表并且有很多不同的变量,那么我的解决方案将很难实现。

I wonder whether there is an easy way without writing a loop over the whole list, for SS in SSlist, as in Mathematica. Can someone familiar with sympy give me any hints?

非常感谢!

最佳答案

我找到了一个解决我自己问题的方法。结果如我所愿。我没有使用 subs(),而是使用了 wild 运算符和 replace()。

   import sympy as sp
p1 = sp.IndexedBase("p1")
p2 = sp.IndexedBase("p2")

FF1 = sp.IndexedBase("FF1")
FF2 = sp.IndexedBase("FF2")

MM,NN,XX=sp.symbols('MM NN XX')
SSlist=[MM,NN,XX]

SS = sp.Wild('SS')
SS1 = sp.Wild('SS1')

testexpr=p1[MM]*p2[NN] + p1[XX]*p2[MM] + p1[XX]**2

replacements = {p1[SS]*p2[SS1] : FF1[SS]*FF2[SS1], p1[SS]**2: 0, p2[SS]**2 : 0}

def replaceall(expr, repls):
for i, j in repls.items():
expr = expr.replace(i, j, map=False, simultaneous=True, exact=False)
return expr

rest=replaceall(testexpr,replacements)
print(rest)

结果和我之前做的完全一样:

  FF1[MM]*FF2[NN] + FF1[XX]*FF2[MM]

我想知道的一件事是,由于 for 循环,当有很多符号时这种效率很高。看起来这两种方法差不多,只是我最近找到的一种看起来更简洁。

我想知道是否有更通用的方法来完成 Wolfram Mathematica 所做的事情。

欢迎任何意见。谢谢!

关于python - 如何用Python(Sympy)实现一个函数,在Wolfram Mathematica中实现与 '_'相同的替换规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53687281/

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