如何在MATLAB中生成动画GIF?

时间:2017-01-19 21:17:19

标签: matlab matlab-figure pde

我想生成一个偏微分方程解的动画GIF。那就是gif应该在特定时间显示解决方案。

example

目前我只能制作所有时间都被绘制的图片。 下面是我的整个程序,figure(3)是我尝试制作一个gif。

clear all;
close all;
%%%%%%%%%%%%
% For slide 27 of Diffusion 1D
% The equation to be graphed in latex form is
% u(x,t)=\frac{1}{L}+\frac{2}{L}\sum^{\infty}_{n=1}cos(\frac{n\pi x_0}{L})cos(\frac{n\pi x}{L})e^{-k(\frac{n\pi}{L})^2t}
%%%%%%%%%%%%

%define constants
%note that the constants listed in the file are arbitrary
L = 2; %length of the rod
k= 0.01; % Diffusivity, which is assume to be constant but can be a function of x
x0 = 1; %location of the inital condition i.e. f(x)=delta(x-x0)
tmax= 50; %maximum amount of time the simulation runs
nmax = 200; % maximum value for n, increase to accuracy
tgrid = 21; %The number of points to be evaluated in the time domain
xgrid = 51; %The number of points to be evaluated in the space domain

%initialize variables
u=zeros(tgrid,xgrid); %preallocate array used for storing values of the solution
t=linspace(0,tmax,tgrid);%We assume that time is evenly distributed
x=linspace(0,L,xgrid); %We assume that space is evenly distributed

%Plotting variables
figure(1);
hold on;
axis([0 L -inf inf]);
xlabel('x');
ylabel('u(x,t)');
%Calculation,
for i=1:tgrid
    for j=1:xgrid
        seriesSum=0;
        %Calculate the fourier series up to nmax for each point u(x,t)
        for n= 1:nmax
            seriesSum= seriesSum + cos(n*pi*x0/L)*cos(n*pi*x(j)/L)*exp(-k*t(i)*(n*pi/L)^2);
        end
        %Finish calcuation for solution at a specific point
        u(i,j)= 1/L+(2/L)*seriesSum;
    end
    %After we have calculated all points at time t, we graph it for time t
    plot(x,u(i,:),'linewidth',4);
end
saveas(gcf,'PDE_sol.png')%Save figure as png in current directory

%run a second loop that does not include the initial condition to get a
%better view of the long term behaviour.
%Plotting variables
figure(2);
hold on;
axis([0 L -inf inf]);
xlabel('x');
ylabel('u(x,t)');
for i=2:tgrid
    plot(x,u(i,:),'linewidth',4);
end
saveas(gcf,'PDE_sol_without_inital.png')%Save figure as png in current directory

%Create a gif verison of figure 2
figure(3);
axis([0 L -inf inf]);
xlabel('x');
ylabel('u(x,t)');
filename = 'PDE_sol.gif';
for i=2:tgrid
    plot(x,u(i,:),'linewidth',4);
    drawnow
    frame = getframe(1);
    im = frame2im(frame);
    [imind,cm] = rgb2ind(im,256);

    if i == 2;
        imwrite(imind,cm,filename,'gif', 'Loopcount',inf);
    else
        imwrite(imind,cm,filename,'gif','WriteMode','append');
    end
end

我得到的输出gif是

this

显然没有动画。

注意:如果您认为有更好的地方发布此问题,请指导我。由于我的问题是使用MATLAB编程语言而不是数学,我认为这是发布我的问题的最佳位置。

1 个答案:

答案 0 :(得分:4)

getframe的第一个输入是figure的句柄,您想截取屏幕截图。正如您所写的那样,您正在抓取图 1 ,这实际上是指您创建的第一个未在循环中更新的数字。

您已为上一次循环之前创建的数字指定了 3 的数字句柄,因此您需要告诉getframe使用 >而不是。

此外,我将创建一个绘图对象并更新XDataYData,而不是连续创建新的绘图对象。连续调用plot的问题在于,它很慢 AND 它会完全重置所有axes设置,例如x和y标签以及x和y限制。

% Store the handle to the figure in hfig
hfig = figure(3);

% Create the initial plot object
hplot = plot(NaN, NaN, 'LineWidth', 4);

axis([0 L 0 2]);
xlabel('x');
ylabel('u(x,t)');

filename = 'PDE_sol.gif';

for i=2:tgrid
    % Update the plot appearance
    set(hplot, 'XData', x, 'YData', u(i,:));
    drawnow

    % Get a screenshot of THIS figure
    frame = getframe(hfig);
    im = frame2im(frame);

    [imind,cm] = rgb2ind(im,256);

    if i == 2;
        imwrite(imind,cm,filename,'gif', 'Loopcount',inf);
    else
        imwrite(imind,cm,filename,'gif','WriteMode','append');
    end
end

enter image description here