Natknąłem się na interesujący, ale denerwujący problem.R: Zintegruj: Maksymalna liczba osiągniętych podpodziałów, błąd zaokrągleń
Próbuję zintegrować funkcję, która została obliczona z zestawu danych. Dane można znaleźć tutaj: Link to sample.txt.
Zacznę od dopasowania linii do moich danych. można to zrobić liniowo z approxfun
lub nieliniowo z splinefun
. W moim przykładzie poniżej używam tego ostatniego. Teraz, gdy próbuję zintegrować funkcję wyposażoną biegnę do błędu
maximum number of subdivisions reached
ale kiedy zwiększają podział uzyskać
roundoff error
Z wartości w moim przykładowym kodzie widać to dla tych konkretnych danych ustawić próg 754-> 755.
Mój kolega nie ma problemu z integracją tego zestawu danych w programie Matlab. Czy istnieje sposób na manipulowanie danymi w celu integracji? Czy istnieje inna metoda numerycznej integracji w 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
Należy rozważyć umieszczenie dopasowanej funkcji. Wydaje mi się, że nie dostaję prognoz parametrów, chociaż może nie działa to w jaki sposób działa splinefun lub robię coś nie tak. –
Twoje dane wyglądają spektakularnie "płasko", więc może wywołanie 'integrate' i ustawienie limitu konwersji na coś takiego jak 1e-9 za pomocą argumentów' rel.tol' i 'abs.tol' przyniesie ci odpowiedź, która jest bardzo dokładna. –
@MarkMiller Istnieje dobry tutorial tutaj: http://casoilresource.lawr.ucdavis.edu/drupal/node/896. Aby narysować tę funkcję, możesz napisać 'plot (dane $ wave, fx.spline (data $ wave), type = 'l')' –