scipy.integrate.

nsum#

scipy.integrate.nsum(f, a, b, *, step=1, args=(), log=False, maxterms=1048576, tolerances=None)[源代码]#

计算收敛的有限或无限级数。

对于有限的 ab,这将计算

f(a + np.arange(n)*step).sum()

其中 n = int((b - a) / step) + 1,其中 f 是平滑的、正的和单峰的。总和中的项数可能非常大或无限,在这种情况下,直接计算部分和,并使用积分逼近余数。

参数:
f可调用对象

计算要相加的项的函数。签名必须是

f(x: ndarray, *args) -> ndarray

其中 x 的每个元素都是有限实数,args 是一个元组,可能包含与 x 可广播的任意数量的数组。

f 必须是逐元素函数:对于所有索引 i,每个元素 f(x)[i] 必须等于 f(x[i])。它不能改变数组 xargs 中的数组,并且它必须在参数为 NaN 时返回 NaN。

f 必须表示在 ab 之间所有实数定义的 x 的平滑、正、单峰函数。

a, b浮点型类数组

求和项的实数下限和上限。必须可广播。 a 的每个元素必须小于 b 中对应的元素。

step浮点型类数组

求和项之间的有限、正实数步长。必须与 ab 可广播。 请注意,总和中包含的项数将为 floor((b - a) / step) + 1;请相应地调整 b 以确保如果需要,包含 f(b)

args元组类数组,可选

要传递给 f 的其他位置参数。必须是与 abstep 可广播的数组。 如果要相加的可调用对象需要与 abstep 不可广播的参数,请用 f 包裹该可调用对象,使得 f 仅接受 x 和可广播的 *args。请参阅示例。

log布尔值,默认值:False

设置为 True 表示 f 返回项的对数,并且 atolrtol 表示为绝对误差和相对误差的对数。 在这种情况下,结果对象将包含总和和误差的对数。 这对于数值下溢或上溢会导致不准确的被加数很有用。

maxterms整数,默认值:2**20

直接求和的最大项数。可能会执行额外的函数评估以进行输入验证和积分评估。

atol, rtol浮点数,可选

绝对终止容差(默认值:0)和相对终止容差(默认值:eps**0.5,其中 eps 是结果数据类型的精度)。如果 log 为 False,则必须为非负且有限;如果 log 为 True,则必须表示为非负且有限数的对数。

返回:
res_RichResult

一个类似于 scipy.optimize.OptimizeResult 实例的对象,具有以下属性。(这些描述的编写方式就好像这些值是标量一样;但是,如果 f 返回一个数组,则输出将是相同形状的数组。)

success布尔值

当算法成功终止时(状态 0)为 True;否则为 False

status整数数组

表示算法退出状态的整数。

  • 0:算法收敛到指定的容差。

  • -1abstep 的元素无效

  • -2:数值积分达到其迭代限制;总和可能发散。

  • -3:遇到非有限值。

  • -4:部分和的最后一项的大小超过容差,因此误差估计超过容差。请考虑增加 maxterms 或放宽 tolerances。或者,可调用对象可能不是单峰的,或者求和限制可能离函数最大值太远。请考虑增加 maxterms 或将总和分成几部分。

sum浮点数数组

总和的估计值。

error浮点数数组

绝对误差的估计值,假设所有项均为非负,函数被精确计算,并且直接求和精确到结果数据类型的精度。

nfev整数数组

评估 f 的点的数量。

另请参阅

mpmath.nsum

注释

对于无限求和实现的方法与无限级数收敛的积分测试相关:为简单起见,假设 step 大小为 1,单调递减函数的总和受以下限制:

\[\int_u^\infty f(x) dx \leq \sum_{k=u}^\infty f(k) \leq \int_u^\infty f(x) dx + f(u)\]

\(a\) 表示 a\(n\) 表示 maxterms\(\epsilon_a\) 表示 atol\(\epsilon_r\) 表示 rtol。该实现首先评估积分 \(S_l=\int_a^\infty f(x) dx\) 作为无限和的下限。然后,它寻找一个值 \(c > a\),使得 \(f(c) < \epsilon_a + S_l \epsilon_r\)(如果存在);否则,令 \(c = a + n\)。然后,无限和近似为

\[\sum_{k=a}^{c-1} f(k) + \int_c^\infty f(x) dx + f(c)/2\]

并且报告的误差为 \(f(c)/2\) 加上数值积分的误差估计。请注意,积分近似可能需要在除了总和中出现的点之外的点评估函数,因此 f 必须是在积分区间内为所有实数定义的连续单调递减函数。但是,由于积分近似的性质,函数在总和中出现的点之间的形状几乎没有影响。如果函数没有自然地扩展到所有实数,请考虑使用线性插值,该插值易于评估并保留单调性。

上述方法针对非单位 step 和有限 b 进行了推广,后者对于直接评估总和来说太大,即 b - a + 1 > maxterms。通过直接对最大值周围的项求和,将其进一步推广到单峰函数。此策略可能会失败

  • 如果左极限是有限的并且最大值离它很远。

  • 如果右极限是有限的并且最大值离它很远。

  • 如果两个极限都是有限的并且最大值离原点很远。

在这些情况下,精度可能较差,并且 nsum 可能会返回状态码 4

尽管可调用对象 f 必须是非负且单峰的,但 nsum 仍可用于评估更一般形式的级数。 例如,要评估交错级数,请传递一个可调用对象,该对象返回相邻项对之间的差值,并相应地调整 step。 请参阅示例。

参考资料

[1]

维基百科。“收敛的积分判别法。” https://en.wikipedia.org/wiki/Integral_test_for_convergence

示例

计算整数平方的倒数的无穷和。

>>> import numpy as np
>>> from scipy.integrate import nsum
>>> res = nsum(lambda k: 1/k**2, 1, np.inf)
>>> ref = np.pi**2/6  # true value
>>> res.error  # estimated error
np.float64(7.448762306416137e-09)
>>> (res.sum - ref)/ref  # true error
np.float64(-1.839871898894426e-13)
>>> res.nfev  # number of points at which callable was evaluated
np.int32(8561)

计算整数的 p 次幂的倒数的无穷和,其中 p 是一个数组。

>>> from scipy import special
>>> p = np.arange(3, 10)
>>> res = nsum(lambda k, p: 1/k**p, 1, np.inf, maxterms=1e3, args=(p,))
>>> ref = special.zeta(p, 1)
>>> np.allclose(res.sum, ref)
True

评估交错调和级数。

>>> res = nsum(lambda x: 1/x - 1/(x+1), 1, np.inf, step=2)
>>> res.sum, res.sum - np.log(2)  # result, difference vs analytical sum
(np.float64(0.6931471805598691), np.float64(-7.616129948928574e-14))