R中集成函数的精度问题

时间:2015-01-06 13:50:06

标签: r precision integrate

在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。

我想知道为什么会出现这些精确问题,是否有任何方法可以避免这种问题?

1 个答案:

答案 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)。