Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: chinoman1993 en 21 Octubre 2012, 05:50 am



Título: Programa para resolver sistemas de ecuaciones hecho en C++
Publicado por: chinoman1993 en 21 Octubre 2012, 05:50 am
Buenas Noches, les dejo un programa que hize hace a penas un rato, el cual sirve para resolver sistemas de ecuaciones de 2x2 y de 3x3 a travez de Gauss-Jordan, el programa esta muy basico, pero funciona bien, falta validar algunas cosas pero en general funciona bien, por favor dejenme sus comentarios, sugerencias, etc., estoy abierto a toda critica constructiva soy estudiante de Ingenieria en Sistemas Computacionales a penas cursando mi primer materia de programación, por lo mismo este programa se basa mas en la logica matematica que en la logica de programación.

Código:
#include <iostream>
using namespace std;
void main()
{
int opcion,repetir=1;
float matriz2x3[2][3],matriz3x4[3][4],x,y,z;
do
{
cout<<"Este programa resuleve sistemas ecuaciones, de 2 y 3 incognitas"<<endl;
cout<<"Para resolver un sistema de 2 incognitas Presiona 1"<<endl;
cout<<"Para resolver un sistema de 3 incognitas Presiona 2"<<endl;
cout<<"Opci\xA2n: ";
cin>>opcion;
while(opcion<1||opcion>2)
{
cout<<endl<<"Seleccione una opci\xA2n valida"<<endl;
cout<<"Opci\xA2n: ";
cin>>opcion;
}
system("cls");
switch(opcion)
{
case 1:
cout<<"Primera Ecuaci\xA2n"<<endl<<endl;
cout<<"Ingrese el coeficiente de x: ";
cin>>matriz2x3[0][0];
cout<<endl;
cout<<"Ingrese el coeficiente de y: ";
cin>>matriz2x3[0][1];
cout<<endl;
cout<<"Ingrese el valor del termino independiente: ";
cin>>matriz2x3[0][2];
cout<<endl;
cout<<"Segunda Ecuaci\xA2n"<<endl<<endl;
cout<<"Ingrese el coeficiente de x: ";
cin>>matriz2x3[1][0];
cout<<endl;
cout<<"Ingrese el coeficiente de y: ";
cin>>matriz2x3[1][1];
cout<<endl;
cout<<"Ingrese el valor del termino independiente: ";
cin>>matriz2x3[1][2];
cout<<endl;
//Resolviendo sistema con base en metodo de Gauss-Jordan
matriz2x3[0][1]=matriz2x3[0][1]/matriz2x3[0][0];
matriz2x3[0][2]=matriz2x3[0][2]/matriz2x3[0][0];
matriz2x3[0][0]=matriz2x3[0][0]/matriz2x3[0][0];// Se hace 1
//----------------------------------------------
matriz2x3[1][1]=((-matriz2x3[1][0])*matriz2x3[0][1])+matriz2x3[1][1];
matriz2x3[1][2]=((-matriz2x3[1][0])*matriz2x3[0][2])+matriz2x3[1][2];
matriz2x3[1][0]=((-matriz2x3[1][0])*matriz2x3[0][0])+matriz2x3[1][0];// Se hace 0
//-------------------------------------------------------------------
matriz2x3[1][2]=matriz2x3[1][2]/matriz2x3[1][1];//Solucion variable y
matriz2x3[1][1]=matriz2x3[1][1]/matriz2x3[1][1];
//----------------------------------------------
matriz2x3[0][2]=((-matriz2x3[0][1])*matriz2x3[1][2])+matriz2x3[0][2];//Solucion variable x
matriz2x3[0][1]=((-matriz2x3[0][1])*matriz2x3[1][1])+matriz2x3[0][1];
//-------------------------------------------------------------------
x=matriz2x3[0][2];
y=matriz2x3[1][2];
cout<<"Soluci\xA2n: "<<endl;
cout<<"\tx="<<x<<endl;
cout<<"\ty="<<y<<endl;
break;
case 2:
cout<<"Primera Ecuaci\xA2n"<<endl<<endl;
cout<<"Ingrese el coeficiente de x: ";
cin>>matriz3x4[0][0];
cout<<endl;
cout<<"Ingrese el coeficiente de y: ";
cin>>matriz3x4[0][1];
cout<<endl;
cout<<"Ingrese el coeficiente de z: ";
cin>>matriz3x4[0][2];
cout<<endl;
cout<<"Ingrese el valor del termino independiente: ";
cin>>matriz3x4[0][3];
cout<<endl;
cout<<"Segunda Ecuaci\xA2n"<<endl<<endl;
cout<<"Ingrese el coeficiente de x: ";
cin>>matriz3x4[1][0];
cout<<endl;
cout<<"Ingrese el coeficiente de y: ";
cin>>matriz3x4[1][1];
cout<<endl;
cout<<"Ingrese el coeficiente de z: ";
cin>>matriz3x4[1][2];
cout<<endl;
cout<<"Ingrese el valor del termino independiente: ";
cin>>matriz3x4[1][3];
cout<<endl;
cout<<"Tercera Ecuaci\xA2n"<<endl<<endl;
cout<<"Ingrese el coeficiente de x: ";
cin>>matriz3x4[2][0];
cout<<endl;
cout<<"Ingrese el coeficiente de y: ";
cin>>matriz3x4[2][1];
cout<<endl;
cout<<"Ingrese el coeficiente de z: ";
cin>>matriz3x4[2][2];
cout<<endl;
cout<<"Ingrese el valor del termino independiente: ";
cin>>matriz3x4[2][3];
cout<<endl;
//Resolviendo sistema con base en metodo de Gauss-Jordan
matriz3x4[0][1]=matriz3x4[0][1]/matriz3x4[0][0];
matriz3x4[0][2]=matriz3x4[0][2]/matriz3x4[0][0];
matriz3x4[0][3]=matriz3x4[0][3]/matriz3x4[0][0];
matriz3x4[0][0]=matriz3x4[0][0]/matriz3x4[0][0];// Se hace 1
//----------------------------------------------
matriz3x4[1][1]=((-matriz3x4[1][0])*matriz3x4[0][1])+matriz3x4[1][1];
matriz3x4[1][2]=((-matriz3x4[1][0])*matriz3x4[0][2])+matriz3x4[1][2];
matriz3x4[1][3]=((-matriz3x4[1][0])*matriz3x4[0][3])+matriz3x4[1][3];
matriz3x4[1][0]=((-matriz3x4[1][0])*matriz3x4[0][0])+matriz3x4[1][0];// Se hace 0
matriz3x4[2][1]=((-matriz3x4[2][0])*matriz3x4[0][1])+matriz3x4[2][1];
matriz3x4[2][2]=((-matriz3x4[2][0])*matriz3x4[0][2])+matriz3x4[2][2];
matriz3x4[2][3]=((-matriz3x4[2][0])*matriz3x4[0][3])+matriz3x4[2][3];
matriz3x4[2][0]=((-matriz3x4[2][0])*matriz3x4[0][0])+matriz3x4[2][0];// Se hace 0
//-------------------------------------------------------------------
matriz3x4[1][2]=matriz3x4[1][2]/matriz3x4[1][1];
matriz3x4[1][3]=matriz3x4[1][3]/matriz3x4[1][1];
matriz3x4[1][1]=matriz3x4[1][1]/matriz3x4[1][1];// Se hace 1
//----------------------------------------------
matriz3x4[0][2]=((-matriz3x4[0][1])*matriz3x4[1][2])+matriz3x4[0][2];
matriz3x4[0][3]=((-matriz3x4[0][1])*matriz3x4[1][3])+matriz3x4[0][3];
matriz3x4[0][1]=((-matriz3x4[0][1])*matriz3x4[1][1])+matriz3x4[0][1];// Se hace 0
matriz3x4[2][2]=((-matriz3x4[2][1])*matriz3x4[1][2])+matriz3x4[2][2];
matriz3x4[2][3]=((-matriz3x4[2][1])*matriz3x4[1][3])+matriz3x4[2][3];
matriz3x4[2][1]=((-matriz3x4[2][1])*matriz3x4[1][1])+matriz3x4[2][1];// Se hace 0
//-------------------------------------------------------------------
matriz3x4[2][3]=matriz3x4[2][3]/matriz3x4[2][2];//Solucion variable z
matriz3x4[2][2]=matriz3x4[2][2]/matriz3x4[2][2];
//-------------------------------------------------------------------
matriz3x4[0][3]=((-matriz3x4[0][2])*matriz3x4[2][3])+matriz3x4[0][3];//Solucion variable x
matriz3x4[0][2]=((-matriz3x4[0][2])*matriz3x4[2][2])+matriz3x4[0][2];
matriz3x4[1][3]=((-matriz3x4[1][2])*matriz3x4[2][3])+matriz3x4[1][3];//Solucion variable y
matriz3x4[1][2]=((-matriz3x4[1][2])*matriz3x4[2][2])+matriz3x4[1][2];
//-------------------------------------------------------------------
x=matriz3x4[0][3];
y=matriz3x4[1][3];
z=matriz3x4[2][3];
cout<<"Soluci\xA2n: "<<endl;
cout<<"\tx="<<x<<endl;
cout<<"\ty="<<y<<endl;
cout<<"\tz="<<z<<endl;
break;
}
cout<<"Para realizar otro calculo presione 1, para salir presione 0"<<endl;
cout<<"Opci\xA2n: ";
cin>>repetir;
while (repetir<0||repetir>1)
{
cout<<endl<<"Ingrese una opci\xA2n valida"<<endl;
cout<<"Opci\xA2n: ";
cin>>repetir;
}
system("cls");
}while(repetir==1);
}


