我试图在两个“半”正态分布的和上积分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)
关于python - scipy.integrate.quad在大范围内给出错误的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30913664/