Sistema de ecuaciones lineales. Método de Gauss
Sistema de cuatro ecuaciones con cuatro incógnitas
Despejamos x1 de la primera ecuación
y la sustituimos en las restantes, quedando el sistema de tres ecuaciones con tres incógnitas
con
Despejamos, ahora, x2 de la primera ecuación
y las sustituimos en las dos restantes, quedando un sistema de dos ecuaciones con dos incógnitas.
con
Despejamos ahora, x3 de la primera ecuación
y la sustituimos en la ecuación restante,
con
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.
Ahora vamos obteniendo las incógnitas empezando por la última ecuación y terminando en la primera.
Sistema de n ecuaciones con n incógnitas
Sea un sistema de n ecuaciones con n incógnitas
que convertimos en el sistema equivalente
donde
Obtenemos las incógnitas xna x1
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
>> 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
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
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:
sean lo más grandes (en valor absoluto).
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
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
>> 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