--- id: 59880443fb36441083c6c20e title: Euler-Methode challengeType: 1 forumTopicId: 302258 dashedName: euler-method --- # --description-- Euler's method numerically approximates solutions of first-order ordinary differential equations (ODEs) with a given initial value. It is an explicit method for solving initial value problems (IVPs), as described in this article. Die ODE muss in der folgenden Form angegeben werden: mit einem Anfangswert Um eine numerische Lösung zu erhalten, ersetzen wir die Ableitung auf der linken Seite durch eine Finite-Differenzen-Approximation: löse dann für $y(t+h)$: was das Gleiche ist wie Die Regel der iterativen Lösung lautet also: wobei $h$ die Schrittweite, der wichtigste Parameter für die Genauigkeit der Lösung ist. Eine kleinere Schrittweite erhöht zwar die Genauigkeit, aber auch die Berechnungskosten, sodass sie immer von Hand nach dem jeweiligen Problem ausgewählt werden muss. **Beispiel: Newtonsches Kühlungsgesetz** Das Newtonsche Abkühlungsgesetz beschreibt, wie ein Objekt mit der Anfangstemperatur $T(t_0) = T_0$ in einer Umgebung mit der Temperatur $T_R$ abkühlt: oder Sie besagt, dass die Abkühlungsgeschwindigkeit $\\frac{dT(t)}{dt}$ des Objekts proportional zur aktuellen Temperaturdifferenz $\\Delta T = (T(t) - T_R)$ zur Umgebung ist. Die analytische Lösung, die wir mit der numerischen Näherung vergleichen werden, lautet # --instructions-- Implementiere eine Routine der Euler'schen Methode und löse damit das gegebene Beispiel des Newton'schen Abkühlungsgesetzes für drei verschiedene Schrittweiten von: und vergleiche mit der analytischen Lösung. **Anfangswerte:** Der erste Parameter der Funktion ist die Anfangszeit, der zweite Parameter die Anfangstemperatur, der dritte Parameter die verstrichene Zeit und der vierte Parameter die Schrittweite. # --hints-- `eulersMethod` sollte eine Funktion sein. ```js assert(typeof eulersMethod === 'function'); ``` `eulersMethod(0, 100, 100, 2)` sollte eine Zahl zurückgeben. ```js assert(typeof eulersMethod(0, 100, 100, 2) === 'number'); ``` `eulersMethod(0, 100, 100, 2)` sollte 20.0424631833732 zurückgeben. ```js assert.equal(eulersMethod(0, 100, 100, 2), 20.0424631833732); ``` `eulersMethod(0, 100, 100, 5)` sollte 20.01449963666907 zurückgeben. ```js assert.equal(eulersMethod(0, 100, 100, 5), 20.01449963666907); ``` `eulersMethod(0, 100, 100, 10)` sollte 20.000472392 zurückgeben. ```js assert.equal(eulersMethod(0, 100, 100, 10), 20.000472392); ``` # --seed-- ## --seed-contents-- ```js function eulersMethod(x1, y1, x2, h) { } ``` # --solutions-- ```js function eulersMethod(x1, y1, x2, h) { let x = x1; let y = y1; while ((x < x2 && x1 < x2) || (x > x2 && x1 > x2)) { y += h * (-0.07 * (y - 20)); x += h; } return y; } ```