R中的Integrate函数返回错误

R中的Integrate函数返回错误,r,integral,R,Integral,我有一个函数定义为 tail <- function(x) {585.1961*x^-2.592484} 但是,从1000到Inf和从1000到5000的积分都很好: > integrate(tail, 1000, Inf) 0.006134318 with absolute error < 2.5e-05 > integrate(tail, 1000, 5000) 0.005661634 with absolute error < 4.9e-09 集成(tai

我有一个函数定义为

tail <- function(x) {585.1961*x^-2.592484}
但是,从1000到Inf和从1000到5000的积分都很好:

> integrate(tail, 1000, Inf)
0.006134318 with absolute error < 2.5e-05
> integrate(tail, 1000, 5000)
0.005661634 with absolute error < 4.9e-09
集成(tail,1000,Inf) 0.006134318,绝对误差<2.5e-05 >集成(tail,10005000) 0.005661634,绝对误差<4.9e-09
integrate(tail,5000,Inf)
难道不等于
integrate(tail,1000,Inf)-integrate(tail,1000,5000)
?为什么会产生发散积分?

您的默认公差(
.Machine$double.eps^0.25
)太大,因此我们将其更改为:

> tail <- function(x) {585.1961*x^-2.592484}
> integrate(tail, 5000, Inf,rel.tol =.Machine$double.eps^0.5 )
0.0004727982 with absolute error < 1.5e-09
当然,您可以将公差设置为
.Machine$double.eps
,但这是以时间为代价的:

> library(microbenchmark)
> a<-function(x) for(i in 1:50) integrate(tail, 5000, Inf,rel.tol =.Machine$double.eps^x )
> microbenchmark(a(0.5),a(0.7),a(1))
Unit: milliseconds
   expr      min       lq   median       uq      max neval
 a(0.5) 10.44027 10.97920 11.12981 11.40529 19.70019   100
 a(0.7) 13.02904 13.69813 13.95942 14.89460 23.02422   100
   a(1) 15.14433 15.96499 16.12595 16.38194 26.27847   100
>库(微基准)
>微基准(a(0.5)、a(0.7)、a(1))
单位:毫秒
expr最小lq中值uq最大neval
a(0.5)10.44027 10.97920 11.12981 11.40529 19.70019 100
a(0.7)13.02904 13.69813 13.95942 14.89460 23.02422 100
a(1)15.14433 15.96499 16.12595 16.38194 26.27847 100

例如,时间增加50%左右。

是的,简单的解决方法是更改容差:
integrate(tail,5000,Inf,rel.tol=1*10^-5)
,因为默认值太大。谢谢,这很有效!只是好奇,如何确定rel.tol的值?我是否可以始终为其分配一个较小的数字,例如.Machine$double.eps?
> integrate(tail, 1000, Inf)$val-integrate(tail, 1000, 5000)$val
[1] 0.0004726847
> library(microbenchmark)
> a<-function(x) for(i in 1:50) integrate(tail, 5000, Inf,rel.tol =.Machine$double.eps^x )
> microbenchmark(a(0.5),a(0.7),a(1))
Unit: milliseconds
   expr      min       lq   median       uq      max neval
 a(0.5) 10.44027 10.97920 11.12981 11.40529 19.70019   100
 a(0.7) 13.02904 13.69813 13.95942 14.89460 23.02422   100
   a(1) 15.14433 15.96499 16.12595 16.38194 26.27847   100