0
votes

Comment créer une animation dans MATLAB dont la courbe se déplace, pas les axes se déplacent?

Je veux tracer y = omega * x ^ 2, quel oméga est -3 en 3 avec une taille de pas de 0,25, x de -4 en 4 avec une taille de pas de 0,001. Mais ce code me donne la courbe ne peut pas bouger et les axes bougent. Je veux que la courbe bouge, comme ceci.

 entrez la description de l'image ici

x=-4:0.001:4;
for omega=-3:0.25:3
    for i=1:length(x)
        y(i)=omega*x(i)^2;
    end
    plot(x,y);
    pause(0.1);
end

Comment faire cela?


0 commentaires

3 Réponses :


3
votes

Une méthode rapide consiste à définir les limites des axes x et y dans la boucle après chaque tracé, en utilisant la commande axis ([xmin, xmax, ymin, ymax]). Cette méthode n'est pas infaillible, dans le cas où le script obtient de l'aide après le tracé mais avant de définir les limites des axes, mais dans la plupart des cas, cela devrait fonctionner.

figure(1)
x=-4:0.001:4;
for omega=-3:0.25:3
    for i=1:length(x)
        y(i)=omega*x(i)^2;
    end
    plot(x,y);
    axis([-4 4 -50 50])
    pause(0.1);
end


0 commentaires

4
votes

Comme une autre réponse l'a indiqué, vous devez définir les limites de l'axe.

(Notez également qu'il n'y a aucune raison de calculer y en utilisant une boucle.)

Mais au lieu d'utiliser plot à chaque fois dans la boucle, il est plus efficace de créer la ligne une seule fois, puis de remplacer les données x et y de la ligne à chaque fois dans la boucle.

x=-4:0.001:4;
all_omega=-3:0.25:3;
for idx = 1:numel(all_omega)
    omega = all_omega(idx);
    y=omega*(x.^2);
    if idx == 1
        % create animated line
        am = animatedline(x,y);
        axis([-4,4,-40,40]);
        box on
        grid on
    else
        % replace the line
        clearpoints(am)
        addpoints(am,x,y);
    end
    title(sprintf('\\Omega = %.2f',omega));
    pause(0.1);
end

Ou vous pouvez utiliser animatedline ,

x=-4:0.001:4;
all_omega=-3:0.25:3;
for idx = 1:numel(all_omega)
    omega = all_omega(idx);
    y=omega*(x.^2);
    if idx == 1
        % create line
        hl = plot(x,y);
        axis([-4,4,-40,40]);
        box on
        grid on
    else
        % replace line data
        set(hl,'XData',x,'YData',y);
    end
    title(sprintf('\\Omega = %.2f',omega)); 
    pause(0.1); 
end


0 commentaires

1
votes

C'est la même chose que la réponse de @ phil-goddard, mais utilise plus efficacement les poignées de la chaîne YData animée et du titre.

x = -4 : 0.001 : 4;
y = zeros(1, numel(x));
omega_range = -3 : 0.25 : 3;

% Create line and title, and obtain handles to them.
h_plot = plot(x, y);
axis([-4, 4, -40, 40]);
box on;
grid on;
h_title = title(sprintf('\\omega = %.2f', 0));

for idx = 1:numel(omega_range)
    omega = omega_range(idx);
    y = omega * (x.^2);

    % Replace y data.
    h_plot.YData = y;

    % Replace title string.
    h_title.String = sprintf('\\omega = %.2f', omega);
    pause(0.1);
end


0 commentaires