一个对称数组的求和

时间:2018-08-07 09:37:48

标签: python sympy

我想使用两个索引Arrayarr来总结一个符号i(称为j)。对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))

1 个答案:

答案 0 :(得分:0)

SymPy将评估总和(如果有)

  1. 求和和求和的限制都是明确的;或
  2. 它可以根据求和公式来找到和的符号表达式。

从左到右执行嵌套求和。在第一个版本中,

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