繁体   English   中英

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

[英]Limits of quad integration in scipy with np.inf

这里有一个结果示例:

我通过高斯分布(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)时,它工作正常 - 积分结果非常接近。

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

你可以帮助quad的建议“兴趣点”,以帮助他找到困难的地区:

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

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

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

这里quad从不选择被积函数值超过1e-31的点,所以它
推断该函数无处不在。

似乎这种行为是预料之中的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM