2017-01-13 4 views
1

also habe ich diese Planetensimulation, in der ich die Position der Planeten (so eine ungebrochene Linie, die den Planeten folgt, wie sie sich bewegen), und habe versucht, so viele verschiedene Varianten zu verwenden von Linespec. Ich glaube, das Problem könnte sein, weil ich zuerst eine "set (h ..)" -Funktion verwende und dann innerhalb einer Schleife plotte, aber ich bin mir nicht sicher.Matlab-Graph verschwindet, wenn ich linespec hinzufüge

clc, close all, clear all 

%% Constants 
m_sun=1.9891*10^(30); % Sun mass KG 
m_earth=5.972*10^(24); 
G=1.4879*10^(-34); %Gravitational constant %AU^3/(kg*day^2) %Because JPL Data.. 
n=36500; %1 year is 36.5 because 1 step is 10 days so this is 10 years. 
dt=1; %Stepsize is by the DATA from JPL aut. set to 10 days (dt=1 aka 10 days) 

%% Start pos. and velocity for Sun, Mercury, Venus, Earth and Moon 
psol=[0 0 0]; 

%% Mercury 
x_mercury=-1.433719457930228E-01; %AU 
y_mercury=2.837093715285307E-01; %AU 
z_mercury=3.633570612044031E-02; %AU 

vx_mercury=-3.076848842366683E-02; %AU/Day 
vy_mercury=-1.162353364156454E-02; %AU/Day 
vz_mercury=1.872970822663991E-03; 

v0_mercury=[vx_mercury vy_mercury vz_mercury]; 
p0_mercury=[x_mercury y_mercury z_mercury]; 
v_mercury=v0_mercury; 
p_mercury=p0_mercury; 

%% Venus 
x_venus=4.673243997906552E-01; %AU 
y_venus=5.508231287051383E-01; %AU 
z_venus=-1.941467305848078E-02; %AU 

vx_venus=-1.548526759260772E-02; %AU/Day 
vy_venus=1.299852601837024E-02; %AU/Day 
vz_venus=1.071832461568199E-03; %AU/Day 

v0_venus=[vx_venus vy_venus vz_venus]; 
p0_venus=[x_venus y_venus z_venus]; 
v_venus=v0_venus; 
p_venus=p0_venus; 

%% Earth 
x_jord=-1.796136519182077E-01; %AU 
y_jord=9.667949205028737E-01; %AU 
z_jord=-3.668730384613077E-05; %AU 

vx_jord=-1.720038360546182E-02; %AU/Day 
vy_jord=-3.211186215649903E-03; %AU/Day 
vz_jord=7.927770738232715E-07; %AU/Day 

v0_jord=[vx_jord vy_jord vz_jord]; 
p0_jord=[x_jord y_jord z_jord]; 
v_jord=v0_jord; 
p_jord=p0_jord; 

%% Moon 
x_moon=1.735515971173234E-03; %AU 
y_moon=-1.954900859093033E-03; %AU 
z_moon=9.023023109649464E-05; %AU 

vx_moon=4.195999130374965E-04; %AU/Day 
vy_moon=4.002519066694706E-04; %AU/Day 
vz_moon=-4.849066257645466E-05; %AU/Day 

v0_moon=[vx_moon vy_moon vz_moon]; 
p0_moon=[x_moon y_moon z_moon]; 
v_moon=v0_moon; 
p_moon=p0_moon; 


%% Calculations 
hold on 
h_sun = plot3(0,0,0,'y.','markersize',80); 
h_mercury = plot3(1,1,1,'k.','markersize',35); 
h_venus = plot3(2,2,2,'m.','markersize',45); 
h_earth = plot3(3,3,3,'b.','markersize',55); 
h_moon = plot3(4,4,4,'r.','markersize',25); 

for step=1:n 
     %% Mercury 
     r_vekt_mercury=-p_mercury; 
     r_mercury=sqrt(x_mercury^2 + y_mercury^2 + z_mercury^2); %Radius in AU 
     a_mercury=((G*m_sun)/((r_mercury)^3))*r_vekt_mercury; 
     v_mercury=a_mercury*dt+v_mercury; 
     p_mercury=v_mercury*dt+p_mercury; 

     %% Venus 
     r_vekt_venus=-p_venus; 
     r_venus=sqrt(x_venus^2 + y_venus^2 + z_venus^2); %Radius in AU 
     a_venus=((G*m_sun)/((r_venus)^3))*r_vekt_venus; 
     v_venus=a_venus*dt+v_venus; 
     p_venus=v_venus*dt+p_venus; 

     %% Jord 
     r_vekt_jord=-p_jord; 
     r_jord=sqrt(x_jord^2 + y_jord^2 + z_jord); %Radius in AU 
     a_jord=((G*m_sun)/((r_jord)^3))*r_vekt_jord; 
     v_jord=a_jord*dt+v_jord; 
     p_jord=v_jord*dt+p_jord; 

