Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用scipy在DBLQUARD积分中获得的误差的含义是什么?_Python_Scipy_Integration - Fatal编程技术网

Python 使用scipy在DBLQUARD积分中获得的误差的含义是什么?

Python 使用scipy在DBLQUARD积分中获得的误差的含义是什么?,python,scipy,integration,Python,Scipy,Integration,我想知道不同Python集成例程(例如dblquad)给出的错误的含义。因为我们不知道确切的时间 积分值,如何计算误差估计值?参考资料是什么?在我的一些计算中,我发现增加积分极限会使误差达到极高的值。因为这只是对误差的估计,所以依赖这样的结果是否明智?简短回答 依靠这样的结果是否明智 在大多数情况下,是的。但是,如果您认为集成例程的行为异常,并且您不信任其输出,请尝试改变方法:例如,将集成区域划分为多个部分,分别对每个部分进行集成,然后查看结果是否相加 解释 在数值积分中,通过使用两种方法计算积

我想知道不同Python集成例程(例如dblquad)给出的错误的含义。因为我们不知道确切的时间 积分值,如何计算误差估计值?参考资料是什么?在我的一些计算中,我发现增加积分极限会使误差达到极高的值。因为这只是对误差的估计,所以依赖这样的结果是否明智?

简短回答 依靠这样的结果是否明智

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

解释 在数值积分中,通过使用两种方法计算积分(或使用两个步长的相同方法)并考虑结果之间的差异来估计误差。我们发现的SciPy的四组程序

abserr = dabs((resk-resg)*hlgth)
其中resg是10点高斯公式的结果,resk是21点克朗罗德公式的结果。有关这些的数学含义,请参阅维基百科文章。(hlgth
hlgth
是积分长度的一半;此处的长度是由于缩放。)

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

abserr = resasc*(0.2d+03*abserr/resasc)**1.5d+00)
这正是维基百科文章所说的:

建议的误差估计值为(200*|高斯-克朗罗德|)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附近局部化,积分间隔为[-1001000],这要大得多。
quad
算法没有在任何具有较大值的点对函数进行采样,因此它的思想是,它几乎处处为零。

感谢您解释和引用abserr公式。我的被积函数是非常复杂的,比如说,在域[0,5e9](0-inf的二重积分)中对40k点进行计算。其中5e9是无穷大的替代。我得到的错误可能高达1e6/1e11。这就是为什么我想知道它是否可靠。我没有得到任何溢出错误,但是我越是增加限制(比如说5e11),错误就越高(从1e6开始为1e11)。请注意应该非常高的整数值,比如1e21,错误看起来很小(1e6/1e11)。您认为在这种情况下,错误可以吗?集成的极限非常大,这可能是一个问题;我怀疑你得到的数字是假的。我在回答中列举了一个发生这种事情的例子。据我所知,你的积分可能是发散的。如果不是,变量的改变可能会有帮助(也许极坐标会更好?)。或者,一种并矢方法:在大小为2^k的区域上积分不同的k值;比较结果。这不是一个我可以在评论中解决的问题。谢谢你的例子和你的评论。我明白你的意思。我将尽可能精确地指定集成领域。积分已经在极坐标中。我没有使用并矢方法,但我会检查它。如果它已经在极坐标中,则并矢分解很方便:在0范围内积分