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

时间:2018-12-12 21:29:21

标签: sympy substitution

我试图使用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!

1 个答案:

答案 0 :(得分:1)

我不确定为什么这种方法不起作用(根据表达式语义应该如此),但这是一种解决方法:

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))