function X=relax(A,B,P,w,delta, max1)

% GSEIDEL    resavanje sistema linearnih jednacina Ax=B relaksacionom
% metodom
%
% Poziv funkcije: X=relax(A,B,P,w,delta, max1)
%
% Argumenti funkcije su :
%   A - regularna matrica dimenzije NxN
%   B - vektor desne strane dimenzije Nx1
%   P - vektor dimenzije Nx1, pocetna aproksimacija (X0)
%   w - relaksacioni parametar
%   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.

[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 
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(w*L+D)*(w*U+(w-1)*D);
c=w*inv(w*L+D)*B;

%ukoliko zadatko sa tacnoscu 10^(-3)
%q=norm(BB,inf);

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 potrebnih iteracija: ');
        disp(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.');

