使用np.inf进行scipy中四元集成的限制

时间:2016-01-19 12:44:06

标签: python scipy

这是一个结果示例:

我通过高斯分布(mu = 800,sigma = 1)与〜+ -2sigma ppf和从-inf+inf的相同积分进行积分。由于某种原因,第二个积分导致零,但在实践中它应该更准确。

有人可以解释一下,为什么会出现这种异常或者我犯了错误?

代码:

from scipy.integrate import quad
import numpy as np
from scipy.stats import norm

def integrand(x):
    return x*norm.pdf(x, 800, 1)
print quad(integrand, norm.ppf(0.05, 800,1), norm.ppf(0.95, 800,1))
print quad(integrand, -np.inf, np.inf)

(719.9999999999894, 5.913323331834147e-11)
(0.0, 0.0) 
编辑:顺便说一句,当均值很小(例如2)时,它工作正常 - 积分结果非常接近。

2 个答案:

答案 0 :(得分:1)

quad使用启发式算法,使用适应性集成步骤来减少时间计算。功能是平坦的,它会更快。因此,在全球大的时间间隔内,它可能会错过峰值。

您可以通过建议“兴趣点”来帮助quad,以帮助他找到有困难的地区:

>>> quad(integrand,0,1000)
(3.8929062783235445e-32, 7.210678067622767e-32)
>>> quad(integrand,0,1000,points=[750])
(799.9999999999993, 2.0260999142842332e-07)

您可以使用quad关键字查看full_output次调查的结果:

>>>quad(integrand,0,1000,full_output=True)[2]['rlist'].max()
3.8929062783235445e-32

此处quad从不选择被积函数值超过1e-31的点,因此它为
推断该函数无处不在。

答案 1 :(得分:0)

似乎这种行为是预期的。

当积分极限如此巨大时 - 从-inf到inf,quad很难找到800左右的相对较小的凹凸,因此积分的结果将为零。

当mean很小时它起作用的原因是因为第一个分割quad在给定范围的中间做零,所以当mean很小时,integral将在第一次分割时找到正值。 (可能它使用某种梯形积分,我不确定)。因此,解决这个问题的方法是:或者给出实数的积分限制(使我们的搜索空间小得多)或者确保其中一个分裂将在范围内找到正值。(例如,确保均值在零附近)。