miércoles, 22 de mayo de 2013

Método de Gauss para Resolver Sistemas de Ecuaciones en C/C++

Aquí dejo el código para resolver sistemas de ecuaciones mediante Gauss con la pequeña correción, pero importante, comentada en el tema de Método de Gauss:




#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.0000001)||((Sist[A][Col]<-0.0000001))){
                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;
    }
}


 


Un saludo. 

23 comentarios:

  1. Buenos días Wendyy,
    El programa utiliza el método conocido como Método de Gauss.
    Esto consiste en realizar operaciones sobre la matriz A del sistema y el vector independiente D (Ax=D donde x es el vector incógnita) para primeramente triangularizarla, de manera que tengas la matriz A' con todos los elementos por debajo de la diagonal nulos, y posteriormente realizar el mismo prceso para los elementos por encima de la diagonal, de modo que tengas una matriz A'' diagonal. Un vez llegado a este paso la resolución ya es inmediata.
    Te dejo el enlace de wikipedia de como triangularizar una matriz con gauss-jordan y resokver el sistema:
    http://es.wikipedia.org/wiki/Eliminaci%C3%B3n_de_Gauss-Jordan

    Un saludo

    ResponderEliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. Hola buenas,
    intento arrancar el programa copiando el codigo y se me cierra el turbo C++, por que podria ser?

    ResponderEliminar
    Respuestas
    1. Yo no utilizo turbo C++, es preferible usar CodeBlocks. En cualquier caso puedes añadir justo al final de la estructura main (pero antes del return) la siguiente linea de código:
      getchar();
      Esto hace la misma función que el scanf() final, pero igual funciona mejor.

      Un saludo y gracias!!

      Eliminar
  4. CUANDO TERMINO DE INTRODUCIR TODOS LOS DATOS ME TIRA UN PORTAZO EN LA CARA Y SE CIERRA LA CONSOLA

    ResponderEliminar
  5. MII DATOS SON:
    2
    4k 3k 3k 3k 2 1
    LA SOL ES 1m y -0.66m m es 10 a la menos 3; k=1000

    ResponderEliminar
    Respuestas
    1. Buenas,
      A mi no me da ningún problema con el sistema que me dices, usando la IDE de codeblocks. El orden de introdución de los datos es: 4000 3000 3000 3000 2 1
      prueba si no a añadir otro scanf al final del main...
      Un saludo, espero haberte podido ayudar


      Eliminar
    2. hola oye este es el metodo de gauss-jordan entonces cual seria el metodo de gauss o cual es la diferencia

      Eliminar
    3. Se le llama de ambas formas, gauss o gauss-jordan, y es el mismo

      Eliminar
    4. Perdón la intromisión, pero gauss es escalonada pero solo hasta llegar a los 1 en la diagonal principal sin importar los numeros que están sobre de estos y gauss-jordan es cuando se logra llegar (por el mismo método) hasta la matriz identidad

      Eliminar
    5. No es lo mismo. Gauss lo resuelve de manera por filas para buscar la identidad de un lado. en cambio Gauss Jordan es el metodo de pivoteo.

      Eliminar
  6. Una pregunta, mediante este codigo es posible resolver Sistemas de encuaciones mediante matrices de 4x4?
    Agradezco su respuesta

    ResponderEliminar
    Respuestas
    1. Hola Eduardo.
      Sí, así es, este programa resuelve sistemas lineales de cualquier tamaño siempre que haya espacio en memoria (Aunque por simplicidad a la hora de programarlo se ha limitado a 100 la dimensión máxima)
      Si tienes cualquier duda a la hora de utilizar el programa no dudes en preguntar.
      Un saludo

      Eliminar
  7. Hola, disculpa que este de incognito, queria preguntarte...Tomando e cuenta el proceso que haces en el cuaderno para resolver esta matriz, que funcion viene haciendo tu variable A,COL,COL1 Y COL2? me serviria mucho para poder visualizar mejor el codigo

    ResponderEliminar
  8. El código tiene un pequeño error, está en la 15o. linea del código fuente, me funcionó hasta que elimine el "scanf("");" pero no sé a que se deba que a otros les corre a la primera. Como sea, gracias por tan buen aporte!

    ResponderEliminar
  9. Buenas tardes... como haria para colocarle que no tiene solucion???... claro en el caso de que no la tenga...

    ResponderEliminar
  10. podria adaptarlo para que resuelva matrices de mxn y no solo de nxn?

    ResponderEliminar
  11. ¿Como puedo hacerlo para resolver un sistema de ecuaciones no lineales?.

    ResponderEliminar
  12. HOLA BUNENAS NOCHE DISCULPE PARA CAMBIAR EL CODIGO A 3*3???
    ES QUE YA LO INTENTE PERO ME MARCA ERROR AYUDA PORFAVOR

    ResponderEliminar