% problem 3
clc, clear

% Adam-Bashforth 4-step explicit method
% define symbolic variables
syms h t ti ti_minus1 ti_minus2 ti_minus3;
syms fi fi_minus1 fi_minus2 fi_minus3;
syms ti_plus1;

% construct Lagrange multipliers
Li = ((t-ti_minus1).*(t-ti_minus2).*(t-ti_minus3))/((ti-ti_minus1).*(ti-ti_minus2).*(ti-ti_minus3));
Li_minus1 = ((t-ti).*(t-ti_minus2).*(t-ti_minus3))/((ti_minus1-ti).*(ti_minus1-ti_minus2).*(ti_minus1-ti_minus3));
Li_minus2 = ((t-ti).*(t-ti_minus1).*(t-ti_minus3))/((ti_minus2-ti).*(ti_minus2-ti_minus1).*(ti_minus2-ti_minus3));
Li_minus3 = ((t-ti).*(t-ti_minus1).*(t-ti_minus2))/((ti_minus3-ti).*(ti_minus3-ti_minus1).*(ti_minus3-ti_minus2));

% put Lagrange poly together
p3 = fi.*Li + fi_minus1.*Li_minus1 + fi_minus2.*Li_minus2 + fi_minus3.*Li_minus3;

% integrate Lagrange poly from ti to ti+1
I = int(p3, t, ti, ti_plus1);

% substitute ti_plus1 = ti + h, ti_minus1 = ti - h, etc.
I = subs(I, ti_plus1, ti+h);
I = subs(I, ti_minus1, ti-h);
I = subs(I, ti_minus2, ti-2.*h);
I = subs(I, ti_minus3, ti-3.*h);

% simplify and display the definite integral of the Lagrange poly
I = simplify(I);
fprintf("Definite integral of Lagrange poly from t_i to t_i+1: %s\n", I);


% Adam-Moulton 2-step implicit method
% define symbolic variables
syms h t ti ti_minus1 ti_plus1 fi_minus1 fi fi_plus1;

% construct Lagrange multipliers
L_i_minus1 = ((t-ti).*(t-ti_plus1))/(-h.*-2.*h);
L_i = ((t-ti_minus1).*(t-ti_plus1))/(h.*-h);
L_i_plus1 = ((t-ti_minus1).*(t-ti))/(2.*h.*h);

% put Lagrange poly together
p2 = fi_minus1 .* L_i_minus1 + fi .* L_i + fi_plus1 .* L_i_plus1;

% integrate Lagrange poly from ti to ti+1
I = int(p2, t, ti, ti_plus1);

% substitute ti_minus1 = ti - h, ti_plus1 = ti + h
I = subs(I, ti_minus1, ti-h);
I = subs(I, ti_plus1, ti+h);

% simplify and display the definite integral of the Lagrange poly
I = simplify(I);
fprintf("Definite integral of Lagrange poly from t_i to t_i+1: %s\n", I);