sexta-feira, 25 de janeiro de 2013

Achar matriz inversa em C

Este é um código em C para multiplicar matrizes, achando a matriz inversa. Você pode notar que eu comentei todo o código, então fica mais fácil de entender, e posso garantir que funciona.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
    int i, j, l = 0, c = 0, k = 0;

    printf("\n Digite o numero de variaveis: \n");//Define o tamanho da matriz A
    scanf("%i",&l);

    c = l;//coluna recebe o valor da linha ex: 3x3

    float A[l][c], ident[l][c], pivo = 0, p = 0, m = 0;

    //Definindo a Matriz Identidade
    for(i = 0; i < l; i++)
    {
        for(j = 0; j < c; j++)
        {
            if(i == j)
            {
                ident[i][j] = 1;
            }
            else
            {
                ident[i][j] = 0;
            }
        }
    }
   
    //Inserindo valores na matriz A
    printf("\n Digite os valores para os coficientes da Matriz A: \n");
    for (i = 0; i < l; i++)
    {
        for (j = 0; j < c; j++){
            printf("\n Digite o valor do termo a(%i,%i):",i+1,j+1);
            scanf("%f",&A[i][j]);
        }
    }
    printf("\n Matriz A: \n");
   
    //Mostrando a Matriz
    for(i = 0; i < l; i++)
    {
        for (j = 0; j < c; j++)
        {
            printf ("%.2f",A[i][j]);
            if(j < c - 1) printf("\t");
            else printf("\n");
        }
    }
   
    //Calculando a Matriz Inversa
    for(j = 0; j < c; j++)
    {
        pivo = A[j][j];
        p = pivo/pivo;
        for(k = j; k < c; k++)
        {
            A[j][k] = (A[j][k])/(pivo);
            ident[j][k] = (ident[j][k])/(pivo);
        }
       
        for(i = 0; i < l; i++)
        {
             if(i != j)
             {
                  m = A[i][j]/p;
                 
                  for(k = 0; k < c; k++)
                  {
                      A[i][k] = (A[i][k]) - (m * A[j][k]);
                      ident[i][k] = (ident[i][k]) - (m * ident[j][k]);
                  }
              }
        }
    }

    //Resultado das Matrizes Identidade e Inversa
     printf("\n Matriz Identidade A: \n");
    for(i = 0; i < l; i++)
    {
        for (j = 0; j < c; j++)
        {
            printf ("%.2f",A[i][j]);
            if(j < c - 1) printf("\t");
            else printf("\n");
        }
    }
    printf("\n Matriz Inversa: \n");
    for(i = 0; i < l; i++)
    {
        for (j = 0; j < c; j++)
        {
            printf ("%.2f",ident[i][j]);
            if(j < c - 1) printf("\t");
            else printf("\n");
        }
    }
    getch();
}

4 comentários:

  1. Na linha 53 (onde voce calcula a matriz inversa), nao daria problema caso A[j][j] fosse "0"?

    ResponderExcluir
    Respostas
    1. Bem respondendo a todos os comentários de uma só vez.
      Consultei meus antigos professores, uma vez que a dúvida me ficou na cabeça, e chegamos a conclusão que para no computador não daria errado, mas ficaria uma indeterminação muito grande e a nível de conhecimento agente resolveu mudar a linha e colocar desta forma:
      onde está pivo e p, pode ser substituído por 1, com isso não há nem a necessidade dos dois aparecerem, até por que um número dividido por 1 sempre vai dar o próprio número.

      " ...

      pivo = 1; // ou nem declara ele
      p = pivo/pivo; // daria 1 então nem precisa aparecer
      for(k = j; k < c; k++)
      {
      A[j][k] = (A[j][k])/(pivo); // dividido por 1 o pivo nem precisa aparecer
      ident[j][k] = (ident[j][k])/(pivo); // dividido por 1 o pivo nem precisa aparecer
      }

      for(i = 0; i < l; i++) { if(i != j)
      {
      m = A[i][j]/p; // dividido por 1 o p nem precisa aparecer
      ....
      "

      Espero que entendam, esse código foi criado para fins didáticos, pode ser que apareça alguma inconsistência como a que foi mostrada acima, e obrigada por me mostrar, onde sempre podemos consertar.

      Ah e como meu professor sempre falava, "copiar código é como dar um tiro no pé", pois cada um tem seu estilo de programar.
      Nós alimentamos esse blog com códigos para fins didáticos, por que sei como é difícil pensar nisso com a pressão do curso, mas sempre modifiquem, estudem o código como nosso amigo Gustavo fez.

      Att.

      Excluir
  2. eu dei crtl+c crtl+v aqui, mas a matriz obtida não corresponde com a inversa da matriz que eu digitei

    ResponderExcluir
  3. eu substituiria os seguintes comandos
    if(i == j)
    {
    ident[i][j] = 1;
    }
    else
    {
    ident[i][j] = 0;
    }
    por ident[i][j] = (i==j);

    ResponderExcluir