2012-05-04 21 views
7

面白いですが厄介な問題が発生しました。R:Integrate:分割数の最大値に達しました。丸め誤差

私は、データセットから計算された関数を統合しようとしています。 データはLink to sample.txtです。

私は自分のデータに線をはめ込むことから始めます。これは、approxfunで線形、またはsplinefunで非線形で行うことができます。私の例では、私は後者を使用します。 今、私はフィット機能を統合しようとすると、エラー

  • 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

適合機能を投稿することを検討してください。私はパラメータの見積もりを得ていないようですが、それはスプラインファンの仕組みではないかもしれませんが、何か間違ったことをしています。 –

+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を学んでいますが、文書の中で物事を見つけたり、正しい言葉を探したりすることは時折順調ではありません –

関連する問題