function x=gradientna(F,JF,x0,delta,maxsteps)

% y=GRADIENTNA(F,JF,x0,delta,maxsteps) dela gradientno metodo s parabolicnim spustom
% za funkcijo G=F'*F z Jacobianom JF. Za gradient G velja grad(G)=JF'*F 
% Zacetni priblizek je x0. Funkciji F in JF morata biti podani v obliki inline funkcij 
% (npr. F=inline('[x(1)^2+x(2)^2-10*x(1)+x(2)-1, x(1)^2-x(2)^2-x(1)+10*x(2)-25]') ). 
% Iteracija se konca, ko se zadnja priblizka relativno razlikujeta za manj kot delta ali ko 
% prekoracimo maksimalno stevilo korakov maxsteps. Ce zadnjih dveh argumentov ne podamo, je 
% privzeta vrednost za delta osnovna zaokrozitvena napaka 1e-5, za maxsteps pa 50.
%
% Po Algoritmu 10.3 v Burden, Faires: Numerical Analysis, 6th edition, Brooks/Cole 1997

% Bor Plestenjak 2004

if nargin<4, delta=1e-5; end
if nargin<5, maxsteps=50; end

xn=x0;
deltax=2*delta*x0;
korak=0;          
g1=F(x0)'*F(x0)
while (g1>delta) & (korak<maxsteps)
   korak=korak+1;           						 
   
	z=JF(x0)'*F(x0);
   z=z/norm(z); 
   
   a1=0;
   
   a3=g1/(2*F(x0)'*JF(x0)*z);  % tangentna metoda
   g3=F(x0-a3*z)'*F(x0-a3*z);
   while (g3>=g1)
      a3=a3/2;
      g3=F(x0-a3*z)'*F(x0-a3*z);
      if a3<delta
         disp('Ni izboljsanja, mozen minimum');
         return
      end
   end
   a2=a3/2;
   g2=F(x0-a2*z)'*F(x0-a2*z);
   
   koef=polyfit([a1 a2 a3],[g1 g2 g3],2); % vrne koeficiente parabole skozi tocke 
   a0=-koef(2)/(2*koef(1))  % korak dobljen iz parabolicnega spusta
   g0=F(x0-a0*z)'*F(x0-a0*z);
   if (g3<g0)
      a0=a3;
   end
   x=x0-a0*z;                     % premaknemo se v izbrano smer za ustrezni pomik
   g0=F(x0-a0*z)'*F(x0-a0*z);
   
   if abs(g1-g0)<delta
      disp('Konec');
      return
   end
   x0=x;
   g1=g0;
   disp([korak g1 x0']);
end   
   
