function [y,x]=mGadjanja(primer,h,s0,s1)
% Funkcija mGadjanja(primer,h,s1,s2) odredjuje priblizno
% resenje jednacine
%  y''=f(x,y,y'), y(a)=A, y(b)=B
%  koristeci metodu gadjanja.
% Za resavanje nelinearnog sistema koristi se metoda
% polovljenja intervala.
%
% Ulazni podaci:
%       s1,s2 - pocetne vrednosti, za metodu polovljenja intervala
%       h - korak
%       primer - naziv skript fajla u kojima se nalaza podaci o problemu
% Pomocna funkcija:
%       y=odj1h(x, y0,f) - Ojlerova metoda
%
% Izlazne vrednosti:
%       x - cvorovi
%       y - aproksimacij
%  Test:
%      [y,x]=mGadjanja('primerMG1',3,4,-24)
%          y= mGadjanja('primerMG1',0.5,4,-34)
%
close all

%% Ucitavamo primer i pripremamo podatke
run(primer)
% transformisemo ga u sistem ODJ prvog reda:
F=@(x,y) [y(2); f(x,y(1),y(2))]; %
%% Grafik tacke koju gadjamo
plot(b,B,'m*')
axis([a,b, -Inf, Inf])
hold on
xlabel('x')
ylabel('y')



%% Pocetni problem
x=a:h:b;% mrezu za Ojlerovu metodu je racunski efikasnije napraviti ovde


%% resavamo odj za prvi izbor s
y0=[A;s0];
uv=ojler(x, y0,F);
y1=uv(1,:);%u prvoj vrsti je resenje
plot(x,y1)
pause(0.5)

%% resavamo odj za drugi izbor s
y0=[A;s1];
uv=ojler(x, y0,F);
y2=uv(1,:);
plot(x,y2)
pause(0.5)

%% Metoda polovljenja intervala
if (y1(end)-B)*(y2(end)-B)>0
    error('Resenja pocetnih problema ne menjaju znak u tacki koju gadjamo.')
    hold off
end

%% metoda polovljenja intervala
%% tesko da cemo metodom polovljenja intervala dobiti tacno resenje problma
%% u konacnom broju iteracija ili j broj iteracija dosta veliki.
%% Zato je potrebno definisati kriterijum zaustavljanja.
brojac=0;
while abs(s0-s1)>1e-4%10^(-4)%abs(y1(end)-y2(end))>1e-4
    s=(s0+s1)/2;%polovimo interval
    brojac=brojac+1;
    if brojac >=100
        warning('Dostignut je maksimalan broj iteracija.')
        break
    end
    %odredjujemo aproksimaciju novog Kosijevog problema
    y0=[A;s];
    uv=ojler(x, y0,F);
    y=uv(1,:);%u prvoj vrsti je resenje
    plot(x,y)
    axis([0 9 -200 1400])
    %title("Broj iteracija "+brojac)
    pause(0.5)
    %odredjujemo novi interval:
    if (y1(end)-B)*(y(end)-B)<0
        s1=s;
        y2=y;
    elseif (y2(end)-B)*(y(end)-B)<0
        s0=s;
        y1=y;
    else
        break % ako smo dobili bas tacno resenje
    end
end
if (y(end)-B)==0
   %ne radi nista, resenje je tacno
else
    y=(y1+y2)/2; %prepolovi jos jednom
end
%title("broj iteracija" + brojac)
hold off

%% pomocna funkcija - Ojlerova metoda
function y=ojler(x, y0,f)
% Funkcija ojler odredjuje priblizno resenje Kosijevog problema za sistem ODJ prvog
% reda koristeci Ojlerovu metodu.
% Ulazni podaci su:
%             x - mreza
%             y0 - pocetni uslov
%             f - desna strana jednacine y'=f(x,y) zadata kao anonimna fja
% Izlazna vrednost:
%             y - aproksimacija resenja.
%
h=x(2)-x(1);% korak
n=length(x);
m=length(y0); %dimenzija sistema
y=zeros(m,n); % inicijalnizujemo aproksimaciju nulama
y(:,1)=y0; % aproksimacija u pocetnoj tacki je jednaka pocetnom uslovu
for j=1:n-1
    y(:,j+1)=y(:,j)+h*f(x(j), y(:,j));
end

