function X = pokoorspust(A,b,P,max1,tol)

% pokoorspust  resava sistem linearnih jednacina Ax=b metodom
% pokoordinatnog spusta
%
% Poziv funkcije: X = pokoorspust(A,b,P,max1,tol)
%
% Argumenti funkcije su :
%   A - simetricna matrica dimenzije NxN
%   B - vektor desne strane dimenzije Nx1
%   P - vektor dimenzije Nx1, pocetna aproksimacija (X0)
%   max1 - maksimalan broj iteracija
%   tol - proizvoljan argument - tolerancija za resenje. Ukoliko se ne
%   navede, podrazumevana vrednost mu je 1e-5
%
% Funkcija vraca:
%   vektor X dimenzije Nx1 - aproksimacija resnja sistema Ax=B 
%
% Autor : Zorica Drazic
% Verzija : 1.0
% Datum : 4.10.2009.
%


% ukoliko nije prosledjena vrednost za toleranciju resenja, postavljamo je
% na podrazumevanu vrednost 1e-5
    if nargin<5
        tol=1e-5;
    end
    
    if ~isequal(A,A')
        error('Mora da vazi A*=A')
    end

    
    [m,n]=size(A);
    % za svaku narednu iteraciju racunamo r,d,lamda i X(k+1)
    % oznake: P=X(n), X=X(n+1)
    for k=1:max1
        r=A*P-b
        ind=mod(k-1,m)+1;
        % d(k)=e(k)=[0 .. 0 1 0 .. 0] 
        d=zeros(1,n)';
        d(ind)=1;
        
        % ukoliko je postignuta odgovarajuca tacnost, prekidamo iterativni
        % postupak i vracamo rezultat
        if(norm(r)<tol)
            disp('Broj potrebnih iteracija: ');
            disp(k);
            return
        end
        
        % L = -<r(k),d(k)> / <A*d(k),d(k)>
        L=-r'*d/((A*d)'*d)
       
        X=P+L*d
        P=X;
    end
   
% ukoliko za max1 iteracija nije postignuta odgovarajuca tacnost:
error('Za zadati broj iteracija nije postignuta odgovarajuca tacnost.');