为什么当以非常小的方差积分简单的高斯pdf时,四边形会返回零?

时间:2016-10-19 16:47:39

标签: scipy

当sigma2很大时,积分给出了正确的答案。但是当将sigma2减少到1e-8或更低时,它会返回0.任何想法如何解决问题?

我检查了Matlab,无论sigma2有多小,它都能给出正确的答案。谢谢!

quad(lambda x:1 / sqrt(2 * pi * sigma2)* exp(-x ** 2 /(2 * sigma2)), - 10,10)

1 个答案:

答案 0 :(得分:0)

简短回答

使用可选参数points帮助积分器找到高斯的峰值:

quad(lambda x: 1/sqrt(2*pi*sigma2)*exp(-x**2/(2*sigma2)), -10, 10, points=[-10*sqrt(sigma2), 10*sqrt(sigma2)])

即使sigma2 = 1e-100,输出也是准确的。

points的含义是表示函数行为的变化:从0(出于所有实际目的)它转变并在与平均值的几个标准偏差内形成一个非常尖锐的峰值。

更简单的方法是简单地用-10*sqrt(sigma2), 10*sqrt(sigma2)替换积分间隔,​​但如果积分涉及除高斯之外的其他项,则可能不是您想要的。

解释

问题在于,当高斯峰非常薄(例如,在长度为20的区间内宽度为0.001),并且整合例程可能永远不会看到它。集成商通常善于适应他们给出的功能的功能,但他们无法适应他们看不到的功能

MATLAB quad在这个例子中的良好表现主要是运气:它使用自适应Simpson方法,该方法涉及在积分间隔的中点精确地采样函数。如果给它一个非对称区间,如(-10,11),它的表现比Scipy的quad差得多。这是一个比较(使用我的MATLAB副本,即R2013a):

  • quad(...,-10,10)始终返回1
  • quad(...,-10,11)sigma2=0.1返回1,而sigma2=0.01更小则错误。
  • scipy.integrate.quad(..., -10, 10)返回1到1e-4
  • scipy.integrate.quad(..., -10, 11)返回1到1e-3
  • MATLAB的integral(...)返回1到1e-5。区间是(-10,10)还是(-10,11)对它没有影响。

值得一提的是MATLAB's quad is deprecated,并且MathWorks建议使用integral,正如您所看到的那样,如果不涉及运气,可以做得更好。

MATLAB的integral和SciPy的quad之间的性能差异并不显着;对于强定位高斯(相对于积分间隔),两者都需要帮助定位峰值。帮助的格式为points参数scipy.integrate.quadWayPoints integral参数。