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.ter Ordnung lösen

 

Jarrao90
Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2017, 23:16     Titel: DGL 2.ter Ordnung lösen
  Antworten mit Zitat      
Guten Tag,
ich würde gerne eine DGL numerisch lösen und muss zuvor jedoch die Gleichung in die Entsprechende Form bringen. Es geht dabei um die Gravitationsgleichung. Ich würde gerne die Anfangswerte für die DGL (x0,y0,vx0,vy0), vorgeben und dann lösen lassen. Als Plot hätte ich gerne die x-y Koordinaten der Lösungsfunktion.
Meine Idee war es nun die DGL für die x-Richtung und y-Richtung separat aufzustellen und zu verbinden.

Gravitationskraft in y-Richtung:


<br />
F_{G}=m_{Objekt}\cdot \ddot{y}=-\dfrac{m_{Objekt}\cdot m_{Erde}}{r^2}
<br />


<br />
<=> \ddot{y}=-\dfrac{\cdot m_{Erde}}{r^2}
<br />

um das Ganze in Matlab zu bringen, muss ich ja aus der DGL 2ter Ordnung zwei DGL´s erster Ordnung machen:

<br />
\dfrac{d}{dt}
<br />
\begin{pmatrix}
<br />
   y_{1}\\
<br />
   \ddot{y}
<br />
\end{pmatrix} 
<br />
=
<br />
\begin{pmatrix}
<br />
  \dot{y}\\
<br />
   -\dfrac{m_{Erde}}{r^2}
<br />
\end{pmatrix} 
<br />

Bzw. wenn ich es in Matlab eingebe, gebe ich den Variablen entsprechende Nummern:


<br />
\dfrac{d}{dt}
<br />
\begin{pmatrix}
<br />
   y(1)\\
<br />
   y(2)
<br />
\end{pmatrix} 
<br />
=
<br />
\begin{pmatrix}
<br />
  y(2)\\
<br />
   -\dfrac{m_{Erde}}{r^2}
<br />
\end{pmatrix} 
<br />

Mein Problem ist jetzt der Radius. Denn der Radius ist:

<br />
r^2 = y(1)^2 + x(1)^2
<br />

Nur die DGL für die x-Richtung habe ich noch gar nicht aufgestellt. Ohne die aktuellen Werte für x, kann der Solver die DGL ja gar nicht lösen oder? Oder bin ich generell irgendwie auf dem Holzweg?

Danke im Voraus!
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: 07.08.2017, 08:46     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Nur die DGL für die x-Richtung habe ich noch gar nicht aufgestellt.

Mag jetzt banal klingen, aber dann mach das doch? Dann hast du vier DGLen für x, x', y, y'.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jarrao90
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2017, 19:56     Titel:
  Antworten mit Zitat      
@Harald
Ja, hat geklappt. Das Problem war, dass ich den solver falsch benutzt habe. Ich muss für die zweite Koordinate (x-Richtung) ebenfalls die Variable y benutzen, da der ode45 nur mit einer Variable arbeiten kann.
Private Nachricht senden Benutzer-Profile anzeigen
 
StephanIIe

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2017, 22:18     Titel: evtl da m file
  Antworten mit Zitat      
Hallo,

evtl. könntest du bitte deine Lösung hier posten?

Die Leute hier sind immer so hilfsbereit, wen jemand später das gleiche oder ähnliches Problem hätte...müsste er nicht mehr so lange suchen und fragen.

Wäre freundlich....

Gruß
 
Jarrao90
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2017, 22:57     Titel:
  Antworten mit Zitat      
So habe ich die DGL eingefügt. Die Herleitung habe ich mir jetzt erspart. Das Problem ist einfach nur die DGL so umzuwandeln, dass Matlab es versteht und habe schon ein bisschen rum probiert bis es geklappt hat.

Zitat:


F=@(t,z)[z(2);-(G*m_e/(sqrt((z(1)^2)+(z(3)^2))^3))*z(1);z(4);-(G*m_e/(sqrt((z(1)^2)+(z(3)^2))^3))*z(3)]

[t,z]=ode45(F,[0:0.1:10000], [r_e,50,0,10000]);

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: 15.08.2017, 23:21     Titel:
  Antworten mit Zitat      
Hallo,

bei solchen längeren Ausdrücken dürfte es deutlich übersichtlicher sein, die DGL in einer externen Funktion und auf mehrere Zeilen aufgeteilt zu definieren statt alles in ein anonymes Function Handle zu quetschen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jarrao90
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2017, 12:18     Titel:
  Antworten mit Zitat      
@Harald
Ich habe das Ganze zumindest in eine Funktion ausgelagert und übergebe dieser immer nur die Anfangswerte.
Das mit dem function handling habe ich nicht so ganz verstanden. Meinst du damit , dass ich die ganzen Funktionen und Ableitungen vorher schon definiere, damit es bei der Eingabe in den ode45 nicht so unübersichtlich aussieht?

