% Bare essentials of MATLAB for Math 46 class % Alex Barnett 4/6/07, updated 4/3/08 % % In windows or Mac, click on the Matlab icon. % Anything after a % is a comment % You can type each line at the command line, or save it as intro.m and % run the whole thing as a program by typing `intro' a = 5; % a symbol can be a number (scalar) a % without a ; the answer is printed sa = sin(a) % sa now contains sin of a, ie sin(5) b = [1 2 3] % a row vector (row vec) c = [3; -2; 4.6] % a column vector (col vec) c(3) % look up the 3rd element of c d = [1 2 3; 4 5 6] % 2x3 matrix (array) d(2,1) % get entry at 2nd row, 1st col d(:,1) % get whole 1st col d(2,:) % get 2nd row b*c % matrix product. Careful with order! % * computes matrix product. Therefore b*c computes dot product (a scalar), % but c*b computes 3-by-3 `outer product'. dot(b,c) % dot(c,b) same, better way for dot prod d = c' % d is now transpose of c (row vec) b.*d % element-by-element multiply, a 1-by-3 sin(b) % sin of all elements at once (fast!) plot(b, c, '+'); % plot c vs b using + symbols % Note: this means plot the 3 points (b(1),c(1)), (b(2),c(2)) and (b(3),c(3)) % b is interpreted as `x values' (horizontal), c as `y values' (vertical). % Number of elements in b and c must match up (unless want multiple lines) axis([0 4 -3 5]); % manually choose axes range plot(b, c, 'g-'); % plot same using instead green lines help % list of help menus help plot % give help on eg plot command doc % if you prefer graphical help window whos % show all currently-defined variables save mydata % save all variables as file mydata.mat quit % need I say? load mydata % load vars (can overwrite variables) clear % clear all variables (careful!) % Use up and down arrows to scroll through recent commands, enter to execute % I will postpone matrices & linear algebra for later... % Solving general 1st-order ODE y' = f(t,y) numerically ---------------------- f = @(t,y) 1-y; % set up func of 2 vars f(t,y) = 1-y f(2,3) % check it evaluates correctly yo = 0; % initial condition at t=0 is yo=0 [ts, ys] = ode45(f, [0, 3], yo, odeset('reltol', 1e-10)); % solve ODE (using 'Runge-Kutta') % over the t-range [0,3] % ts is now a col vec of t values, ys is col vec of corresponding y values % ---------------------------------------------------------------------------- plot(ts, ys, '+-'); % plot solution with + symbols and lines yex = 1 - exp(-ts); % compute analytic (exact) y values % at each already-existing t value % Note that we subtracted exp(ts) which is a col vec, from 1 which is a scalar, % but it figured out to do the right thing (make 1 an appropriate vector of 1s) hold on; % plot the next graph over this one plot(ts, yex, 'ro'); % compare exact solution as red o symbols hold off; % stop overlaying future graphs figure(2); % start a new figure plot(ts, ys-yex, '+-'); % Subtract the two - best way to compare! xlabel('t'); ylabel('y error'); % label axes: important to communicate! title('dy/dt = 1-y: error in numerical solution ys-yex'); % Solving general 2nd-order ODE y'' = f(t,y,y') numerically ------------------ % eg consider u'' - u = eps.t.u % rewrite as coupled 1st-order with col vec y = [u; v], where v = u' % then ODE is y' = F(y) for F:R2->R2 some vector function eps = 0.1; % note you have to set value of eps F = @(t, y) [ y(2); y(1)*(1 + eps*t)]; % before you create vec func F yo = [1;1]; % IC for u and v [ts, ys] = ode45(F, [0 3], yo); % numerically solve in t domain [0,3] %----------------------------------------------------------------------------- figure; plot(ts, ys(:,1), '-'); % plot just first col (u values) vs t hold on; plot(ts, ys(:,2), '--r'); % add v = u' to the plot xlabel('t'); legend('u', 'v = u'''); title('solution of 2nd-order ODE'); % note how in order to create a prime (') inside the text string I had to use % '' (the third ' is the one which closes the string!) % You could now compare against an analytic solution and add that to your plot % See course website links for more complete introductions. Enjoy!