% Resolvemos el problema K*x=f
%  -----Entradas de la función--------
%  1. Matriz K
%  2. Vector f
%  3. Tolerancia entre iteraciones sucesivas
%  4. Máximo número de iteraciones
%  5. Solución inicial: inicialización de x (normalmente vector de ceros)
%  -----Salidas de la función-------
%  1. La solución x
%  2. Número de iteraciones utilizadas

function [x,iter]  =  MyGaussSeidelIterativeSolver(K,f,tol,maxiter,x0)  
%-----------------------------------  
% Extraemos la a partir de K su triangular 
%  inferior. Ese es el precondicionador
%-----------------------------------  
P       =  tril(K);
iter    =  0;
diff    =  tol*6;
x       =  x0;
while and(diff>tol,iter<=maxiter)
    iter  =  iter + 1;
    xold  =  x;
    %--------------------------------
    % Calculamos (P-K)*xold + b
    %--------------------------------
    ftilde    =  (P-K)*xold + f;
    %--------------------------------
    % Resolvemos
    %--------------------------------
    x     =  MyLowerSubstitution(P,ftilde);
    %--------------------------------
    % Criterio de tolerancia
    %--------------------------------
    if iter>1
       diff  =  norm(x-xold)/norm(xold);
    end
end
if iter>=maxiter
  warning('Gauss-Seidel solver used the maximum number of prescribed iterations without reaching the desired tolerance')  
end

  
end
