function [x, nm_error, iteraci, H] = jacobi(A, b, x0, tolerantion, max_iter)
% Jacobiova metoda pro reseni soustavy rovnic Ax=b
%
%	vstupní parametry:
%	A			- matice soustavy
%	b			- vektor pravé strany
%	x0			- počáteční aproximace (vektor)
%	tolerantion		- nastavení požadované přesnosti (číslo)
%	max_iter		- nastavení maximálního počtu iterací (číslo)
%
%	výstupní paramery:
%	x			- poslední aproximace řešení
%	nm_error		- euklidovská norma rozdílu
%				  dvou po sobě jdoucích aproximací
%	iteraci			- počet iteračních kroků metody
%

clc;
tisk=sprintf('Jacobiova metoda pro reseni soustavy  Ax=b, kde ');
disp(tisk);
A
b
x0

  n = size(A,1);
  x=x0;
  iteraci=0;
  nm_error=inf;
  
  D=diag(diag(A));
  U=tril(A)-D;
  L=triu(A)-D;
  H=-D\(L+U)
  g=D\b
   
  while ((nm_error > tolerantion) && (iteraci < max_iter))
    iteraci=iteraci+1;
    x_new=H*x+g;
    fprintf('%d. iterace = [ %f], rozdíl iterací [ %f]\n',iteraci,x_new(1),x_new(1)-x(1));
    for i=2:n
       fprintf('             [ %f],                [%f]\n', x_new(i),x_new(i)-x(i)  );
    end  
    disp(' ');
    nm_error=norm(x_new-x);
    x=x_new;
    pause;
  end

  x


