Verfasst am: 22.11.2015, 22:47
Titel: Lösen einer DGL mit zeitabhängiger Einwirkung
Hallo zusammen.
Im Rahmen meiner Bachelorarbeit muss ich folgende Bewegungsgleichung mit Matlab lösen:
M*x''(t)+D*x'(t)+K*x(t) = F(t)
Es handelt sich hierbei um die Berechnung eines 3 stöckigen Hauses z.B. unter Erdbebeneinwirkung. M, D, K (je 3x3 Matrizen) und F(t) (3x1 Matrix) sind bekannt.
Bisher bin ich zum Lösen einer Differentialgleichung nur auf den ODE-Befehl gestoßen, jedoch funktioniert dieser soweit ich weiß nicht, wenn in der DGL kein zeitabhängiger Parameter vorhanden ist. (bzw. ich habe noch keine Lösung zu meinem Problem gefunden).
Mein Betreuer meinte, man könnte die Bewegungsgleichung auch über das Zustandsraum-Modell lösen, das wollen wir aber vermeiden, wenn es eine Alternative gibt.
Kann mir einer von euch weiterhelfen? Da ich Matlab im Zuge meiner BA zum ersten Mal benutzt habe, kenne ich mich noch nicht soo gut aus.
sollte an sich kein Problem sein.
Erster Schritt wird sein, das System dreier DGLen zweiter Ordnung in ein System von sechs DGLen erster Ordnung überzuführen. Dann sollte es z.B. mit ode45 funktionieren.
Verfasst am: 23.11.2015, 10:26
Titel: Re: Lösen einer DGL mit zeitabhängiger Einwirkung
Hallo eisklecks,
Zitat:
Bisher bin ich zum Lösen einer Differentialgleichung nur auf den ODE-Befehl gestoßen, jedoch funktioniert dieser soweit ich weiß nicht, wenn in der DGL kein zeitabhängiger Parameter vorhanden ist.
Das "t" in Deiner Gleichung sieht doch sehr nach "Zeit" aus.
In der Dokumentation von
ode45
bzw.
ode15i
wird genau erklärt, wie die Befehle funktionieren. Hilft Dir das bereits weiter?
Das "t" in Deiner Gleichung sieht doch sehr nach "Zeit" aus.
In der Dokumentation von ode45 bzw. ode15i wird genau erklärt, wie die Befehle funktionieren. Hilft Dir das bereits weiter?
Wie der ode-Befehl funktioniert habe ich soweit verstanden. Allerdings weiß ich momentan noch nicht wie ich F(t) einbinde, da dieses ja nicht konstant ist, sondern nach jeder Sekunde einen anderen Wert annimmt:
F(1)= -13.3980
F(2)= -103.3560
F(3)= -96.6570
F(4)= -84.2160
F(5)= -90.9150
.... (die entsprechenden Werte ziehe ich mir aus einer anderen mat-Datei!)
Wenn ich versuche mein F(t) (in der Form) in den ode-Befehl einzufügen, bekomme ich immer eine Fehlermeldung.
Zitat:
Erster Schritt wird sein, das System dreier DGLen zweiter Ordnung in ein System von sechs DGLen erster Ordnung überzuführen. Dann sollte es z.B. mit ode45 funktionieren.
Es gibt keinen "ode-Befehl" in Matlab. Es kommt darauf an, welchen Integrator Du für das System verwenden möchtest und dies wird zu verschiedenen Ergebnissen führen. Also meinst Du
ode45
,
ode15i
,
ode23
, ...? Weitere Integratoren findest Du unter http://www.mathworks.com/help/matlab/ref/ode45.html
Wenn F unstetig ist, können Matlabs Integratoren gar nicht damit umgehen. Die einzige numerisch zuverlässige Behandlung ist dann den Integrator nur von 0 bis 1, von 1 bis 2 etc laufen zu lassen.
Wenn ich versuche mein F(t) (in der Form) in den ode-Befehl einzufügen, bekomme ich immer eine Fehlermeldung.
Bitte poste für eine Diskussion im Forum dann immer den Code und die vollständige Fehlermeldung. Wir wollen wirklich gerne helfen, können aber die Details nicht erraten.
Zitat:
Wie genau meinst du das mit der Überführung?
ODE45 kann wie die meisten anderen ODE-Integratoren nur Systeme erster Ordnung integrieren. Du kannst im Netz oder Deinem Vorlesungsskript danach suchen, wie man ein Sytsem n.ter Ordnung in n Systeme 1. Ordnung umwandelt.
Wenn F unstetig ist, können Matlabs Integratoren gar nicht damit umgehen. Die einzige numerisch zuverlässige Behandlung ist dann den Integrator nur von 0 bis 1, von 1 bis 2 etc laufen zu lassen.
So etwas in der Art hatte ich auch schonmal überlegt. Danke!
Ich habe allerdings mit meinem Betreuer besprochen, dass unser F doch erstmal wie folgt definiert werden soll: F(t) = a*sin(omega*t)
Wie ich die Differentialgleichung dann mit ode23 löse, wird ja sehr gut in Beispiel 3 dargestellt.
Mein nächstes Problem ist jetzt, dass ich mir nicht sicher bin, wie ich die Differentialgleichung mit den Matrizen gelöst bekomme.
Ich habe meine Funktion erstmal wie folgt geschrieben: (Die jeweiligen Werte aus der Matrix habe ich per Hand eingegeben und nicht zB mit K(1,1) abgefragt!)
Code:
function dzdt = rode2(z,t,F)% M*x''(t) + D*x'(t) + K*x(t) = F
ein Problem ist auf jeden Fall: dein anonymous function handle ruft rode2 mit rode2(t,z,Ft,F,K,M,D,M_inv) auf. rode2 nimmt aber nur drei Argumente entgegen, und diese auch noch in einer anderen Reihenfolge.
Ich weiß nicht, ob das auch noch ein Problem macht, aber ich würde konsequent bei Zeilenvektoren (momentan IC) oder Spaltenvektoren (momentan dzdt) bleiben.
Solchen Problemen kann man übrigens auch gut mit dem Debugger auf den Grund gehen.
Leider stehe ich gerade wieder vor einer neuen Fehlermeldung, da ich doch unseren ursprünglichen Plan verfolgen soll, dass bei jedem Zeitschritt eine andere äußere Einwirkung F(t) in die DGL eingelesen werden soll.
Die verschiedenen Einwirkungen wurden in einem Zeitschritt von 0.01s gemessen und importiere ich aus einer Workspace-Datei. Meine DGL soll in diesen Zeitschritten jeweils einmal ausgewertet werden. Mein Befehl sieht wie folgt aus:
Ich weiß nicht wo der Fehler ist bzw wieso überhaupt versucht wird die Zeile 1.2 meines Vektors F einzulesen. Meine Schrittlänge bei der Integration hatte ich ja mit 0.01 definiert und es wird jeder F-Wert an der Stelle "t*100+1" abgefragt. Durch die Umrechnung "t*100+1" entstehen doch immer nur ganze Zahlen.
Durch die Umrechnung "t*100+1" entstehen doch immer nur ganze Zahlen.
Wenn du den Debugger verwendest, wirst du feststellen, dass dem eben nicht so ist, da ode45 Zwischenschritte macht um die Lösung mit der erforderlichen Genauigkeit zu berechnen. Wie wäre es mit Interpolation?
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
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.