2016-08-01 86 views
0

我想計算下面的積分中的R集成()R非謂語函數值與雖然解存在

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

然而,當我整合到1.600001或1.599999,它的工作和收益率0.4710365和0.4710357。

但並沒有什麼特殊的點處,1.6此功能...所以它應該是一些奇怪的數字問題R.

任何想法?

回答

0

在符合@的BHA的答案,我會去以下解決方案:

> 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」避免了與一個量化的問題,「X」

+0

不錯的解決方案。但是你可以把任何你喜歡的東西放在'ifelse'的第三個參數中。嘗試'10.99'而不是'0'。 – Bhas

+0

@Bhas,這是真的,但0是這個函數唯一正確的極限1 ;-)另外,在調用'integrate'時,插入10.99可能會導致錯誤的結果。 – 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

簡而言之,您不會傳遞'x'的值1。在逼近積分的過程中「整合」了這一點。顯然它取決於上限1.6與下限0的組合,這很可能只是由您的特定功能引起的。看看我的函數'f'的輸出。 – Bhas