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

2024-07-04 05:35:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图对两个半正态分布的和进行积分。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)

为什么会这样?在


Tags: nppisqrtoutintegratefunquad正态分布
1条回答
网友
1楼 · 发布于 2024-07-04 05:35:27

这里的原因是,你的函数只在积分区域的一个很小的区域内达到非常强的峰值,在其他地方都是零,quad永远找不到这个峰值,因此只看到被积函数为零。在

因为在这种情况下,您知道峰值在哪里,所以将积分的极限分开,以便分别考虑峰值周围的区域。在

要做到这一点,您可以使用points参数来强制quad分别考虑峰值。在

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

相关问题 更多 >

    热门问题