2017-01-19 3 views
0

Ich möchte ein animiertes Gif einer Lösung für eine partielle Differentialgleichung erstellen. Das heißt, das Gif sollte die Lösung zu einem bestimmten Zeitpunkt zeigen.Wie erstelle ich ein animiertes GIF in MATLAB?

example

Derzeit kann ich nur Bilder, in denen machen alle Zeiten aufgetragen sind. Unten ist mein ganzes Programm, mit figure(3) ist mein Versuch, ein gif zu machen.

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 

Der Ausgang gif, die ich erhalte, ist

this

die deutlich belebt nicht.

Hinweis: Wenn Sie denken, dass es einen besseren Ort gibt, um diese Frage zu stellen, bitte leiten Sie mich dazu. Da mein Problem mit der MATLAB-Programmiersprache und nicht mit der Mathematik verbunden ist, dachte ich, dies wäre der beste Ort, um meine Frage zu stellen.

Antwort

3

Der erste Eingang zu getframe ist das Handle des figure, von dem Sie einen Screenshot machen möchten. Wie Sie es geschrieben haben, greifen Sie Abbildung , die sich tatsächlich auf die erste Figur bezieht, die Sie erstellen, dass Sie nicht innerhalb Ihrer Schleife aktualisieren.

Sie haben einen numerischen Griff die Figur zugewiesen, die Sie direkt vor Ihrer letzten Schleife erstellen, damit Sie getframe sagen, werden Sie wollen stattdessen dass Figur zu verwenden.

Zusätzlich würde ich ein Plotobjekt erstellen und die XData und YData aktualisieren, anstatt kontinuierlich neue Plotobjekte zu erstellen. Das Problem mit plot Kontinuierlich ist, dass es langsam ist AND es setzt alle Ihre axes Einstellungen wie x und y Etiketten sowie x und y Grenzen.

% 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

+0

Das ist mein Hauptproblem lösen half. Wie fixiere ich die Achsenmaße (vertikal) und beschrifte die Achse? – AzJ

+0

@AzJ Aktualisiert, um zu zeigen, wie Sie das erreichen können – Suever

Verwandte Themen