/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Matriz Inversa usando determinante (nxn)

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
hezelmet



Registrado: 12 Nov 2007
Mensajes: 5
Ubicación: Caguas, Puerto Rico

MensajePublicado: 15/11/2007 7:58 pm
Título: Matriz Inversa usando determinante (nxn)

Saludos!

Es la segunda vez que escribo en este foro... la primera vez me sirvio de muchisima ayuda, la cual les agradezco infinitamente!!

Esta vez necesito realizar un programa que me entregue la matriz inversa de una matriz n x n...

No me exigen ningun metodo en especifico... decidi hacerlo por utilizando determinantes ya que se me hace mas sencillo (creo) que el metodo de Gauss-Jordan...

En fin, logre hacer el programa para una matriz 3 x 3... Necesito que, aunque sea... me den ideas de como puedo lograr que el programa funcione para cualquier valor de n... 4x4, 5x5, 6x6... nxn...

Aqui lo que tengo:

===============================================

#include<iostream.h>
#define n 3
#define filas 3
#define columnas 3


int main()

{ int a,b;
double B[n][n],A[filas][columnas],x;

for(a=0;a<=filas-1;a++)
{
for(b=0;b<=columnas-1;b++)

{

cout<<"A ["<<a<<"]["<<b<<"] = ";
cin>>A[a][b];

}
}

for(a=0;a<=filas-1;a++)

{
for(b=0;b<=columnas-1;b++)

{

x=(A[0][0]*((A[1][1]*A[2][2])-(A[2][1]*A[1][2])))-(A[0][1]*((A[1][0]*A[2][2])-(A[2][0]*A[1][2])))+(A[0][2]*((A[1][0]*A[2][1])-(A[2][0]*A[1][1])));
}}

cout<<"Determinate = "<<x<<endl; //x es el determinante

if (x!=0)
{

for(a=0;a<=filas-1;a++)
{
for(b=0;b<=columnas-1;b++)
{

B[0][0]=((A[1][1]*A[2][2])-(A[2][1]*A[1][2]))*(1/x);

B[0][1]=(-((A[0][1]*A[2][2])-(A[2][1]*A[0][2])))*(1/x);

B[0][2]=((A[0][1]*A[1][2])-(A[0][2]*A[1][1]))*(1/x);

B[1][0]=(-((A[1][0]*A[2][2]-A[2][0]*A[1][2])))*(1/x);

B[1][1]=((A[0][0]*A[2][2])-(A[2][0]*A[0][2]))*(1/x);

B[1][2]=(-((A[0][0]*A[1][2]-A[1][0]*A[0][2])))*(1/x);

B[2][0]=((A[1][0]*A[2][1])-(A[1][1]*A[2][0]))*(1/x);

B[2][1]=(-((A[0][0]*A[2][1]-A[2][0]*A[0][1])))*(1/x);

B[2][2]=((A[0][0]*A[1][1])-(A[1][0]*A[0][1]))*(1/x); cout<<"A^-1 ["<<a<<"]["<<b<<"] = "<<B[a][b]<<endl;
}
}
}
else
{
cout<<"Matriz no tiene inversa"<<endl;
}
return 0;
}

===============================================

Cualquier ayuda sera agradecida!!
Volver arriba
hezelmet



Registrado: 12 Nov 2007
Mensajes: 5
Ubicación: Caguas, Puerto Rico

MensajePublicado: 16/11/2007 8:18 am
Título:

Investigue y me acabo de dar cuenta que para matrices mayores a 3x3 hacerlo por Determinante es casi imposible :/


Habra algun otro metodo para relaizar este ejercicio?
Volver arriba
digies



Registrado: 18 Nov 2005
Mensajes: 314
Ubicación: Cono Sur

MensajePublicado: 16/11/2007 12:44 pm
Título:

En C estándar y con el método de Gauss-Jordan lo podrías hacer así:

Código:

#include <stdio.h>
#include <stdlib.h>

float pivote, a[50][50], b[50][50];
int i, j, n, k, l;
char opcion;

void lee_matriz(void);
void fila_pivote(void);
void col_pivote(void);
void otros(void);
void imprimir(void);

int main(void)
{
    lee_matriz();
    for(i=0; i<n; i++)
    {
        j=i;
        pivote=a[i][j];
        b[i][j]=1/pivote;
        fila_pivote();
        col_pivote();
        otros();
        for(k=0; k<n; k++)
            for(l=0; l<n; l++)
                a[k][l]=b[k][l];
    }
    imprimir();
    puts("\n");
    system("PAUSE");
    return EXIT_SUCCESS;
}

void lee_matriz(void)
{
    printf("INVERSA DE UNA MATRIZ nxn\n\nn: ");
    scanf("%d",&n);
    putchar('\n');
    for(i=0; i<n; i++)
        for(j=0; j<n; j++)
        {
            printf("Elemento A[%d][%d]: ", i+1, j+1);
            scanf("%f", &a[i][j]);
        }
}

void fila_pivote(void)
{
    int m;
    for(m=0; m<n; m++)
        if(m != i)
            b[i][m]=a[i][m]/pivote;
}

void col_pivote()
{
    int m;
    for(m=0; m<n; m++)
        if(m != j)
            b[m][j]=-a[m][j]/pivote;
}

void otros(void)
{
    int x,y;
    for(x=0 ;x<n; x++)
        for(y=0; y<n; y++)
            if(x!=i && y!=j)
                b[x][y]=a[x][y]-(a[i][y]*a[x][j])/pivote;
}

void imprimir(void)
{
    puts("\nMatriz inversa:\n");
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
            printf("%4.2f ", a[i][j]);
        printf("\n");
    }
}

Ahora solo debes pasarlo a C++.

Un saludo
Volver arriba
hezelmet



Registrado: 12 Nov 2007
Mensajes: 5
Ubicación: Caguas, Puerto Rico

MensajePublicado: 18/11/2007 7:51 pm
Título:

Muchisimas gracias digies!
Ya lo converti a C++ Smile

Ahora solo tengo que averiguar como determinar si es o no inversible la matriz para que el programa asi me lo indique...

Saludos y gracias nuevamente!
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com