Apuntes 14
Apuntes 14
Apuntes 14
Método de Gauss-Jordan
Un sistema de ecuaciones se resuelve por el método de Gauss cuando se obtienen sus soluciones mediante la
reducción del sistema dado a otro equivalente. El método de Gauss transforma la matriz de coeficientes en una
matriz triangular superior. El método de Gauss-Jordan continúa el proceso de transformación hasta obtener
una matriz diagonal unitaria.
El algoritmo es el siguiente:
1. Ir a la columna extrema izquierda que tenga algún elemento distinto de cero. Obs: si se aumentan las
columnas de manera secuencial, y se llega a una columna con ningún elemento distinto de cero,
pueden ocurrir dos cosas: el sistema no tiene solución o tiene infinitas soluciones
2. Si el primer renglón tiene un cero en esta columna, intercambiarlo con otro que no lo tenga.
3. Luego, obtener ceros debajo de este elemento delantero, sumando múltiplos adecuados del renglón
superior a los renglones debajo de él.
4. Cubrir el renglón superior y repetir el proceso anterior con la submatriz restante. Repetir con el resto
de los renglones (en este punto la matriz se encuentra en la forma de escalón).
5. Comenzando con el último renglón no cero, avanzar hacia arriba: para cada renglón obtener un 1
delantero e introducir ceros arriba de éste sumando múltiplos correspondientes a los renglones
correspondientes.
La implementación del algoritmo se muestra a continuación (se utilizan punteros para los intercambios de
filas):
#include<stdio.h>
int main(){
int i,n,j,k;
printf("Ingrese la cantidad de variables: "); scanf("%d",&n);
int A[n][n+1];
printf("Este programa resuelve el sistema de ecuaciones Ax=b\n");
printf("Ingrese los valores de la matriz A\n");
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("Ingrese A[%d][%d]: ",i,j);scanf("%d",&A[i][j]);
}
}
printf("\nIngrese los valores del vector b\n");
for(i=0;i<n;i++){
printf("Ingrese b[%d]: ",i);scanf("%d",&A[i][n]);
}
int *p[n],*q;
//Situación inicial
for(i=0;i<n;i++) *(p+i)=*(A+i);
//Proceso
int band,piv,ref;
for(j=0;j<n;j++){
band=1;
for(i=j;i<n;i++){
piv=*(*(p+i)+j);
if(piv!=0){
band=0;
break;
}
}
if(band){
printf("\nEl sistema no tiene solucion o no es unica\n");
for(i=0;i<n;i++){
for(j=0;j<=n;j++){
printf("%d\t",*(*(p+i)+j));
}
printf("\n");
}
return 0;
}
else{
q=*(p+i);
*(p+i)=*(p+j);
*(p+j)=q;
for(i=(j+1);i<n;i++){
ref=*(*(p+i)+j);
for(k=j;k<=n;k++){
*(*(p+i)+k) = ref*(*(*(p+j)+k)) - piv*(*(*(p+i)+k));
}
}
}
}
//Hasta aquí, la matriz está escalonada. Ahora se avanza hacia arriba
for(j=(n-1);j>0;j--){
piv=*(*(p+j)+j);
for(i=0;i<j;i++){
ref=*(*(p+i)+j);
for(k=0;k<=n;k++){
*(*(p+i)+k) = ref*(*(*(p+j)+k)) - piv*(*(*(p+i)+k));
}
}
}
for(i=0;i<n;i++){
piv=(*(*(p+i)+i));
for(k=0;k<=n;k++){
*(*(p+i)+k)/=piv;
}
}
//Impresion de resultados
printf("\nEl resultado es:\n");
for(i=0;i<n;i++){
for(j=0;j<=n;j++){
printf("%d\t",*(*(p+i)+j));
}
printf("\n");
}
return 0;
}
Se tiene que:
El método de Jacobi es el método iterativo para resolver sistemas de ecuaciones lineales más simple y se aplica
sólo a sistemas cuadrados, es decir a sistemas con tantas incógnitas como ecuaciones.
1. Primero se determina la ecuación de recurrencia. Para ello se ordenan las ecuaciones y las incógnitas.
De la ecuación se despeja la incógnita . En notación matricial se escribe como:
Uno de los principales problemas de los métodos iterativos es la garantía de que el método va a converger, es
decir, va a producir una sucesión de aproximaciones cada vez efectivamente más próximas a la solución. En el
caso del método de Jacobi no existe una condición exacta para la convergencia. Lo mejor que se tiene es una
condición que garantiza la convergencia, pero en caso de no cumplirse puede o no haberla. La condición es la
siguiente: si la matriz de coeficientes original del sistema de ecuaciones es diagonalmente dominante, el
método de Jacobi seguro converge (esto mismo se puede afirmar para el método de Gauss-Seidel).
Una matriz se dice matriz diagonalmente dominante, si en cada uno de los renglones, el valor absoluto del
elemento de la diagonal principal es mayor que la suma de los valores absolutos de los elementos restantes del
mismo renglón. A veces la matriz de un sistema de ecuaciones no es diagonalmente dominante pero cuando se
cambian el orden de las ecuaciones y las incógnitas el nuevo sistema puede tener matriz de coeficientes
diagonalmente dominante.
Orden conveniente para Jacobi
En ciertas ocasiones al aplicar Jacobi la matriz no es diagonalmente dominante y por tanto no existirá garantía
de convergencia. Sin embargo, en algunos casos será posible reordenar las incógnitas en otra manera de forma
que la nueva matriz de coeficientes sea diagonalmente dominante. Esto se puede detectar revisando todos los
posibles ordenamientos de las incógnitas y ver cómo es la matriz resultante. Esto conlleva un buen número de
pruebas, pues el número posible de ordenamientos en variables es . Pero cuando es reducido, es
sencillo.
Método de Gauss-Seidel
El método de Gauss-Seidel es muy semejante al método de Jacobi. Mientras que en el de Jacobi se utiliza el
valor de las incógnitas para determinar una nueva aproximación, en el de Gauss-Seidel se van utilizando los
valores de las incógnitas recién calculados en la misma iteración, y no en la siguiente. Por ejemplo, en el
método de Jacobi se obtiene en el primer cálculo , pero este valor de no se utiliza sino hasta la
siguiente iteración. En el método de Gauss-Seidel en lugar de eso se utiliza de en lugar de en forma
inmediata para calcular el valor de las siguientes incógnitas; de igual manera procede con las siguientes
variables: siempre se utilizan las variables recién calculadas.
Se puede notar que el método de Gauss-Seidel converge más rápido que el método de Jacobi. Esto es debido a
que se usan los valores actuales en lugar de los valores de la iteración anterior.