WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

DGL 2. Ordnung lösen

 

RaphMi
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 30.06.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2020, 11:18     Titel: DGL 2. Ordnung lösen
  Antworten mit Zitat      
Hallo zusammen!

Ich habe für mein Studium ein Aufgabe zu lösen.
Ich muss eine DGL für das öffnen einer Bahnschranke aufstellen und diese dann nummerisch mit Matlab lösen.

Die DGL für eine Schranke ohne Gegengewicht habe ich mittlerweile:

Phi''(t)=(g * cos(Phi(t))) / L

Um das mit Matlab zu lösen muss ich aus dem DGL 2. Ordnung ein DGL System 1. Ordnung machen.
Wie kann ich das jetzt mit Matlab lösen, hat jemand eine Idee?

Ich bin für jede Hilfe dankbar!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.06.2020, 12:15     Titel:
  Antworten mit Zitat      
Hallo,

das kannst du mit ode45 lösen, siehe vor allem die Beispiele "Solve Nonstiff Equation" oder auch "Pass Extra Parameters to ODE Function".

Der erste Schritt ist wie du schon sagst das Umwandeln in ein System von DGLen 1. Ordnung. Hast du das schon gemacht?
Anschließend kannst du das wie in den Beispielen mit ode45 lösen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
RaphMi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 30.06.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2020, 13:11     Titel:
  Antworten mit Zitat      
Danke für die schnelle Antwort Smile

Ich habe die DGL jetzt umgewandelt:

