在一个求和中替换IndexedBase

时间:2017-01-21 23:05:29

标签: sympy substitution

我正试图在一个总结中替换一个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,我如何更改代码以确保它能够实现?

2 个答案:

答案 0 :(得分:2)

它不起作用,因为 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

答案 1 :(得分:0)

如果您使用replace method代替:

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

另见this answer