Eliminación Gaussiana – Algoritmos antiguos

Publicado por Andrea Navarro en

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.

carl_friedrich_gauss_1840_by_jensen

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 .

Sistema de ecuaciones - Eliminación Gaussiana

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.

Eliminación Gaussiana

Multiplico el valor obtenido por el valor de la primera fila y resto el valor resultante al valor correspondiente de la segunda fila.

Eliminación Gaussiana
Eliminación Gaussiana
Eliminación Gaussiana

Repito el procedimiento para la tercer fila

Eliminación Gaussiana
Eliminación Gaussiana
Eliminación Gaussiana
Eliminación Gaussiana
Eliminación Gaussiana

Repito para el segundo valor de la tercera fila

Eliminación Gaussiana
Eliminación Gaussiana
Eliminación Gaussiana
Eliminación Gaussiana
Eliminación Gaussiana

Despejo el valor de x3

Eliminación Gaussiana

Divido el resultado de la segunda ecuación por el valor de la diagonal y obtengo el valor de x2

Eliminación Gaussiana

Sumo la multiplicación de x2 por los valores de la primera fila

Eliminación Gaussiana

Divido la suma por el valor de la diagonal y obtengo x1

Eliminación Gaussiana
  • Pseudocódigo con Pseint
  • Algoritmo para PHP
  • Algorimto para C
  • Algoritmo para Python

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!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Andrea Navarro

- Ingeniera en Informática - Docente universitaria - Investigadora

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.