y1=phi
y1´=y2
y2´=(g * cos(phi(t)) / L

Ist das so richtig?

Ich habe mir die Beispiele angesehen, verstehe jetzt aber leider nicht so viel..
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.06.2020, 13:30     Titel:
  Antworten mit Zitat      
Hallo,

ich würde es so schreiben:

Code:
phi1´=phi2
phi2´=(g * cos(phi1) / L


Zitat:
verstehe jetzt aber leider nicht so viel..

Was oben steht ist sehr ähnlich zur Ausgangslage in den Beispielen, daher sollte sich das übertragen lassen. Auch wenn es besser ist zu verstehen, was man tut, muss man das fast nicht mal, um es zu übertragen.
Falls du dabei Schwierigkeiten hast: je konkreter die Frage ist bzw. die Schwierigkeiten erklärt werden, desto eher ist es möglich zu antworten bzw. zu unterstützen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
RaphMi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 30.06.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2020, 14:50     Titel:
  Antworten mit Zitat      
Hab mir jetzt ein Grundgerüst gebastelt.

Code:

function main

   global g
   
   g = 9.81;
   tspan = [0, 10]; y0 = [0, 25, 65, 90];
   [t,y] = ode45(@dgl, tspan, y0);
   plot(t,y(:,1),t,y(:,3));

end

function dphi = dgl(t,phi)
   global g
   
   dphi (1,1) = phi2;
   dphi (2,1) = (g * cos(phi1(t))) / L ;

end
 


Wofür ist y0 in meinem Fall da?
Ich möchte für verschiedene Winkel das Ergebnis haben.
Was muss ich noch ändern?

Vielen Dank und schöne Grüße
Raphael
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.06.2020, 15:29     Titel:
  Antworten mit Zitat      
Hallo,

ein paar Anpassungen:

Code:
function main

tspan = [0, 10]; y0 = [0; 0]; % 2 Gleichungen --> 2 Anfangsbedingungen
[t,y] = ode45(@dgl, tspan, y0);
plot(t,y(:,1),t,y(:,2)); % es gibt nur 2 Komponenten und damit auch nur 2 Spalten

end

function dphi = dgl(t,phi)
g = 9.81; % keine globalen Variablen. Wenn etwas variabel sein soll, dann siehe das "Passing Extra Parameters" - Beispiel
L = 1; % wie zu g. War nicht definiert, ich habe mal L = 1 gesetzt
dphi (1,1) = phi(2); % du musst in phi indizieren
dphi (2,1) = (g * cos(phi(1))) / L ;

end


Zitat:
Wofür ist y0 in meinem Fall da?

Das sind die Anfangsbedingungen für die DGL. Ohne die ist eine numerische Lösung nicht möglich. Im Beispiel habe ich mal phi(0) = phi'(0) = 0 genommen.

Zitat:
Ich möchte für verschiedene Winkel das Ergebnis haben.

Die Frage verstehe ich nicht. Der Winkel ändert sich doch ständig?

Falls du verschiedene Anfangsbedingungen meinst: da hilft nur eine for-Schleife.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2020, 15:35     Titel:
  Antworten mit Zitat      
Edit: Harald war mal wieder schneller Smile

y ist der sogenannte Zustandsvektor mit allen Zustandsvariablen des Systems. In deinem Fall ist das der Winkel phi der Schranke sowie die erste Ableitung des Winkels nach der Zeit, also die Winkelgeschwindigkeit. Ich würde dir wie Harald empfehlen phi anstelle von y zu verwenden, das ist für das Verständnis einfacher.

y0 enthält deine Anfangsbedingungen, schließlich muss der solver wissen an welchem Punkt und mit welcher Startgeschwindigkeit deine Schranke startet.
y0 muss für jede Zustandsgröße einen Startwert enthalten, er sollte also 2 Einträge enthalten, nicht vier.
Private Nachricht senden Benutzer-Profile anzeigen
 
RaphMi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 30.06.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2020, 17:01     Titel:
  Antworten mit Zitat      
Vielen Dank Harald und auch T16!

Ihr habt mir gut weitergeholfen. Sehr verlässliches Forum!!!

Wenn ich noch etwas nicht verstehe, weiß ich wo ich Hilfe bekomme Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
RaphMi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 30.06.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2020, 09:21     Titel:
  Antworten mit Zitat      
Was bedeutet diese Fehlermeldung von Matlab in meinem Programm?

"Array indices must be positive integers or logical values."


Dankeschön und viele Grüße
Raphael
Private Nachricht senden Benutzer-Profile anzeigen
 
T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2020, 09:29     Titel:
  Antworten mit Zitat      
Dass die Indizes deiner Vektoren positive Integerwerte oder logische Ausdrücke sein müssen :p

Vermutlich hast du irgendwo als index eine Null, eine Gleitkommazahl oder einen negativen Wert genutzt. A(1) funktioniert, A(0.1) nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
RaphMi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 30.06.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2020, 09:47     Titel:
  Antworten mit Zitat      
Dankeschön @T16

Warum läuft dieses Programm nicht? Ich kann den Fehler nicht finden..

Code:

function main

tspan = [0, 10];
y0 = [0; 0];
[t,y] = ode45(@dgl, tspan, y0);
plot(t,y(:,1),t,y(:,2));

end

function dphi = dgl(t,phi)

g = 9.81;
L = 3;
dphi (1,1) = phi(2);
dphi (2,1) = (g * cos(phi(t))) / L ;

end
 


Dankeschön und viele Grüße
Raphael
Private Nachricht senden Benutzer-Profile anzeigen
 
T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2020, 09:59     Titel:
  Antworten mit Zitat      
Das Problem liegt bei phi(t). Ode45 läuft durch t durch (von tspan(1) bis tspan(2)) und nimmt dabei auch Gleitkommawerte an, dadurch der Fehler. Deswegen hat Harald in seiner Version phi(1) benutzt.

In deiner Aufgabenstellung steht vmtl. phi(t) um zu verdeutlichen, dass phi eine Funktion von der Zeit ist. Deswegen musst du t aber nicht als index verwenden.
Private Nachricht senden Benutzer-Profile anzeigen
 
RaphMi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 30.06.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2020, 09:33     Titel:
  Antworten mit Zitat      
Ich möchte mein Programm noch erweitern.
Mit der DGL habe ich jetzt ja die Geschwindigkeit und die Beschleunigung der Schranke in Abhängigkeit von Zeit und Winkel.

Nun möchte ich eine Animation dazu haben, also das man sieht, wie die Schranke öffnet.
Ich kenne es bisher so, dass ich in einer For-schleife zu jedem Winkel die x und y Koordinaten berechne und diese in der Schleife Plotte, wodurch eine Animation entsteht.
Die Geschwindigkeit wird dabei durch die Berechnungsdauer oder die Pausen in der Schleife gesteuert.
Nun habe ich aber die Geschwindigkeit und die Beschleunigung vom Schwerpunkt der Schranke.
Wie kann ich in diesem Fall eine Animation einbringen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.07.2020, 11:56     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Mit der DGL habe ich jetzt ja die Geschwindigkeit und die Beschleunigung der Schranke in Abhängigkeit von Zeit und Winkel.

ode45 integriert ja. Meines Erachtens bekommst du also Winkel (1. Spalte) und Winkelgeschwindigkeit (2. Spalte) in Abhängigkeit der Zeit t zurück.

Ich könnte mir das so vorstellen: die Schranke als Strecke, deren Winkel (und damit min. ein Endpunkt oder auch beide, je nachdem ob der Drehpunkt ein Endpunkt ist oder nicht) sich über die Zeit hinweg ändert.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 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.