Enter password:
%% Parameters
format longE;
% define a function f
f = @(t,y) y - t^2 + 1;
% define endpoints
a = 0;
b = 2;
% tolerance
TOL = 1e-5;
% maximum and minimum step sizes
hmax = 0.25;
hmin = 0.01;
% initial condition
alpha = 0.5;
t = a;
w = alpha;
h = hmax;
%% Running the code
[t_arr, w_arr, w_hat_arr] = RKF45(f,t,w,h,b,TOL,hmax,hmin);
summary = cat(2,t_arr,w_arr,w_hat_arr,1/h*abs(w_arr-w_hat_arr));
% summary
%% RKF45 Algorithm
function [t_arr, w_arr, w_hat_arr] = RKF45(f,t,w,h,b,TOL,hmax,hmin)
% saving the data
t_arr = [t];
w_arr = [w];
w_hat_arr = [w];
FLAG = 1;
while FLAG == 1
k1 = h * f(t,w);
k2 = h * f(t+0.25*h, w+0.25*k1);
k3 = h * f(t+3/8*h, w+3/32*k1+9/32*k2);
k4 = h * f(t+12/13*h, w+1932/2197*k1-7200/2197*k2+7296/2197*k3);
k5 = h * f(t+h, w+439/216*k1-8*k2+3680/513*k3-845/4104*k4);
k6 = h * f(t+1/2*h, w-8/27*k1+2*k2-3544/2565*k3+1859/4104*k4-11/40*k5);
% RK 4
w_val = w + 25/216*k1 + 1408/2565*k3 + 2197/4104*k4 - 1/5*k5;
% RK 5
w_hat_val = w + 16/135*k1 + 6656/12825*k3 + 28561/56430*k4 - 9/50*k5 + 2/55*k6;
% Calculate R
R = 1/h * abs(w_val - w_hat_val);
if R <= TOL
t = t+h;
w = w_val;
t_arr = [t_arr; t];
w_arr = [w_arr; w];
w_hat_arr = [w_hat_arr; w_hat_val];
fprintf("t : %f\tw : %e\tw_hat : %e\tR : %e \n",t,w,w_hat_val,R)
end
delta = 0.84*(TOL/R)^(1/4);
if delta <= 0.1
h = 0.1*h;
elseif delta >= 4
h = 4*h;
else
h = delta * h;
end
if h > hmax
h = hmax;
end
if t >= b
FLAG = 0;
elseif t+h > b
h = b-t;
elseif h < hmin
FLAG = 0;
fprintf("minimum h exceeded")
end
end
fprintf("The number of time steps : %d\nSolution at t=%f : %f\n", length(t_arr), b, w)
end