|
Jarrao90 |
Forum-Anfänger
|
|
Beiträge: 33
|
|
|
|
Anmeldedatum: 18.08.14
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 06.08.2017, 22:16
Titel: DGL 2.ter Ordnung lösen
|
|
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:
um das Ganze in Matlab zu bringen, muss ich ja aus der DGL 2ter Ordnung zwei DGL´s erster Ordnung machen:
Bzw. wenn ich es in Matlab eingebe, gebe ich den Variablen entsprechende Nummern:
Mein Problem ist jetzt der Radius. Denn der Radius ist:
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!
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 07.08.2017, 07:46
Titel:
|
|
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
|
|
|
Jarrao90 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 33
|
|
|
|
Anmeldedatum: 18.08.14
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 14.08.2017, 18:56
Titel:
|
|
@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.
|
|
|
StephanIIe |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 14.08.2017, 21:18
Titel: evtl da m file
|
|
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
|
|
Beiträge: 33
|
|
|
|
Anmeldedatum: 18.08.14
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 14.08.2017, 21:57
Titel:
|
|
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]);
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 15.08.2017, 22:21
Titel:
|
|
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
|
|
|
Jarrao90 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 33
|
|
|
|
Anmeldedatum: 18.08.14
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.08.2017, 11:18
Titel:
|
|
@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
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 16.08.2017, 12:17
Titel:
|
|
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:
und dann
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
|
|
|
Jarrao90 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 33
|
|
|
|
Anmeldedatum: 18.08.14
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 27.08.2017, 23:33
Titel:
|
|
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:
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?
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 28.08.2017, 07:41
Titel:
|
|
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
|
|
|
Jarrao90 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 33
|
|
|
|
Anmeldedatum: 18.08.14
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.08.2017, 12:45
Titel:
|
|
Ich habe die Funktion als externes m-File Gespeicher:
Wenn ich in meinem Hauptprogramm nun schreibe:
F=@dgl
bekomme ich die Fehlermeldung: Not enough input arguments.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 28.08.2017, 12:50
Titel:
|
|
Hallo,
warum hast du denn das t als Eingabeargument entfernt?
Den Sinn der Zeile
kann ich nicht erkennen.
Grüße,
Harald
|
|
|
Jarrao90 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 33
|
|
|
|
Anmeldedatum: 18.08.14
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.08.2017, 13:58
Titel:
|
|
Ach sorry, ich hatte ein wenig rum experimentiert. Habe das "t" wieder drinnen.
Dann bekomme ich folgende Meldung in der Hauptfunktion:
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 28.08.2017, 14:17
Titel:
|
|
Hallo,
das ist ja nicht schwer zu beheben. Entweder als Spaltenvektor vorbelegen oder transponieren?
Grüße,
Harald
|
|
|
Jarrao90 |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 33
|
|
|
|
Anmeldedatum: 18.08.14
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.08.2017, 14:37
Titel:
|
|
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
oder
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
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 - 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.
|
|