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

Kontinuierliche Darstellung von Funktionen (Lissajous-Figur)

 

ExxE
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 19.03.12
Wohnort: Wien
Version: R2010b
     Beitrag Verfasst am: 12.09.2012, 12:13     Titel: Kontinuierliche Darstellung von Funktionen (Lissajous-Figur)
  Antworten mit Zitat      
Hallo Comunity!

Ich bin gerade dabei mir mittels des Buches "Die nicht zu kurze Kurzeinführung in MATLAB",MATLAB Wissen anzueignen.
Es sind darin Übungsbeispiele ohne Lösung enthalten.
Also "Lösungshilfe" sind lediglich die Befehle angeführt, die man verwenden soll.

Jetzt aber zu meiner Frage:

Ich soll eine Lissajous-Figur darstellen.
Wobei sich die Phasenverschiebung kontinuierlich von 0°-360° verändern und die Frequenz schrittweise in Einer schritten ändern soll.
Die Darstellung soll weiters "flimmerfrei und optisch ansprechend sein".

Es sollen die Befehle: "linspace", "figure", "hold", "axis", "colordef", "plot", "pause", "for "verwendet werden.

Mein Problem dabei ist, dass ich es bei weitem nicht flimmerfrei hinkriege!
Mein PC limitiert die Darstellungsgeschwindigkeit.

Ich habe schon folgendes probiert:

1.Reduktion der diskreten Zeitpunkte "t" => schnellere Darstellung aber die Figur wird nur als Punktmuster dargestellt.
2.Reduktion der pause-Zeit => Bringt nichts, da der PC es nicht schafft.
3.Erhöhung der Phasenverschiebung "phi" => Bewegung wird feiner aber noch langsamer.

Und wenn ich den Befehl "axis" dazugebe um die Darstellung ein wenig vom Koordinatensystem weg zu schieben, ist es ganz vorbei...

Die Befehle "figure" und "colordef" habe ich noch nicht verwendet.
Wie mir "figure" helfen könnte weiß ich nicht und "colordef" wird wohl nur für die optische Darstellung sein.

Hier mein Code:

Code:
clear, clc, clf

f=1;
omega=2*pi*f;
n=1;

%Schrittweise Erhöhung der Frequenz, der y-Komponente mittels "n"

for n=linspace(1,5,5)
   
    %Definition der Phasenverschiebung "phi", wird schrittweise erhöht
   
    for phi=linspace(0,2*pi,50)
   
        %Definition der diskreten Zeitschritte "t"
       
        for t=linspace(0,10,1000)
   
            x=sin(omega.*t);
            y=sin(n*omega.*t+phi);
            plot(x,y)
            %axis([-1.2 1.2 -1.2 1.2]);
            hold on
           
        end
       
    pause(0.04)
    clf
           
    end
   
end
 


