elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Programa para resolver sistemas de ecuaciones hecho en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Programa para resolver sistemas de ecuaciones hecho en C++  (Leído 55,058 veces)
chinoman1993

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Programa para resolver sistemas de ecuaciones hecho en C++
« 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);
}


En línea

za.asi

Desconectado Desconectado

Mensajes: 62


Ver Perfil
Re: Programa para resolver sistemas de ecuaciones hecho en C++
« Respuesta #1 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.


En línea

cypascal

Desconectado Desconectado

Mensajes: 42


Ver Perfil WWW
Re: Programa para resolver sistemas de ecuaciones hecho en C++
« Respuesta #2 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
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;
    }
}
En línea

Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Programa para resolver sistemas de ecuaciones hecho en C++
« Respuesta #3 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
« Última modificación: 23 Octubre 2012, 08:16 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
cypascal

Desconectado Desconectado

Mensajes: 42


Ver Perfil WWW
Re: Programa para resolver sistemas de ecuaciones hecho en C++
« Respuesta #4 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
En línea

Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines