Programação com matriz

3 respostas
programação
C

Boa tarde Pessoal!

Estou com um problema em uma questão e não consigo encontrar o erro.

a questão pede: “Faça uma função que calcula a inversa de uma matriz de ordem n utilizando a matriz adjunta”.

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

#define MAXLIN 10
#define MAXCOL 10
#define LEN 20

//PROTÓTIPOS

void printMat(char texto[LEN], double mat[MAXLIN][MAXCOL], int n);

int trocaPivo2(double a[MAXLIN][MAXCOL], double inv[MAXLIN][MAXCOL],int n, int indxVelho);

void inversa(double a[MAXLIN][MAXCOL], double inv[MAXLIN][MAXCOL],int n);

void identidade(double ident[MAXLIN][MAXCOL], int n);

void matTransposta(int tam_i, int tam_j, int transposta[tam_j][tam_i]);
int main()

{

double A[MAXLIN][MAXCOL],inv[MAXLIN][MAXCOL];

char texto[LEN];

int i, j, n, m, aux, tamanh, tam_i, tam_j;
printf("Informe a ordem da matriz quadrada:");//esse será o valor do número de linhas e colunas
    scanf("%d",&n);


    printf("\n");

    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("Digite os valores da matriz:");// os valores a serem digitados vão fazer parte da matriz quadrada de ordem n
            scanf("%2lf",&A[i][j]);
        }
    }
    printf("\n");
    printMat("Matriz original:",A,n);//vai mostrar na tela a matriz A com os números que foram digitados
    inversa(A,inv,n);
    printMat("Matriz inversa:",inv,n);//vai mostrar na tela a inversa da matriz A

return 0;
}

//DEFINIÇÃO DAS FUNÇÕES

void inversa(double a[MAXLIN][MAXCOL], double inv[MAXLIN][MAXCOL],int n)//função que muda a matriz normal pela inversa dela

{

int i, j, k, num_trocas=0, aux;

double m;
identidade(inv,n);

//escalonando de cima para baixo
for(i=0;i<n;i++) //diagonal
{
    aux = trocaPivo2(a,inv,n,i);
    if(a[i][i]!=0||aux!=0)//se o pivo for zero
    {
        num_trocas+=aux;

        for(j=i+1;j<n;j++) //linhas zeradas
        {
            m=-a[j][i]/a[i][i];
            for(k=0;k<n;k++)//colunas das linhas zeradas
            {
                a[j][k]=a[j][k]+m*a[i][k];
                inv[j][k]=inv[j][k]+m*inv[i][k];
            }
        }
    }
}
//escalonando de baixo para cima
for(i=n-1;i>0;i--)//diagonal - pivo
{
    for(j=i-1;j>=0;j--)//andando nas linhas dos elementos a serem zeradas
    {
        m = -a[j][i]/a[i][i];
        for(k=0;k<n;k++)//andando na coluna dos elementos a serem zeradas
        {
            a[j][k] = a[j][k]+m*a[i][k];
            inv[j][k] = inv[j][k]+m*inv[i][k];
        }

    }
}

for(i=0;i<n;i++)//caso a diagonal não estiver com o número 1, precisa dividir os números por eles mesmos
{
    m = 1/a[i][i];
    a[i][i] = m*a[i][i];
    for(j=0;j<n;j++)
        inv[i][j] = m*inv[i][j];
}

}

int trocaPivo2(double a[MAXLIN][MAXCOL], double inv[MAXLIN][MAXCOL],int n, int indxVelho)//trocando caso tenha comecado com o numero 0

