Sistema de ecuaciones lineales. Método de Gauss

Sistema de cuatro ecuaciones con cuatro incógnitas

a 11 x 1 + a 12 x 2 + a 13 x 3 + a 14 x 4 = b 1 a 21 x 1 + a 22 x 2 + a 23 x 3 + a 24 x 4 = b 2 a 31 x 1 + a 32 x 2 + a 33 x 3 + a 34 x 4 = b 3 a 41 x 1 + a 42 x 2 + a 43 x 3 + a 44 x 4 = b 4

Despejamos x1 de la primera ecuación

x 1 = b 1 a 11 a 12 a 11 x 2 a 13 a 11 x 3 a 14 a 11 x 4

y la sustituimos en las restantes, quedando el sistema de tres ecuaciones con tres incógnitas

a 22 1 x 2 + a 23 1 x 3 + a 24 1 x 4 = b 2 1 a 32 1 x 2 + a 33 1 x 3 + a 34 1 x 4 = b 3 1 a 42 2 x 1 + a 43 1 x 3 + a 44 1 x 4 = b 4 1

con

a ij 1 = a ij a i1 a 1j a 11 b i 1 = b i a i1 b 1 a 11 (i,j2,3,4)

Despejamos, ahora, x2 de la primera ecuación

x 2 = b 2 1 a 22 1 a 23 1 a 22 1 x 3 a 24 1 a 22 1 x 4

y las sustituimos en las dos restantes, quedando un sistema de dos ecuaciones con dos incógnitas.

a 33 2 x 3 + a 34 2 x 4 = b 3 2 a 43 2 x 3 + a 44 2 x 4 = b 4 2

con

a ij 2 = a ij 1 a i2 1 a 2j 1 a 22 1 b i 2 = b i 1 a i2 1 b 2 1 a 22 1 (i,j3,4)

Despejamos ahora, x3 de la primera ecuación

x 3 = b 3 2 a 33 2 a 34 2 a 33 2 x 4

y la sustituimos en la ecuación restante,

a 44 3 x 4 = b 4 3

con

a ij 3 = a ij 2 a i3 2 a 3j 2 a 33 2 b i 3 = b i 2 a i3 2 b 3 2 a 33 2 (i,j4)

Por tanto, el proceso de resolver un sistema lineal de ecuaciones por el método de Gauss se reduce a la construcción de un sistema equivalente que tenga una matriz triangular.

a 11 x 1 + a 12 x 2 + a 13 x 3 + a 14 x 4 = b 1 a 22 1 x 2 + a 23 1 x 3 + a 24 1 x 4 = b 2 1 a 33 2 x 3 + a 34 2 x 4 = b 3 2 a 44 3 x 4 = b 4 3

Ahora vamos obteniendo las incógnitas empezando por la última ecuación y terminando en la primera.

x 4 = b 4 3 a 44 3 x 3 = b 3 2 a 34 2 x 4 a 33 2 x 2 = b 2 1 a 23 1 x 3 a 24 1 x 4 a 22 1 x 1 = b 1 a 12 x 2 a 13 x 3 a 14 x 4 a 11

Sistema de n ecuaciones con n incógnitas

Sea un sistema de n ecuaciones con n incógnitas

