function [x, nm_error, iteraci, H] = gauss_seidel(A, b, x0, tolerantion, max_iter);
% Gauss-Seidelova 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(['Gauss-Seidelova 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));
  L=tril(A)-D;
  U=triu(A)-D;
  H=-(L+D)\U
  g=(L+D)\b
   
  while ((nm_error > tolerantion) & (iteraci < max_iter))
    iteraci=iteraci+1;
    x_new=H*x+g;
    disp(sprintf('%d. iterace = [ %f], rozdíl iterací [ %f]',iteraci,x_new(1),x_new(1)-x(1)));
    for i=2:n
       disp(sprintf('             [ %f],                [%f]', x_new(i),x_new(i)-x(i)  ));
    end  
    disp(' ');
    nm_error=norm(x_new-x);
    x=x_new;
    pause;
  end

  x


