Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con inversa

Estas en el tema de Problema con inversa en el foro de C/C++ en Foros del Web. Hola!! estoy tratando de crear un programa en c++ que calcule la inversa de una matriz introducida por el usuario. No se donde tengo el ...
  #1 (permalink)  
Antiguo 22/03/2011, 14:31
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 8 meses
Puntos: 3
Problema con inversa

Hola!! estoy tratando de crear un programa en c++ que calcule la inversa de una matriz introducida por el usuario. No se donde tengo el error y lo tengo programao en matlab y funciona perfectamente no se por que aqui no:

Cita:
#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;
}
  #2 (permalink)  
Antiguo 23/03/2011, 14:52
Avatar de sephirot47  
Fecha de Ingreso: marzo-2011
Ubicación: BCN
Mensajes: 54
Antigüedad: 13 años, 8 meses
Puntos: 9
Respuesta: Problema con inversa

Prueba a hacer un debug.
__________________
Todo lo que tiene un inicio tiene un final inevitable...

¡ No olvides darme karma si te fui útil ^^ !
  #3 (permalink)  
Antiguo 23/03/2011, 15:21
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Problema con inversa

Cita:
Iniciado por sephirot47 Ver Mensaje
Prueba a hacer un debug.
Ya encontre el error, es en las ultimas lineas hay que cambiar algo asi como:

Código:
}
for(int i=1;i<=n;i++){
for(int j=1;j<=2*n;j++){
A[i][j]=A[i][j]/A[i][i];
}
}
por:

Código:
}
for(int i=1;i<=n;i++){
for(int j=n+1;j<=2*n;j++){
A[i][j]=A[i][j]/A[i][i];
}
A[i][i]=1;
}
  #4 (permalink)  
Antiguo 24/03/2011, 03:48
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 5 meses
Puntos: 73
Respuesta: Problema con inversa

Recuerda que, en C / C++, los índices empiezan en cero, es decir, si en na dimensión de un array o matriz tienes n elementos, el índice va de cero a n-1.
  #5 (permalink)  
Antiguo 24/03/2011, 11:51
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Problema con inversa

Cita:
Iniciado por Fw190 Ver Mensaje
Recuerda que, en C / C++, los índices empiezan en cero, es decir, si en na dimensión de un array o matriz tienes n elementos, el índice va de cero a n-1.
Si, es un error pero de todas formas funciona. Supongo que valdra igual recorrer la matriz de 1:n que de 0:n-1
  #6 (permalink)  
Antiguo 28/03/2011, 08:48
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 5 meses
Puntos: 73
Respuesta: Problema con inversa

No es igual. Estás invadiendo zonas de memoria que no corresponden, por ejemplo la correspondiente a otras variables de tu programa (cuyo valor ya no será el que debe), o, incluso, áreas de memoria correspondientes a otros programas o procesos que estén presentes en tu sistema en un momento dado. Lo normal es que te encuentres desde un error de violación de segmento hasta el más absoluto de los cuelgues.
  #7 (permalink)  
Antiguo 28/03/2011, 14:09
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Problema con inversa

Cita:
Iniciado por Fw190 Ver Mensaje
No es igual. Estás invadiendo zonas de memoria que no corresponden, por ejemplo la correspondiente a otras variables de tu programa (cuyo valor ya no será el que debe), o, incluso, áreas de memoria correspondientes a otros programas o procesos que estén presentes en tu sistema en un momento dado. Lo normal es que te encuentres desde un error de violación de segmento hasta el más absoluto de los cuelgues.
Sisi está todo corregido, muchas gracias.

Por cierto me podrías recomendar algún libro bueno sobre c++?

