
function x = gseid(A,b,xa,delta,maxit)
%-----------------------------------------------------------------------
%             -------------                             -------
%             function file                             gseid.m
%             -------------                             -------
%-----------------------------------------------------------------------
%                        ----------------------------
%                        Zeros Reais de Sistemas Lineares
%                        ----------------------------
%                          -----------------------
%                           Metodo de Gauss Siedel
%                          -----------------------
%
%            Chamada do Procedimento  gseid
%------------------------------------------
%x = gseid(A,b)
%ou x = gseid(A,b,xa,delta,maxit)
% Gauss-Seidel: método iterativo para resolver Ax=b
% 
% Entradas: A (n x n) matriz dos coeficientes (não singular)
%           b (n x 1) vector dos termos independentes
%           xa (n x 1) vector aproximação inicial de (default= zeros)
%           delta - tolerância de convergência do critério de paragem
%                   ||x(k)-x(k-1)|| < delta     ou 
%                   ( ||x(k)-x(k-1)|| / ||x(k)|| ) < delta
%                   (é usada a norma máxima - inf)(default=1e-6)
%           maxit - máximo de iterações(default=250)
%
% Saída: x (n x 1) vector aproximação da solução de Ax=b 
%Outras formas de uso
%---------------------------------------------------------------------------
if nargin<3 
    xa=zeros(length(b),1);
end
if nargin<4
    delta=1e-6;
end
if nargin<5
    maxit=250;
end

n=length(b);

for k=1:maxit
   
   x(1) = ( b(1) - A(1,2:n)*xa(2:n) ) / A(1,1);
   for j=2:n-1
      x(j) = ( b(j) - A(j,1:j-1)*(x(1:j-1))' - A(j,j+1:n)*xa(j+1:n) ) / A(j,j);
   end   
   x(n) = ( b(n) - A(n,1:n-1)*(x(1:n-1))' ) / A(n,n);
   
   errox=norm(x'-xa,inf);
   errorelx=errox/norm(x,inf);
   
   if (errox < delta) | (errorelx < delta)
      disp(' ');
      disp('Gauss-Seidel converge com a tolerância desejada');
      break; 
   end
      
   xa=x';
   
end

sprintf('Após  k=%d iterações',k)
x=x';

