MATLAB Creating 3D Animations in MATLAB for ODEs/PDEs

AI Thread Summary
The discussion focuses on creating 3D animations of ordinary and partial differential equations in MATLAB for educational purposes. The user initially struggled with animating plots in MATLAB 2010a but later found a helpful example on Wikipedia. The provided code illustrates the heat equation using finite differences and the Forward Euler method, demonstrating how to visualize the temperature distribution over time. Key elements include setting up the mesh grid, applying boundary conditions, and saving frames for animation. The conversation highlights the importance of visual aids in teaching complex mathematical concepts.
QweticoWoods
Messages
11
Reaction score
0
I was tasked with making some animations of simple ODEs and PDEs in MATLAB for use in an undergraduate class. (Vibrating string, Heat Equation, Navier-Stokes)...

I wrote some code and plotted some graphs, but I'm not seeing an option to animate along an axis in 2010a. Maybe I'm blind and it's staring me right in the face.

Thoughts?
 
Physics news on Phys.org
Oye... Nevermind. I found a great example on how to do this on Wikipedia.

Heat_eqn.gif


Code:
% illustration of the heat equation
% Solve the heat equation using finite differences and Forward Euler
function main()
 
   % the number of data points. More points means prettier picture.
   N = 100;
 
   L = 2.5; % the box size is [-L, L] x [-L, L]
 
   XX = linspace(-L, L, N);
   YY = linspace(-L, L, N);
   [X, Y] = meshgrid(XX, YY);
 
   scale = 2;
   Z = get_step_function (N, scale, X, Y);
 
   CFL = 0.125; % Courant–Friedrichs–Lewy
   dx = XX(2)-XX(1);  dy = dx; % space grid
   dt = CFL*dx^2;
 
   plot_dt = 0.004; % plot every plot_dt iterations
 
 
% Solve the heat equation with zero boundary conditions
   T = 0:dt:1;
   iter = 0;
   frame_no = 0;
   for t=T
 
      % plot the current temperature distribution
      if floor(t/plot_dt) + 1 > frame_no
 
	 frame_no = frame_no + 1
 
        % plot the surface
	 figure(2); clf; 
	 surf(X, Y, Z);
 
         %  make the surface beautiful
	 shading interp; colormap autumn;
 
         % add in a source of light
	 camlight (-50, 54);
	 lighting phong;
 
         % viewing angle
	 view(-40, 38);
 
	 axis equal; axis off;
	 axis([-L, L, -L, L, 0, scale])
 
	 hold on; plot3(0, 0, 3.4, 'g*'); % a marker to help with cropping
 
	 pause(0.1);
	 %return
 
	 file = sprintf('Movie_frame%d.png', 1000+frame_no); saveas(gcf, file) %save the current frame
 
	 disp(file); %show the frame number we are at
 
         % cut at max_fr_no frames
	 max_fr_no = 15; 
	 if frame_no >= max_fr_no
	    break
	 end
 
      end
 
      % advance in time
      W = 0*Z;
      for i=2:(N-1)
	 for j=2:(N-1)
 
	    W(i, j) = Z(i, j) + dt * ( Z(i+1, j) + Z(i-1, j) + Z(i, j-1) + Z(i, j+1) - 4*Z(i, j))/dx^2;
 
	 end
      end
      Z = W;
 
   end
 
 
% The gif image was creating with the command 
% convert -antialias -loop 10000  -delay 20 -compress LZW Movie_frame10* Heat_eqn.gif 
 
% get a function which is 1 on a set, and 0 outside of it
function Z = get_step_function(N, scale, X, Y)
 
   c = 2;
   d=-1;
   e=1;
   f=0.5;
   k=1.2;
   shift=10;
 
   Z = (c^2-(X/e-d).^2-(Y/f).^2).^2 + k*(c+d-X/e).^3-shift;
 
   Z = 1-max(sign(Z), 0);
   Z = scale*Z;
 

Attachments

  • Heat_eqn.gif
    Heat_eqn.gif
    64.9 KB · Views: 701

Similar threads

Replies
12
Views
3K
Replies
7
Views
4K
Replies
1
Views
3K
Replies
3
Views
3K
Replies
2
Views
3K
Replies
6
Views
26K
Replies
4
Views
3K
Replies
2
Views
7K
Back
Top