Ich habe ein "Problem" mit Rekursionsgleichungen.
Ich habe eine Datenreihe von 0 bis 1700, mit denen ich das durchspielen möchte.
Code: Alles auswählen
x <- seq(0,1700, by=1)
rekursion <- function(x){
if(x==1){
return(0.002)
}
else {
return(
rekursion(x-1) * (1 + (0.004/(1+( (x-2)*0.004 )) ) ) +0.002
)
}
}
Code: Alles auswählen
rekursion(3)
[1] 0.006023968
Wenn ich die Funktion mit einer hohen Zahl aufrufe, erhalte ich einen Fehler
Code: Alles auswählen
rekursion(800)
Fehler: C stack usage 7975172 is too close to the limit
Ich verstehe, dass der Fehler bedeutet, dass die Rekursion "zu tief" geht.
Da ich Linux benutze, beende ich RStudio und gebe ins Terminal ein:
Code: Alles auswählen
ulimit -s 16384
Jetzt kann ich die Formel bis zur Zahl 1473 aufrufen
Code: Alles auswählen
> rekursion(1473)
[1] 6.654057
Also baue ich die Funktion etwas um, mit bekannten Ergebnissen, damit er nicht so tief runter muss
Code: Alles auswählen
rekursion <- function(x){
if(x==1){
return(0.002)
}
if(x==1000){
return(4.024376)
}
if(x==1400){
return(6.229157)
}
else {
return(
rekursion(x-1) * (1 + (0.004/(1+( (x-2)*0.004 )) ) ) +0.002
)
}
}
Jetzt mein "Problem":
Ich brauche einen neuen Vektor, welcher die Funktionsergebnisse für 0 bis 1700 enthält.
Rufe ich die Funktion mit meiner Datensequenz vom Anfang auf, bekomme ich wieder den Fehler:
Code: Alles auswählen
> x <- seq(0,1700, by=1)
> rekursion(x)
Fehler: C stack usage 15948500 is too close to the limit
Selbst bei kleinem Zahlenvektor raucht er ab
Code: Alles auswählen
> x <- c(0,1,2,3)
> rekursion(x)
Fehler: C stack usage 15948500 is too close to the limit
Code: Alles auswählen
y <- 0.002
y <- c(y, mikrekursion( 2 ))
y <- c(y, mikrekursion( 3 ))
y <- c(y, mikrekursion( 4 ))
y <- c(y, mikrekursion( 5 ))
y <- c(y, mikrekursion( 6 ))
y <- c(y, mikrekursion( 7 ))
y <- c(y, mikrekursion( 8 ))
y <- c(y, mikrekursion( 9 ))
(...)
y <- c(y, mikrekursion( 1698 ))
y <- c(y, mikrekursion( 1699 ))
y <- c(y, mikrekursion( 1700 ))
Somit habe ich in y alles, was ich wollte.
Meine Frage ist, wie man das denn nun "richtig" macht?