Programa para resolver sistemas de ecuaciones hecho en C++

Iniciado por chinoman1993, 21 Octubre 2012, 05:50 AM

0 Miembros y 1 Visitante están viendo este tema.

chinoman1993

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.

#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);
}

za.asi

Yo cambiaría un fragmento del código, la parte que has puesto


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:


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.

cypascal

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
#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;
    }
}
Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES

do-while

#3
¡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
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

cypascal

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
#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
Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES