Logo elrincondelc.com
curso de programación en c
Foros de programación en C
Inicio :: Código fuente

Valoración
18

Metodo Gauss-Jordan

codigo enviada por: kropzter
Este programa calcula la inversa de una matriz por medio del metodo
del espejo, es decir se aplica la reduccion de Gauss-Jordan en
una matriz de nxn y se aplican las mismas operaciones de fila a una
matriz identidad de nxn
#include <stdio.h>
#include <conio.h>
#include <math.h>

/*********** VARIABLES GLOBALES **********************/

double matriz[50][50];
double identidad[50][50];
int N; //N contiene el tama¤o de la matriz cuadrada


/*********** PROTOTIPOS DE FUNCIONES *****************/

void hallar_inversa(void);
void escalonar_matriz(void);
void permutar_filas(int fila1, int fila2);
void multip_fila(int fila,double factor);
void sumar_fila_multip(int fila1,int fila2, double factor);
void ceros_abajo(int fila_pivote, int columna_pivote);
void ceros_arriba(int fila_pivote, int columna_pivote);
void generar_matriz_identidad(void);

/*****************************************************/


int main()
{
int fi, co;

clrscr();

do{
printf("Ingrese el tama¤o de la matriz cuadrada: ");
scanf("%i",&N);
if(N>50 || N<2) {clrscr(); printf("El numero debe estar entre 2 y 50n");}
}while(N>50 || N<2);

for(fi=0;fi<N;fi++)
{
for(co=0;co<N;co++)
{
printf("Ingrese el valor de matriz[%i][%i]",fi+1,co+1);
scanf("%lf",&matriz[fi][co]);
}
}

hallar_inversa();

return 0;
}

/*-------------------------------------------------------------------------*/

void hallar_inversa(void)
{
int cont,cont2, flag=0;

escalonar_matriz();
generar_matriz_identidad(); //rellena la matriz identidad


for(cont=0;cont<N;cont++) //recorre filas
{
for(cont2=0;cont2<N;cont2++) //recorre columnas
{
if(matriz[cont][cont2]!=0) //busca pivote (elemento ditinto de 0)
{
if(matriz[cont][cont2]!=1) //si pivote no es 1, se lo multiplica
{
multip_fila(cont,pow(matriz[cont][cont2],-1));
}

ceros_arriba(cont,cont2); // se hacen 0's por arriba
ceros_abajo(cont,cont2); // y por debajo del pivote

break;
}
}
}

/*--------------------------------------------------------------*/
/* Una vez terminada esta operacion, la matriz identidad estara */
/* transformada en la inversa */
/* */
/* Ahora se comprueba que la matriz original este transformada */
/* en la matriz identidad, de no ser asi la inversa obtenida */
/* no es valida y la matriz no tiena inversa */
/*--------------------------------------------------------------*/


for(cont=0;cont<N;cont++)
{
for(cont2=0;cont2<N;cont2++)
{
if(cont==cont2)
{
if(matriz[cont][cont2]!=1) flag=1;
}
else
{
if(matriz[cont][cont2]!=0) flag=1;
}
}
}



if(flag==1)
{
printf("nnLa matriz no tiene inversann");
}
else
{
printf("nnLa Matriz Inversa es :nn");

for(cont=0;cont<N;cont++)
{
for(cont2=0;cont2<N;cont2++)
{
printf("%+#0.3f ",identidad[cont][cont2]);

}
printf("n");
}
}


printf("nPresione una tecla para continuar...");
getch();


}

/*-----------------------------------------------------------------------*/
/* */
/* Ordena la matriz de forma que quede en su forma escalonada por */
/* renglones */
/* */
/*-----------------------------------------------------------------------*/

void escalonar_matriz(void)
{
int cont, col, ceros, vec[10];
int flag, aux;

for(cont=0;cont<N;cont++)
{
col=0,ceros=0;

if(matriz[cont][col]==0)
{
do{
ceros++;
col++;
}while(matriz[cont][col]==0);
}
vec[cont]=ceros;
}


do
{
flag=0;
for(cont=0;cont<N-1;cont++)
{
if(vec[cont]>vec[cont+1])
{
aux=vec[cont];
vec[cont]=vec[cont+1];
vec[cont+1]=aux;

permutar_filas(cont,cont+1);

flag=1;
}
}
}while(flag==1);

}

/*----------------------------------------------------------------------*/
/* SE DEFINEN LAS 3 OPERACIONES ELEMENTALES DE FILA */
/* */
/* Las operaciones que se le realizen a la matriz para reducirla */
/* tambien deberan realizarsele a la matriz identidad para obtener */
/* la matriz inversa */
/*----------------------------------------------------------------------*/


void permutar_filas(int fila1,int fila2)
{
float auxval;
int cont;

for(cont=0;cont<N;cont++)
{
auxval=matriz[fila1][cont];
matriz[fila1][cont]=matriz[fila2][cont];
matriz[fila2][cont]=auxval;

auxval=identidad[fila1][cont];
identidad[fila1][cont]=identidad[fila2][cont];
identidad[fila2][cont]=auxval;
}
}

/*----------------------------------------------------------------------*/

void multip_fila(int fila,double factor)
{
int cont;

for(cont=0;cont<N;cont++)
{
matriz[fila][cont]=(matriz[fila][cont])*factor;
identidad[fila][cont]=(identidad[fila][cont])*factor;
}
}

/*----------------------------------------------------------------------*/

