% pregunta 2, laboratorio 4, 521230, S2-2012

N = 50;

% crear matriz tridiagonal directamente como sparse
A = matriz_preg1_lab4_sparse(N,4,-1,-1,1);
% descomponer A para crear matrices de iteracion de Jacobi y Gauss-Seidel
% matriz diagonal con diagonal principal igual a diagonal principal de A
D = diag(diag(A));
% parte triangular inferior de A
E = -tril(A,-1);
% parte triangular superior de A
F = -triu(A,1);

% matriz de iteracion de Jacobi
J = D\(E+F);
% matriz de iteracion de Gauss-Seidel
GS = (D-E)\F;
% radios espectrales de ambas matrices
disp('radios espectrales de matrices de iteracion, Jacobi y GS')
max(abs(eigs(J)))
max(abs(eigs(GS)))

% parte derecha de sistema a resolver
b = ones(N,1);
for tol = [1e-2, 1e-4, 1e-6]
    % resolver por Jacobi
    [jacsol,convjac,itsjac] = jacobisol(A,b,zeros(N,1),tol,100);
    % resolver por Gauss-Seidel
    [gssol,convgs,itsgs] = gaussseidelsol(A,b,zeros(N,1),tol,100);
    
    if convjac && convgs
        disp('norma de diferencia entre aproximación de Jacobi y aproximación de Gauss-Seidel')
        norm(jacsol-gssol,inf)
        disp('número de iteraciones de Jacobi')
        itsjac
        disp('número de iteraciones de Gauss-Seidel')
        itsgs
    elseif ~convjac || ~convgs
        if ~convjac
            disp('el método de Jacobi no encontró aproximación con precisión deseada')
        else
            disp('el metodo de Gauss-Seidel no encontró aproximación con precisión deseada')
        end
    end
end