|
|
DGL lösen - Wurftrajektorie - Verständnis des Codes |
|
Lerner |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.03.2014, 12:43
Titel: DGL lösen - Wurftrajektorie - Verständnis des Codes
|
 |
|
 |
|
Hallo liebe Matlabuser,
ich möchte in Matlab mit dem ODE23 solver eine DGL lösen und habe dabei Schwierigkeiten die Einträge in der function fwurf nachzuvollziehen. Die DGL habe ich aus einem Beispiel zur Simulation einer Wurftrajektorie.
Könnte mir bitte jemand erklären wie dieser ydot Vektor aufgebaut ist? Vor allem mit diesen y(1),y(2),y(3) und y(4) komme ich völlig durcheinander.
Die dritte und vierte Spalte in ydot müssten die Gleichungen für die Beschleunigungen sein.
x''= -c_w*v*y(3) =>d.h. y(3) = x' !?
y''= -g-c_w*v*y(4) =>d.h. y(4) = y' !?
Wäre dann y(1)=x und y(2)=y ?!?!
Damit müsste der ydot Vektor doch folgendermaßen aussehen:
ydot = [x' y' x'' y'']
Wenn ich mit
die DGL löse dann steht im Lösungsvektor:
y = [ x y x' y'] !?!??!?!?!
Der Vektor für die Anfangswerte in der Main-Programm müsste dann entsprechend des ydot Vektors auch vier Einträge besitzen, oder?
also die Einträge zum Zeitpunkt t=0 wären dann ,
y0= [x(t=0) y(t=0) x'(t=0) y'=(t=0)]
Freue mich auf eure Antworten.
|
|
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 08.03.2014, 13:15
Titel:
|
 |
Hallo,
sieht soweit gut aus.
Ich finde es immer leichter, wenn man statt y dann u verwendet, um das zusammenzufassen. Sonst bringt man schnell das ursprüngliche y und das zusammenfassende y durcheinander.
Globale Variablen können vermieden werden - siehe
http://www.mathworks.com/help/matla.....meterizing-functions.html
Grüße,
Harald
|
|
|
Lerner |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.03.2014, 13:54
Titel:
|
 |
Hallo Harald,
vielen Dank für deine schnelle Antwort.
Mir sind noch ein paar Fragen eingefallen.
Bei dem Vektor y0 im Main-Programm kann ich doch auch die Anfangswerte für die Beschleunigung angeben, oder?!
z.B.: y0 = [x(t=0) y(t=0) x'(t=0) y'=(t=0) x''(t=0) y''(t=0)]
Gibt es eine Möglichkeit im Lösungsvektor y der DGL
die Beschleunigung auszugeben?
z.B. y=[x y x' y' x'' y'']
Um die Beschleunigung über die Zeit zu plotten, ist mir nur eingefallen, dass ich in die Beschleunigungsgleichungen aus ydot nochmal die berechten Lösungen aus y einsetzten könnte.
also so in etwa:
x''= -c_w*v*y(:,3);
y''= -g-c_w*v*y(:,4);
plot(t,x'');
plot(t,y'');
Ich habe es ausprobiert und es funktioniert, aber gibt es da vielleicht noch einen besseren Weg?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 08.03.2014, 15:13
Titel:
|
 |
Hallo,
Zitat: |
Bei dem Vektor y0 im Main-Programm kann ich doch auch die Anfangswerte für die Beschleunigung angeben, oder?!
z.B.: y0 = [x(t=0) y(t=0) x'(t=0) y'=(t=0) x''(t=0) y''(t=0)] |
Nein, ist aber auch nicht nötig. Die anfängliche Beschleunigung ergibt sich ja direkt aus deiner Funktion fwurf.
Zitat: |
Um die Beschleunigung über die Zeit zu plotten, ist mir nur eingefallen, dass ich in die Beschleunigungsgleichungen aus ydot nochmal die berechten Lösungen aus y einsetzten könnte. |
Das ist eine gute Idee. Alternativ kannst du fwurf aufrufen.
Grüße,
Harald
|
|
|
Lerner |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.03.2014, 16:34
Titel:
|
 |
