使用scipy在dblquad集成中获得的错误是什么意思?

时间:2017-01-15 14:54:01

标签: python scipy integration

我想知道不同Python集成例程给出的错误的含义,例如: dblquad。因为我们不确切知道 积分值,如何计算误差估计值?参考是什么?在我的一些计算中,我看到增加积分的极限会将误差带到极高的值。由于它只是对误差的估计,依靠这样的结果是否可取?

1 个答案:

答案 0 :(得分:3)

简短回答

  

依靠这样的结果是否可取?

在大多数情况下,是的。但是如果您认为集成例程行为异常并且您不信任其输出,请尝试更改方法:例如,将集成区域划分为多个部分,分别对每个部分进行集成,并查看结果是否添加起来。

解释

在数值积分中,通过使用两种方法计算积分(或使用两种步长的相同方法)并考虑结果之间的差异来估计误差。我们发现的Deep within Fortran source SciPy的quadpack例程

abserr = dabs((resk-resg)*hlgth)

其中resg是10点高斯公式的结果,而resk是21点Kronrod公式的结果。有关这些的数学含义,请参阅维基百科文章Gauss–Kronrod quadrature formula。 (hlgth是积分积分长度的一半;长度在这里是由于缩放。)

实际上,我引用的公式不是最终的误差估计,它是一个非常粗略的第一种方法。两行之后我们看到了

abserr = resasc*(0.2d+03*abserr/resasc)**1.5d+00)

这正是维基百科文章所述:

  

建议的误差估计是(200 * |高斯 - kronrod |) 1.5

绝对误差的这种估计不是保证来约束计算积分和实际积分之间的差异(后者是未知的)。 "推荐"估计倾向于在实践中起作用,并且指数1.5(方法的收敛顺序)有一些数学证明,但我们永远不知道它是否真的涵盖了实际误差。

毕竟,该功能仅在其域内的有限多个点进行评估。据我们所知,在这些点上可能会出现0,而在其他地方可能会出现一些巨大的问题,即集成例程看不到的地方。

实施例

这是一个看起来很简单的函数的组成部分,它被错误地评估:

from scipy.integrate import quad
import numpy as np
quad(lambda x: np.exp(-x**2), -1e2, 1e3)

返回(4.176612573788305e-60, 7.896357364711954e-60)。实际积分约为1.77(pi的平方根)。误差估计8e-60完全错误,值4e-60也是如此。原因是该函数位于0附近,并且积分间隔为[-100,1000],这要大得多。 quad算法没有碰巧在具有相当大值的任何点处对函数进行采样,因此它继续认为它到处都是零。