function x = r2_newton(f, x0, epsilon, maxiter)
% Funkcija vrsi Newton-ov iterativni algoritam i pokusava da 
% pronadje nulu funkcije, f:R^2->R sa datom tacnoscu. 
% Argumenti funkcije su : 
%       f  - simbolicki 2x1 vektor koji predstavlja funkciju f(x, y)
%       x0 - 2x1 vektor koji sadrzi pocetnu iteraciju
%       epsilon - tacnost 
%       maxiter - maksimalni dozvoljeni broj iteracija
% Funkciji nedostaju provere korektnosti 

% Odredjujemo inverznu matricu Jakobijana funkcije f
iJ = inv([diff(f, 'x') diff(f, 'y')]);

% Postavljamo tekucu iteraciju na pocetnu
x = x0; 
iter = 0;
while(1)
    % Proveravamo da li smo presli dozvoljen broj iteracija
    iter = iter + 1;
    if (iter >= maxiter) 
        error('Metoda ne konvergira'); 
    end
    
    % Pamtimo prethodnu iteraciju
    xp = x;

    % Odredjujemo sledecu iteraciju po Newton-ovoj formuli
    x = xp - subs(iJ, {'x', 'y'}, {xp(1), xp(2)})* ...
             subs(f,  {'x', 'y'}, {xp(1), xp(2)});
    x=double(x);
         
    % Ukoliko je zadovoljen kriterijum tacnosti, prekidamo iteriranje
    if (norm(x-xp)<epsilon)
        break;
    end
end