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

Flüssige Bewegungsdarstellung in 2D Plot

 

Jarrao90
Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2017, 13:03     Titel: Flüssige Bewegungsdarstellung in 2D Plot
  Antworten mit Zitat      
Guten Tag,
auf folgender Seite habe ich eine interessante Art gefunden um den Orbit verschiedener Planeten darzustellen:

https://de.mathworks.com/help/physm.....orbit-due-to-gravity.html

Dort sieht man wie schön flüssig sich die Planeten bewegen. Mit welchem Tool kann ich in Matlab solch eine 2D Darstellung erzeugen, so dass ich dort meine x-y- Koordinaten übergeben kann, um bestimmte Bewegungen zu erzeugen? Denn mit dem normalen plot-Befehl geht es auch, aber es sieht nicht so schön flüssig aus.

Vielleicht kann mir Jemand noch einen Tipp geben mit welchen Befehlen / Tools, ich meine Berechnungen so schön darstellen kann?

Danke im Voraus Smile
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: 13.07.2017, 18:59     Titel:
  Antworten mit Zitat      
Hallo,

poste doch bitte deine bisherigen Versuche. Generell beschleunigt es die Ausführung, wenn man statt einen neuen Plot zu erzeugen nur die Daten (Eigenschaften XData, YData) ersetzt.

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: 15.07.2017, 21:03     Titel:
  Antworten mit Zitat      
Also mein erster Versuch war folgendes:
Code:

clc
clear all

G=6.67408e-11;  % Gravitationskonstante
m_e=5.972e+24;  % Masse der Erde
r_e = 6300e+3   % Radius der Erde
t=2000;         % Iterationen

%Startbedingungen
r_f=35000e+3;    %Flughöhe über Erdboden
r_o=r_e+r_f      %Ortsvektor absolut
v_x_0=300;       %Startgeschwindigkeit x-Richtung
v_y_0=-3000;     %Startgeschwindigkeit y-Richtung
x_0=r_o;         %Startort x-Koordinate
y_0=0;           %Startort y-Koordinate
h=60;            %Zeitschrittweite
%----------------
i=1;
x=zeros(1,t);
x(1,i)=x_0;
y(1,i)=y_0;
v(1,i)=v_x_0;
v(2,i)=v_y_0;
%img = imread('globe.tif');          
%imagesc([-5*10e+6 5*10e+6], [-5*10e+6 5*10e+6], img);
%hold on;
for s=0:t-1
    r(1,i)=((x(1,i).^2)+(y(1,i).^2)).^(3/2);
    x(1,i+1)=x(1,i)+v(1,i).*h;
    v(1,i+1)=v(1,i)+(G.*m_e./(r(1,i)).*-(x(1,i)).*h);
    y(1,i+1)=y(1,i)+v(2,i).*h;
    v(2,i+1)=v(2,i)+(G.*m_e./(r(1,i))*-(y(1,i)).*h);
    axis([-5*10e+6 5*10e+6 -5*10e+6 5*10e+6 ])
 pause (0.001)
 plot(x(1,i),y(1,i),'.');
hold on
 i=i+1;
end

%plot(x(1,i),y(1,i),'.');
 


Mit dem ersten Ergebnis bin ich zufrieden. Ich habe sogar ein Bild eingefügt, welches jedoch für dieses Minimalbeispiel auskommentiert wurde.
Im weiteren möchte ich den Plot bisschen besser visualisieren und in eine Funktion auslagern. Außerdem werde ich versuchen die DGL mit einem besseren Verfahren zu lösen, da auch bei kleinen Zeitschritten das Objekt an Energie gewinnt, so dass eine Spirale statt eines geschlossenen Kreises entsteht. Das Ziel ist es im späteren Verlauf mehr Kräfte in das Modell einzubeziehen. Als Bespiel wäre hier die Widerstandskraft erwähnt. Diese würde zumindest bei einem Startwert auf Bodenhöhe in Form eines Luftwiderstandes auftreten. Mir ist bewusst, dass dieser z.B. von der Höhe abhängt (Dichte) und vom CW-Wert, welcher wiederum eine Funktion der Geschwindigkeit ist und deshalb auch nur iterativ ermittelbar. Deshalb würde ich diese Werte zunächst als konstant oder linear annehmen. Ich würde das ganze aber gerne auf hübschen, so dass es wie in meinem geposteten Link flüssiger läuft (im Moment ist es ziemlich laggi) und ggf. mit einem Panel die Parameter währenddessen oder zumindest zuvor anpassen kann.

Mit Matlab habe ich noch nicht soviel Erfahrung. Falls Jemand einen Tipp für eine vereinfachte Schreibweise hat, bin ich da auch immer offen für. Ich hab jetzt alles in eine Schleife gepackt und versucht das Ganze innerhalb und einmal außerhalb der Schleife zu plotten (auskommentierter Plot).
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.07.2017, 23:02     Titel:
  Antworten mit Zitat      
Hallo,

und, hast du den Vorschlag mal versucht?
In deinem Beispiel gewinne ich damit einen Faktor 3.
Code:

for s=0:t-1
    % Berechnungen ...
    axis([-5*10e+6 5*10e+6 -5*10e+6 5*10e+6 ])
    if s == 0
        p = plot(x(1,i),y(1,i),'.');
    else
        p.XData = x(1, 1:i);
        p.YData = y(1, 1:i);
    end
    drawnow
    i=i+1;
end


Wenn es noch schneller gehen soll, kannst du ein paar Frames auslassen. Für das menschliche Auge sieht es immer noch flüssig aus:
Code:
for s=0:t-1
    % Berechnungen ...
   
    if s == 0
        p = plot(x(1,i),y(1,i),'.');
        axis([-5*10e+6 5*10e+6 -5*10e+6 5*10e+6 ])
    elseif mod(s,4) == 0
        p.XData = x(1, 1:i);
        p.YData = y(1, 1:i);
        axis([-5*10e+6 5*10e+6 -5*10e+6 5*10e+6 ])
        drawnow
    end    
    i=i+1;
end


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: 15.07.2017, 23:53     Titel:
  Antworten mit Zitat      
Danke Harald, sieht schon sehr nice aus und macht natürlich auch viel mehr Sinn Smile
Sagen wir ich möchte jetzt z.B. ein einzelnes Objekt sich bewegen lassen entlang der Koordinaten, ginge das auch?

Also im Fall von XData müsste es ja zumindest möglich sein einen Punkt zu erzeugen und im nächsten Durchlauf zu löschen und den neuen einen Schritt weiter zu erstellen, dann sähe es so aus als würde dieser alleine durch die Luft kreisen.

Ich werde mir aber jetzt auch parallel noch die Help Seite dazu durchlesen.
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.07.2017, 09:14     Titel:
  Antworten mit Zitat      
Hallo,

statt
Code:
p.XData = x(1, 1:i);
 
kannst du auch
Code:
p.XData = x(1, i);

verwenden. Dann wird nur der momentane Punkt angezeigt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
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 - 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.