Sympy собирать неопределенные функции - PullRequest
1 голос
/ 05 марта 2020

У меня есть выражение в sympy, представляющее собой линейную комбинацию вычисляемой функции, f. Схематически

expr  = Sum_{m,n} c_{m,n} f(x+a_m,y+a_n)

, где c_{m,n} - коэффициент, зависящий от переменных x,y. Очень простой пример:

import sympy as sp

x, y = sp.symbols("x, y")
f = sp.Function("f")(x,y)

expr = 0
for i in range(0,3):
    expr += (x-i)* f.subs({x: x+2*i, y: y+3*i})

В моем действительном коде expr является результатом длинной последовательности сумм, и функция g не упрощается, как здесь. Есть ли эффективный способ группировки функций с разными аргументами, как collect(expr) для многочленов? Я хочу получить структурированный список:

In: someFunction(...)
Out: [..., [c_{m,n}, x+a_m, y+a_n ], ...]

в приведенном выше примере

In: someFunction(expr)
Out: [[x, x, y], [x - 1, x + 2, y + 3], [x - 2, x + 4, y + 6]]

1 Ответ

1 голос
/ 05 марта 2020

Я не уверен, что это именно то, что вы хотите, но вы можете использовать сопоставление с шаблоном:

In [27]: expr                                                                                                                                  
Out[27]: x⋅f(x, y) + (x - 2)⋅f(x + 4, y + 6) + (x - 1)⋅f(x + 2, y + 3)

In [28]: a, b, c = symbols('a, b, c', cls=Wild)                                                                                                

In [29]: pattern = a*f(b, c)                                                                                                                   

In [30]: for term in Add.make_args(expr): 
    ...:     print(term.match(pattern)) 
    ...:                                                                                                                                       
{b_: x, c_: y, a_: x}
{b_: x + 2, c_: y + 3, a_: x - 1}
{b_: x + 4, c_: y + 6, a_: x - 2}
...