Programación General > C/C++
Problema inversa
Epa:
En la linea 75 se te escapo un = del <= en el for.
Creo que no me explique muy bien en la otra respuesta :P
Si tenes una matriz, por ejemplo mat[N][M]
los elementos de esa matriz van desde mat[0][0] a mat[N-1][M-1]
O sea, N y M representa la cantidad de elementos e cada dimension.
Pero despues para acceder a cada elemento, se empieza desde 0.
Si tenes por ejemplo:
int A[5];
los elementos de ese vector son, A[0], A[1], A[2], A[3] y A[4]
Te dejo tu codigo con esas cositas corregidas.
Fijate que le saque la matriz B, y directamente le agrego la identidad a A.
--- Código: C++ --- #include <iostream>using namespace std;int main ()/*Este programa pide al usuario una matriz de orden n la diagonaliza por elmetodo de Gauss-Jordan sin pivote*/{ //Genero las variables, la matriz, la pido al usuario y la muestro por pantalla int n, w, q; long double t; cout<<"Introduzca el orden de la matriz:"<<endl; cin>>n; q=n; double A[n][2*n]; 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){cout<<endl;} } } //Acoplo la matriz identidad para trabajar con ella for(int j = 0; j < n; j++){ for(int i = n; i < 2*n; i++) { if(j == (i-n)) A[j][i] = 1; else A[j][i] = 0; } } //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;j++){ A[w][j]=A[w][j]-t*A[q][j]; } } } 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; } //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=0;k<2*n;k++){ cout<<A[i][k]<<" "; } cout<<endl; } return 0;}
Saludos
Checho360:
En la linea 29 creo que esta mal; deberia ser:
--- Código: C++ ---if(k==n-1){cout<<endl;}
La explicacion que das de A[5] es perfecta, ahora entiendo bien eso. Hasta ahora pensaba que era como matlab .
Bueno haciendo esos ajustes ya me funciona perfectamente, ahora le queda hacer algunos ajustes de pivoteo y esas cosas a ver que tal, si eso ya comento otra vez con el error para que me ayudes jaja.
Bueno pues lo dicho muchas gracias, y por cierto epa, que estudias??
Epa:
jaja, que bueno que hayas entendido con esa "pseudo" explicacion jaja :good:
Estudio Ingenieria en Sistemas de Informacion. O por lo menos eso intento :P jajaja
Saludos
Checho360:
Por cierto, en su momento se me olvido... pero por si a alguien le interesa quedo:
--- 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][(2*n)];double B[n][n]; 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[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 int u=2; for(int i=0;i<n;i++){ for(int k=i+1;k<n;k++){ //Activo este bucle para evitar que el programa divida por 0 (el pivote sea 0) if(A[i][i]==0){ double sum =0.0; for(int x=i+1;x<n;x++){ if(A[x][i]!=0){sum=1;break;} sum=sum+A[x][i]; } if(sum==0){u=1;break;} } if(u==1){break;} int a=i+1; //Permutamos las filas mientras el pivote sea 0 while(A[i][i]==0){ for(int s=0;s<2*n;s++){ int p = A[i][s];A[i][s]=A[a][s];A[a][s]=p; } a++; } t=A[k][i]/A[i][i]; for(int j=0;j<2*n;j++){ if(u==1){break;} 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;j++){ A[w][j]=A[w][j]-t*A[q][j]; } } } 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; } //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=0;k<2*n;k++){ cout<<A[i][k]<<" "; } cout<<endl; } system("pause");return 0;}
Navegación
[*] Página Anterior
Ir a la versión completa