Verfasst am: 12.09.2012, 12:13
Titel: Kontinuierliche Darstellung von Funktionen (Lissajous-Figur)
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.
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);
...
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.
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:
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?
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
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
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.