%  %% Moon 
     %r_vekt_moon=psol-p_moon; 
     r_vekt_moon_earth=p_jord-p_moon; 
     r_moon=sqrt(x_moon^2 + y_moon^2 + z_moon^2); %Radius in AU 
     a_moon=((G*m_earth)/((r_moon)^3))*r_vekt_moon_earth; 
     v_moon=a_moon*dt+v_moon; 
     p_moon=v_moon*dt+p_moon; 

     set(h_sun,'XData',psol(1),'YData',psol(2),'ZData',psol(3));  
     set(h_mercury,'XData',p_mercury(1),'YData',p_mercury(2),'ZData',p_mercury(3)); 
     set(h_venus,'XData',p_venus(1),'YData',p_venus(2),'ZData',p_venus(3)); 
     set(h_earth,'XData',p_jord(1),'YData',p_jord(2),'ZData',p_jord(3)); 
     set(h_moon,'XData',p_moon(1),'YData',p_moon(2),'ZData',p_moon(3)); 
     xlabel('AU'); 
     ylabel('AU'); 
     zlabel('AU'); 
     axis([-2 2 -2 2 -2 2]); 
     drawnow; 
     hold off 
    end 

Also, wenn Sie die Schleife suchen, bevor Sie werden sehen, „Set (...)“ Funktion i erwähnt und am Ende der Schleife ist das Plotten. Wenn ich z. B. @ h_mercury von "k" ändern. zu 'k' verschwindet der Planet vollständig. Wenn ich es zu "-" ändere. es verschwindet auch. Ich habe unzählige Variationen ausprobiert und entweder verschwindet der Planet oder es gibt mir einen Fehler. Ich habe die Hilfe-Seite @ Matlabs Website in 2D-Plot, 3D-Plot, Linespec usw. angeschaut und habe immer noch keine Lösung gefunden!

Ich hoffe, jemand kann mir helfen, das herauszufinden so schnell wie möglich!

Dank

Antwort

0

Ihre Plots für jeden Planeten sind Liniendiagramme mit einem einzigen Punkt (plot3(0,0,0,'k.',...)). Das heißt, wenn Sie einen Marker festlegen, wird Ihr einzelner Punkt mit einem Marker versehen und so sehen Sie ihn. Momentan verwenden Sie den Punktmarker ('k.'). Wenn Sie den Punkt entfernen, gibt es keinen Marker mehr und auch keine Linie mehr, da keine zwei Punkte zu verbinden sind.

Ihre set(...) aktualisiert die Zeichnung nicht durch Hinzufügen von Punkten, sondern durch Verschieben des ursprünglich gezeichneten Punktes. Um zu sehen, was passiert, geben Sie inspect(h_mercury) ein, Sie werden feststellen, dass sein XData, YData, ZData nur einen einzigen Punkt enthält.

Wenn Sie Linien mit den vorherigen Punkten zeichnen möchten, müssen Sie sie zum Plot hinzufügen. Es gibt mindestens zwei Möglichkeiten:

  • Fügen Sie eine plot3(p_mercury(1),p_mercury(2),p_mercury(3),'k.')) zu Ihrer Schleife hinzu. Dadurch werden an allen bereits besuchten Positionen zusätzliche Plotpunkte gesetzt. Obwohl dies einfach ist, ist es nicht unbedingt das Beste: Es wird keine durchgehende Linie geben, die die Punkte verbindet, und wenn Sie viele Schritte machen, wird dies viele Punkte hinzufügen und somit die Animation verlangsamen. Wenn Sie dies verwenden möchten, müssen Sie auch den Befehl hold off am Ende der Schleife löschen, da andernfalls die plot3 die Darstellung löscht.
  • Besser: Speichern Sie die Trajektorie in einem Array und haben Sie zwei Diagramme, eines für die aktuelle Position (Punktmarker), eines für die Trajektorie (Linie). Etwas wie dieses:

.

h_mercury = plot3(1,1,1,'k.','markersize',35); 
h_mercury_trajectory = plot3(1,1,1,'k-'); 

p_mercury_trajectory = zeros(3,n); 
for step = 1:n 
    % your calculation of positions... 
    p_mercury = ... 
    p_mercury_trajectory(:,step) = p_mercury; 

    % rest of the loop ... 

    % update plots 
    set(h_mercury,'XData',p_mercury(1),'YData',p_mercury(2),'ZData',p_mercury(3)); 
    set(h_mercury_trajectory,'XData',p_mercury_trajectory(1,1:step),'YData',p_mercury_trajectory(2,1:step),'ZData',p_mercury_trajectory(3,1:step)); 
