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

% JACOBI    resavanje sistema linearnih jednacina Ax=B Jacobijevom metodom
%
% Poziv fukncije: X=jacobi(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 - na koliko decimala racunamo (npr delta=1e-4 znaci 4 decimale)
%   max1 - maksimalan broj iteracija
%
% Funkcija vraca:
%   vektor X dimenzije Nx1 - Jacobijeva aproksimacija resnja sistema Ax=B 

% Autor : Zorica Drazic
% Verzija : 2.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);
if N~=n
    error('Vektor B nije ispravne dimenzije');
end

M = length(P);
if M~=n
    error('Vektor P nije ispravne dimenzije');
end

% vektor c inicijalizujemo na sve 0
c=zeros(1,N);

% izracunavamo matricu BB = -D^(-1)*(L+U), kao i vektor c = D^(-1)*B
for j=1:N
    BB(j,:)=-A(j,:)/A(j,j);
    BB(j,j)=0;
    c(j)=B(j)/A(j,j);
end

% za svaku iteraciju izracunavamo vektor X
% vektor X = X(n+1), P=X(n)
for j=1:max1
    X=BB*P+c';

    err=norm(X-P,inf); % L_inf odnosi se na svaku koordinatu
    P=X;
    
    if (err<delta)
        % ukoliko je postignuta odg. tacnost stampamo broj iteracija i
        % zavrsavamo za daljim racunanjem
        disp('Broj iteracija')
        j            
        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