Título: Re: Programa para resolver sistemas de ecuaciones hecho en C++
Publicado por: za.asi en 21 Octubre 2012, 14:07 pm
Yo cambiaría un fragmento del código, la parte que has puesto

Código:
cin>>opcion;
while(opcion<1||opcion>2)
{
cout<<endl<<"Seleccione una opci\xA2n valida"<<endl;
cout<<"Opci\xA2n: ";
cin>>opcion;
}

yo lo escribiria con default. Si usas switch tienes la opcion de poner default que es para todas las opciones diferentes de las que has declarado con case:

Código:
case 1:
     ...
     break;
case 2:
     ...
     break;
default:
     cout<<endl<<"Seleccione una opci\xA2n valida"<<endl;
     cout<<"Opci\xA2n: ";
     cin>>opcion;
     break;

Creo que es mas cómodo trabajar así, porque si luego quieres modificar el código para incluir mas opciones te será mas facil. Ademas pondría los algoritmos de la resolución de los sistemas en funciones para que sea más legible el código.


Título: Re: Programa para resolver sistemas de ecuaciones hecho en C++
Publicado por: cypascal en 22 Octubre 2012, 22:28 pm
Te aconsejo que implementes el algoritmo de resolucion de Gauss-Jordan de modo que sea capaz de resolver cualquier tipo de sistema (Siempre y cuando el ordenador te lo permita). Además el algoritmo te quede incluso mas ligero que el de tu programa inicial. Esta bien empezar por casos mas sencillos, pero yo te invito a que pienses un poco y generalices tu algoritmo. Te dejo un progrma que hice yo para resolver sistemas (Lo maslo es que está en C y no en C++ pero se puede entender lo que se hace)
El algorito está aquí (juntos con muchos mas programas):

