%Metoda GAUSS pentru rezolvarea sistemelor de ecuatii liniare
clearvars
clc

%Date de intrare
%Matricea coeficientilor A.
A= [ 10 -1 2 4 
    -1 4 2 2 
     2 2 10 3 
     4 2 3 4];
% A= [ 10 -1 2  4 1
%      -1  4 2  2 2
%       2  2 10 3 3
%       4  2 3  4 4
%       1  2 3  4 8];

%Vectorul termenilor liberi B
B=[2 15 10 -8]';
%B=[2 15 10 -8 -12]';

%start proces eliminare
i = 1; % initializare
AB = [ A B ]; %matrice extinsa formata din A si B
[ nX mX ] = size( AB);   
while i <= nX 
   if AB(i,i) == 0 % se verifica daca termenii de pe diag principala au valoarea egala cu 0
            disp('Element egal cu zero pe diagonala principala a matririi coeficientilor') % se aloca mesajul in cazul in care avem termen egal cu zero pe diag principala
            return
   end
   % eliminarea elementelor de pe coloana i, de sub diagonala principala
   for k =  (i+1):nX 
    a=AB(k,i)/AB(i,i);
    AB(k,i:mX) = AB(k,i:mX) - a*AB(i,i:mX);  
   end
    i = i +1;
end  %final proces eliminare
    
U=AB(1:nX,1:nX); %matricea superior triunghiulara
B1=AB(:,mX); %termenii liberi dupa procesul de eliminare

%determinare solutie prin substitutie inapoi
x(nX)=AB(nX,mX)/AB(nX,nX);
for i=nX-1:-1:1
    S=B1(i);
    for j=i+1:nX
    S=S-U(i,j)*x(j);
    end
    x(i)=S/U(i,i);
end

%afisare rezultate
disp('Matricea superior triunghiulara este:');
disp (U);

disp('Solutia sistemului de ecuatii este:')
for k=1:nX 
fprintf ( '   x(%1.0f) = %2.10f  \n',k,x(k))
end

%proba solutiei; practic se face operatia A*X-B
disp ('   ');
disp('Proba solutiei A*X-B=0:') 
%fprintf ( ' %2.20f  \n', A*x'-B');    

for k1=1:nX 
fprintf ( '  Ecuatia %1.0f: %2.20f  \n', k1, A(k1,:)*x'-B(k1));
end
