【问题标题】:Summation over a sympy Array对 sympy 数组求和
【发布时间】:2018-08-07 09:37:48
【问题描述】:

我想使用两个索引 ij 来总结一个 sympy 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))

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    SymPy 将评估总和,如果有的话

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

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

    summation(arr[i], (j, 0, i))
    

    属于第 2 项:由于 summand 不依赖于索引 j,因此 sum 的计算结果象征性地为 (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 会使内部 sum 显式化,因此会被计算。

    >>> sum([summation(arr[j], (j, 0, i)) for i in range(len(arr))])
    4
    

    当然,这并没有真正使用 SymPy 的符号功能:内部总和也可以是 Python 的 sum

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多