Autor
|
Tema: Programa para resolver sistemas de ecuaciones hecho en C++ (Leído 55,848 veces)
|
chinoman1993
Desconectado
Mensajes: 6
|
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); }
|
|
|
En línea
|
|
|
|
za.asi
Desconectado
Mensajes: 62
|
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.
|
|
|
En línea
|
|
|
|
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; } }
|
|
|
En línea
|
|
|
|
do-while
Desconectado
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡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
|
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
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Resolver ecuaciones Visual Basic 6.0
« 1 2 3 »
Programación Visual Basic
|
oJosLoCos
|
26
|
29,756
|
13 Julio 2009, 19:02 pm
por WestOn
|
|
|
Resolucion de sistemas de ecuaciones sencillos
Java
|
Debci
|
6
|
7,544
|
1 Abril 2010, 15:58 pm
por Debci
|
|
|
Aprendiendo C: Programa resolver ecuaciones de 2º grado
Programación C/C++
|
raulgombru
|
9
|
12,971
|
18 Septiembre 2010, 17:17 pm
por Lolo_Molo
|
|
|
[Matemática] Resolviendo sistemas de ecuaciones lineales modulares.
Foro Libre
|
APOKLIPTICO
|
9
|
9,061
|
5 Diciembre 2010, 05:17 am
por APOKLIPTICO
|
|
|
C para resolver ecuaciones de segundo grado llamando tres funciones diferentes,
Programación C/C++
|
raulinchi
|
1
|
9,066
|
22 Octubre 2011, 16:27 pm
por raulinchi
|
|