martes, 16 de octubre de 2012

Metodo de Gauss en C/C++

El siguiente programa muestra el método de Gauss y su aplicación para resolver sistemas de Ecuaciones en C. Este programa ya fue implementado en Pascal: (http://cypascal.blogspot.com.es/2011/07/metodo-de-gauss.html)
aunque en este programa hemos trabajado de manera más sistematica, quedando un programa con muchas menos lineas e igual de efectivo. Este programa solo trabaja con sistemas de ecuaciones lineales con una única solución determinada, y que sean compatibles. Este programa del metodo de Gauss para la resolución de sistemas de ecuaciones en C, incluye una función que es la encargada de resolver el sistema y que se llama ResuelveGauss. Esta función será utilizada a la hora de resolver el sistema que da lugar el método de Mínimos Cuadrados y el cálculo del determinante.
Otro método que tambien permite resolver sitemas de ecuaciones, esta vez de forma iterativa, es el método de Jacobi. En los dos siguientes enlaces pueden encontrar los códigos tanto en C como en Pascal: Jacobi en C y Jacobi en Pascal

Mínimos cuadrados: .http://cypascal.blogspot.com.es/2012/10/minimos-cuadrados-en-cc.html.
Determinante: http://cypascal.blogspot.com.es/2013/04/calculo-determinante-en-c.html

#include <stdio.h>

void PideDatos(int *Dim, float Sist[][102]);
void EscribeDatos(int Dim, float Sist[][102]);

void ResuelveGauss(int Dim, float Sist[][102]);


int main(void)
{
    int C,Dimension;
    float Sistema[101][102];
    PideDatos(&Dimension,Sistema);
    printf("\n\n\nEl SISTEMA introducido es el siguiente: \n\n");
    EscribeDatos(Dimension,Sistema);
    ResuelveGauss(Dimension,Sistema);
    printf("\n\n\nLas soluciones son:\n");
    for(C=1;C<=Dimension;C++) printf("\n X%d=%f\n",C,Sistema[C][Dimension+1]);
   
    scanf("");
    return(0);
}


void PideDatos(int *Dim,float Sist[][102])
{
    int A,B;
    printf("\n\n ||RESUELVE SISTEMAS LINEALES DETERMINADOS POR GAUSS||");
    printf("\n\n\n Introduce el numero de incognitas:(menor que 100)");
    scanf("%d",&*Dim);
    printf("\n\n PASE A INTRODUCIR CADA COMPONENTE DEL SISTEMA (A|B):");
    printf("\n\n MATRIZ A:\n");
    for(A=1;A<=*Dim;A++) for(B=1;B<=*Dim;B++){
        printf("\n Termino A(%d,%d):",A,B); scanf("%f",&Sist[A][B]);}
    printf("\n\n\n VECTOR B:\n");
    for(A=1;A<=*Dim;A++){
        printf("\n Termino B(%d):",A);scanf("%f",&Sist[A][*Dim+1]);
    }}

void EscribeDatos(int Dim, float Sist[][102])
{
    int A,B;
    for(A=1;A<=Dim;A++){
        for(B=1;B<=(Dim+1);B++){
            printf("%7.2f",Sist[A][B]);
            if(B==Dim) printf("   |");}
        printf("\n");
    }}

void ResuelveGauss(int Dim, float Sist[][102])
{
    int NoCero,Col,C1,C2,A;
    float Pivote,V1;
   
    for(Col=1;Col<=Dim;Col++){
        NoCero=0;A=Col;
        while(NoCero==0){
            if(Sist[A][Col]!=0){
                NoCero=1;}
            else A++;}
        Pivote=Sist[A][Col];
        for(C1=1;C1<=(Dim+1);C1++){
            V1=Sist[A][C1];
            Sist[A][C1]=Sist[Col][C1];
            Sist[Col][C1]=V1/Pivote;}
        for(C2=Col+1;C2<=Dim;C2++){
            V1=Sist[C2][Col];
            for(C1=Col;C1<=(Dim+1);C1++){
                Sist[C2][C1]=Sist[C2][C1]-V1*Sist[Col][C1];}
    }}
   
    for(Col=Dim;Col>=1;Col--) for(C1=(Col-1);C1>=1;C1--){
        Sist[C1][Dim+1]=Sist[C1][Dim+1]-Sist[C1][Col]*Sist[Col][Dim+1];
        Sist[C1][Col]=0;
    }
}



Se podría poner un numero pequeño en vez de cero para que no diera problemas. Hay que tener en cuenta, que a la hora de operar, es posible que en vez de obtener 0s obtengamos número muy pequeños pero no ceros. Aquí les dejo el código con esa pequeña corrección:
Codigo con mejora

Salu10!

No hay comentarios:

Publicar un comentario