function X=gseidel(A,B,P,delta, max1)

% GSEIDEL    resavanje sistema linearnih jednacina Ax=B Gauss-Seidelovom metodom
%
% Poziv funkcije: X=gseidel(A,B,P,delta, max1)
%
% Argumenti funkcije su :
%   A - regularna matrica dimenzije NxN
%   B - vektor desne strane dimenzije Nx1
%   P - vektor dimenzije Nx1, pocetna aproksimacija (X0)
%   delta - tolerancija za P
%   max1 - maksimalan broj iteracija
%
% Funkcija vraca:
%   vektor X dimenzije Nx1 - Gauss_Seidelova aproksimacija resnja sistema Ax=B 

% Autor : Zorica Drazic
% Verzija : 1.0
% Datum : 28.10.2009.


% Provera da li je prosledjena matrica A kvadratna
[m,n]=size(A);
if(m~=n)
    error('Matrica mora biti kvadratna');
end

% duzina vektora desne strane
N = length(B);
% vektor c inicijalizujemo na sve 0
c=zeros(1,N);

% formiramo dijagonalnu matricu D iz GS metode
D=diag(diag(A));
%Matrice U i L inicijalizujemo na 0-matrice
U=zeros(N,N);
L=zeros(N,N);

% odredjujemo elemente matrica L i U (donje trougaona i gornje trougaona)
for i=1:N
    for j=1:N
        if (i>j)
            L(i,j)=A(i,j);
        else if(i<j)
                U(i,j)=A(i,j);
            end
        end
    end
end

% odredjujemo matricu BB i vektor c
BB=-inv(L+D)*U;
c=inv(L+D)*B;

% za svaku iteraciju izracunavamo vektor X
% vektor X = X(n+1), P=X(n)
for k=1:max1
    X=BB*P+c;
    
    err=norm(X-P,inf);
    P=X;
     % kriterijum zaustavljanja
    if (err<delta)
         % ukoliko je postignuta odg. tacnost stampamo broj iteracija i
         % zavrsavamo za daljim racunanjem
         disp('Broj iteracija:')
        k
        return 
    end
 
end

% ukoliko za max1 iteracija nije postignuta odgovarajuca tacnost:
error('Sistem ili ne konvergira ili za zadati broj iteracija nije postignuta odgovarajuca tacnost.');

end


