% 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]  =  MyJacobiIterativeSolver(K,f,tol,maxiter,x0)  
%-----------------------------------  
% Extraemos la diagonal de K como vector
% e invertimos cada componente del vector
%-----------------------------------  
v    =  diag(K);  %  Extraemos vector con la diagonal
D    =  diag(v);  %  Crear la matriz diagonal
d    =  1./v;     %  invertimos los elementos del vector
iter    =  0;  %  iteraciones inicializadas a 0
xk      =  x0;    %  Solución xk vamos a hacerla coincidir con solución inicial
diff    =  tol*6;
while and(diff>tol,iter<=maxiter)
    iter  =  iter + 1;  % incrementamos las iteraciones
    %--------------------------------
    % Calculamos (D-K)*xold + b
    %--------------------------------
    ftilde    =  (D-K)*xk + f;
    %--------------------------------
    % Resolvemos
    %--------------------------------
    xk_1     =  d.*ftilde;  %  El vector que contiene la inversa de la diagonal
                           % multiplica a ftilde y nos da el nuevo valor de xk+1
    %--------------------------------
    % Criterio de tolerancia
    %--------------------------------
    if iter>1
       diff  =  max(norm(xk_1-xk)/norm(xk));
    end
    xk       =  xk_1;   %  xk coincide con xk+1                                   
end
x   =  xk_1; % la salida de la función x la hacemos coincidir
% con xk_1
if iter>=maxiter
  warning('Jacobi solver used the maximum number of prescribed iterations without reaching the desired tolerance')  
end  
end
