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