Vielleicht kann mir jemand helfen!?
LG
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.09.2012, 13:38     Titel: Re: Kontinuierliche Darstellung von Funktionen (Lissajous-Fi
  Antworten mit Zitat      
Hallo ExxE,

PLOT benötigt als High-Level-Funktion immer einige Zeit. Danach werden die X- und Y-Limits des AXES-Objekts neu bestimmt, was ebenfalls aufwändig ist.
Schneller, also flimmer-ärmer, ist es, das Objekt nur einmal zu erstellen und danachg nur noch die XData und YData upzudaten.

Code:

lineH = plot([], []);  % Geht das? Ich kann es gerade nicht testen

for n=linspace(1,5,5)
 ...    
            t = linspace(0,10,1000);  % Ohne FOR!
            x = sin(omega.*t);
            y = sin(n*omega.*t+phi);
            set(lineH, 'XData', x, 'YData', y);
...

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ExxE
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 19.03.12
Wohnort: Wien
Version: R2010b
     Beitrag Verfasst am: 12.09.2012, 16:52     Titel:
  Antworten mit Zitat      
Hallo Jan

Danke für deine Antwort!

Ich habe deinen Code mal so eingesetzt wie ich glaube das du es dir vorgestellt hast.
Ich bekomme zwar keine Fehlermeldung aber auch kein Ergebniss, sprich keine Darstellung im Grafikfenster.

Code:
clear, clc, clf

f=1;
omega=2*pi*f;
n=1;

%Schrittweise Erhöhung der Frequenz, der y-Komponente mittels "n"

lineH = plot([], []);

for n=linspace(1,5,5)
   
    %Definition der Phasenverschiebung "phi", wird schrittweise erhöht
   
    for phi=linspace(0,2*pi,50)
       
        %Definition der diskreten Zeitschritte "t"
       
        t = linspace(0,10,1000);  % Ohne FOR!
        x = sin(omega.*t);
        y = sin(n*omega.*t+phi);
        set(lineH, 'XData', x, 'YData', y);
           
        pause(0.04)
        clf
           
    end
   
end


Warscheinlich habe aber nur ich einen Fehler gemacht. Anfänger...

Du hast mich aber auf die Idee gebracht, dass ich die innerste "for-Schleife" ja garnicht benötige und so funktioniert es wirklich gut!!!

Neuer Code:

Code:
clear, clc, clf

f=1;
omega=2*pi*f;
n=1;

a=0.5;

colordef black;

%Schrittweise Erhöhung der Frequenz, der y-Komponente mittels "n"

for n=linspace(1,5,5)
   
    %Definition der Phasenverschiebung "phi", wird schrittweise erhöht
   
    for phi=linspace(0,2*pi,300)
   
        %Definition der diskreten Zeitschritte "t"
       
        t=linspace(0,10,1000);
        x=sin(omega.*t);
        y=sin(n*omega.*t+phi);
       
        plot(x,y)
        axis([-1.5 1.5 -1.5 1.5]);
        hold on
           
        pause(0.015)
        clf
   
    end
   
    pause(a);
   
end


Dennoch würde es mich interessieren wie du das mit den Befehlen
Code:
lineH = plot([], [])
und
Code:
set(lineH, 'XData', x, 'YData', y)
gemeint hast.

Wenn ich das richtig verstehe, hast du mit "lineH=plot([] [])" einen Platzhalter definiert.
Und dieser soll dann mittels "set(...)" befüllt werden?

Hast du den Platzhalter nach Lust und Laune so benannt oder hat das einen Zweck?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.09.2012, 23:21     Titel:
  Antworten mit Zitat      
Hallo ExxE,

Nächster Versuch, jetzt habe ich auch Matlab zum Testen:
Code:
f=1;
omega=2*pi*f;
n=1;

lineH = [];
t = linspace(0,10,1000);  % Ausserhalb der Schleifen

for n = linspace(1,5,5)
    for phi = linspace(0, 2 * pi, 50)
        x = sin(omega .* t);
        y = sin(n * omega .* t + phi);
        if isempty(lineH)
          lineH = plot(x, y);
        else
          set(lineH, 'XData', x, 'YData', y);
        end        
        pause(0.04)
      end
end

Der LINE oder PLOT Befehl gibt einen "Handle" zu dem erzeugten Objekt zurück. Danach kann man per SET die "Properties", also die Eigenschaften des Objektes ändern. Eine Liste der Properties bekommst Du mit:
Code:


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ExxE
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 19.03.12
Wohnort: Wien
Version: R2010b
     Beitrag Verfasst am: 13.09.2012, 11:44     Titel:
  Antworten mit Zitat      
Hallo Jan,

Danke, ich habe dein Programm getestet, es funktioniert auch sehr gut!

Nur verstehe ich nicht warum du die if-else Unterscheidung eingebaut hast.
Wenn ich das richtig verstehe, wird geprüft ob in "lineH" Werte vorhanden sind.
Wenn nicht, soll x über y geplottet werden.
Wenn schon, sollen die x und y Daten eingelesen werden.

Das könnte man aber auch weglassen(siehe Code unten).
Hast du das aus einem bestimmten Grund eingebaut?

Code:
clear, clc, clf
f=1;
omega=2*pi*f;
n=1;

lineH = [];
t = linspace(0,10,1000);  % Ausserhalb der Schleifen

for n = linspace(1,5,5)
    for phi = linspace(0, 2 * pi, 50)
        x = sin(omega .* t);
        y = sin(n * omega .* t + phi);
        % if isempty(lineH)
          lineH = plot(x, y);
        % else
        %  set(lineH, 'XData', x, 'YData', y);
        % end        
        pause(0.04)
    end
end


Lg, Thomas
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 - 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.