如何在曲线移动而不是轴移动的 MATLAB 中制作动画?

How to make animation in MATLAB which the curve is moving, not axes is moving?

我想绘制 y=omega*x^2,其中 omega 是 -3 到 3,步长为 0.25,x 从 -4 到 4,步长为 0.001。但是这段代码给我的曲线是不能移动的,轴是移动的。我希望曲线在移动,像这样。

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

怎么做?

一种快速的方法是在每个绘图后使用 axis([xmin, xmax, ymin, ymax]) 命令在循环中设置 x 轴和 y 轴的限制。这种方法不是万无一失的,如果脚本在绘图之后但在设置轴限制之前得到帮助,但在大多数情况下它应该有效。

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

正如另一个答案所指出的,您需要设置轴限制。

(另请注意,没有理由使用循环来计算 y。)

但是,与其每次循环都使用 plot,不如只创建一次该行,然后每次都替换该行的 xy 数据更有效通过循环。

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

或者您可能想使用 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 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

这与@phil-goddard的答案相同,但更有效地使用了动画 YData 和标题字符串的句柄。

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