python中的“integrate.quad”函数和R中的“integral”,“integration”会产生错误的结果

时间:2016-01-26 19:47:40

标签: python r integrate

我需要评估几个积分,我使用普通(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,绝对错误&lt; 0

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

[1] 0.5

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

[1] 0

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

1 个答案:

答案 0 :(得分:2)

查看QAGI和QAGS算法,似乎发生了以下情况:

  1. 域xε(-inf,b)通过变换x = b-(1-t)/ t从t映射,因此可以在t∈(0,1)上评估积分。规格here

  2. adaptive quadrature algorithm用于评估积分。将limit=1传递到您的scipy代码会产生消息“已实现最大细分数(1)。”传递limit=2不会产生此消息。这表明在算法的第4步中,积分Q的估计值和误差估计值ε相等。

  3. 这可能是因为估计中没有使用重要点。在t∈(0,1)的区间中使用21个均匀间隔的点产生的x值范围为80-100(大约)。所有这些值都非常接近0.算法中使用的值不是均匀的this page,但可能会取得类似的结果。

  4. 因此,总之,从(-inf,100)到(0,1)的映射将积分估计中采样的值偏向x = 100的终点。由于正态分布pdf是在这里实际上为零,算法不知道它缺少x = 0附近的区域,其中分布是非零的,所以它永远不会细分以提高准确性。

    此外,scipyR使用相同的算法,因此它们产生相同的结果是有意义的。

    如果从-100到100进行积分,则中点0将是一个评估点,它允许算法按预期运行。但是,如果你从-1000到100进行整合,算法会再次错过任何重要的点,你最终会得到0的积分。