2014-10-15 3 views
2

я функция определена какВключение функции в R возвращает ошибку

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

Когда я попытался получить интеграл от нее от 5000 до Inf, он возвращает ошибку:

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

Однако, интегрируя от 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 

не integrate(tail, 5000, Inf) просто равна до integrate(tail, 1000, Inf) - integrate(tail, 1000, 5000)? Почему это привело к расходящемуся интегралу?

+0

Это простое исправление, чтобы изменить допуск: 'интегрируйте (tail, 5000, Inf, rel.tol = 1 * 10^-5)', так как ваше значение по умолчанию слишком велико. –

+0

Спасибо, что работает! Просто любопытно, как определить ценность rel.tol? Могу ли я всегда назначать небольшое число, например .Machine $ double.eps, ему? –

ответ

2

Ваша терпимость по умолчанию (.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 

и это примерно так же, как:

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

Конечно, вы можете просто установить допуск к .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 

, например. увеличение времени вокруг 50 pct.

Смежные вопросы