当sigma2很大时,积分给出了正确的答案。但是当将sigma2减少到1e-8或更低时,它会返回0.任何想法如何解决问题?
我检查了Matlab,无论sigma2有多小,它都能给出正确的答案。谢谢!
quad(lambda x:1 / sqrt(2 * pi * sigma2)* exp(-x ** 2 /(2 * sigma2)), - 10,10)
答案 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 integral(...)
返回1到1e-5。区间是(-10,10)还是(-10,11)对它没有影响。值得一提的是MATLAB's quad
is deprecated,并且MathWorks建议使用integral
,正如您所看到的那样,如果不涉及运气,可以做得更好。
MATLAB的integral
和SciPy的quad
之间的性能差异并不显着;对于强定位高斯(相对于积分间隔),两者都需要帮助定位峰值。帮助的格式为points
参数scipy.integrate.quad
或WayPoints
integral
参数。