如何用Python(Sympy)实现函数,实现与Wolfram Mathematica中的''uu'和替换规则相同?

2024-09-28 23:45:24 发布

您现在位置:Python中文网/ 问答频道 /正文

在wolframmathematica中,我可以定义命名模式,其中_(称为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中使用sypy来做同样的事情。在

^{pr2}$

所以结果也是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?

非常感谢!在


Tags: inl1nnmmp2xxp1expr
1条回答
网友
1楼 · 发布于 2024-09-28 23:45:24

我找到了一个解决我自己问题的办法。我想怎么办就怎么办。使用wild()而不是subs运算符。在

   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)

结果与我之前的结果完全相同:

^{pr2}$

我想知道的一件事是,由于for循环,当有许多符号时,它是有效的。这两种方法似乎很相似,只是我最近发现的方法看起来更简洁。在

我想知道是否有一种更普遍的方法来做像wolframmathematica那样的事情。在

欢迎发表任何意见。谢谢!在

相关问题 更多 >