渐近数组上的求和
问题描述
我想用i
和j
这两个指数对Array
(称为arr
)求和。对arr[i]
求和得到一个整数,如In [4]
所示。但是,对arr[j]
求和不会得到一个数字(请参见下面的In [5]
)。为什么会这样?
In [1]: from sympy import *
In [2]: i, j = symbols("i j", integer=True)
In [3]: arr = Array([1, 2])
In [4]: summation(
...: arr[i],
...: (j, 0, i), (i, 0, len(arr)-1)
...: )
Out[4]: 5
In [5]: summation(
...: arr[j],
...: (j, 0, i), (i, 0, len(arr)-1)
...: )
Out[5]: Sum([1, 2][j], (j, 0, i), (i, 0, 1))
解决方案
如果出现以下情况,symPy将计算总和
- 求和数和的限制都是明确的;或者
- 它可以根据求和的公式找到求和的符号表达式。
嵌套求和是从左到右执行的。在第一版中,
summation(arr[i], (j, 0, i))
属于第2项:由于被和数不依赖于索引j
,因此求和的值象征性地等于(i + 1)*arr[i]
。则外和变为
summation((i + 1)*arr[i], (i, 0, len(arr)-1))
这属于第1项:求和和限制都是显式的。
但在第二个版本中
summation(arr[j], (j, 0, i))
既不适合1也不适合2。被加数依赖于j,我们没有关于它的任何公式(它只是一些数字[1,2]),和和求和的上限是象征性的。SymPy与这样的金额没有任何关系,因此它仍未完成。因此,由于未完成内部求和,因此外和不会到达任何位置。
解决方法
在第二种情况下,用Python sum替换外和会显式计算内和,因此会对其求值。
>>> sum([summation(arr[j], (j, 0, i)) for i in range(len(arr))])
4
当然,这并不真正使用SymPy的符号功能:内部和也可以是Python的sum
。
相关文章