% Metoda Jacobiego (iteracji prostej):
%                                  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 D oraz I 
    [n, m] = size(a);
    d = diag(diag(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,:))) % po lewej jest suma wszystkich wyrazów, więc po prawej mamy 2*, żeby się zgadzało
           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 -  d \ a) * x0 + d \ 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.');
