Как реализовать функцию с Python (Sympy), реализуя то же самое, что и '_', и правило замены в Wolfram Mathematica? - PullRequest
0 голосов
/ 09 декабря 2018

В Wolfram Mathematica я могу определить именованные шаблоны, где _ (называемый Blank ) соответствует любому выражению, а затем использовать совпадение в правиле замены .

* 1007.* Пример:
    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]

Однако я не знаю, как использовать sympy в Python, чтобы сделать то же самое.

    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 представляет собой большой список и в нем много разных переменных, это будет трудно реализовать с помощью моего решения.

Интересно, есть ли простой способ без записи цикла по всему списку, для SS в SSlist , как в Mathematica.Может кто-нибудь, знакомый с sympy, дать мне какие-нибудь подсказки?

Большое спасибо!

1 Ответ

0 голосов
/ 14 декабря 2018

Я нашел одно решение для моего собственного вопроса.Это работает, как я хочу.Вместо использования 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.

Любые комментарии приветствуются.Спасибо!

...