%Skripta za resavanje zadatka 7.43 iz zbirke
%Metodom najstrmijeg spusta nalazimo minimum funkcionala f=x^2+y^2+xy polazeci od
%tacke (1,2) sa tacnoscu 10^(-4)

% Funkcional
f   = @(x,y) x.^2 + y.^2 + x.*y;
% Prvi izvodi - potrebni za gradijent
fx  = @(x,y) 2*x+y; 
fy  = @(x,y) 2*y+x;
% Drugi izvodi - potrebni sa Hessian
fxx = @(x,y) 2; 
fxy = @(x,y) 1; 
fyx = @(x,y) 1; 
fyy = @(x,y) 2;

% Pocetna iteracija i tacnost
x0 = 1; 
y0 = 2; 
tol= 1e-4;

% Postavljamo vrednost tekuce iteracije na pocetnu
x = x0;  
y = y0;
iter=0;
hold on
while(1)  
   % Pamtimo vrednosti prethodne iteracije
   xp = x; 
   yp = y;
   iter=iter+1;
   % Izracunavamo vektor gradijenta u tekucoj tacki
   d = -[fx(x, y) fy(x, y)];
   
    % Izracunavamo vrednost Hessiana u tekucoj tacki
    H = [fxx(x, y) fxy(x, y);...
         fyx(x, y) fyy(x, y)];

    % Ukoliko tekuca tacka nije stacionarna izracunavamo koeficijenat lambda
    % koji odredjuje "koliko dugo" je potrebno spustati se u pravcu d 
    if (~isequal(d,[0 0]))
        lambda = d*d'/(d*H*d');
    else
        % Ukoliko je tacka stacionarna, nasli smo lokalni minimum
        break;
    end
    
    % Izracunavamo vrednost nove tacke
    x = x + lambda*d(1); 
    y = y + lambda*d(2); 
    plot([x,xp],[y,yp]); %crtamo pomeraj, dovoljno je zadati krajnje tacke

    % Ukoliko je postignuta zeljena tacnost prekidamo iterativni postupak
    if (abs(x-xp)<tol && abs(y-yp)<tol)
        break;    
    end    
end

disp('Minimum funkcije je u tackama:');
disp('x=');
disp(x);
disp('y=');
disp(y);
disp('Broj iteracija:')
disp(iter)
