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

Hilfe zum Thema Dreikörperproblem

 

benjo22
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 03.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.08.2012, 11:41     Titel: Hilfe zum Thema Dreikörperproblem
  Antworten mit Zitat      
Hallo, ich bin im Rahmen eines Projekts zum Thema "Dreikörperproblem" auf einige Probleme gestoßen. Ich bin noch ziemlich neu auf diesem Gebiet deshalb wollte ich euch mal fragen, ob ihr mir nicht helfen könnt.

Code:

G = 6.67384e-11; % Gravitationskonstante
 
% Masse der beiden Sonnen, Masse des in Bewegung liegenden Planeten kann vernachlässigt werden
m1 = 10e12;
m2 = 10e9 ;

vX_i = sym(rand(2,1)); % Erstellung von 3 Vektoren die die Position des Körpers im Raum definieren.
vX_j = sym(rand(2,1)) % Vektor des Planeten
vX_k = sym(rand(2,1));
vP = sym(rand(2,1)); % Neuer Vektor für den zu bewegenden Planeten
vV = sym(rand(2,1)); % Geschwindigkeitsvektor

vTime = linspace(1,1000,100000); % Zeitvektor für die Berechnungen der Planetenbahn
 
 vV(1) = 3; % Geschwindigkeit
 vV(2) =4;
 
 %% Belegung der Ortsvektoren
 vX_j(1) = 30
 vX_j(2) = 10
 vX_i(1) = -50
 vX_i(2) = -10
 vX_k(1) = 50
 vX_k(2) = 10
 
 
 %% Berechnungen der Planetenbahn

 
  figure,
    plot(vX_i(1), vX_i(2), 'ro'),hold on, grid on % Plotten der zwei Sonnen
    plot(vX_k(1), vX_k(2), 'ro'),hold on,
   

for cntT = 1:numel(vTime)
   
    vP = vX_j;
    D = distance(vP, vX_i) % Liefert die Distanz zur ersten Sonne
    vA = force(G,m1,vP,D) % Berrechnet die Gravitationskraft der ersten Sonne
    D = distance(vP, vX_k) % Das gleiche mit der zweiten Sonne
    vA = vA + force(G,m2,vP,D) % Addition der Kräfte ala Superposition
   
    axis ([-100 100 -100 100])
    vV = vV + cntT.*vA; % Die Geschwindigkeit wird immer neu berrechnet, wie berrechnet man delta(cntT)?
    vP = vP + cntT.*vV; % der neue Aufenthaltsort wird auch immer neu berrechnet
    plot(vP(1), vP(2), 'mo'), hold on % Plotten des Aufenthaltspunktes von dem Planeten
 
    pause();
end


Hier ist mein Code, habe zusätzlich noch 2 Funktionen

Code:

function iD = distance( vX1, vX2 )

 
  iD = (vX1 - vX2).^3
  iD = sqrt(iD(1)^2+iD(2)^2)

end
 


und

Code:

function ivA = force( iG, im, ivX, iD )

    ivA = -((iG * im) .* ivX)/iD;

end
 

Mein Problem ist es, dass die Planetenbahn nie richtig berechnet wird, es liegt vielleicht auch daran, dass ich immer Delta(cntT) brauche aber wie berrechne ich das, weil wenn ich anstatt cntT "2" eingebe, kommt auch nichts sinnvolles dabei raus. Ich wäre auch sehr dankbar, wenn ihr euch das mal ansehen könntet. Habe alles allein gemacht, deswegen glaube ich, dass ich den Fehler nicht sehe.


Schonmal Danke im Voraus
Private Nachricht senden Benutzer-Profile anzeigen


MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 03.08.2012, 11:48     Titel:
  Antworten mit Zitat      
Hallo,

was mir auffällt, ist die Distanzfunktion. Ich denke, das ist nicht korrekt. Ich würde hier einfach D=norm(v1-v2) verwenden. Es handelt sich dabei um eine Euklidische Norm/Standardnorm?

Du kannst natürlich auch die Distanzfunktion korrigieren:
Code:


function iD = distance( vX1, vX2 )

  iD = (vX1 - vX2)
  iD = sqrt(iD(1)^2+iD(2)^2)

end
 


Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
benjo22
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 03.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.08.2012, 14:17     Titel:
  Antworten mit Zitat      
Danke, hab das jetzt ausgebessert, es funktioniert aber leider immer noch nicht.

