在求和中替换 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
我试图在 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