Creating 3D Animations in MATLAB for ODEs/PDEs

  • Context: MATLAB 
  • Thread starter Thread starter QweticoWoods
  • Start date Start date
  • Tags Tags
    3d animations Matlab
Click For Summary
SUMMARY

This discussion focuses on creating 3D animations of ordinary differential equations (ODEs) and partial differential equations (PDEs) using MATLAB 2010a. The user successfully implemented a solution for the heat equation using finite differences and the Forward Euler method, generating animated plots of temperature distributions. Key features include the use of meshgrid for surface plotting, Courant–Friedrichs–Lewy condition for stability, and saving frames as PNG images for later compilation into a GIF. The user also referenced a helpful example found on Wikipedia for further guidance.

PREREQUISITES
  • Familiarity with MATLAB programming (version 2010a)
  • Understanding of ordinary and partial differential equations
  • Knowledge of numerical methods, specifically finite differences
  • Basic skills in 3D plotting and animation techniques in MATLAB
NEXT STEPS
  • Explore MATLAB's built-in functions for advanced 3D plotting and animation
  • Learn about the implementation of the Navier-Stokes equations in MATLAB
  • Research techniques for optimizing animation performance in MATLAB
  • Investigate the use of MATLAB's 'VideoWriter' for creating video files from plots
USEFUL FOR

Students, educators, and researchers in mathematics and engineering fields who are interested in visualizing ODEs and PDEs through MATLAB animations.

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: 728

Similar threads

  • · Replies 12 ·
Replies
12
Views
4K
  • · Replies 7 ·
Replies
7
Views
4K
  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 11 ·
Replies
11
Views
17K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 5 ·
Replies
5
Views
10K
  • · Replies 6 ·
Replies
6
Views
27K
  • · Replies 4 ·
Replies
4
Views
4K
  • · Replies 2 ·
Replies
2
Views
7K