Por si a alguien le interesa quedo esto:

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3. int main ()
  4. /*Este programa pide al usuario una matriz de orden n la diagonaliza por el
  5. metodo de Gauss-Jordan sin pivote y calcula su inversa*/
  6. {
  7.     //Genero las variables, la matriz, la pido al usuario y la muestro por pantalla
  8.     int n;double long t;int w;
  9.     cout<<"Introduzca el orden de la matriz:"<<endl;
  10.     cin>>n;int q=n;
  11.     double A[n][(2*n)];double B[n][n];
  12.     for(int i=0;i<n;i++){
  13.             for(int k=0;k<n;k++){
  14.                     cout<<"Introduzca el elemento de la fila "<<i+1<<" y la columna "<<k+1<<endl;
  15.                     cin>>A[i][k];
  16.             }
  17.     }
  18.     cout<<endl<<endl;
  19.     for(int i=0;i<n;i++){
  20.             for(int k=0;k<n;k++){
  21.                     cout<<A[i][k]<<" ";
  22.                     if(k==n-1){cout<<endl;}
  23.             }
  24.     }
  25.     //Genero la matriz identidad
  26.     for(int i=0;i<n;i++){
  27.             for(int j=0;j<n;j++){
  28.                     if(j==i){B[i][j]=1.0;}
  29.                     else{B[i][j]=0.0;}
  30.                     }
  31.             }
  32.     //Acoplo la matriz identidad para trabajar con ella
  33.     for(int j=0;j<n;j++){
  34.             int a=0;
  35.             for(int i=n;i<2*n;i++){
  36.                     A[j][i]=B[j][a];
  37.                     a++;
  38.                     }
  39.             }
  40.     //Muestro la matriz con la que voy a trabajar
  41.     cout<<endl<<endl<<"La matriz introducida con la identidad acoplada es:"<<endl<<endl;
  42.     for(int i=0;i<n;i++){
  43.             for(int k=0;k<2*n;k++){
  44.                     cout<<A[i][k]<<" ";
  45.             }
  46.             cout<<endl;
  47.             }
  48.     cout<<endl<<endl;
  49.     //Triangulo la matriz
  50.     int u=2;
  51.     for(int i=0;i<n;i++){
  52.             for(int k=i+1;k<n;k++){
  53.                     //Activo este bucle para evitar que el programa divida por 0 (el pivote sea 0)
  54.                     if(A[i][i]==0){
  55.                                        double sum =0.0;
  56.                                        for(int x=i+1;x<n;x++){
  57.                                                if(A[x][i]!=0){sum=1;break;}
  58.                                                sum=sum+A[x][i];
  59.                                                }
  60.                                        if(sum==0){u=1;break;}
  61.                                        }
  62.                     if(u==1){break;}
  63.                     int a=i+1;
  64.                     //Permutamos las filas mientras el pivote sea 0
  65.                     while(A[i][i]==0){
  66.                                      for(int s=0;s<2*n;s++){
  67.                                              int p = A[i][s];A[i][s]=A[a][s];A[a][s]=p;  
  68.                                      }
  69.                                      a++;
  70.                                      }
  71.                     t=A[k][i]/A[i][i];
  72.                     for(int j=0;j<2*n;j++){
  73.                             if(u==1){break;}
  74.                             A[k][j]=A[k][j]-t*A[i][j];
  75.                     }
  76.             }
  77.     }
  78.         cout<<endl<<endl;
  79.         //Muestro la matriz triangulada
  80.     cout<<"La matriz triangulada es:"<<endl<<endl;
  81.     for(int i=0;i<n;i++){
  82.             for(int k=0;k<2*n;k++){
  83.                     cout<<A[i][k]<<" ";
  84.             }
  85.             cout<<endl;
  86.             }
  87.            
  88.         cout<<endl<<endl;
  89.     //Aplico Gauss-Jordan
  90.     for(int i=0;i<n;i++){
  91.             q--;w=q;
  92.             for(int k=i+1;k<n;k++){
  93.                     w--;
  94.                     t=A[w][q]/A[q][q];
  95.                     for(int j=0;j<2*n;j++){
  96.                             A[w][j]=A[w][j]-t*A[q][j];
  97.                     }
  98.             }
  99.     }
  100.     for(int i=0;i<n;i++){
  101.             for(int j=n;j<2*n;j++){
  102.                     A[i][j]=A[i][j]/A[i][i];
  103.             }
  104.             A[i][i]=1;
  105.     }
  106.     //Muestro la matriz diagonalizada y la inversa:
  107.     cout<<"La matriz diagonalizada y la inversa de A es:"<<endl<<endl;
  108.     for(int i=0;i<n;i++){
  109.             for(int k=0;k<2*n;k++){
  110.                     cout<<A[i][k]<<" ";
  111.             }
  112.             cout<<endl;
  113.             }
  114.    
  115.         system("pause");return 0;
  116. }

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:53.