Verfasst am: 12.07.2013, 15:08
Titel: Zeitschritte diskretisieren bei numerischen Problem
Hallo liebe Foren-Gemeinde,
ich bin absoluter MatLab/Octave-Neuling und habe einige Probleme bei der Modifizierung eines Codes, den mir mein Prof gegeben hat.
Das Problem stellt sich wie folgt dar:
Es soll ein Fahrzeugfolgemodell mit 3 Fahrzeugen simuliert werden. Dabei soll untersucht werden, wie die jeweiligen Folgefahrzeuge (2 an der Zahl) auf Geschwindigkeitsänderungen der jeweiligen Führungsfahrzeuge reagieren.
Der Code dafür sieht folgendermaßen aus:
Hierbei steht 'x' für den jeweiligen Ort des Fahrzeugs, 'xp' für die Geschwindigkeit des jeweiligen Fahrzeugs, 'xpp' für die Beschleunigung des jeweiligen Fahrzeugs und 'a' für den Abstand zwischen Fahrzeug 1 und Fahrzeug 2 bzw. zwischen Fahrzeug 2 und Fahrzeug 3 (also 2 Abstände, die zu berechnen sind).
Es gibt noch weitere Parameter: ist hier mit 0.2 angegeben und 'tau' mit 2 sek. (Tau ist die Zeit zwischen Reiz und Reaktion).
Für die Berechnung der einzelnen Variablen (x,xp,xpp, usw.) liegen die Gleichungen im Code vor. Normalerweise ist das Ganze ja eine Differentialgleichung (xpp_{n+1}(t+tau)=*(xp_{n}(t) - xp_{n}(t)).
Ich solls halt numerisch lösen und die Zeit beliebig diskretisieren. D.h. momentan bewege ich mich ja in der for-Schleife mit Zeitschritten von einer Sekunde vorwärts. Und jetzt kommt mein eigentliches Problem: Wie kann ich die Zeitschritte (nennen wir sie 'dt') unterschiedlich groß werden lassen, also z.B. 0.1 Sek. oder 0.01 Sek? Ziel ist hierbei, dass sich die einzelnen errechneten Werte irgendwann stabilisieren. Ich muss demnach schauen, wie groß ich 'dt' wählen muss, um zur Stabilisierung zu gelangen.
Zusammengefasst: Ich muss in den Code irgendwie das 'dt' reinbasteln (im Anhang sind auch nochmal die 3 Formeln zur Berechnung angegeben, in denen u.a. das dt auftaucht).
Ich hoffe, ich hab mich nicht zu verkorkst ausgedrückt resp. nen unnötig langen Roman aus dem Beitrag gemacht. Ich bin wie gesagt absoluter Neuling und brauche daher etwas Starthilfe. Ich würde mich über jeden Ansatz freuen, der mir bei der Lösung des Problems hilft.
Du meinst quasi, dass ich die 't'-Variable einfach mit dem Zeitschritt '0.1' versehe. ...Hm, das hab ich auch schon probiert, aber da kommt leider folgender Fehler:
"parse error near line 102 of file C:\...
syntax error"
(In Line 102 kommt bei mir eigentlich gar kein Befehl mehr?!?!?)
Danke Denny bis hierher. Ich glaube, ich komme der Sache näher. Allerdings gibt es immer noch ein paar Problemchen. Wende ich deinen zweiten Vorschlag an, meckert Octave immer noch rum, dass der Index ganzzahlig sein muss. Bei deinem ersten Vorschlag kommt folgende Fehlermeldung:
Code:
error: __plt2vv__: vector lengths must match
error: called from:
error: C:\PROGRA~2\Octave\OCTAVE~1.2\share\octave\3.6.4\m\plot\private\__plt__.m at line601, column 5 error: C:\PROGRA~2\Octave\OCTAVE~1.2\share\octave\3.6.4\m\plot\private\__plt__.m at line238, column 14 error: C:\PROGRA~2\Octave\OCTAVE~1.2\share\octave\3.6.4\m\plot\private\__plt__.m at line99, column 17 error: C:\PROGRA~2\Octave\OCTAVE~1.2\share\octave\3.6.4\m\plot\plot.m at line196, column 9 error: C:\... at line90, column 1
Des Weiteren stehe ich noch etwas auf dem Schlauch, was das 'dt' angeht. Ich muss doch normalerweise 'dt' mit in die for-Schleife einbauen. D.h. ich müsste ja normalerweise das 't' mit 'dt' multiplizieren, damit meine "näherungsweise" Gleichung der "echten" Gleichung immer näher kommt. Aber wie du schon sagtest, wenn ich einfach 'dt' mit 't' multipliziere, dann bekomme ich nicht-ganzzahlige Indizes und da meckert Octave ja dann rum. Ich weiß also immer noch nicht so genau, wie ich das Problem lösen soll.
Die gepostete Fehlermeldung kommt von PLOT-Befehlen, da müssen die übergebene Vektoren gleich lang sein, deswegen nehme lieber den 2.Vorschlag, du muss dann überall die zeit-Variable durch timestep ersetzen.
Vielen Dank für deinen ausführlichen Lösungsvorschlag!! Ich habe ihn gleich mal übernommen und ausprobiert. Leider klappts immer noch nicht so richtig. Er bringt mir folgende Fehlermeldung:
Code:
>>testlauf
error: 'testlauf' undefined near line110 column 1
>>testlauf
error: 'testlauf' undefined near line113 column 1
>>testlauf
error: 'testlauf' undefined near line114 column 1 ...
bei mir läuft das Programm. Ich habe das in Octave 3.2.4 ausprobiert.
Der Fehler kommt daher, weil deine Datei wurde nicht unter .m abgespeichert. Ich meine hat keine Endung .m
Deswegen vergewissere dich, dass du die Datei unter testlauf.m abgespeichert hast.
du hattest Recht: Die Endung .m hat gefehlt (was mich allerdings wundert, da diese beim Abspeichern automatisch angefügt wird?!).
Trotzdem sieht der Plot noch etwas wunderlich aus. Er zeigt mir eigentlich nur den ersten Fahrzeugabstand an und irgendwie scheint was nicht mit der Skalierung der y-Achse zu stimmen (s. Anhang).
Die anderen Plots zeigt er mir gar nicht erst an. Er öffnet zwar das Fenster, aber das Diagramm ist nicht zu sehen. Stattdessen steht links unten "Inf, Inf". Wieso unendlich?
Womit hängt die merkwürdige Anzeige der Plots zusammen? U.a. ist er doch durch den xvektor
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.