用求和项计算公式

时间:2014-11-30 02:03:25

标签: sympy

我是使用sympy库的新手,在定义公式后我无法计算平均值:

import sympy as sp
import numpy as np
sp.init_printing()

mu, N, i, x_i = sp.symbols( 'mu N i x_i' )
mu_form = sp.Eq( mu , (1/N) * sp.Sum( x_i, (i, 1, N) ) )

现在我想为x_i定义一个值列表,以实际计算平均值。我尝试过这种方式,但它似乎无法正常工作:

x_i_val = (1, 1, 3, 3, 2, 2, 2, 2)
mu_val = mu_form.subs( [(x_i, x_i_val), (N, 8)] )

我对mean并不感兴趣,我想了解计算这样一个公式结果的方法,并在里面加总。

在找到可用教程和Google搜索中的最小示例时,我没有运气。

1 个答案:

答案 0 :(得分:2)

符号x_i与符号i无关。它打印有下标,但这只是一个打印惯例。

更好的选择是IndexedBase。来自https://github.com/sympy/sympy/pull/8065的修复程序使这更容易,但是现在,您可以执行以下操作:

In [13]: x = IndexedBase('x')

In [14]: mu_form = sp.Eq( mu , (1/N) * sp.Sum( x[i], (i, 1, N) ) )

In [15]: mu_form = mu_form.subs(N, 8).doit()

这会扩大总和,以便您可以替换术语:

In [16]: mu_form
Out[16]:
    x[1]   x[2]   x[3]   x[4]   x[5]   x[6]   x[7]   x[8]
μ = ──── + ──── + ──── + ──── + ──── + ──── + ──── + ────
     8      8      8      8      8      8      8      8

In [20]: mu_form = mu_form.subs({x[i]: x_i_val[i - 1] for i in range(1, 9)})

In [21]: mu_form
Out[21]: μ = 2

顺便说一句,如果你将索引设置为0而不是1,那么处理事情要容易得多,因为这就是Python所做的事情。