python中的函数“ integrate.quad”和R中的函数“ integral”,“ integrate”给出错误的结果

Ye Tian

我需要评估几个积分,并且正在使用normal(0,1)密度进行测试。

在python中

import scipy.integrate as integrate
import scipy.stats
import numpy as np

def integrand(x):
    return scipy.stats.norm(0, 1).pdf(x)

print integrate.quad(integrand, -float('inf'), 0)
print integrate.quad(integrand,-np.inf,100)

(0.4999999999999999,5.089095674629994e-09)

(0.0,0.0)

我对计算机为范围(-inf,0)正确计算积分但完全错过了(-inf,100)(应接近1)这一事实感到非常困惑。因此,我在R中尝试了以下方法

integrate(dnorm,-Inf,0)

0.5,绝对误差<4.7e-05

integrate(dnorm,-Inf,100,abs.tol=0L)

0,绝对误差<0

library(pracma)
integral(dnorm,-Inf,0)

[1] 0.5

integral(dnorm,-Inf,100,abstol=0)

[1] 0

到底是怎么回事?我应该使用哪种自适应方法?

贾里德·高根(Jared Goguen)

查找QAGI和QAGS算法,似乎正在发生以下情况:

  1. 域xε(-INF,b]上正在从吨由变换X = B-(1-T)/ T,使得积分可以在tε(0,1]进行评价。参见规格映射这里

  2. 自适应积分算法被用来计算积分。传递limit=1给您的scipy代码将显示消息“已达到最大细分数(1)”。传递limit=2不会产生此消息。这表明在算法的第4步中,积分Q的估计值和误差ε的估计值相等。

  3. 这大概是因为估计中没有使用重要点。在tϵ(0,1]的间隔中使用21个均匀间隔的点会产生x值,范围从80至100(大约),所有这些值都非常接近于0。此页面,但大概可以达到类似的结果。

因此,总而言之,从(-inf,100]到(0,1]的映射使对积分的估计中采样的值向x = 100的端点倾斜。由于正态分布pdf实际上为零,该算法不知道它缺少x = 0附近分布不为零的区域,因此它从未细分以提高准确性。

而且,scipy并且R使用相同的算法,因此它们产生相同的结果是有意义的。

如果从-100到100进行积分,则中点0将是一个评估点,这将使算法按预期运行。但是,如果从-1000到100进行积分,则该算法将再次错过任何有效点,最终得到0的整数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档