% Solving Linear Systems of Equations (GAUSS) 
% РЕШЕНИЕ СИСТЕМЫ ЛИНЕЙНЫХ УРАВНЕНИЙ МЕТОДОМ ГАУССА
%  Синтаксис:
%             [x]=fgauss01(ab)
%
% ab - Исходная матрица системы линейных уравнений вида:
%
%   a11 a12 a13 a14 .... a1N b1
%   a21 a22 a23 a24 .... a2N b2
%   ...........................
%   aN1 aN2 aN3 aN4 .... aNN bN
% 
% x - Вычисляемый вектор корней 
% 
function [x]=fgauss01(ab)
if isempty(ab)
    disp('Матрица системы линейных уравнений не задана');
    x=NaN;
    return
end;
nb = size(ab,2);
nx = size(ab,1);
if (nb < 2) || (nb ~= (nx+1))
    disp('Размеры матрицы системы линейных уравнений заданы неправильно');
    x=NaN;
    return
end;    
% Постороение Гауссовой матрицы
for nM=1:(nx-1)
    % Установка на главную диагональ строки с максимальным элементом ab(nM,nM)
    [v,n]=max(abs(ab(:,nM)));
    if (n > nM)
        s=ab(n,:);
        ab(n,:) = ab(nM,:);
        ab(nM,:)=s;
    end;
    % Ловушка неразрешимых ситуаций
    if ab(nM,nM) == 0
       disp('Матрица плохо обусловлена');
       x=NaN;
       return;
    end;
    % Постороение треугольной Гауссовой матрицы 
    for row =(nM + 1):nx 
       koef =ab(row,nM)/ab(nM,nM);
       for n=1:nb
          if n == nM
             ab(row,n)=0;
         else   
             ab(row,n)=ab(row,n)-ab(nM,n)*koef;;
         end;    
      end;    
   end;
end;
% Вычисление корней
% Ловушка неразрешимых ситуаций
if ab(nx,nx) == 0
   disp('Матрица плохо обусловлена');
   x=NaN;
   return;
end;
x=zeros(nx,1);
row = nx;
x(nx)=ab(row,nb)/ab(row,nx);  % Последний короень
while row > 1
    row=row-1;
    s=0;
    for n=1:nx
        if ab(row,n) ~= 0
           s=s+ab(row,n)*x(n);
       end;   
    end;
    x(row)=(ab(row,nb)-s)/ab(row,row);  % Очередной корень   
end;

