% Metoda Gauss'a-Seidel'a: rozwiązuje układ Ax = b dla podanego x0.
%
% Zmienne:
%     a: macierz główna A układu Ax=b
%     b: macerz wyrazów wolnych
%     x0: początkowe przybliżenie rozwiązania
%     tol: dokładność 
%     iter_max: maksymalna liczba iteracji

clc; clear; format long

a = [4 2 -1; 1 4 1; 2 -1 4];
b = [5; 12; 12];

x0 = [1; 1; 1];

tol = 10^(-6);
iter_max = 200;

    % Utworzenie macierzy L oraz I 
    [n, m] = size(a);
    l = tril(a);
    i = eye(n);


    % Sprawdzenie czy macierz główna jest dominująca przekątniowo
    for j = 1:n
        if 2*abs(a(j,j)) < sum(abs(a(j,:)))
           error('Macierz główna nie jest dominująca przekątniowo - algorytm nie jest zbieżny')
        end
    end


    % Proces iteracyjny
    for iter = 1:iter_max
        x = (i - l \ a) * x0 + l \ b; % "A\B" oznacza "INV(A)*B"

        disp('Iteracja nr:');
        disp(iter);
        disp('X= ');
        disp(x);
        disp('----------------------')
        
        if norm(x - x0, inf) <= tol
            break;
        end
                
        x0 = x;
    end
    
    disp('Wykonało się');
    disp(iter);
    disp('iteracji.');
