Lösen von DGL in C++
-
Ich denke, man sollte nicht "Konstanten" sagen, wenn sie offensichtlich nicht konstant sind.
Aber ansonsten: ja, eine große Klasse von DGLs kann man so numerisch approximieren.
-
wunderbar.
Wenn ich mir das Eulerverfahren zur Lösung von DGL angucke, wird die Lösung ja durch einen Polygonzug approximiert mit der Berechnungsvorschrift
...
h = 1/N;
...
T[k+1] = T[k] + h;
Y[k+1] = Y[k] + h * [f(x)];
...Nun habe ich das Problem, dass ich zu Beginn meiner Simulation noch nicht weiß, wie lange diese läuft, da sie ein ereignisbezogenes Abbruchkriterium hat. Insofern kann ich N, welches mein T in gleich große Intervalle partitioniert, nicht wissen. Also ist es wohl "best practice", dass ich ein hohes N wähle und hoffe, dass es ausreicht.
Oder ist es auch möglich, sozusagen das N in jedem Schritt einfach zu ändern, ohne die ergebnisse zu verfälschen?thx for ideas
-
Die Schrittweite h hat nichts mit der Anzahl deiner Schritte zu tun. Du kannst von Anfang an ein bliebiges h wählen (möglichst klein).
Du kannst h auch während der Simulation ändern. Das hat aber nichts mit der Anzahl deiner Schritte zu tun (das ist sogar üblich - es gibt Lösungsverfahren, die automatisch die Schrittweite an die Funktion anpassen).Du musst nur daran denken: Mit jedem Schritt wird der Fehler größer!
Das kannst du ausprobieren, indem du eine DGL analytisch löst und dann mit dem Eulerverfahren, z.b. y'(t) = y(t), y(0)=1
Guck dir den Abstand zwischen der echten Kurve und der numerisch berechneten an. Je größer die Zeit, desto größer der Fehler.