Rechteckverfahren bei Exponentialfunktion

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Antworten
programming_newbie

Rechteckverfahren bei Exponentialfunktion

Beitrag von programming_newbie »

Guten Tag,

ich habe eine Frage zum Rechteckverfahren (numerische Integration). Aufgabe ist es, eine R Funktion zu schreiben, getArea(lower,upper,n), die mit approximativ über Rechtecke die Fläche unter der Funktion y = x^2 im Intervall [lower,upper] schätzen soll. n ist dabei die Anzahl der Rechtecke zur Schätzung.

Meine Lösung dazu:

Code: Alles auswählen

foo=function(x) {
  y=x^2
  return(y)
}

getArea = function(lower,upper,n) {
  for (i in 0:n-1) {
    yi = foo(lower + i * (upper-lower)/n + (upper-lower)/(2*n))
  return(yi)
  }
  z = ((upper-lower)/n) * sum(yi[1:length(yi)])
  return(z)
}
Leider ist diese Lösung falsch, wenn ich es per Hand nachrechne.
Meine Frage: Wo liegt der Fehler?

Bin über jede Hilfe dankbar.

MfG
ein Anfänger
Zuletzt geändert von programming_newbie am Mi Mai 02, 2018 8:59 am, insgesamt 1-mal geändert.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Rechteckverfahren bei Exponentialfunktion

Beitrag von jogo »

Hallo Neuling,

willkommen im Forum!
Kannst Du Deine Nachricht noch etwas aufhübschen? siehe viewtopic.php?f=20&t=29

Die Rechtecke sollen alle gleich breit sein?
Die Funktion x^2 ist sicher nur ein Beispiel; soll die Funktion immer so aufgebaut sein, dass sie einen Vektor x verarbeiten kann?
Gibt es bei dieser (Haus-)aufgabe irgendwelche Einschränkungen bei den Mitteln, die eingesetzt werden dürfen?
In Deiner Funktion getArea() ist an zwei Stellen return(); das ist recht ungewöhnlich und verwundert mich - zumal die zwei Rückgabewerte algorithmisch verschieden erzeugt werden.

Gruß, Jörg
programming_newbie

Re: Rechteckverfahren bei Exponentialfunktion

Beitrag von programming_newbie »

x^2 ist natürlich nur ein Beispiel, um es auch für mich per Hand leicht nachvollziehbar zu gestalten. Habe den code jetzt auch als solchen lesbar gemacht. Einschränkungen gibt es prinzipiell keine, aber ich meine diese aufgabe sollte elegant in wenigen Zeilen zu lösen sein.

Die Rechtecke sollten alle dieselbe breite ("x-Abstand") haben.

MfG

Edit: zum doppelten return(). ich dachte ich speichere die yi Werte als Vektor ab (automatisch?) um diesen dann in die Zielfunktion einsetzen zu können. dann bilde ich die summe über alle Werte vom ersten bis zum letzten Wert im Vektor yi.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Rechteckverfahren bei Exponentialfunktion

Beitrag von jogo »

Na klar geht das auch in ganz wenigen Zeilen, z.B.:

Code: Alles auswählen

foo <- function(x) x^2
getArea <- function(lower, upper, n) {
  Breite <- (upper - lower)/n
  x <- seq(lower+Breite/2, upper-Breite/2, length.out = n)
  return(Breite*sum(foo(x))) # oder auch   Breite*sum(foo(x))
}
(auch dies ließe sich noch reduzieren, aber dann leidet die Lesbarkeit)

1. Die Schleife in Deinem Code dreht nur eine Runde, dann wird mit return(yi) die gesamte Funktion verlassen.
2. Du hättest die Werte yi in einem Vektor speichern müssen, etwa so:

Code: Alles auswählen

y <- numeric(n)
for (...) {
  ...
  y[i] <- yi # bzw. für Dich y[i+1] <- ... da Du i von 0 bis n-1 laufen lässt
}
Gruß, Jörg
programming_newbie

Re: Rechteckverfahren bei Exponentialfunktion

Beitrag von programming_newbie »

Vielen Dank für die schnelle Hilfe Jörg!

Könntest du mir noch sagen wo bei meiner Lösung das Problem liegt?

MfG

Edit:
Habe den Code dementpsrechend abgeändert, es wird aber dasselbe (falsche) Ergebnis ausgegeben

Code: Alles auswählen

getArea = function(lower,upper,n) {
  y = numeric(n)
  for (i in 0:n-1) {
    yi = foo(lower + i * (upper - lower)/n + (upper-lower)/(2*n))
    y[i+1] = yi
  }
  z = ((upper-lower)/n) * sum(yi[1:length(yi)])
  return(z)
}
Edit2:

Auch y[i+1] ändert nichts an dem falschen Ergebnis. Tut mir leid, dass ich tortz der von dir vogeschlagenen Lösung so nachharke, aber ich möchte einfach verstehen, warum das bei mir nicht klappt. Danke nochmal
Zuletzt geändert von programming_newbie am Mi Mai 02, 2018 9:30 am, insgesamt 3-mal geändert.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Rechteckverfahren bei Exponentialfunktion

Beitrag von jogo »

Es muss heißen

Code: Alles auswählen

for (i in 0:(n-1)) { ... }
Der Operator : bindet stärker als - :!: Bitte probier mal: 0:5-1 vs. 0:(5-1)
Hast Du vorher Fehlermeldungen bekommen? (index out of range o.ä.)

Und am Ende einfach:

Code: Alles auswählen

z = sum(y) * (upper-lower) / n
Gruß, Jörg
programming_newbie

Re: Rechteckverfahren bei Exponentialfunktion

Beitrag von programming_newbie »

Super!!! Vielen Dank für deine Zeit und Mühe. die klammer bei 0:(n-1) wars.

Deine Lösung ist natürlich sehr viel eleganter.Ich werde weiter üben um auch einmal dorthin zu kommen :D

MfG
Antworten