SymPy Expr.subs()方法在Sum中不起作用



我正试图使用sympy从PDE开始,象征性地操纵它以获得有限元公式,然后应用代码生成来获得用于在应用程序中应用结果的代码片段。

因此,我想从导数对象开始,但在某个时候用一个简单的函数来代替这些导数,因为基函数和这些基函数的导数将由代码存储。在简单的情况下,这是有效的:

>>> from sympy import *
>>> init_printing()
>>> i = Idx('i')
>>> x = Symbol('x')
>>> phi = Function('phi')(i,x)
>>> expr = Derivative(phi,x) + phi
>>> expr
d
φ(i, x) + ──(φ(i, x))
dx
>>> phi_x = Function('phi_x')(i,x)
>>> expr.subs(Derivative(phi,x), phi_x)
φ(i, x) + φₓ(i, x)

但是,如果导数出现在求和范围内,则替换失败:

>>> N = Symbol('N', integer=True)
>>> expr = summation(Derivative(phi,x) + phi, (i,0,N-1))
>>> expr
N - 1
____
╲
╲   ⎛          d          ⎞
╲  ⎜φ(i, x) + ──(φ(i, x))⎟
╱  ⎝          dx         ⎠
╱
╱
‾‾‾‾
i = 0
>>> expr.subs(Derivative(phi,x), phi_x)
N - 1
____
╲
╲   ⎛          d          ⎞
╲  ⎜φ(i, x) + ──(φ(i, x))⎟
╱  ⎝          dx         ⎠
╱
╱
‾‾‾‾
i = 0

有人知道为什么会这样,或者可能有什么变通办法吗?TIA!

我不确定为什么这不起作用(根据表达式语义应该是这样(,但这里有一个解决方法:

from sympy import *
def substitution_in_sum(expr,old_sub_expr,new_sub_expr):
if expr == old_sub_expr:
return new_sub_expr
elif expr.args==():
return expr
else:
result_list = []
for arg in expr.args:
result_list.append(substitution_in_sum(arg,old_sub_expr,new_sub_expr))
return expr.func(*tuple(result_list))

最新更新