nsum#
- scipy.integrate.nsum(f, a, b, *, step=1, args=(), log=False, maxterms=1048576, tolerances=None)[源代码]#
计算收敛的有限或无限级数。
对于有限的 a 和 b,这将计算
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])
。它不能改变数组x
或args
中的数组,并且它必须在参数为 NaN 时返回 NaN。f 必须表示在 a 和 b 之间所有实数定义的 x 的平滑、正、单峰函数。
- a, b浮点型类数组
求和项的实数下限和上限。必须可广播。 a 的每个元素必须小于 b 中对应的元素。
- step浮点型类数组
求和项之间的有限、正实数步长。必须与 a 和 b 可广播。 请注意,总和中包含的项数将为
floor((b - a) / step)
+ 1;请相应地调整 b 以确保如果需要,包含f(b)
。- args元组类数组,可选
要传递给 f 的其他位置参数。必须是与 a,b 和 step 可广播的数组。 如果要相加的可调用对象需要与 a,b 和 step 不可广播的参数,请用 f 包裹该可调用对象,使得 f 仅接受 x 和可广播的
*args
。请参阅示例。- log布尔值,默认值:False
设置为 True 表示 f 返回项的对数,并且 atol 和 rtol 表示为绝对误差和相对误差的对数。 在这种情况下,结果对象将包含总和和误差的对数。 这对于数值下溢或上溢会导致不准确的被加数很有用。
- 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
:算法收敛到指定的容差。-1
:a、b 或 step 的元素无效-2
:数值积分达到其迭代限制;总和可能发散。-3
:遇到非有限值。-4
:部分和的最后一项的大小超过容差,因此误差估计超过容差。请考虑增加 maxterms 或放宽 tolerances。或者,可调用对象可能不是单峰的,或者求和限制可能离函数最大值太远。请考虑增加 maxterms 或将总和分成几部分。
- sum浮点数数组
总和的估计值。
- error浮点数数组
绝对误差的估计值,假设所有项均为非负,函数被精确计算,并且直接求和精确到结果数据类型的精度。
- nfev整数数组
评估 f 的点的数量。
另请参阅
注释
对于无限求和实现的方法与无限级数收敛的积分测试相关:为简单起见,假设 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))