2016-08-01 1 views
0

Я хотел бы вычислить следующий интеграл в R:Non-конечное значение функции с Интегрируя() R, хотя решение существует

print(integrate(function(x){((1.-x)^2)/(abs(1.-x))^(1/3)},lower = 0, upper = 1.6, abs.tol = 1E-7)$value) 

И я получаю эту ошибку:

Error in integrate(function(x) { : non-finite function value

Однако, когда Я интегрирую до 1.600001 или 1.599999, он работает и дает 0.4710365 и 0.4710357.

Но нет ничего особенного с этой функцией в точке 1.6 ... Так что это должно быть какое-то странное числовая проблема в R.

Любые идеи?

ответ

0

В соответствии с ответом @ BHAs, я хотел бы пойти на следующее решение:

> f <- function(x){ifelse(x!=1,((1.-x)^2)/(abs(1.-x))^(1/3),0)} # Set f(1)=0 since it is the limit of 'f' at 1. 
> integrate(f,lower=0,upper=1.6,abs.tol=1E-7) 
0.4710361 with absolute error < 2.2e-08 

«IfElse» позволяет избежать проблем, связанных с Векторизованных «х»

+0

Хорошее решение. Но вы можете поместить все, что вам нравится, для третьего аргумента 'ifelse'. Попробуйте, например. '10.99' вместо' 0'. – Bhas

+0

@Bhas, это правда, но 0 является единственным правильным пределом в 1 для этой функции ;-) Кроме того, включение 10,99 может привести к ложным результатам при вызове 'integrate'. – DeeCeeDelux

0

Если вы пишете функцию, как этот

f <- function(x) { 
    r <- ((1.-x)^2)/(abs(1.-x))^(1/3) 
    cat("x=",x,"\n") 
    cat("r=",r,"\n") 
    r 
} 

вы можете получить некоторое представление о том, что происходит. Попробуйте

z <- integrate(f,lower = 0, upper = 1.6, abs.tol = 1E-7,subdivisions=50) 
z 

И вы увидите, что integrate передает значение 1 функционировать f. И деление на 0 (от 1-x)) дает NaN. Кажется, это артефакт integrate.

С указанными пределами вы прыгаете через точку, где функция не определена. Вы можете избежать этого, выполнив

z1 <- integrate(f,lower = 0, upper = 1, abs.tol = 1E-7) 
z1 

z2 <- integrate(f,lower = 1, upper = 1.6, abs.tol = 1E-7) 
z2 
z1$value+z2$value 

, который дает результат

[1] 0.4710361 

Я не знаю, как обойти эту проблему иначе, чем то, что вы сделали или то, что я пытался.

+0

Но при интегрировании до 1.600001, я также передать неопределенное значение 1. А также другие значения выше 1 работают просто отлично ... Итак, почему 1.6? –

+0

Короче говоря, вы не передаете значение 1 для 'x'. Это «интегрировать», делая это в процессе аппроксимации интеграла. По-видимому, это зависит от верхнего предела 1.6 в сочетании с нижним пределом 0, и это, скорее всего, просто вызвано вашей конкретной функцией. Посмотрите на вывод моей функции 'f'. – Bhas

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

  • Нет связанных вопросов^_^