2012-05-04 12 views
7

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?

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

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. –

+0

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. –

+0

@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')' –

Odpowiedz

6

Istnieje wiele procedur integracyjnych w R, i można znaleźć niektóre z nich przez „RSiteSearch'ing lub za pomocą" pakiet SOS.

Na przykład, pakiet pracma ma kilka implementacji, przykładowo

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 

nie należy, że są one czyste skrypty R i w związku z tym mniejsza niż, na przykład, skompilowany integrate rutynowe z taką funkcją ruchu oscylacyjnego.

+0

Dobra odpowiedź i dopasowanie do wyników Matlaba. Nadal uczę się R, ale znalezienie rzeczy w dokumentacji lub poszukiwanie prawidłowych terminów czasami nie jest takie proste –

Powiązane problemy