function [w,t] = Adams4PCv(FunFcnIn, Intv, alpha, N) % On input: % FunFcnIn is the name of function to be integrated % interv is the interval to be integrated over % % The problem: y' = f(t,y), y(a) = alpha, a<= t <= b % where Intv = [a b], and a call to FunFcnIn with % argument (t, y) returns f(t,y). % % Adams4PC uses the Adams 4th order Predictor-Corrector method % to approximate y at N+1 equi-spaced points on [a, b]. % % This is the vector version of Adams4PC. % % On output % t contains the (equi-spaced) mesh points, w the % function values at these points. % % Written by Ming Gu for Math 128A, Fall 2008 % [FunFcn,msg] = fcnchk(FunFcnIn,0); if ~isempty(msg) error('InvalidFUN',msg); end a = Intv(1); b = Intv(2); h = (b-a)/N; m = length(alpha); w = zeros(m, N+1); t = a + h*(0:N)'; w(:,1)= alpha; % % RK4v for the first 3 steps % h2 = h/2; for i = 1:3 k1 = h* FunFcn(t(i),w(:,i)); k2 = h* FunFcn(t(i)+h2,w(:,i)+k1/2); k3 = h* FunFcn(t(i)+h2,w(:,i)+k2/2); k4 = h* FunFcn(t(i)+h,w(:,i)+k3); w(:,i+1) = w(:,i) + (k1+2*k2+2*k3+k4)/6; end % % main loop % p = h*[-9/24 37/24 -59/24 55/24]'; c = h*[ 1/24 -5/24 19/24 9/24 ]'; f = zeros(m,4); for i = 1:4 f(:,i) = FunFcn(t(i), w(:,i)); end for i = 4:N wp = w(:,i) + f*p; fp = FunFcn(t(i+1),wp); w(:,i+1) = w(:,i) + [f(:,2:end),fp]*c; f =[f(:,2:end), FunFcn(t(i+1),w(:,i+1))]; end