Ver Mensaje Individual
  #7 (permalink)  
Antiguo 28/03/2011, 14:09
Checho360
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 9 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. }