end 

Hier ist, wie es kurz nach Beginn aussieht:

Screenshot of orbit simulation

Ist das, was Sie im Sinn hatte?

noch eine Bearbeitung: Da ich Ihre Animation wirklich mochte, konvertierte ich Sonne und Planeten in Kugeln mit Licht aus der Mitte (Sonne). Ich mag den Effekt.Dies ist, wie es aussieht:

Screenshot of modified orbit simulation

Die Umlaufbahn des Mondes wenn auch ein wenig übertrieben ist, nicht wahr?

Anyways, das modifizierte Skript hier: https://nopaste.me/view/473add8f

+0

Also habe ich versucht, den Code, den Sie geschrieben, aber es nur hinzugefügt eine Linie von der Sonne zum Planeten (ich habe nur mit Merkur versucht, um zu sehen, wie es aussehen würde), die den Planeten um etwas wie eine Brücke vom Planeten zur Sonne begleitet. Was ist der Grund dafür? Und für die andere Lösung, die Sie geschrieben haben, würde ich dann den Plot3 (...) nach dem Satz (...) aka kurz vor dem Ende der Schleife hinzufügen? – Rida

+0

Ich hatte einen kleinen Fehler gemacht. Entschuldigen Sie. Ich habe meine Lösung bearbeitet und hier getestet, es sollte jetzt funktionieren. – Florian

+0

Genau! Ich werde versuchen, das, was du erstellt hast, zu kopieren und es allen meinen Planeten hinzuzufügen! Wenn Sie etwas weiter erklären möchten, würde ich gerne versuchen zu verstehen, was Ihr Code macht und nicht nur kopieren! – Rida

0

Linie Formatierung

Sie setzte die Linie verschwindet, wenn Sie den Stil 'k.'-'k' ändern Sie einen einzelnen Punkt Plotten (formatiert ein Punkt von .) also, wenn Sie die Punktmarkierung nicht zeichnen, haben Sie keine sichtbare Linie! Siehe unten für Code, der zum Zeichnen einer kontinuierlichen Spur oder zum Verschieben von Punkten verwendet werden kann.

Vorgeschlagene-Code

ich die Set Befehle vollständig weggelassen haben und einfach jede Iteration erneut aufgetragen, siehe unten ...

% Previous code omitted 
% <...> 

%% Calculations 

for step=1:n 

    % <...> 
    % Code omitted for clarity, do calculations for each planet as in question 
    % <...> 

    % Replace use of SET with continued use of PLOT3 

    % Clear figure from previous plot and hold on 
    figure(1) 
    clf   % << Remove if you don't want the previous points to disappear 
    hold on 

    % Do all plotting 
    h_sun = plot3(psol(1),psol(2),psol(3),'y.','markersize',80); 
    h_mercury = plot3(p_mercury(1),p_mercury(2),p_mercury(3),'k.','markersize',35); 
    h_venus = plot3(p_venus(1),p_venus(2),p_venus(3),'m.','markersize',45); 
    h_earth = plot3(p_jord(1),p_jord(2),p_jord(3),'b.','markersize',55); 
    h_moon = plot3(p_moon(1),p_moon(2),p_moon(3),'r.','markersize',25); 

    % Format, hold off, draw 
    xlabel('AU'); 
    ylabel('AU'); 
    zlabel('AU');  
    axis([-2 2 -2 2 -2 2]);  
    hold off   
    drawnow; 

end 
+0

Also habe ich das PLOT3, das außerhalb meiner Schleife war, direkt nach meiner Berechnung in meine Schleife verschoben. und ersetzte das SET mit PLOT3. Dies hat das Problem behoben, aber es fügt einfach die (vorherigen) Punkte und als solche den Marker hinzu, anstatt eine Linie hinter dem beweglichen Marker hinzuzufügen. – Rida

+0

Konnte meinen Kommentar nicht bearbeiten, aber ich habe gerade bemerkt, dass es auch meine 3D-Simulation in eine 2D-Simulation verwandelt hat. – Rida

+0

Sie haben also: Plotten, welche Updates wie bei der Simulation sind. Sie wollen: das Gleiche, aber auch mit einer Reihe zuvor berechneter Werte? Auch das ändert nichts an deiner Simulation, also bin ich mir nicht sicher, was du damit meinst, indem du sagst, dass es jetzt 2D ist? – Wolfie

Verwandte Themen