Programación General > C/C++

 Problema inversa

<< < (2/2)

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

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa