2012-05-04 98 views
7

我遇到了一個有趣但令人討厭的問題。R:積分:達到的最大細分數,舍入誤差

我想整合一個已經從數據集中計算出來的函數。 數據可以在這裏找到:Link to sample.txt

我從一條線適合我的數據開始。這可以通過approxfunsplinefun進行線性擬合或非線性進行。在我的例子中,我使用後者。 現在,當我試圖整合擬合函數我碰到了錯誤

  • maximum number of subdivisions reached

但是當我增加了細分,我得到

  • roundoff error

從我的示例代碼中的值中,可以看到這個特定的數據設置閾值爲754-> 755。

我的同事在Matlab中集成這個數據集沒有問題。有沒有辦法操縱我的數據進行整合? R中是否有另一種數值積分方法?

enter image description here

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 
+0

考慮發佈擬合函數。我似乎沒有得到參數估計,雖然也許這不是splinefun的工作方式,或者我做錯了什麼。 –

+0

您的數據看起來非常「平坦」,因此可能調用「integrate」並通過'rel.tol'和'abs.tol'參數將轉換限制設置爲1e-9之類的東西,這將爲您提供足夠準確的答案。 –

+0

@MarkMiller這裏有一個很好的教程:http://casoilresource.lawr.ucdavis.edu/drupal/node/896。爲了繪製這個函數,你可以寫出'plot(data $ wave,fx.spline(data $ wave),type ='l')' –

回答

6

有R中許多積分程序,您可以通過「RSiteSearch'ing或使用‘SOS’包找到其中的一些。

例如,包pracma具有若干實施方式中,例如

quad(fx.spline,min(data$wave),max(data$wave)) # adaptive Simpson 
# [1] 2.170449         # 2.5 sec 
quadgk(fx.spline,min(data$wave),max(data$wave)) # adaptive Gauss-Kronrod 
# [1] 2.170449         # 0.9 sec 
quadl(fx.spline,min(data$wave),max(data$wave)) # adaptive Lobatto 
# [1] 2.170449         # 0.8 sec 

請並不是說這些是純的R腳本和因此比慢,例如,編譯integrate例程與這樣的振盪函數。

+0

好的答案和匹配Matlab結果。我仍然在學習R,但是在文檔中查找或查找正確的術語有時並不那麼簡單 –