function X=SystemGauss(A,B)
% Розв"язок системи лінійних рівнянь методом Гауса
% Аргументи:
%   A - матриця коефіцієнтів при невідомих
%   B - стовпчик вільних членів
%   кількість невідомих визначається за розміром матриці A
% Результати:
%   X - рядок розв"язків
% Обмеження:
%   1) матриця A повинна бути квадратною
%   2) вектор B повинен мати стільки ж рядків, що й матриця A

% визначаємо кількість невідомих
[n,n]=size(A);
% ПРЯМИЙ ПРОХІД
% виконуємо цикл до передостаннього рядка, так як для нього проводити пошук
% не потрібно
for i=1:n-1
    [MAX,i1]=max(abs(A(i:n,i)));        % шукаємо індекс max елемента у стовпчику i на головній діагоналі
                                        % та нижче і записуємо індекс в i1
    i1=i1+i-1;
    if (i~=i1)                          % чи потрібна перестановка?
        TEMP=A(i,:);                    % якщо потрібна - міняємо рядки місцями
        A(i,:)=A(i1,:);
        A(i1,:)=TEMP;
        TEMP=B(i,1);                    % міняємо місцями праві частини
        B(i,1)=B(i1,1);
        B(i1,1)=TEMP;
    end
    % перераховуємо матрицю та праві частини
    for i1=i+1:n                        % виконуємо цикл по рядкам необробленої частини матриці
        c=A(i1,i)/A(i,i);               % множник для рядка з номером i1
        A(i1,:)=A(i1,:)-A(i,:)*c;       % перерахунок рядка з номером i1
        B(i1,1)=B(i1,1)-B(i,1)*c;       % перерахунок правої частини
    end
end                                     % КІНЕЦЬ ПРЯМОГО ПРОХОДУ

% ЗВОРОТНІЙ ПРОХІД
X=zeros(1,n);                           % створюємо нуль-вектор з кількістю елементів = n
X(1,n)=B(n)/A(n,n);
for i=n-1:-1:1
    z=B(i);
    for i1=i+1:n
        z=z-A(i,i1)*X(1,i1);
    end
    X(1,i)=z/A(i,i);
end

clear n i MAX i1 TEMP c z;              % очищуємо локальні змінні