Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Integrate function in R returns error

Tags:

r

integral

I have a function defined as

tail <- function(x) {585.1961*x^-2.592484}

When I tried to get the integral of it from 5000 to Inf, it returns an error:

> integrate(tail, 5000, Inf)
Error in integrate(tail, 5000, Inf) : the integral is probably divergent

However, integrating from 1000 to Inf and from 1000 to 5000 both worked fine:

> integrate(tail, 1000, Inf)
0.006134318 with absolute error < 2.5e-05
> integrate(tail, 1000, 5000)
0.005661634 with absolute error < 4.9e-09

Isn't integrate(tail, 5000, Inf) simply equal to integrate(tail, 1000, Inf) - integrate(tail, 1000, 5000)? Why that resulted in a divergent integral?

like image 518
Zebra Propulsion Lab Avatar asked Jul 25 '26 04:07

Zebra Propulsion Lab


1 Answers

Your default tolerance (.Machine$double.eps^0.25) is too large, so we change it:

> 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

and this is approximately the same as:

> integrate(tail, 1000, Inf)$val-integrate(tail, 1000, 5000)$val
[1] 0.0004726847

Of course you can just set your tolerance to .Machine$double.eps, but this comes at a cost of time:

> 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

eg. a increase in time around 50 pct.

like image 198
J.R. Avatar answered Jul 27 '26 17:07

J.R.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!