在R中使用integrate()
函数时,一些精度问题让我感到困惑。例如,我想整合这个功能:
p <- function(x)exp(-x^2)
我选择区间[-1e3,1e3],它给出了正确答案:
> integrate(p, -1e3, 1e3)
1.772454 with absolute error < 7.8e-09
但如果我将间隔扩展为[-1e9,1e9],那就错了:
> integrate(p, -1e9, 1e9)
0 with absolute error < 0
为了不调整间隔,我尝试使用Inf
:
> integrate(p, -Inf, Inf)
1.772454 with absolute error < 4.3e-06
它有效,但很快我发现还有一些其他问题:
> integrate(p, -Inf, -Inf)
1.772454 with absolute error < 4.3e-06
在这种情况下,它无法给出正确答案0。
我想知道为什么会出现这些精确问题,是否有任何方法可以避免这种问题?
答案 0 :(得分:1)
建议您使用Inf
,-Inf
。有趣的是,似乎integrate()
在用作上限时将-Inf
转换为Inf
。 :
> integrate(p, -Inf, -1*.Machine$double.xmax)
0 with absolute error < 0
> integrate(p, -Inf, -2*.Machine$double.xmax)
1.772454 with absolute error < 4.3e-06
这并没有达到我们的预期。让我们尝试将积分分成两部分,第一部分:
> integrate(p, 0, Inf)
0.8862269 with absolute error < 2.2e-06
> integrate(p, 0, 1e100)
0 with absolute error < 0
> integrate(p, 0, 1e2)
0.8862269 with absolute error < 9.9e-11
这似乎与使用Inf
,-Inf
的建议完全一致,但请注意切换标志时会发生什么:
> integrate(p, 0, -Inf)
0.8862269 with absolute error < 2.2e-06
> integrate(p, 0, -1e100)
0 with absolute error < 0
> integrate(p, 0, -1e2)
-0.8862269 with absolute error < 9.9e-11
最后,您可以随时更改容差,细分,但在这种情况下,这不会对您有所帮助。
编辑:正如@Ben指出的,这是一个小错误,因为integrate
检查上限是否有限,而不是Inf
(或-Inf
)。