Ich habe z.B. versucht vorher den Radius zu definieren mit r = sqrt(z(1)^2+z(2)^2) nur wenn ich das mache sagt Matlab mir das z(1) und zwei nicht definiert sind. Wenn ich den ganzen Ausdruck aber direkt in den Solver schreibe, dann versteht Matlab das. Sonst hätte ich im Solver auch nur r^3 stehen anstatt ((z(1)^2+z(2)^2)^3/2
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: 16.08.2017, 13:17     Titel:
  Antworten mit Zitat      
Hallo,

die Idee war statt
F=@(t,z)[z(2);-(G*m_e/(sqrt((z(1)^2)+(z(3)^2))^3))*z(1);z(4);-(G*m_e/(sqrt((z(1)^2)+(z(3)^2))^3))*z(3)]

dies zu machen:
Code:
function dz = fun(t,z)
dz(1) = z(2);
dz(2) = -(G*m_e/(sqrt((z(1)^2)+(z(3)^2))^3))*z(1);
dz(3) = z(4);
dz(4) = -(G*m_e/(sqrt((z(1)^2)+(z(3)^2))^3))*z(3);


und dann
Code:


Zitat:
Ich habe z.B. versucht vorher den Radius zu definieren mit r = sqrt(z(1)^2+z(2)^2) nur wenn ich das mache sagt Matlab mir das z(1) und zwei nicht definiert sind.

Bitte poste deinen Code anstatt ihn zu umschreiben. So ist das zumindest mir nicht verständlich.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jarrao90
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2017, 00:33     Titel:
  Antworten mit Zitat      
Code:

G=6.67408e-11;  
m_e=5.972e+24;  
r_e = 6300e+3  
h_s= 35786000;  
x=35786000;    
y=0;            
vx=500;        
vy=3000;        
span=[0:1:55000];        
start = [x,vx,y,vy];  

F=@dgl;
[t,z]=ode45(F,span,start);

function dz = dgl(t,z)
dz(1) = z(2);
dz(2) = -(G*m_e/(sqrt((z(1)^2)+(z(3)^2))^3))*z(1);
dz(3) = z(4);
dz(4) = -(G*m_e/(sqrt((z(1)^2)+(z(3)^2))^3))*z(3);
end


Ich habe mal alles unnötige aus dem Code entfernt und versucht die Funktion in ein m-File auszulagern und dann einen function handle draus zu machen, aber irgendwie will Matlab das nicht.

Ich verstehe das mit der Funktion auch nicht so ganz. Die Funktion übergibt t und z und der Rückgabewert kommt dann in dz? Ich weiß nicht genau was die Funktion genau macht. Wenn ich das ganze laufen lasse steht auch nichts im Workspace.
Ich kenne das mit den function handle nur so:

Code:
fun =@(a,b)(a+b)
fun(10,20)

ans = 30 ....
 


Aber in der function ist gar kein t übergibt der Solver dann immer t und z an die Funktion? Und was gibt es dann zurück?
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: 28.08.2017, 08:41     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
aber irgendwie will Matlab das nicht

Und wie äußert sich das? Vermutlich in einer Fehlermeldung, aber welcher?

Funktionen haben einen getrennten Workspace. Du musst also Variablen wie G entweder in der Funktion definieren oder an diese übergeben. Für letzteres, siehe hier:
http://de.mathworks.com/help/matlab.....-functions.html#bsgprpq-8

Zitat:
Die Funktion übergibt t und z und der Rückgabewert kommt dann in dz?

Ich würde eher sagen, sie bekommt t und z von außen übergeben.

Zitat:
Ich weiß nicht genau was die Funktion genau macht.

Eigentlich das, was du im Satz davor geschrieben hast.

Zitat:
Wenn ich das ganze laufen lasse steht auch nichts im Workspace.

Wie lässt du es denn laufen?

Zitat:
Aber in der function ist gar kein t übergibt der Solver dann immer t und z an die Funktion?

Ja.

Zitat:
Und was gibt es dann zurück?

Na, dz.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jarrao90
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2017, 13:45     Titel:
  Antworten mit Zitat      
Ich habe die Funktion als externes m-File Gespeicher:

Code:
%m-File: dgl.m

function dz = dgl(z)
x = fzero(dz,0)
G=6.67408e-11;              %Graviationskonstante
m_e=5.972e+24;              %Erdmasse

dz(1) = z(2);
dz(2) = -(G*m_e/(sqrt((z(1)^2)+(z(3)^2))^3))*z(1);
dz(3) = z(4);
dz(4) = -(G*m_e/(sqrt((z(1)^2)+(z(3)^2))^3))*z(3);
 


Wenn ich in meinem Hauptprogramm nun schreibe:

F=@dgl

bekomme ich die Fehlermeldung: Not enough input arguments.
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: 28.08.2017, 13:50     Titel:
  Antworten mit Zitat      
Hallo,

warum hast du denn das t als Eingabeargument entfernt?

Den Sinn der Zeile
Code:

kann ich nicht erkennen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jarrao90
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2017, 14:58     Titel:
  Antworten mit Zitat      
Ach sorry, ich hatte ein wenig rum experimentiert. Habe das "t" wieder drinnen.
Dann bekomme ich folgende Meldung in der Hauptfunktion:

Code:
F =

    @dgl

Error using odearguments (line 90)
DGL must return a column vector.

Error in ode45 (line 115)
    odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);

 
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: 28.08.2017, 15:17     Titel:
  Antworten mit Zitat      
Hallo,

das ist ja nicht schwer zu beheben. Entweder als Spaltenvektor vorbelegen oder transponieren?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jarrao90
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2017, 15:37     Titel:
  Antworten mit Zitat      
Ich habe versucht die Rückgabe zu einem Spaltenvektor umzuformen indem ich ein ' hinter die Funktion geschrieben habe oder auch mit F=@dgl'
usw. aber dann bekomme ich nur die Meldung

Code:
Error: File: dgl.m Line: 1 Column: 30
Unexpected MATLAB operator.


oder

Code:
Undefined operator ''' for input arguments of type 'function_handle'.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.