function [y,x,er]=AdamsE(primer,h,s)
% Funkcija [x,y,er]=AdamsE(primer,h,s) izracunava priblizno
% resenje Kosijevog problema y'=f(x,y), y(x0)=y0, koristeci
% eksplicitne Adamsove formule.
%
% Ulazni podaci:
% primer - naziv skript fajla u kojima se nalaza podaci o problemu
% h - korak
% s - red metode
%
% Izlazni podaci:
% x - mreza
% y - priblizno resenje
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Test: y=AdamsE('primer2',0.2,4)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Inicijalizacija
run(primer)
x=x0:h:xm; % vektor sa cvorovima mreze
n=length(x);
y=zeros(1,n);% aproksimacija

% Pocetne vrednosti za Adamsovu formulu odredicemo metodom Runge - Kuta
% reda 4. Neophodno je da odredimo prvih s vrednosti.
y(1:s)=rk4(f,x0,y0,h,x(s));
% Radi jednostavnijeg zapisa, vrednosti desne strane jednacine upisujemo u
% poseban vektor F:
F=zeros(1,n);
F(1:s)=f(x(1:s),y(1:s));
%% Odredjujemo koeficijente Adamsove formule.
% Treba imati u vidu da prvi element vektora p mnozi vrednost funkcije sa
% najvecim indeksom! Zato cemo elemente vektora F uzimati unazada.
p=koefAdamsE(s);%
%% Aproskimacija
for j=s:n-1
% p*F' vrsta * kolona = skalarno mnozenje:
y(j+1)=y(j)+h*p*F(j:-1:j-s+1)';
F(j+1)=f(x(j+1), y(j+1)); % upisujemo novu vrednost desne strane
end
%% Uniformna greska metode
if nargout==3
er=max(abs(ye(x)-y));
end

plot(x,y,'ro--') %grafik aproksimacije
hold on
plot(x, ye(x),'b') %grafik tačnog rešenja
hold off
legend('aproksimacija', 'tačno rešenje')
legend('Location','northwest')
end
%% Kraj glavne funkcije %%
%% Pomocna funkcija Runge - Kuta reda 4
function y=rk4(f,x0,y0,h,xmax)
x=x0:h:xmax; %diskretan skup tacaka na kome odredjujemo aproksimaciju
n=length(x);
y=zeros(1,n); %aproksimacija
y=y0; %pocetni uslov
for j=1:n-1
k1=f(x(j), y(:,j));
k2=f(x(j)+h/2,y(:,j)+ 1/2*h*k1);
k3=f(x(j)+h/2,y(:,j)+ 1/2*h*k2);
k4=f(x(j+1),y(:,j)+ h*k3);
y=[y,y(:,j)+h/6*(k1+2*k2+2*k3+k4)];
end
end
