ich vermute da eher einen Programmierfehler. Poste hier, bei Bedarf, die entscheidenden Stellen deines Quelltextes. Dann kann man sich das genauer ansehen.Hmm erstaunlicherweise werden beim Runge Kutta die Bahnen ganz schön instabil im vergleich zum Euler.
Diese drei Links funktionieren bei mir nicht.
die hatte mir gefehlt und damit wird jetzt alles gleich viel verständlicherDie Startbedingungen gibt man über die Datei Planeten.txt vor:
Solche Spezialitäten solltest Du unbedingt vermeiden, da man die bei längeren Pausen sehr gerne vergisst. Es sei denn, Du machst Dir sehr genaue Notizen. Mir ist die letzten Tage selbst aufgefallen, wie wichtig Kommentare gerade in privaten Quelltexten sind.Die Masse sollte in Kilogramm angeben werden und ist im Moment noch der Übersichtlichkeit halber um 20 Nullen gekürzt, man kann auch solche Werte wie 5.7e11 eingeben, daher wird das in der nächsten Version angepasst.
OK, Rest ist erst mal Baustelle.Die werte s v bitte auf 0 lassen, das funktioniert noch nicht so richtig. Die Dichte wird in g/cm³ angegeben.
Das Formular im Programm ist analog zu der Textdatei zu betrachten, und ist gedacht um die aktuell berechneten Werte abzulesen und anzupassen.
Das Feature Maus funktioniert nicht mehr, bitte ignorieren.
Der Slider Genauigkeit ermöglicht das Anpassen der Schrittweite, Der Slider geht von 1-100 und wird im Programm durch 5 gerechnet und dann als Kehrwert für die Schrittweite genommen. Das bedeutet Geneauigkeit 1 entspricht einer Schrittweite von 5 Einheiten (Kilometern?) und 100 entspricht der Schrittweite 1/ (100/5) 0.05.
Für die schlechte Beschriftung möchte ich mich entschuldigen, das Programm ist ja noch in Arbeit.
\dot{\vec{x}_1} = \vec{v}_1
\dot{\vec{v}_1} = G m_2 \frac{\vec{x_2}-\vec{x_1}}{\| \vec{x_2}-\vec{x_1} \|^3}
\dot{\vec{x}_2} = \vec{v}_2
\dot{\vec{v}_2} = G m_1 \frac{\vec{x_1}-\vec{x_2}}{\| \vec{x_1}-\vec{x_2} \|^3}
%Planeten%.hx:= %Planeten%.ix ; speichern des alten Impulses für trägheit
%Planeten%.hy:= %Planeten%.iy
%Planeten%.hz:= %Planeten%.iz
;steht in klasse this = planet um den es geht, gegner= beeinflussender planet
this.xd:=gegner.x-this.x ;Berechnung des Abstands zwischen den Planeten
this.yd:=gegner.y-this.y
this.zd:=gegner.z-this.z
abstand:=sqrt(this.xd*this.xd+this.yd*this.yd+this.zd*this.zd) ;bis hier
this.xn:=this.xd/abstand ; Einheitsvektor
this.yn:=this.yd/abstand
this.zn:=this.zd/abstand
this.s:=gegner.gm/(abstand*abstand) ; Berechnen der einwirkinden Gravitationskräfte
this.gx:=this.s*this.xn ; Verechnung der Grav mit der Richtung
this.gy:=this.s*this.yn
this.gz:=this.s*this.zn
;Ende Klassenteil
if (plzB=1)
%Planeten%.abstand:=abstand ; Speichert den Abstand zum Hauptkörper (idR Stern)
;aufaddieren des berechneten kraftvektors auf den vorhandenen impuls
%Planeten%.ix := %Planeten%.hx + %Planeten%.gx/genauigkeit
%Planeten%.iy := %Planeten%.hy + %Planeten%.gy/genauigkeit
%Planeten%.iz := %Planeten%.hz + %Planeten%.gz/genauigkeit
;Oben = Innerer schleifenteil, wird für jeden anderen Körper im System durchgeführt
%Planeten%.x:=%Planeten%.x+ %Planeten%.ix/genauigkeit ; Berechnung der neuen Koordinaten aus den summierten Kräften
%Planeten%.y:=%Planeten%.y+ %Planeten%.iy/genauigkeit
%Planeten%.z:=%Planeten%.z+ %Planeten%.iz/genauigkeit
%Planeten%.hx:= %Planeten%.ix ; speichern des alten Impulses für trägheit
%Planeten%.hy:= %Planeten%.iy
%Planeten%.hz:= %Planeten%.iz
;Klassenteil ist der selbe daher siehe Teil 1
if (plzB=1)
%Planeten%.abstand:=abstand
%Planeten%.P1ix := %Planeten%.hx + %Planeten%.gx/(genauigkeit*2) ; %Planeten%.g/(genauigkeit*2 )=m1 prognose punkt 1 impuls (halbe schrittweite)
%Planeten%.P1iy := %Planeten%.hy + %Planeten%.gy/(genauigkeit*2)
%Planeten%.P1iz := %Planeten%.hz + %Planeten%.gz/(genauigkeit*2)
%Planeten%.P1x:=%Planeten%.x+ %Planeten%.P1ix/(genauigkeit*2) ;prognose punkt 1 koordinaten
%Planeten%.P1y:=%Planeten%.y+ %Planeten%.P1iy/(genauigkeit*2)
%Planeten%.P1z:=%Planeten%.z+ %Planeten%.P1iz/(genauigkeit*2)
%Planeten%.xd:=%PlanetenB%.x-%Planeten%.P1x ; abstand
%Planeten%.yd:=%PlanetenB%.y-%Planeten%.P1y
%Planeten%.zd:=%PlanetenB%.z-%Planeten%.P1z
abstand:=sqrt(%Planeten%.xd*%Planeten%.xd+%Planeten%.yd*%Planeten%.yd+%Planeten%.zd*%Planeten%.zd) ; immernoch abstand
%Planeten%.xn:=%Planeten%.xd/abstand
%Planeten%.yn:=%Planeten%.yd/abstand
%Planeten%.zn:=%Planeten%.zd/abstand
%Planeten%.s:=%PlanetenB%.gm/(abstand*abstand) ; gravitation
%Planeten%.g2x:=%Planeten%.s*%Planeten%.xn ;%Planeten%.g/(genauigkeit*2 )=m2 ; gravitationsvektor
%Planeten%.g2y:=%Planeten%.s*%Planeten%.yn
%Planeten%.g2z:=%Planeten%.s*%Planeten%.zn
%Planeten%.P2ix := %Planeten%.hx + %Planeten%.g2x/(genauigkeit*2) ; %Planeten%.g/(genauigkeit*2 )=m2 ;Prognosepunkt 2 impuls
%Planeten%.P2iy := %Planeten%.hy + %Planeten%.g2y/(genauigkeit*2)
%Planeten%.P2iz := %Planeten%.hz + %Planeten%.g2z/(genauigkeit*2)
%Planeten%.P2x:=%Planeten%.x+ %Planeten%.P2ix/(genauigkeit*2) ;teil 2 ; Prognosepunkt 2 koordninaten
%Planeten%.P2y:=%Planeten%.y+ %Planeten%.P2iy/(genauigkeit*2)
%Planeten%.P2z:=%Planeten%.z+ %Planeten%.P2iz/(genauigkeit*2)
%Planeten%.xd:=%PlanetenB%.x-%Planeten%.P2x ; siehe oben usw und so fort
%Planeten%.yd:=%PlanetenB%.y-%Planeten%.P2y
%Planeten%.zd:=%PlanetenB%.z-%Planeten%.P2z
abstand:=sqrt(%Planeten%.xd*%Planeten%.xd+%Planeten%.yd*%Planeten%.yd+%Planeten%.zd*%Planeten%.zd)
%Planeten%.xn:=%Planeten%.xd/abstand
%Planeten%.yn:=%Planeten%.yd/abstand
%Planeten%.zn:=%Planeten%.zd/abstand
%Planeten%.s:=%PlanetenB%.gm/(abstand*abstand)
%Planeten%.g3x:=%Planeten%.s*%Planeten%.xn ;%Planeten%.g/(genauigkeit*2 )=m3 teil 1
%Planeten%.g3y:=%Planeten%.s*%Planeten%.yn
%Planeten%.g3z:=%Planeten%.s*%Planeten%.zn
%Planeten%.P3ix := %Planeten%.hx + %Planeten%.g3x/genauigkeit ; %Planeten%.g/(genauigkeit*2 )=m3
%Planeten%.P3iy := %Planeten%.hy + %Planeten%.g3y/genauigkeit
%Planeten%.P3iz := %Planeten%.hz + %Planeten%.g3z/genauigkeit
%Planeten%.P3x:=%Planeten%.x+ %Planeten%.P3ix/genauigkeit ;teil 2
%Planeten%.P3y:=%Planeten%.y+ %Planeten%.P3iy/genauigkeit
%Planeten%.P3z:=%Planeten%.z+ %Planeten%.P3iz/genauigkeit
%Planeten%.xd:=%PlanetenB%.x-%Planeten%.P3x
%Planeten%.yd:=%PlanetenB%.y-%Planeten%.P3y
%Planeten%.zd:=%PlanetenB%.z-%Planeten%.P3z
abstand:=sqrt(%Planeten%.xd*%Planeten%.xd+%Planeten%.yd*%Planeten%.yd+%Planeten%.zd*%Planeten%.zd)
%Planeten%.xn:=%Planeten%.xd/abstand
%Planeten%.yn:=%Planeten%.yd/abstand
%Planeten%.zn:=%Planeten%.zd/abstand
%Planeten%.s:=%PlanetenB%.gm/(abstand*abstand)
%Planeten%.g4x:=%Planeten%.s*%Planeten%.xn ;%Planeten%.g/(genauigkeit*2 )=m4 teil 1
%Planeten%.g4y:=%Planeten%.s*%Planeten%.yn
%Planeten%.g4z:=%Planeten%.s*%Planeten%.zn
%Planeten%.P4ix := %Planeten%.hx + %Planeten%.g4x/genauigkeit ; %Planeten%.g/(genauigkeit*2 )=m4
%Planeten%.P4iy := %Planeten%.hy + %Planeten%.g4y/genauigkeit
%Planeten%.P4iz := %Planeten%.hz + %Planeten%.g4z/genauigkeit
%Planeten%.ix:=1/6*(%Planeten%.P1ix + 2 * %Planeten%.P2ix + 2*%Planeten%.P3ix + %Planeten%.P4ix) Verrechnung der 3 Prognosepunkte zum dann verwendeten Impuls
%Planeten%.iy:=1/6*(%Planeten%.P1iy + 2 * %Planeten%.P2iy + 2*%Planeten%.P3iy + %Planeten%.P4iy)
%Planeten%.iz:=1/6*(%Planeten%.P1iz + 2 * %Planeten%.P2iz + 2*%Planeten%.P3iz + %Planeten%.P4iz)
; ende innere schleife, ausgeführt für jeden gegnerischen Körper
%Planeten%.x:=%Planeten%.x+ %Planeten%.ix/genauigkeit ; Verrechnen des summierten neuen Impuls mit den Koordinaten
%Planeten%.y:=%Planeten%.y+ %Planeten%.iy/genauigkeit
%Planeten%.z:=%Planeten%.z+ %Planeten%.iz/genauigkeit
Da ich im Quelltext keinen offensichtlichen Fehler finde, sollten wir uns besser die Startwerte genauer ansehen. Wie kommst Du auf den Wert -0.324 für die Variable ImpulsY,Mond?Falls fragen sein sollten immer her damit.
ich fände es prima, wenn Du alles auf SI-Einheiten umstellen würdest. Alle sechs Koordinaten also in m. Anstelle des Impulses sollte die Datei Planeten.txt die Startgeschwindigkeiten in m/s enthalten. Die Masse sollte man in kg angeben.Empfiehlst du da sowas wie die Bahngeschwindigkeit in m/s oder Kraft in Newton?
KoordX KoordY KoordZ v_X v_Y v_Z Masse s v Name dichte s und v sind noch nicht implementiert
-4.67e6 0.0 0.0 0.0 0.01 0.0 5.974e24 0 0 erde 5.515e3
3.794e8 0.0 0.0 0.0 -1.01e3 0.0 7.349e22 0 0 mond 3.341e3
Das Erde-Mond-System ist in meinen Augen nicht so gut geeignet, weil die überprüfbaren Daten nicht mit den Modelldaten übereinstimmen können. Besser wäre stattdessen der Test, den ich im letzten Absatz des Posts 33 vorgeschlagen hatte, der auch bei 2D noch genauso gut funktioniert und sehr leicht unabhängig überprüfbar ist.Auf die Daten der NASA-Horizons Seite können wir in diesem Stadium vorerst noch verzichten. Die Konstellation Erde-Mond ist für den Anfang ideal, weil sie sehr übersichtlich ist.
MfG
Das Erde-Mond-System ist in meinen Augen nicht so gut geeignet, weil die überprüfbaren Daten nicht mit den Modelldaten übereinstimmen können.
Mit den Formeln aus dem Wikipedia-Artikel zum Zweikörperproblem kann man daraus bereits die genaue Bahn berechnen:Die Datei Planeten.txt sähe dann beispielsweise so aus:
Code:KoordX KoordY KoordZ v_X v_Y v_Z Masse s v Name dichte s und v sind noch nicht implementiert -4.67e6 0.0 0.0 0.0 0.01 0.0 5.974e24 0 0 erde 5.515e3 3.794e8 0.0 0.0 0.0 -1.01e3 0.0 7.349e22 0 0 mond 3.341e3
Das ist wirklich unschön. Gibt es da keinen Workaround? Kann man eventuell einen bestimmten String oder ein bestimmtes Sonderzeichen einlesen und im Programm die zugehörige Variable dann auf Null setzen?Werte von genau 0 sind in dem Programm schwierig umsetzbar, die führen aus mir nicht bekannten Gründen im kompilierten Programm zu reihenweise leeren Variablen, gleich nach dem ersten Start, daher vermeide Ich diese vorerst.
Hallo Kibo,Die Datei Planeten.txt sähe dann beispielsweise so aus:
Code:KoordX KoordY KoordZ v_X v_Y v_Z Masse s v Name dichte s und v sind noch nicht implementiert -4.67e6 0.0 0.0 0.0 0.01 0.0 5.974e24 0 0 erde 5.515e3 3.794e8 0.0 0.0 0.0 -1.01e3 0.0 7.349e22 0 0 mond 3.341e3
KoordX KoordY KoordZ v_X v_Y v_Z Masse s v Name dichte s und v sind noch nicht implementiert
-4.67e6 0.0 0.0 0.0 12.45 0.0 5.974e24 0 0 erde 5.515e3
3.797e8 0.0 0.0 0.0 -1.012e3 0.0 7.349e22 0 0 mond 3.341e3