scipy.integrate.quad 在大范围内给出了错误的结果



我正在尝试对两个"半"正态分布的总和进行积分。 当我尝试在小范围内积分时,scipy.integrate.quad工作正常,但当我对大范围进行积分时返回 0。代码如下:

mu1 = 0
mu2 = 0
std1 = 1
std2 = 1
def integral_fun(x):
    nor1 = 0.5 * ((1 / (np.sqrt(2 * np.pi) * std1)) * (np.e ** ((-(x-mu1) ** 2) / (2 * std1 **2))))
    nor2 = 0.5 * ((1 / (np.sqrt(2 * np.pi) * std2)) * (np.e ** ((-(x-mu2) ** 2) / (2 * std2 **2))))
    return nor1 + nor2

integrate.quad(integral_fun, -5, 5)
Out[54]: (0.9999994266968564, 8.668320228277793e-10)
integrate.quad(integral_fun, -10, 10)
Out[55]: (1.0000000000000002, 8.671029607900576e-10)
integrate.quad(integral_fun, -100000, 100000)
Out[56]: (0.0, 0.0)

为什么会这样?

这里的原因是你的函数只在积分区域的非常小的区域中非常强地达到峰值,而在其他任何地方实际上为零,quad永远不会找到这个峰值,因此只能看到积分为零。

由于在这种情况下,您知道峰的位置,因此拆分积分的极限是合理的,以便分别考虑峰周围的区域。

为此,您可以以一种稍微混蛋的方式使用 points 参数来迫使quad单独考虑峰值。

In [3]: integrate.quad(integral_fun, -100000, 100000, points=[-10,10])
Out[3]: (1.0000000000000002, 8.671029607900576e-10)

相关内容

  • 没有找到相关文章

最新更新