我遇到了一個有趣但令人討厭的問題。R:積分:達到的最大細分數,舍入誤差
我想整合一個已經從數據集中計算出來的函數。 數據可以在這裏找到:Link to sample.txt。
我從一條線適合我的數據開始。這可以通過approxfun
與splinefun
進行線性擬合或非線性進行。在我的例子中,我使用後者。 現在,當我試圖整合擬合函數我碰到了錯誤
maximum number of subdivisions reached
但是當我增加了細分,我得到
roundoff error
從我的示例代碼中的值中,可以看到這個特定的數據設置閾值爲754-> 755。
我的同事在Matlab中集成這個數據集沒有問題。有沒有辦法操縱我的數據進行整合? R中是否有另一種數值積分方法?
data<-read.table('sample.txt',sep=',')
colnames(data)<-c('wave','trans')
plot(data$wave,data$trans,type='l')
trans<- -1 * log(data$trans)
plot(data$wave,trans,type='l')
fx.spline<-splinefun(data$wave,trans)
#Try either
Fx.spline<-integrate(fx.spline,min(data$wave),max(data$wave))
#Above: Number of subdivision reached
Fx.spline<-integrate(fx.spline,min(data$wave),max(data$wave),subdivisions=754)
#Above: Number of subdivision reached
Fx.spline<-integrate(fx.spline,min(data$wave),max(data$wave),subdivisions=755)
#Above: Roundoff error
考慮發佈擬合函數。我似乎沒有得到參數估計,雖然也許這不是splinefun的工作方式,或者我做錯了什麼。 –
您的數據看起來非常「平坦」,因此可能調用「integrate」並通過'rel.tol'和'abs.tol'參數將轉換限制設置爲1e-9之類的東西,這將爲您提供足夠準確的答案。 –
@MarkMiller這裏有一個很好的教程:http://casoilresource.lawr.ucdavis.edu/drupal/node/896。爲了繪製這個函數,你可以寫出'plot(data $ wave,fx.spline(data $ wave),type ='l')' –