De todas formas tambien te lo pongo aqui:http://cypascal.blogspot.com.es/2012/10/metodo-de-gauss-en-cc.html (http://cypascal.blogspot.com.es/2012/10/metodo-de-gauss-en-cc.html)
Código:
#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;
    }
}


Título: Re: Programa para resolver sistemas de ecuaciones hecho en C++
Publicado por: do-while en 23 Octubre 2012, 08:12 am
¡Buenas!

Si quereis resolver sistemas de ecuaciones utilizando Gauss-Jordan, investigad un poco sobre el condicionamiento del problema y pivotaje parcial y completo. Si no aplicais estas reglas, podeis encontraros con resultados extraños derivados de la representacion en coma flotante de los numeros reales, a fin de cuentas, no estais trabajando con numeros reales, sino con sus aproximaciones binarias. Esto quiere decir que en la mayor parte de los casos en lugar de un numero x, estareis trabajando con un numero x + E, donde E es un error de redondeo en la representacion interna, por lo que al realizar operaciones este error se puede acumular hasta producir soluciones incorrectas.

¡Saludos!

PD: Un poco de teoria y algunos algoritomos para resolver sistemas de ecuaciones lineales:

http://pcmap.unizar.es/~mpala/C_N_lecci/CN_1II2_SELdir.pdf


Título: Re: Programa para resolver sistemas de ecuaciones hecho en C++
Publicado por: cypascal en 23 Octubre 2012, 14:41 pm
Si, tienes toda la razón, sería mas correcto que en vez de considerar un cero como tal, considerara 0 cualquier valor menor de una cierta cantidad.Yo creo que el codigo quedaria mejor con este pequeño cambi
Código:
#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;
    }
}

Donde he considerado que si -0.0000001<x<0.0000001 entonces ese numero es 0.

Un Saludo
cypascal.blogspot.com.es (http://cypascal.blogspot.com.es)