Aber trotzdem danke für deine schnelle Antwort
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 03.08.2012, 14:22     Titel:
  Antworten mit Zitat      
Kannst du genauer beschreiben, was jetzt noch nicht funktioniert.
Private Nachricht senden Benutzer-Profile anzeigen
 
benjo22
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 03.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.08.2012, 15:14     Titel:
  Antworten mit Zitat      
Wenn ich die Simulation starte, schleudert es den "Planeten" sofort aus dem System. Ich weiß nicht ob es vielleicht an der falschen Datenfütterung liegt. Es sollte ca so aussehen Datei unten angehängt

Vielleicht liegt es ja an einem falschen Vorzeichen oder so.

Gruß benjo

38-16-planetenbahn.jpg
 Beschreibung:

Download
 Dateiname:  38-16-planetenbahn.jpg
 Dateigröße:  182.58 KB
 Heruntergeladen:  769 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 04.08.2012, 10:59     Titel:
  Antworten mit Zitat      
Kannst du eine Quelle angeben, wo du die entsprechenden Gleichungen her hast für dieses Modell? Eine Internetseite, ein PDF.

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 04.08.2012, 18:34     Titel:
  Antworten mit Zitat      
So, ich habe das ganze jetzt erstmal korrekt mathematisch modelliert. Das ist wesentlich komplizierter als gedacht. Man muss in jedem Fall ein Differentialgleichungssystem der Ordnung 2 lösen. Ich werde das wahrscheinlich heute noch programmieren und posten.
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 04.08.2012, 22:08     Titel:
  Antworten mit Zitat      
Viel Spaß damit.

Code:

% Gravitationskonstante
global G m1 m2 x_s1 x_s2

G = 6.67384e-11;

% Masse der beiden Sonnen, Masse des in Bewegung liegenden Planeten kann vernachlässigt werden
m1 = 10e10;
m2 = 10e9 ;

%% Ortsvektoren definieren

% Anfangsort des sich bewegenden Planeten
x0 = rand(2,1);
% Orte der beiden ruhenden Sonnen
x_s1 = rand(2,1);
x_s2 = rand(2,1);

% Betrag der Anfangsgeschwindigkeit
v0_abs=10E-4;
% Geschwindigkeitsvektor des Planeten - Startvektor
v0 = v0_abs.*1/norm((x_s1-x0)+(x_s2-x0))*(1.5*(x_s1-x0)+(x_s2-x0));

% Zeitvektor für die Berechnungen der Planetenbahn
% vTime = linspace(0,20,100);
 
%% Berechnung der Planetenbahn
fig=figure;
hold on;
grid on;
% Plotten der zwei Sonnen
fig=plot(x_s1(1), x_s1(2), 'r*');
fig=plot(x_s2(1), x_s2(2), 'r*');  

% Plotten des Anfangsortes des Planeten
fig=plot(x0(1), x0(2), 'ro');  

vTime=10;

[T,Y] = ode45(@deqsxcurve,[0 vTime],[x0' v0']);

% Bahnkurve plotten
fig=plot(Y(:,1),Y(:,2));
hold off;
 


Das dazugehörige Differentialgleichungssystem:

Code:

function dx=deqsxcurve(t,x)
    global G m1 m2 x_s1 x_s2
    % 4 Gleichungen
    div1=(sqrt((x(1)-x_s1(1))^2+(x(2)-x_s1(2))^2)).^3;
    div2=(sqrt((x(1)-x_s2(1))^2+(x(2)-x_s2(2))^2)).^3;
    dx = zeros(4,1);
    dx(1)=x(3);
    dx(2)=x(4);
    dx(3)=-G*(m1*(x(1)-x_s1(1))/div1 + m2*(x(1)-x_s2(1))/div2);
    dx(4)=-G*(m1*(x(2)-x_s1(2))/div1 + m2*(x(2)-x_s2(2))/div2);
end
 


planetcurve.png
 Beschreibung:

Download
 Dateiname:  planetcurve.png
 Dateigröße:  11.82 KB
 Heruntergeladen:  838 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
benjo22
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 03.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.08.2012, 13:59     Titel:
  Antworten mit Zitat      
Ich hätte noch eine Frage, und zwar bei der Ode45 Funktion


