The following is an implementation in Matlab where Heun's method is used to approximate the error for Euler's method. The scaling factor is restricted to halving or doubling the size of the interval.
function [ts, ys] = heuler( f, tint, y0, h, eps_step ) % tint is a vector of two entries represting the interval [t_0, t_end] t0 = tint(1); tend = tint(2); % We will start with vectors with one element and % continue to add further elements ts = t0; ys = y0; k = 1; while ( ts(k) < tend ) K0 = f(ts(k), ys(k)); K1 = f(ts(k) + h, ys(k) + h*K0); % Euler's approximation y1 = ys(k) + h*K0; % Heun's approximation z1 = ys(k) + h*(K0 + K1)/2; s = sqrt( eps_step/abs( y1 - z1 ) ); if ( s < 1 ) % h is too large h = h/2; elseif ( s < 2 ) % h is appropriate ts( k + 1 ) = ts(k) + h; ys( k + 1 ) = y1; k = k + 1; else % s >= 2 % h is too small ts( k + 1 ) = ts(k) + h; ys( k + 1 ) = y1; k = k + 1; h = 2*h; end % If ts(k) + h > tend, set h = tend - ts(k) h = min( h, tend - ts(k) ); end end
Copyright ©2006 by Douglas Wilhelm Harder. All rights reserved.