Eliminación Gaussiana – Algoritmos antiguos
En este artículo se explicara el método de Eliminación Gaussiana para la resolución de sistemas de ecuaciones lineales y su aplicación en varios lenguajes.
La eliminación gaussiana es un algoritmo que permite resolver un sistema de ecuaciones lineal. Consiste en una secuencia de operaciones realizadas sobre las matrices de los coeficientes de dichas ecuaciones.
Este algoritmo aparece por primera vez en el libro «Los nueve capítulos de el arte matemático«, un libro realizado por varias generaciones de estudiosos en China entre los siglos I y II AC.
Carl Friedrich Gauss desarrollo en 1810 una notación para la eliminación simétrica que fue adoptada en el siglo IX por las llamadas «computadoras humanas» para resolver los problemas de mínimos cuadrados en ecuaciones normales. Finalmente el algoritmo comenzó a llamarse solamente por el nombre de Gauss.
Funcionamiento del algoritmo de Eliminación Gaussiana
El algoritmo de eliminación Gaussiana realiza lo que se llama una reducción de filas en una matriz donde se realizan una serie de operaciones sobre los valores hasta que la esquina izquierda inferior de la matriz consiste solamente en ceros.
Existen tres tipos de operaciones elementales de filas
- Intercambiar dos filas
- Multiplicar una fila por un escalar diferente de cero
- Sumar el múltiplo de una fila a otra fila
En el siguiente ejemplo se ve la resolución de un sistema de ecuaciones .
El primer paso es convertir el sistema en matriz.
El primer valor a convertir en 0 es el primer valor de la segunda fila, para hacerlo dividimos el valor por el primer elemento de la matriz.
Multiplico el valor obtenido por el valor de la primera fila y resto el valor resultante al valor correspondiente de la segunda fila.
Repito el procedimiento para la tercer fila
Repito para el segundo valor de la tercera fila
Despejo el valor de x3
Divido el resultado de la segunda ecuación por el valor de la diagonal y obtengo el valor de x2
Sumo la multiplicación de x2 por los valores de la primera fila
Divido la suma por el valor de la diagonal y obtengo x1
Pseudocódigo para PSeint
Proceso Eliminación Gaussiana
Dimension matriz(3,4);
//Matriz
matriz[1,1]=3;
matriz[1,2]=2;
matriz[1,3]=3;
matriz[1,4]=3;
matriz[2,1]=1;
matriz[2,2]=3;
matriz[2,3]=1;
matriz[2,4]=-6;
matriz[3,1]=5;
matriz[3,2]=1;
matriz[3,3]=3;
matriz[3,4]=12;
//Resultados
Dimension x(3);
//Orden de la matriz
orden=3;
mostrarMatriz(matriz,orden);
//Recorrer la matriz
Para j=1 Hasta orden+1 Con Paso 1 Hacer
Para i=1 Hasta orden Con Paso 1 Hacer
Si(i>j)
//Divir los elementos de la matriz
division=matriz[i,j]/matriz[j,j];
Para k=1 Hasta orden+1 Con Paso 1
//Obterner el nuevo valor para los elementos en la diagonal inferior
matriz[i,k]=matriz[i,k]-division*matriz[j,k];
FinPara
FinSi
FinPara
FinPara
//Recorrer la matriz
Para i=orden Hasta 1 Con Paso -1
suma=0;
Para j=i+1 Hasta orden Con Paso 1
suma=suma+matriz[i,j]*x[j];
FinPara
//Obtener los valores de las variables
x[i]=(matriz[i,orden+1]-suma)/matriz[i,i];
FinPara
//Mostrar los valores de las variables
Para i=1 Hasta orden Con Paso 1
Escribir "x" i "=" x[i];
FinPara
FinProceso
//Función para mostrar la matriz
SubProceso mostrarMatriz(matriz,orden)
Para i=1 Hasta orden Con Paso 1 Hacer
Escribir Sin Saltar "| ";
Para j=1 Hasta orden+1 Con paso 1 Hacer
Escribir Sin Saltar matriz[i,j] " ";
FinPara
Escribir "| ";
FinPara
Escribir " ";
FinSubProceso
Código en C
#include<stdio.h>
#define ORDEN 3
#define COLS 4
void mostrarMatriz(float matriz[ORDEN][COLS]);
int main(int argc, char** argv){
//Función para mostrar la matriz
float matriz[ORDEN][4]={
{3,2,3,3},
{1,3,1,-6},
{5,1,3,12}
};
float x[ORDEN],suma;
int j,i,k;
//Orden de la matriz
float division;
mostrarMatriz(matriz);
//Recorrer la matriz
for(j=0;j<=ORDEN;j++){
for(i=0; i<=(ORDEN-1); i++){
if(i>j){
//Divir los elementos de la matriz
division=matriz[i][j]/matriz[j][j];
for(k=0;k<=ORDEN;k++){
//Obterner el nuevo valor para los elementos en la diagonal inferior
matriz[i][k]=matriz[i][k]-division*matriz[j][k];
}
}
}
}
//Recorrer la matriz
for(i=ORDEN-1;i>=0;i--){
suma=0;
for(j=i+1;j<=ORDEN-1;j++){
suma=suma+matriz[i][j]*x[j];
}
//Obtener los valores de las variables
x[i]=(matriz[i][ORDEN]-suma)/matriz[i][i];
}
//Mostrar los valores de las variables
for(i=0; i<=ORDEN-1; i++){
printf("x%d =\t%.2f\n",i+1,x[i]);
}
return 0;
}
void mostrarMatriz(float matriz[ORDEN][COLS]){
int i,j;
printf("\n");
for(i=0;i<=(ORDEN-1);i++){
printf("|\t");
for(j=0;j<=ORDEN;j++){
printf("%.2f\t",matriz[i][j]);
}
printf("|\t\n");
}
printf("\n\n");
}
Código en PHP
<?php
//Eliminación Gaussiana
//Función para mostrar la matriz
function mostrarMatriz($matriz,$orden)
{
for($i=0;$i<=($orden-1);$i++)
{
echo "| ";
for($j=0;$j<=$orden;$j++)
{
echo $matriz[$i][$j]." ";
}
echo "| ";
echo "<br>";
}
echo "<br/><br/>";
}
//Matriz
$matriz[0][0]=3;
$matriz[0][1]=2;
$matriz[0][2]=3;
$matriz[0][3]=3;
$matriz[1][0]=1;
$matriz[1][1]=3;
$matriz[1][2]=1;
$matriz[1][3]=-6;
$matriz[2][0]=5;
$matriz[2][1]=1;
$matriz[2][2]=3;
$matriz[2][3]=12;
//Orden de la matriz
$orden=count($matriz);
mostrarMatriz($matriz,$orden);
//Recorrer la matriz
for($j=0;$j<=$orden;$j++)
{
for($i=0; $i<=($orden-1); $i++)
{
if($i>$j)
{
//Divir los elementos de la matriz
$division=$matriz[$i][$j]/$matriz[$j][$j];
for($k=0;$k<=$orden;$k++)
{
//Obterner el nuevo valor para los elementos en la diagonal inferior
$matriz[$i][$k]=$matriz[$i][$k]-$division*$matriz[$j][$k];
}
}
}
}
//Recorrer la matriz
for($i=$orden-1;$i>=0;$i--)
{
$suma=0;
for($j=$i+1;$j<=$orden-1;$j++)
{
$suma=$suma+$matriz[$i][$j]*$x[$j];
}
//Obtener los valores de las variables
$x[$i]=($matriz[$i][$orden]-$suma)/$matriz[$i][$i];
}
//Mostrar los valores de las variables
for($i=0; $i<=$orden-1; $i++)
{
echo "x".($i+1)." = $x[$i] <br>";
}
Código en Python
#Eliminación Gaussiana
#Función para mostrar la matriz
def mostrarMatriz(matriz,orden):
for i in range(0,orden):
linea = "| "
for j in range(orden+1):
linea += str(matriz[i][j])+" "
linea += "| "
print(linea)
matriz = [[3,2,3,3], [1,3,1,-6], [5,1,3,12]]
#Orden de la matriz
orden=len(matriz)
mostrarMatriz(matriz,orden);
#Recorrer la matriz
for j in range(0,orden+1):
for i in range(0, orden):
if i>j:
#Divir los elementos de la matriz
division=matriz[i][j]/matriz[j][j]
for k in range(0, orden+1):
#Obterner el nuevo valor para los elementos en la diagonal inferior
matriz[i][k]=matriz[i][k]-division*matriz[j][k];
#Recorrer la matriz
x = [0,0,0]
for i in range(orden,0,-1):
suma=0
for j in range(i,orden):
suma=suma+matriz[i-1][j]*x[j]
#Obtener los valores de las variables
x[i-1]=((matriz[i-1][orden]-suma)/matriz[i-1][i-1])
#Mostrar los valores de las variables
for i in range(0,orden):
print("x"+str(i)+" = "+str(x[i]))
Espero que les resulte útil!
2 comentarios
Ivana Amelia · 22 septiembre, 2016 a las 04:27
Genial! Para Nivel I de Programación! Muchas gracias
Andrea Navarro · 23 septiembre, 2016 a las 17:49
Gracias por comentar! Me alegro que te sirva!
Los comentarios están cerrados.