{ a 11 x 1 + a 12 x 2 + a 13 x 3 +...+ a 1n x n = b 1 a 21 x 1 + a 22 x 2 + a 23 x 3 +...+ a 2n x n = b 2 .... a n1 x 1 + a n2 x 2 + a n3 x 3 +...+ a nn x n = b n

que convertimos en el sistema equivalente

{ a 11 x 1 + a 12 x 2 + a 13 x 3 +...+ a 1n x n = b 1 a 22 1 x 2 + a 23 1 x 3 +...+ a 2n 1 x n = b 2 1 a 33 2 x 3 +...+ a 3n 2 x n = b 3 2 .... a n1n1 n2 x n1 + a n1n n2 x n = b n1 n2 a nn n1 x n = b n n1

donde

a ij 1 = a ij a i1 a 11 a 1j b i 1 = b i a i1 a 11 b 1 i,j=2...n a ij 2 = a ij 1 a i2 1 a 22 1 a 2j 1 b i 2 = b i 1 a i2 1 a 22 1 b 2 1 i,j=3...n a ij k = a ij k1 a ik k1 a kk k1 a kj k1 b i k = b i k1 a ik k1 a kk k1 b k k1 i,j=k...n k=1,2...n1

Obtenemos las incógnitas xna x1

x n = b n n1 a nn n1 x i = b i i1 i+1 n a ij i1 x j i1 a ii i1 i=n1,n2,...2,1

function x=gauss_ecuacion(A,b)
    Ab=[A b];
    n=length(b);
%matriz triangular
    for k=1:n-1 
        for i=k+1:n
            factor=Ab(i,k)/Ab(k,k);
            for j=k:n+1
                Ab(i,j)=Ab(i,j)-factor*Ab(k,j);
            end
        end
    end
    
%incógnitas
    x=zeros(n,1);
    x(n)=Ab(n,n+1)/Ab(n,n);
    for i=n-1:-1:1 
        x(i)=Ab(i,n+1)/Ab(i,i);
        for j=i+1:n
            x(i)=x(i)-Ab(i,j)*x(j)/Ab(i,i); 
        end
    end
end

Reducimos el código suprimiendo el bucle de índice j y sustituyéndolo por el operador :

function x=gauss_ecuacion(A,b)
    Ab=[A b];
    n=length(b);
%matriz triangular
    for k=1:n-1 
        for i=k+1:n
            factor=Ab(i,k)/Ab(k,k);
            Ab(i,k:n+1)=Ab(i,k:n+1)-factor*Ab(k,k:n+1);          
        end
    end
    
%incógnitas
    x=zeros(n,1);
    x(n)=Ab(n,n+1)/Ab(n,n);
    for i=n-1:-1:1 
        x(i)=Ab(i,n+1)/Ab(i,i)-Ab(i,i+1:n)*x(i+1:n)/Ab(i,i); 
    end
end

Probamos la función gauss_ecuacion con los sistemas de ecuaciones

{ x 1 +2 x 2 +3 x 3 =6 2 x 1 +2 x 2 +3 x 3 =7 x 1 +4 x 2 +4 x 3 =9 { x 1 + x 2 + x 3 =4 2 x 1 + x 2 +3 x 3 =7 3 x 1 + x 2 +6 x 3 =2

>> A=[1,2,3;2,2,3;1,4,4];
>> b=[6;7;9];
>> gauss_ecuacion(A,b)
ans =
     1
     1
     1
>> A=[1,1,1;2,1,3;3,1,6];
>> b=[4;7;2];
>> gauss_ecuacion(A,b)
ans =
    19
    -7
    -8

Mejora del procedimiento de Gauss

Sea el sistema de ecuaciones

{ a 11 x 1 + a 12 x 2 + a 13 x 3 +...+ a 1n x n = b 1 a 21 x 1 + a 22 x 2 + a 23 x 3 +...+ a 2n x n = b 2 .... a n1 x 1 + a n2 x 2 + a n3 x 3 +...+ a nn x n = b n

El procedimiento de Gauss no se puede aplicar si a11 es nulo. La solución a este problema es intercambiar filas hasta conseguir que a11≠0. A este elemento a11 que aparece como denominador se le denomina elemento pivote. Si después de la primera iteración

{ a 11 x 1 + a 12 x 2 + a 13 x 3 +...+ a 1n x n = b 1 a 22 1 x 2 + a 23 1 x 3 +...+ a 2n 1 x n = b 2 1 a 32 1 x 2 + a 33 1 x 3 +...+ a 3n 1 x n = b 3 1 .... a n2 1 x 2 + a n3 1 x 3 +...+ a nn 1 x n = b n 1 a 22 1 0

el primer elemento de la segunda fila (pivote) es nulo hay que intercambiar filas entre las n-1 ecuaciones restantes para que este elemento sea distinto de cero.

Para mejorar la estabilidad del método de Gauss en cada una de las interacciones se intercambian filas para conseguir que el elemento pivote sea el elemento mayor (en valor absoluto) de cada una de las columnas, es decir que los elementos:

a 11 , a 22 1 , a 33 2 ... a kk k1 k=1,2,...n1

sean lo más grandes (en valor absoluto).

{ 0 x 1 +4 x 2 2 x 3 2 x 4 =4 1 x 1 +2 x 2 +4 x 3 3 x 4 =5 3 x 1 3 x 2 +8 x 3 2 x 4 =7 1 x 1 +1 x 2 +6 x 3 3 x 4 =7

Creamos el siguiente script para ver el proceso de intercambio de filas y de reducción de la matriz A a una matriz triangular.

A=[0,4,-2,-2;1,2,4,-3;-3,-3,8,-2;-1,1,6,-3];
b=[-4;5;7;7];
Ab=[A b]
n=length(b);
for k=1:n-1 
    [mayor,j]=max(abs(Ab(k:n,k)));
    fila=j+k-1;
    if fila~=k
        fprintf('intercambio fila %i por fila %i\n',k,fila);
        Ab([k,fila],:)=Ab([fila,k],:);%intercambio de filas
        Ab %muestra la matriz
    end
    %convierte en matriz triangular
    for i=k+1:n
        factor=Ab(i,k)/Ab(k,k);
        Ab(i,k:n+1)=Ab(i,k:n+1)-factor*Ab(k,k:n+1);          
    end
    Ab %muestra la matriz
end

En la ventana de comandos vemos lo siguiente:

%matriz ampliada Ab
%El elemento pivote Ab(1,1) es cero
Ab =
             0          4.00         -2.00         -2.00         -4.00
          1.00          2.00          4.00         -3.00          5.00
         -3.00         -3.00          8.00         -2.00          7.00
         -1.00          1.00          6.00         -3.00          7.00

intercambio fila 1 por fila 3
Ab =
         -3.00         -3.00          8.00         -2.00          7.00
          1.00          2.00          4.00         -3.00          5.00
             0          4.00         -2.00         -2.00         -4.00
         -1.00          1.00          6.00         -3.00          7.00
%se hacen ceros los elementos de la primera columna de las filas 2,3,4
Ab =
         -3.00         -3.00          8.00         -2.00          7.00
             0          1.00          6.67         -3.67          7.33
             0          4.00         -2.00         -2.00         -4.00
             0          2.00          3.33         -2.33          4.67
%se examinan los valores de los elementos de la segunda columna de las filas 2,3,4
intercambio fila 2 por fila 3
Ab =
         -3.00         -3.00          8.00         -2.00          7.00
             0          4.00         -2.00         -2.00         -4.00
             0          1.00          6.67         -3.67          7.33
             0          2.00          3.33         -2.33          4.67
%se hacen ceros los elementos de la segunda columna de las filas 3,4
Ab =
         -3.00         -3.00          8.00         -2.00          7.00
             0          4.00         -2.00         -2.00         -4.00
             0             0          7.17         -3.17          8.33
             0             0          4.33         -1.33          6.67
%se examinan los valores de los elementos de la tercera columna de las filas 3,4
%no hay intercambio
%se hacen ceros los elementos de la tercera columna de la fila 4
%se completa la matriz triangular
Ab =
         -3.00         -3.00          8.00         -2.00          7.00
             0          4.00         -2.00         -2.00         -4.00
             0             0          7.17         -3.17          8.33
             0             0             0          0.58          1.63

Modificamos la función gauss_ecuacion para incluir la mejora

function x=gauss_ecuacion(A,b)
    Ab=[A b];
    n=length(b);
%matriz triangular
  for k=1:n-1 
        [mayor,j]=max(abs(Ab(k:n,k)));
        fila=j+k-1;
        if fila~=k
            Ab([k,fila],:)=Ab([fila,k],:);%intercambio de filas
        end
        for i=k+1:n
            factor=Ab(i,k)/Ab(k,k);
            Ab(i,k:n+1)=Ab(i,k:n+1)-factor*Ab(k,k:n+1);          
        end
    end
%incógnitas
    x=zeros(n,1);
    x(n)=Ab(n,n+1)/Ab(n,n);
    for i=n-1:-1:1 
        x(i)=Ab(i,n+1)/Ab(i,i)-Ab(i,i+1:n)*x(i+1:n)/Ab(i,i); 
    end
end

Llamamos a la función gauss_ecuacion para resolver el sistema de cuatro ecuaciones lineales

>> A=[0,4,-2,-2;1,2,4,-3;-3,-3,8,-2;-1,1,6,-3];
>> b=[-4;5;7;7];
>> gauss_ecuacion(A,b)
ans =
    0.6000
    1.6000
    2.4000
    2.8000