Seite 1 von 1
Rechteckverfahren bei Exponentialfunktion
Verfasst: Mi Mai 02, 2018 8:45 am
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
Re: Rechteckverfahren bei Exponentialfunktion
Verfasst: Mi Mai 02, 2018 8:56 am
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
Re: Rechteckverfahren bei Exponentialfunktion
Verfasst: Mi Mai 02, 2018 9:01 am
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.
Re: Rechteckverfahren bei Exponentialfunktion
Verfasst: Mi Mai 02, 2018 9:09 am
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
Re: Rechteckverfahren bei Exponentialfunktion
Verfasst: Mi Mai 02, 2018 9:18 am
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
Re: Rechteckverfahren bei Exponentialfunktion
Verfasst: Mi Mai 02, 2018 9:22 am
von jogo
Es muss heißen
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:
Gruß, Jörg
Re: Rechteckverfahren bei Exponentialfunktion
Verfasst: Mi Mai 02, 2018 9:36 am
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
MfG