Programación General > C/C++
Problema inversa
Checho360:
Hola muy buenas, estoy programando algunas cosas con C++ y en este caso el calculo de la inversa a partir de una matriz que introduce el usuario. Tengo el mismo algoritmo programado en matlab y funciona perfectamente pero en c++ no lo ejecuta como yo esperaba. En primer lugar no calcula la inversa, y ademas se cuelga si metes orden 4. Espero que alguien me diga por que no funciona. Espero vuestra respuesta un saludo y gracias de antemano!!!
--- Código: C++ ---#include <iostream>using namespace std;int main ()/*Este programa pide al usuario una matriz de orden n la diagonaliza por el metodo de Gauss-Jordan sin pivote*/{ //Genero las variables, la matriz, la pido al usuario y la muestro por pantalla int n;double long t;int w; cout<<"Introduzca el orden de la matriz:"<<endl; cin>>n;int q=n+1; double A[n][2*n];double B[n][n]; for(int i=1;i<=n;i++){ for(int k=1;k<=n;k++){ cout<<"Introduzca el elemento de la fila "<<i<<" y la columna "<<k<<endl; cin>>A[i][k]; } } cout<<endl<<endl; for(int i=1;i<=n;i++){ for(int k=1;k<=n;k++){ cout<<A[i][k]<<" "; if(k==n){cout<<endl;} } } //Genero la matriz identidad for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(j==i){B[i][j]=1;} else{B[i][j]=0;} } } //Acoplo la matriz identidad para trabajar con ella for(int j=1;j<=n;j++){ int a=1; for(int i=n+1;i<=2*n;i++){ A[j][i]=B[j][a]; a++; } } //Muestro la matriz con la que voy a trabajar cout<<endl<<endl<<"La matriz introducida con la identidad acoplada es:"<<endl<<endl; for(int i=1;i<=n;i++){ for(int k=1;k<=2*n;k++){ cout<<A[i][k]<<" "; } cout<<endl; } cout<<endl<<endl; //Triangulo la matriz for(int i=1;i<=n;i++){ for(int k=i+1;k<=n;k++){ t=A[k][i]/A[i][i]; for(int j=1;j<=2*n;j++){ A[k][j]=A[k][j]-t*A[i][j]; } } } cout<<endl<<endl; //Muestro la matriz triangulada cout<<"La matriz triangulada es:"<<endl<<endl; for(int i=1;i<=n;i++){ for(int k=1;k<=2*n;k++){ cout<<A[i][k]<<" "; } cout<<endl; } cout<<endl<<endl; //Aplico Gauss-Jordan for(int i=1;i<=n;i++){ q--;w=q; for(int k=i+1;k<=n;k++){ w--; t=A[w][q]/A[q][q]; for(int j=1;j<=2*n;j++){ A[w][j]=A[w][j]-t*A[q][j]; } } } for(int i=1;i<=n;i++){ for(int j=1;j<=2*n;j++){ A[i][j]=A[i][j]/A[i][i]; } } //Muestro la matriz diagonalizada y la inversa: cout<<"La matriz diagonalizada y la inversa de A es:"<<endl<<endl; for(int i=1;i<=n;i++){ for(int k=1;k<=2*n;k++){ cout<<A[i][k]<<" "; } cout<<endl; } system("pause");return 0;}
Epa:
Buenas.
Los rangos de las variables para los bucles estan mal.
En c/c++ los elementos de los vectores van de 0 a N-1.
Por ejemplo:
# for(int i=1;i<=n;i++){
# for(int k=1;k<=n;k++){
# cout<<"Introduzca el elemento de la fila "<<i<<" y la columna "<<k<<endl;
# cin>>A[k];
# }
# }
tendria que quedar:
# for(int i=0;i<n;i++){
# for(int k=0;k<n;k++){
# cout<<"Introduzca el elemento de la fila "<<i+1<<" y la columna "<<k+1<<endl;
# cin>>A[k];
# }
# }
La verdad que ni mire el algoritmo :P
Corregi eso y si aparece otro problema avisa.
Saludos
Checho360:
Hola Epa; en primer lugar muchisimas gracias por contestar ya pensaba que nadie lo haría jeje. Voy a probar lo que dices. Ya sabia que las matrices se generan contando desde 0 pero simplemente me parecio mas comodo hacerlo asi, y ademas pensaba que eso no generaria errores, es decir pense: que mas da recorrer la matriz de 0 a n-1 que de 1 a n. De todas formas voy a cambiarlo todo a ver si cambia la cosa. Ahh y lo del algoritmo, creo que esta bien porque lo pense yo y lo programe primero en matlab y ahí funciona de maravilla. Lo unico que a este aun no le añadi cosas como que no tome como pivote un 0 o cosas asi (primero que funcione con esto y luego ya le añado cosas).
Un saludo y muchas gracias por contestar
Epa:
Ahi revise el algoritmo.
Ademas de los de los bucles, tendrias que modificar el q=n +1; del principio, cambiarlo por q=n;
Fijate que los valores iniciales de las variables en los bucles anidados, quedan como estaban. Por ejemplo:
for(int i=0;i<n;i++){
for(int k=i+1;k<n;k++){
k=i+1 queda asi, y no k=i
Aunque encontre un pequeño error en el algoritmo, no se si ya te habras dado cuenta.
En la parte
--- Código: C++ --- for(int i=0;i<n;i++){ for(int j=0;j<2*n;j++){ A[i][j]=A[i][j]/A[i][i]; } }
Despues da Gauss-Jordan
Fijate que estas dividiendo primero la matriz original, por lo que vas poniendo 1's en la diagonal, y despues dividis las filas de la otra matriz por 1, o sea que queda igual.
Podrias ahcer algo como:
--- Código: C++ --- for(int i=0;i<n;i++){ for(int j=n;j<2*n;j++){ A[i][j]=A[i][j]/A[i][i]; } A[i][i] = 1; }
Me alegra haber sido de ayuda :good:
Saludos
Checho360:
Bueno pues ya he probao a cambiar eso y sigue igual. Ahora ademas tengo dos cosas que pasan que no entiendo. Adjunto una imagen para explicarlo: para empezar la primera columna de la matriz A la cambia por la columna 1 de la matriz identidad y despues todo mal claro... no encuentro el error a ver si alguien me puede decir; gracias de antemano!!
img121.imageshack.us/i/sinttuloi.gif/
El nuevo codigo es:
--- Código: C++ ---#include <iostream>using namespace std;int main ()/*Este programa pide al usuario una matriz de orden n la diagonaliza por el metodo de Gauss-Jordan sin pivote y calcula su inversa*/{ //Genero las variables, la matriz, la pido al usuario y la muestro por pantalla int n;double long t;int w; cout<<"Introduzca el orden de la matriz:"<<endl; cin>>n;int q=n; double A[n-1][(2*n)-1];double B[n-1][n-1]; for(int i=0;i<n;i++){ for(int k=0;k<n;k++){ cout<<"Introduzca el elemento de la fila "<<i<<" y la columna "<<k<<endl; cin>>A[i][k]; } } cout<<endl<<endl; for(int i=0;i<n;i++){ for(int k=0;k<n;k++){ cout<<A[i][k]<<" "; if(k==n-1){cout<<endl;} } } //Genero la matriz identidad for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(j==i){B[i][j]=1.0;} else{B[i][j]=0.0;} } } //Acoplo la matriz identidad para trabajar con ella for(int j=0;j<n;j++){ int a=0; for(int i=n;i<2*n;i++){ A[j][i]=B[j][a]; a++; } } //Muestro la matriz con la que voy a trabajar cout<<endl<<endl<<"La matriz introducida con la identidad acoplada es:"<<endl<<endl; for(int i=0;i<n;i++){ for(int k=0;k<2*n;k++){ cout<<A[i][k]<<" "; } cout<<endl; } cout<<endl<<endl; //Triangulo la matriz for(int i=0;i<n;i++){ for(int k=i+1;k<n;k++){ t=A[k][i]/A[i][i]; for(int j=0;j<2*n;j++){ A[k][j]=A[k][j]-t*A[i][j]; } } } cout<<endl<<endl; //Muestro la matriz triangulada cout<<"La matriz triangulada es:"<<endl<<endl; for(int i=0;i<n;i++){ for(int k=0;k<2*n;k++){ cout<<A[i][k]<<" "; } cout<<endl; } cout<<endl<<endl; //Aplico Gauss-Jordan for(int i=0;i<n;i++){ q--;w=q; for(int k=i+1;k<n;k++){ w--; t=A[w][q]/A[q][q]; for(int j=0;j<=2*n-1;j++){ A[w][j]=A[w][j]-t*A[q][j]; } } } for(int i=0;i<n;i++){ for(int j=1;j<2*n;j++){ A[i][j]=A[i][j]/A[i][i]; } A[i][i]=1; } //Muestro la matriz diagonalizada y la inversa: cout<<"La matriz diagonalizada y la inversa de A es:"<<endl<<endl; for(int i=0;i<n;i++){ for(int k=1;k<2*n;k++){ cout<<A[i][k]<<" "; } cout<<endl; } system("pause");return 0;}
Por cierto epa tienes toda la razon en el fallo del algoritmo en la parte de dividir por la diagonal. No lo había visto asi que un error menos jejeje.
Muchisimas gracias epa da gusto que haya gente asi ;)
EDITO: epa he modificao el primer programa que puse con este ultimo fallo que has comentao y funciona perfectamente, sin embargo cambiando los bucles por 0:n-1 no funciona (no veo el error), por esos fallos de la imagen. Aver si lo ves tu. Un saludo
Navegación
[#] Página Siguiente
Ir a la versión completa