Code:
dx(1)=x(3);
    dx(2)=x(4);
    dx(3)=-G*(m1*(x(1)-x_s1(1))/div1 + m2*(x(1)-x_s2(1))/div2);
    dx(4)=-G*(m1*(x(2)-x_s1(2))/div1 + m2*(x(2)-x_s2(2))/div2);

 

Wieso plotte ich anschließend nur die Werte dx(1) und dx(2) ( werte von v0')
Code:

plot(Y(:,1),Y(:,2)
 


Wieso nicht die Werte, welche ich durch das Integrieren bekomme. von (x0')

Oder ist das so gemeint, dass sich die werte von x0 verändern sodass v0 sich dann bei dieser Gleichung wieder verändert
Code:

v0 = v0_abs.*1/norm((x_s1-x0)+(x_s2-x0))*(1.5*(x_s1-x0)+(x_s2-x0));
 



Aber danke nochmals für deine Hilfe
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 05.08.2012, 14:30     Titel:
  Antworten mit Zitat      
benjo22 hat Folgendes geschrieben:
Ich hätte noch eine Frage, und zwar bei der Ode45 Funktion


Code:
dx(1)=x(3);
    dx(2)=x(4);
    dx(3)=-G*(m1*(x(1)-x_s1(1))/div1 + m2*(x(1)-x_s2(1))/div2);
    dx(4)=-G*(m1*(x(2)-x_s1(2))/div1 + m2*(x(2)-x_s2(2))/div2);

 

Wieso plotte ich anschließend nur die Werte dx(1) und dx(2) ( werte von v0')
Code:

plot(Y(:,1),Y(:,2)
 


Wieso nicht die Werte, welche ich durch das Integrieren bekomme. von (x0')


Das ist eine gute Frage. Das hatte mich auch erst stutzig gemacht, bis ich begriff, dass es so sein muss. Ich setzt mal ein wenig weiter vorne an. Bei meiner Recherche zum Lösen des Problems, bin ich drauf gestoßen, dass ode45 ausschließlich Differentialgleichungen der Ordnung 1 lösen kann. Daher musste ich zu einem Trick greifen und das ganz transformieren. Die ersten beiden Gleichungen sind daher Hilfsgleichungen, wiederum aber die entscheidenden Gleichungen, denn diese sind zweifach differenziert ausgehend von der Beschleunigung gerade der Ort (xy-Koordinaten) des Planeten. Es gilt x''=a. Daher wird in den Anfangswerten zuerst x0 und dann v0 gesetzt. Wenn wir nun die Rückgabewerte des Solvers betrachten, stehen zwangsläufig die Ortskoordinaten in den ersten beiden Komponenten. Die Geschwindigkeiten in den letzten beiden. Falls du dich dafür interessierst, kannst du diese auch auslesen.

benjo22 hat Folgendes geschrieben:

Oder ist das so gemeint, dass sich die werte von x0 verändern sodass v0 sich dann bei dieser Gleichung wieder verändert
Code:

v0 = v0_abs.*1/norm((x_s1-x0)+(x_s2-x0))*(1.5*(x_s1-x0)+(x_s2-x0));
 



Dieses Konstrukt ist ein Hilfsvektor, der dafür sorgt, dass der Planet sich stets in Richtung der beiden Sonnen bewegt. Es ist das gewichtete Mittel der beiden Richtungsvektoren, normiert und dann mit dem gewünschten Betrag multipliziert.
Private Nachricht senden Benutzer-Profile anzeigen
 
benjo22
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 03.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.08.2012, 15:54     Titel:
  Antworten mit Zitat      
Danke.


Wie errechnet man den Wert 1.5. Hab jetzt nämlich das Programm umgeschrieben auf ein Mehrkörpersystem und mir ist aufgefallen, dass die Flugbahn sehr stark von diesem Wert abhängt. Würde mich sehr interessieren sodass ich es jetzt abgleichen kann


Code:
v0 = v0_abs.*1/norm((x_s1-x0)+(x_s2-x0))*([size=18]1.5[/size]*(x_s1-x0)+(x_s2-x0));


Gruß Benjamin
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 05.08.2012, 15:58     Titel:
  Antworten mit Zitat      
Achso, den kannst du weglassen. Ich habe die Vektorsumme damit gewichtet, damit der Planet nicht immer so langweilig genau in das Zentrum der beiden Sonnen "fliegt". Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
Verschoben: 07.08.2012, 08:34 Uhr von denny
Von Objektorientierte Programmierung nach Programmierung
 
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 - 2025 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.