function y = gau_sei(A,b)
%gau_sei - Gaussova-Seidelova iteracni metoda reseni soustav lin.rovnic
%A..matice soustavy
%b..vektor pravych stran
%y..reseni soustavy
%priklad volani:    A=[2 -1 0;-1 2 -1;0 -1 2], b=[1/3;1;-1/3];
%y=gau_sei(A,b)

presnost=1e-2;  %pevne nastavena presnost metody
[m,n]=size(A);
if m~=n     %pocet radku/sloupcu
    error('Matice musi byt ctvercova!')
end
b=b(:);     %sloupcovy vektor
if length(b)~=m %rozmery vektoru b
    error('Vektor pravych stran ma chybny pocet prvku!')
end
if rank(A)~=rank([A b])     %Frobeniova veta
    error('Soustava nema reseni!')
end
%podminky konvergence metody: matice A musi byt diagonalne dominantni
%neboli každý diagonální prvek a_ii v abs. hodnotì musí pøevyšovat souèet abs. hodnot ostatních prvkù "svého" øádku nebo sloupce (staèí splnìní jedné z tìch dvou podmínek u každého diagonálního prvku)
% for i=1:m % m=size(A,1)
%   if abs(A(i,i))<=sum(abs(A([1:i-1 i+1],i))) && abs(A(i,i))<=sum(abs(A(i,[1:i-1 i+1]))) % sloupec, øádek - obojí porušeno
%     error('Matice soustavy nesplnuje podminky konvergence metody!')
%   end
% end

%priprava
y=b;    
delka=length(y);

for k=1:10000 %max. 10000krat budeme iterovat (nemusi konvergovat!)
    y0=y;       %uchovani predchoziho vysledku
        for i=1:delka
            a=A(i,i);   %diagonalni prvek
                if abs(a)<1e-12     %test zda je to skoro nula
                    error('Matice ma nulovy diagonalni prvek!')
                end
            y(i) = 1/a * (b(i) - A(i,1:i-1) * y(1:i-1) - A(i,i+1:end) * y(i+1:end)); %i-ta slozka reseni
        end
        if i==delka && all(abs(y-y0)<presnost) %vsechny slozky dosahly presnosti
            return %muzeme skoncit
        end
end
  

        disp('Vycerpano 10000 iteraci, nebyla dosazena pozadovana presnost!')