Hallo nochmals,
ich habe deinen Vorschlag ausprobiert. Nun hänge ich scheinbar am Syntax.
Folgender Code müsste es doch tun oder?
Habe es bei einem anderen Beispiel ausprobiert, da werden mir die zwei Beschleunigungswerte zum Zeitpunkt t=0 und t=end ausgegeben. Komisch.
Hier mal der Code zu dem was ich selber umzusetzen versuche. Es handelt sich dabei um ein einfaches Feder-Dämpfer-System mit einer vorgespannten Feder.
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 08.03.2014, 16:57
Titel:
|
 |
Hallo,
deine f_entk ist darauf ausgelegt, t und einen u-Vektor entgegenzunehmen.
Jetzt wertest du das mit einer Matrix y aus - wie soll das klappen?
Du musst deine Funktion entweder geeignet umschreiben oder sie in einer for-Schleife aufrufen.
Grüße,
Harald
|
|
|
Lerner |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 09.03.2014, 00:06
Titel:
|
 |
Wie genau würdest du die function denn umschreiben, an dieser Stelle wäre für mich ein Beispiel wirklich hilfreich.
Wenn ich ydot in der function ausgebe, kommt dabei pro Zeitschritt ein Vektor mit 2 Einträgen raus. Diese 2 Einträge sind vermutlich [x x'] und könnte sie dann in die Beschleunigungsgleichung einsetzen?!
Ausgabe ydot pro Zeitschritt:
Zudem noch eine Ausgabevariable zu der function hinzufügen oder?
Was anderes zu "Funktion geeignet umschreiben" fällt mir leider nicht ein...
Als Ergebnis kommt leider ein zu kurzer Vektor für 'Beschleunigung' raus.
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 09.03.2014, 10:21
Titel:
|
 |
Hallo,
z.B. so:
Grüße,
Harald
|
|
|
Lerner |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 09.03.2014, 11:34
Titel:
|
 |
Hallo Harald,
bei mir kommt leider ein zu kurzer Vektor "a" raus (siehe Ergebnis ganz unten).
Ergebnis:
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 09.03.2014, 12:49
Titel:
|
 |
Hallo,
ich habe den Code getestet, und bei mir war dem nicht so.
Meine Vermutung ist, dass du nicht alle von mir vorgeschlagenen Änderungen übernommen hast - insbesondere nicht
Zudem: wenn dir nicht klar ist, warum ein Code das macht, was er macht, dann geh das ganze doch mal mit dem Debugger durch?
Und wenn es für dich einfacher ist, dann ruf eben nicht die Funktion nochmal auf, sondern führe die Auswertung direkt durch - wie von dir selbst vorgeschlagen im Beitrag von gestern, 12:54.
Grüße,
Harald
|
|
|
Lerner |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 18.03.2014, 18:23
Titel:
|
 |
Hallo Harald,
eine verspätetes Dankeschön für deine Hilfe. Dein letzter Tipp hat wunderbar funktioniert.
Ja, ich benutze ständig den Debugger, um zu gucken was der Code macht.
Nun bin ich dabei das Skript mit mehreren Funktionen zu verschachteln. Beim Debuggen ist mir aufgefallen, dass beim Aufruf einer Function die Zeit als ein kompletter t-Vector übergeben wird. Eigentlich wollte ich in der Function if-Bedingungen setzen. Aber dadurch, dass t ein Vektor ist, werden die Bedingungen scheinbar ignoriert...
Ursprünglich dachte ich, dass man mit ein "." die Berechnung komponentenweise ausführen kann, aber dem ist irgendwie nicht so.
Beispielcode:
Sind in der ODE-function auch IF-Bedingungen erlaubt? Quasi, dass er zwischen unterschiedlichen zu lösenden Differentialgleichungen springt?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 18.03.2014, 20:00
Titel:
|
 |
Hallo,
du müsstest entweder innerhalb oder außerhalb der Funktion eine for-Schleife verwenden, oder noch besser: logische Indizierung.
Grüße,
Harald
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
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.
|
|