Ich bin auf ein interessantes aber eher nerviges Problem gestoßen.R: Integrieren: Max. Anzahl der Unterteilungen erreicht, Rundungsfehler
Ich versuche eine Funktion zu integrieren, die aus einem Datensatz berechnet wurde. Die Daten finden Sie hier: Link to sample.txt.
Ich fange an, eine Zeile an meine Daten anzupassen. Dies kann linear mit approxfun
oder nichtlinear mit splinefun
erfolgen. In meinem Beispiel unten benutze ich Letzteres. Nun, wenn ich versuche, die angepasste Funktion zu integrieren, laufe ich in den Fehler
maximum number of subdivisions reached
aber wenn ich die Unterteilung erhöhen ich
roundoff error
Anhand der Werte in meinem Beispielcode können Sie das für diese spezifischen Daten sehen Stellen Sie den Schwellenwert auf 754-> 755.
Mein Kollege hat kein Problem, diesen Datensatz in Matlab zu integrieren. Gibt es eine Möglichkeit, meine Daten zu integrieren, um sie zu integrieren? Gibt es eine andere Methode zur numerischen Integration in 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
Sie können die angepasste Funktion buchen. Ich scheine keine Parameterschätzungen zu bekommen, obwohl splinefun nicht so funktioniert oder ich etwas falsch mache. –
Ihre Daten sehen spektakulär "flach" aus. Wenn Sie also "integrate" aufrufen und das Konvertierungslimit über die Argumente "rel.tol" und "abs.tol" auf 1e-9 setzen, erhalten Sie eine viel genauere Antwort. –
@MarkMiller Es gibt ein gutes Tutorial hier: http://casoilresource.lawr.ucdavis.edu/drupal/node/896. Um die Funktion zu plotten, kann man 'plot (Daten $ wave, fx.spline (Daten $ wave), type = 'l') schreiben' –