在求和中替换 IndexedBase

Substitution of IndexedBase inside a summation

我试图在 sympy 的求和中替换 IndexedBase。在求和之外它有效,但在内部我得到了没有替换的表达式:

In [125]: (f, n) = sympy.symbols("f n")

In [126]: foo = sympy.IndexedBase(f)[n]

In [127]: foo.subs(foo, 1)
Out[127]: 1

In [128]: sympy.Sum(foo, (n, 0, 5)).subs(foo, 1)
Out[128]: 
  5       
 ___      
 ╲        
  ╲   f[n]
  ╱       
 ╱        
 ‾‾‾      
n = 0     

为什么最后一步没有将 f[n] 替换为 1,我需要如何更改我的代码以确保它可以?

如果您改用 replace method,它会起作用:

In [129]: sympy.Sum(foo, (n, 0, 5)).replace(foo, 1)
Out[129]: 
  5    
 ___   
 ╲     
  ╲   1
  ╱    
 ╱     
 ‾‾‾   
n = 0  

另见

它不起作用,因为 n 是一个虚拟变量,它会改变求和的值。也就是说,.subs( ) 应该为您提供与应用于扩展求和时相同的值:

In [7]: sympy.Sum(foo, (n, 0, 5)).doit()
Out[7]: f[0] + f[1] + f[2] + f[3] + f[4] + f[5]

在此表达式中不再有 f[n],因为它已被相应的数值所取代。替换无效:

In [8]: sympy.Sum(foo, (n, 0, 5)).doit().subs(foo, 1)
Out[8]: f[0] + f[1] + f[2] + f[3] + f[4] + f[5]

因此,.subs() 将忽略相加的变量匹配(在本例中为 n)。

另一方面,

replace( ) 不关心值的一致性并替换匹配的表达式:

In [9]: sympy.Sum(foo, (n, 0, 5)).replace(foo, 1)
Out[9]: 
  5    
 ___   
 ╲     
  ╲   1
  ╱    
 ╱     
 ‾‾‾   
n = 0  

当然,结果值现在不同了:

In [10]: sympy.Sum(foo, (n, 0, 5)).replace(foo, 1).doit()
Out[10]: 6