espero que te sirva leelo !/*
Calculo de la Iversa de una Matriz - Algoritmo de Gauss
*/
#include <iostream.h>
class matriz {
/*
Definicion del objeto matriz. Usare tabla para guardar los datos orginales
y sobre tabla2 se realizaran las operaciones.
*/
double **tabla,**tabla2;
int dim;
public:
enum tipo_tabla{coef,ampliada,inversa};
matriz(int);
~matriz();
void llenar();
void imprimir(int);
bool invertir(int,bool);
};
matriz::matriz(int n) {
int i;
dim=n;
tabla=new double *[dim];
for (i=0;i<dim;i++) *(tabla+i)=new double[dim*2];
}
matriz::~matriz() {
int i;
for (i=0;i<dim;i++) delete [] *(tabla+i);
delete [] tabla;
for (i=0;i<dim;i++) delete [] *(tabla2+i);
delete [] tabla2;
}
void matriz::llenar() {
int i,j;
double num;
for (i=0;i<dim;i++) {
for (j=0;j<dim;j++) {
cout<<"Ingresa coeficiente a["<<i+1<<","<<j+1<<"]: ";
cin>>num;
*(*(tabla+i)+j)=num;
}
for (j=dim;j<dim*2;j++) *(*(tabla+i)+j)=(i==(j-dim))?(double)1:(double)0;
}
tabla2=new double *[dim];
for (i=0;i<dim;i++) *(tabla2+i)=new double[dim*2];
for (i=0;i<dim;i++)
for (j=0;j<dim*2;j++) *(*(tabla2+i)+j)=*(*(tabla+i)+j);
}
void matriz::imprimir(int t_tabla) {
int i,j;
if (t_tabla==coef) {
for (i=0;i<dim;i++,cout<<endl)
for (j=0;j<dim;j++) cout<<*(*(tabla+i)+j)<<"t";
}
else if (t_tabla==ampliada) {
for (i=0;i<dim;i++,cout<<endl)
for (j=0;j<dim*2;j++) cout<<*(*(tabla+i)+j)<<"t";
}
else {
for (i=0;i<dim;i++,cout<<endl)
for (j=dim;j<dim*2;j++) cout<<*(*(tabla2+i)+j)<<"t";
}
}
bool matriz::invertir(int pivote=0,bool ida=true) {
/*
Invierte la matriz en tabla2. Retorna true si el proceso se realizo con exito, o sea
si la matriz en tabla es invertible o de lo contrario false.
Pivote es el elemento de la diagonal bajo, o sobre, el cual se anularan los coeficientes.
ida indica que paso se ejecuta, la formacion de:
i) triangular superior
ii) triangular inferior y simplificacion
Vea las hojas de respuesta para ver una explicacion detallada de los pasos y el algoritmo
*/
int i,j;
double k;
if (!*(*(tabla2+pivote)+pivote)) return false; // Matriz no invertible
else if (ida) {
// Fomacion trinagular superior
if (pivote==dim-1) return invertir(pivote,false); //Se llega al elemento a[n,n] y se llama a si misma pero con false, o sea pasa al paso ii
else {
for (i=pivote;i<dim-1;i++) {
k=*(*(tabla2+i+1)+pivote)/ *(*(tabla2+pivote)+pivote); // Calculo de k
for (j=0;j<dim*2;j++)
*(*(tabla2+i+1)+j)=*(*(tabla2+i+1)+j)-*(*(tabla2+pivote)+j)*k; // Operacion fila
}
return invertir(++pivote);
}
}
else {
// Fomacion trinagular inferior
if (pivote==0) { //Se llega al elemento a[1,1]
k=1/ *(*(tabla2+pivote)+pivote);
for (j=0;j<dim*2;j++)
*(*(tabla2+pivote)+j)*=k; //Se simplifica el elemento la fila por el elemento de la diagonal (paso iii)
return true;
}
else {
for (i=pivote;i>0;i--) {
k=*(*(tabla2+i-1)+pivote)/ *(*(tabla2+pivote)+pivote); // Calculo de k
for (j=0;j<dim*2;j++)
*(*(tabla2+i-1)+j)=*(*(tabla2+i-1)+j)-*(*(tabla2+pivote)+j)*k; // Operacion fila
k=1/ *(*(tabla2+pivote)+pivote);
for (j=0;j<dim*2;j++)
*(*(tabla2+pivote)+j)*=k; //Se simplifica el elemento la fila por el elemento de la diagonal (paso iii)
}
return invertir(--pivote,false);
}
}
}
int main() {
int dim;
matriz *tabla;
cout<<"Calculo de la Iversa de una Matriz - Algoritmo de Gauss"<<endl<<endl;
cout<<"Fase de Tarea Certamen 2 - Fundamentos de Informatica I"<<endl<<endl;
cout<<"Jorge Riquelme S. 2173090-4"<<endl;
cout<<"http://www.totex.cl -
totex@totex.cl"<<endl<<endl<<endl;
cout<<"Dimension de la matriz? ";
cin>>dim;
tabla=new matriz(dim);
tabla->llenar();
cout<<endl<<"Matriz de coeficientes ingresados:"<<endl;
tabla->imprimir(matriz::coef);
cout<<endl<<"Matriz ampliada"<<endl;
tabla->imprimir(matriz::ampliada);
if (tabla->invertir()) {
// Si la matriz se pudo invertir la muestra
cout<<endl<<"Matriz Inversa"<<endl;
tabla->imprimir(matriz::inversa);
}
else cout<<endl<<"La matriz no tiene inversa!"<<endl;
return 0;
}