Algoritmia - AYUDA POR FAVOR!!! (matriz inversa)

 
Vista:

AYUDA POR FAVOR!!! (matriz inversa)

Publicado por Lilian (1 intervención) el 30/05/2007 16:53:37
hola, necesito URGENTE un programa que defina la funcion de la matriz inversa, debe ser po metodo de gaus-jordan, no puede ser por determinantes.
El enunciado que debemos seguir (osea, la deficion de la matriz) es la que esta abajo, despues de eso, hay q ingresar la funcion de la matriz inversa.
Por favor!!! lo necesito URGENTE para hoy miercoles 30 de mayo del 2007 a mas tardar a las 23.00 hrs (horario santiago, chile)


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

/* La funcion crea_matriz pide espacio en la memoria (a traves de
malloc) para almacenar una matriz de f filas por c columnas.
El retorno de la funcion crea_matriz es un puntero al espacio de
memoria pedido.
*/
float** crea_matriz(int f, int c);

/* La funcion destruye_matriz devuelve el espacio utilizado por una
matriz de f filas, pedido mediante la funcion crea_matriz,
utilizando free.
*/
void destruye_matriz(float** m, int f);

/* La funcion lee_matriz_desde_teclado obtiene desde el teclado los
datos para la matriz m de f filas y c columnas.
*/
void lee_matriz(float** m, int f, int c);

/* La funcion imprime matriz muestra en pantalla una matriz de f filas
y c columnas.
*/
void imprime_matriz(float** m, int f, int c);

/* La funcion matriz_inversa obtiene la inversa de la matriz m,
cuadrada de orden d, sin modificar la matriz m.
La funcion matriz_invertida retorna un puntero al espacio de
memoria que apunta a la matriz inversa de m. Si m no es invertible,
la funcion matriz_invertida retorna NULL.
*/
float** matriz_inversa(float** m, int d);


int main()
{
float** Mo; /* puntero para guardar la matriz original */
float** Mi; /* puntero para guardar la matriz inversa */
int D; /* orden de la matriz original (y de paso, de la inversa) */


printf("ingrese orden de la matriz: ");
scanf("%d", &D);

Mo = crea_matriz(D, D); /* creacion de la matriz */
lee_matriz(Mo, D, D); /* lectura de la matriz */

Mi = matriz_inversa(Mo, D); /* obtencion de la matriz inversa */

if( Mi == NULL ) /* esto significa que Mo no era invertible */
{
printf("la matriz dada no es invertible:\n");
imprime_matriz(Mo, D, D);
}
else /* la matriz Mo si era invertible */
{
printf("matriz original:\n");
imprime_matriz(Mo, D, D);
printf("matriz inversa:\n");
imprime_matriz(Mi, D, D);
}

destruye_matriz(Mo, D);

if( Mi != NULL )
{
destruye_matriz(Mi, D);
}

return 1;
}


float** crea_matriz(int f, int c)
{
int i;
float** r;

r = (float**)malloc(f*sizeof(float*));

for(i = 0; i < f; ++i)
r[i] = (float*)malloc(c*sizeof(float));

return r;
}

void destruye_matriz(float** m, int f)
{
int i;
if( m != NULL )
{
for(i = 0; i < f; ++i)
free( m[i] );

free( m );
}
}

void lee_matriz(float** m, int f, int c)
{
int i, j;

for(i = 0; i < f; ++i)
{
for(j = 0; j < c; ++j)
{
printf("m[%d][%d]? ", i, j);
scanf("%f", &m[i][j]);
}
}
}

void imprime_matriz(float** m, int f, int c)
{
int i, j;

printf(" ");
for(j = 0; j < c; ++j)
{
printf(" | %8d", j);
}
printf("\n");

printf("---");
for(j = 0; j < c; ++j)
{
printf("-+---------");
}
printf("\n");

for(i = 0; i < f; ++i)
{
printf("%3d", i);

for(j = 0; j < c; ++j)
{
printf(" | %8.3f", m[i][j]);
}
printf("\n");
}
}

float** matriz_inversa(float** m, int d)
{
return NULL;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Matriz inversa por método de Gauss-Jordan

Publicado por Alejandro (307 intervenciones) el 11/03/2024 19:48:23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <stdio.h>
#include <stdlib.h>
 
/* ... (resto de las funciones se mantienen igual) ... */
 
/* Función auxiliar para intercambiar filas en una matriz */
void intercambiar_filas(float** m, int fila1, int fila2, int columnas) {
    for (int j = 0; j < columnas; ++j) {
        float temp = m[fila1][j];
        m[fila1][j] = m[fila2][j];
        m[fila2][j] = temp;
    }
}
 
/* Función auxiliar para multiplicar una fila por un escalar */
void multiplicar_fila(float** m, int fila, int columnas, float escalar) {
    for (int j = 0; j < columnas; ++j) {
        m[fila][j] *= escalar;
    }
}
 
/* Función auxiliar para restar una fila multiplicada por un escalar a otra fila */
void restar_filas(float** m, int fila1, int fila2, int columnas, float escalar) {
    for (int j = 0; j < columnas; ++j) {
        m[fila1][j] -= escalar * m[fila2][j];
    }
}
 
/* Función para obtener la matriz inversa por el método de Gauss-Jordan */
float** matriz_inversa(float** m, int d) {
    /* Crear una matriz auxiliar que contenga la matriz original y su identidad */
    float** aumentada = crea_matriz(d, 2 * d);
 
    for (int i = 0; i < d; ++i) {
        for (int j = 0; j < d; ++j) {
            aumentada[i][j] = m[i][j];
            aumentada[i][j + d] = (i == j) ? 1.0 : 0.0;  // Identidad
        }
    }
 
    /* Aplicar eliminación hacia adelante */
    for (int i = 0; i < d; ++i) {
        /* Pivoteo parcial para evitar divisiones por cero */
        int fila_pivote = i;
        for (int k = i + 1; k < d; ++k) {
            if (aumentada[k][i] > aumentada[fila_pivote][i]) {
                fila_pivote = k;
            }
        }
 
        if (aumentada[fila_pivote][i] == 0.0) {
            /* La matriz no es invertible */
            destruye_matriz(aumentada, d);
            return NULL;
        }
 
        intercambiar_filas(aumentada, i, fila_pivote, 2 * d);
        float pivote = aumentada[i][i];
        multiplicar_fila(aumentada, i, 2 * d, 1.0 / pivote);
 
        for (int k = 0; k < d; ++k) {
            if (k != i) {
                float factor = aumentada[k][i];
                restar_filas(aumentada, k, i, 2 * d, factor);
            }
        }
    }
 
    /* Extraer la matriz inversa de la parte derecha de la matriz aumentada */
    float** inversa = crea_matriz(d, d);
    for (int i = 0; i < d; ++i) {
        for (int j = 0; j < d; ++j) {
            inversa[i][j] = aumentada[i][j + d];
        }
    }
 
    destruye_matriz(aumentada, d);
    return inversa;
}
 
/* ... (resto del código se mantiene igual) ... */

Lilian, este código implementa el método de Gauss-Jordan para obtener la matriz inversa. Recuerda que este método puede no ser adecuado para todas las matrices, ya que la matriz original debe ser invertible.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar