function Jacobi1(A,eps)
% Funkcija pronalazi sopstvene vrednosti matrice A, Jakobijevom 
% iterativnom metodom

% Odredjujemo velicinu matrice A i proveravamo da li 
% je simetricna
[m,n]=size(A);

if (~isequal(A,A')) 
    error('Matrica mora biti simetricna');
end

% U slucaju skalara, posao je zavrsen
if n==1
    return
end

% inicijalizujemo matricu koja ce sadrzati proizvode svih koriscenih
% matrica U
Upr=eye(n);

% Racunamo donjedijagonalnu normu matrice A
ni=norm(triu(A,1),'fro');
% triu(A,1)=tril(A,-1)

% Vandijagonalna norma polazne matrice je vec manja od zeljenje tacnosti
if ni<=eps
    return
end

while 1
    % Pronalazimo indekse najveceg po modulu elementa matrice A
    [k,l]=find(tril(abs(A),-1)==max(max(tril(abs(A),-1))));
    %ukoliko postoji vise elemenata sa istom maksimalnom apsolutnom
    %vrednoscu biramo prvi od njih
    if(length(k)>1 && length(l)>1)
        k=k(1);
        l=l(1);
    end
   
    % specijalni slucaj kada A(k,k)=A(l,l)
    if abs(A(k,k)-A(l,l))<eps
        
        if A(k,l)>0
            cos_fi=sqrt(2)/2;
            sin_fi=sqrt(2)/2;
        else
            cos_fi=-sqrt(2)/2;
            sin_fi=sqrt(2)/2;
        end
    else
    % Inace,koristimo stabilniji algoritam za racunanje elemenata matrice U
        lambda=-A(k,l);
        mi=(A(l,l)-A(k,k))*0.5;
        omega=sign(mi)*lambda/sqrt(lambda^2+mi^2);
        sin_fi=omega/sqrt(2*(1+sqrt(1-omega^2)));
        cos_fi=sqrt(1-sin_fi^2);
    end

    % Gradimo matricu rotacije umetanjem u jedinicnu
    U=eye(n);
    U(k,k)=cos_fi;
    U(l,l)=cos_fi;
    U(k,l)=-sin_fi;
    U(l,k)=sin_fi;

    % Anuliramo najveci po modulu element matrice A
    A=U'*A*U;
    % Mnozimo prethodne matrice U sa matricom iz ovog koraka
    Upr=Upr*U;
       
    % Postupak zavrsavamo kad odnos vandijagonalnih normi 
    % tekuce i polazne matrice postane manji od zeljenje tacnosti
    if (norm(triu(A,1),'fro')<=eps*ni)
        A
        disp('Sopstvene vrednosti:')
        sv=diag(A)
        disp('Kolone matrice Upr su sopstveni vektori:')
        Upr
        return 
    end
   
end