sympy 收集未定义的函数

sympy collect undefined functions

我在 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]]

我不确定这是否完全符合您的要求,但您可以使用模式匹配:

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}