{

int indxNovo = indxVelho, i, j, cont=0;

double aux;//auxiliar é usado para trocar os elementos de uma linha com a outra
if(a[indxVelho][indxVelho]==0)// se o Pivo é 0, procura um elemento que não seja e nomeia como novo Pivo
{
    for(i=indxVelho+1;i<n;i++)
        if(a[i][indxVelho]!=0)
        {
            indxNovo = i;
            cont = 1;
            break;
        }

    if(indxNovo != indxVelho)// serve para ver  se foi encontrato um novo pivo que seja diferente de 0
    {
        for(j=indxVelho;j<n;j++)
        {
            aux = a[indxVelho][j];
            a[indxVelho][j] = a[indxNovo][j];
            a[indxNovo][j] = aux;

            aux = inv[indxVelho][j];
            inv[indxVelho][j] = inv[indxNovo][j];
            inv[indxNovo][j] = aux;

        }

    }
}
return cont;//vai retornar quantidade de trocas
}

void printMat(char texto[LEN], double mat[MAXLIN][MAXCOL], int n)//funcao que faz aparecer na tela a matriz

{

int i, j;
printf("%s\n",texto);// um texto para poder nomear a matriz
for (i = 0; i < tam_j; i++)

{

for (j = 0; j < tam_i; j++)

{

printf("%d\t", transposta[i][j]);

}

printf("\n\n");

}

printf("\n");
}

void identidade(double ident[MAXLIN][MAXCOL], int n)//criando uma matriz identidade

{

int i, j;
for(i=0;i<n;i++)//varre as linhas da matriz
       for(j=0;j<n;j++)//varre as colunas da matriz
    {
        if(i==j)
            ident[i][j]=1;//coloca o numero 1 na diagonal principal
        else
            ident[i][j]=0;//coloca o numero 0 nas outras posicoes

    }

//TRANSPOSTA
void matTransposta(int tam_i, int tam_j, int transposta[tam_j][tam_i]);

int tam_i;
int tam_j;
int tamanho;

if(tam_i > tam_j){

tamanho = tam_i;

}

else{

tamanho = tam_j;

}

int matriz[tamanho][tamanho];

for (i = 0; i < tamanho; i++);
{
for (j = i + 1; j < tamanho; j++);
{

    int tam_i;
    int tam_j;
    int aux;

    aux = matriz[i][j];
    matriz[i][j] = matriz[j][i];
    matriz[j][i] = aux;
}

}

for (i = 0; i < tam_j; i++);

{

for (j = 0; j < tam_i; j++);

{
int transposta [i][j];

    transposta[i][j] = matriz[i][j];
}

}

}

3 Respostas

K

Formata o codigo com image

E diz qual erro / problema esta dando

C

Não consigo fazer aparecer a inversa usando a transposta

I

Vamos às definições:

1 - Matriz Adjunta: dado uma matriz quadrada (número de linhas é igual ao número de colunas), é a transposta de sua matriz dos cofatores;

2 - Matriz Transposta: é matriz obtida pela transposição das linhas pelas colunas e das colunas pelas linhas. Logo:

image

3 - Cofator de uma matriz: é u valor numérico de um elemento de uma matriz obtido pela seguinte expressão:

image

Onde: image é o cofator, i e j são as linhas e as colunas respectivamente e D é a determinante.

3.1 - Matriz cofatora: é a matriz onde os elementos são os cofatores.

4 - Matriz Inversa: é a matriz image que multiplicada pela matriz A, resulta na matriz identidade.

5 - Matriz identidade: é matriz onde todos os elementos da diagonal principal são uns (1) e todos os outros elementos são zeros (0).
Então:

1º) Crie uma função que calcula a determinante para cofator. Para isso, deve-se calcular a determinante da matriz obtida retirando-se a linha e coluna que intercepta o elemento cuja determinante quer se obter;

Exemplo: Mundo Educação - Cofator de uma matriz

2º) Crie um método que calcula todos os cofatores da matriz a fim de obter a matriz cofatora;

3º ) Crie um método que cacula a matriz transposta da matriz cofatora, ou seja que calcule a matriz adjunta;

4º) Crie um método que calcule a matriz inversa da matriz dada usando a matriz adjunta.

Criado 7 de junho de 2020
Ultima resposta 8 de jun. de 2020
Respostas 3
Participantes 3