void sumar_fila_multip(int fila1,int fila2, double factor)
{
int cont;
for(cont=0;cont<N;cont++)
{
matriz[fila1][cont]=(matriz[fila1][cont])+((matriz[fila2][cont])*factor);
identidad[fila1][cont]=(identidad[fila1][cont])+((identidad[fila2][cont])*factor);
}
}


void ceros_arriba(int fila_pivote, int columna_pivote)
{
int cont;

for(cont=0;cont<fila_pivote;cont++)
{
sumar_fila_multip(cont,fila_pivote,((matriz[cont][columna_pivote])*(-1)));

}
}

/*-------------------------------------------------------------------------*/
void ceros_abajo(int fila_pivote, int columna_pivote)
{
int cont;

for(cont=columna_pivote+1;cont<N;cont++)
{
sumar_fila_multip(cont,fila_pivote,((matriz[cont][columna_pivote])*(-1)));
}

}
/*-------------------------------------------------------------------------*/
void generar_matriz_identidad(void)
{
int i,j;
for(i=0;i<50;i++)
{
for(j=0;j<50;j++)
{
if(i==j) identidad[i][j]=1;
else identidad[i][j]=0;
}
}
}
eso es todo el programa??? que quiere decir /* ??
(teniente de fragata 2007-10-08 17:27:14)
GAUSS JORDAN SENCILLO
(JALROLDAN 2007-10-24 16:14:54)
Eheh loko toy cursando algebra y odio la materia esa, la verdad que te tiene que gustar esta cagada para ponerte a programar sobre eso, esta muy bueno el programa y muy prolijo, sos un capo loco te felicito. Seguro que te fue bien en los finales de algebra jajaja es jodido matrices. Suerte viejo y segui asi Salteño
(Salteño 2007-11-01 19:10:11)
loco gracias por postear el codigo aki, mira que tengo una pregunta que hacerte que es con los "flag" ke usaste y con el termino "auxval", si me lo podes explicar o alguien ke sepa, ke yo como ke no soy tan bueno en eso, gracias de antemano.
(lorocator 2007-11-01 21:42:58)
buen codigo amigo, la verdad que la reduccion de jordan si esta algo complicada, voy a programar un evento similar usando sentencias distintas a la tuya y pues podremos comparar, codigos, pero chido
(marck 2008-08-02 16:41:00)
Wow se nota ke eres un master en esto! Gracias man me sirvio para aprobar mi curso de programacion (y)
(ManuelUNT 2008-08-14 19:11:18)
Muy bueno el codigo. Supongo q no tiene xq ser q guste muxo el tema, sino q si es necesario pues viene bien tenerlo a mano. Si tienes asignaturas kmo algebra viene muy bien para acer comprobaciones.
(Hunter_Dreams 2008-09-05 09:00:26)
Me acabas de sacar de un apuro compadre, estupendo codigo aunque... dudo un poco pero muy bueno. Gracias... kropzter
(ciervoD'anubis 2008-09-08 18:49:27)
Hola! soy nuevo en el foro y estudiante de algebra lineal al correr este programa en el Dev-C++ me marca algunos errores,en que compilador esta hecho?
(Fessinger 2008-09-23 20:02:28)
Pudieras resolverme una duda, he modificado tu codigo para validar todos los datos ingresados, es decir que no se puedan ingresar letras numeros negativos y con punto decimal en el campo de las incognitas, y letras o numeros con boble punto decimal en los coeficientes pero, aun no entiendo como mostrar iteracio tras iteracion de cambio de la matriz inversa. por favor envia tu direccion de correo al siguiente mail Jesusrdzmtzm@gmail.com , para que pueda enviarte mi modificacion y puedas aclararme mi duda.
(fycykys 2009-04-04 03:49:41)
me podrias especificar que compilador usaste. muchas gracias por tu aporte.
(arquimedez 2009-09-04 13:17:31)
Tu código no funciona como yo esperaba, no debería devolverte los elementos de la matriz invertida?¿?
(se_bas 2010-06-01 09:31:59)
Hola t hago una pregunta sera que se puede hacer para cualkier tmaño de la matriz en C.................. POrfa si puedes ayudame
(marilin zarate 2011-02-01 05:24:27)
Hola,tengo un problemilla con el programa!! no funciona correctamente con todos los numeros; por ejemplo: si metes esta matriz 2X2 ; 6 8 9 4 me dice que no tiene inversa , pero en cambio si la tiene, y cuando pones algun cero en la diagonal principal la inversa de la matriz es correcta pero salen intercambiadas las filas, me podrian enviar alguna solucion?¿ mi direccion de correo electronico es may_c89@hotmail.com Muchas Gracias
(aso4 2011-05-04 03:27:17)
oye como puedo mejorar tu programa para que pueda imprimir bien la inversa
(michel9010 2011-05-13 21:31:25)
perro te las mandaste era justo lo que me faltaba para terminar un ramo ahora lo modifico y listo, gracias perro.
(seba_spk 2012-01-26 16:34:05)
Pagina relacionada con las dudas que surgen al momento de comenzar a desarrollar. Esta pagina maneja temas de nivel basico, Medio y avanzado con la bondad que se puede relacionar con cualquier lenguage de programacion. http://www.facebook.com/Desarrollo.Facil?ref=hl#!/Desarrollo.Facil Entren esta bastante buena y ahy aportes de muy buenos y que si ayudan
(gaona 2012-07-26 19:42:30)

Para enviar comentarios debes estar registrado.

(c) ElRincondelC.com

Un proyecto de Urlan Heat : proyectos de Internet y soporte para el comercio electrónico.