Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como calcular o Determinante das matrizes abaixo?

0 votos
23 visitas
perguntada Fev 22 em Matemática por Thiago Lappicy (6 pontos)  

A imagem será apresentada aqui.

Compartilhe

1 Resposta

0 votos
respondida Fev 22 por Thiago Lappicy (6 pontos)  

Uma maneira é criando um programa em R para calcular a determinante de qualquer matriz quadrada (podendo ser usada para as duas matrizes acima).

Abaixo segue uma proposta de código para resolver determinante utilizando o método de eliminação de gauss / método de escalonamento. Portanto, é feita uma matriz triangular superior e depois é multiplicado a diagonal principal.

Utilizando o código proposto, a primeira matriz tem Determinante igual a -29400000 e a segunda matriz tem Determinante igual a 394.

Primeiro é criado uma função que toma uma matriz como argumento. Depois é feito o processo de eliminação com 2 for loops. O primeiro variando uma variável i de 1 até o número de linhas da matriz menos 1 e o segundo for variando uma variável j de i + 1 até o número de linhas da matriz.

obs: entre esses dois loops é salvado a linha em que se está mexendo para que essa volte a seu valor original.

Em seguida, dentro do segundo for é analisado se o valor abaixo da diagonal principal é igual a zero, se for, pula-se para o próximo valor de j , caso não seja igual a zero, é feito o processo de eliminação.

O processo de eliminação consiste em multiplicar a primeira linha por um fator multiplicativo para que o valor do primeiro elemento da diagonal principal seja igual ao número embaixo dela. Com isso, essas linhas podem ser subtraídas uma pela outra (tornando a matriz mais próxima a uma triangular superior). Depois é restaurada a linha i a seu valor original (sem o fator multiplicativo).

Quando isso for feito para todos os valores de i, a determinante é calculada fazendo o produtório da diagonal principal.

O código, comentado, segue abaixo:

Determinante <- function(matriz) {

# Processo de eliminação
for(i in 1:(nrow(matriz) - 1)) {

  # Salvar a linha original para depois restaurar ela
  linha_proxy <- matriz[i,]

  # Fazer um outro for para as linhas seguintes
  for(j in (i+1):nrow(matriz)) {

    # Se o numero abaixo da Dprincipal for != 0
    if(matriz[j, i] != 0) {

      fator_mult <- (matriz[j, i] / matriz[i, i])

      # Fazer p/ cada coluna, preenchendo a linha inteira
      for(k in 1:as.numeric(ncol(matriz))) {

        matriz[i, k] <- matriz[i, k] * fator_mult

      }

      # Fazer a eliminação da linha "j" para determinado "i"
      matriz[j,] <- matriz[j,] - matriz[i,]
    }
  }

  # Restaurar a linha original
  matriz[i,] <- linha_proxy
}

# Cálculo da determinante
det_matriz <- 1
for (i in diag(matriz)) {
  det_matriz <- det_matriz * i
}

return(det_matriz)
}

Importante notar que este código não toma alguns cuidados. Por exemplo, se a matriz não for quadrada a função simplesmente não roda (não é dado um motivo pela função). Para isso, pode-se fazer:

# Se a matriz não for quadrada dar erro!
if(ncol(matriz) != nrow(matriz)) {
  return("A matriz não é quadrada!")
}

Outro cuidado é caso o elemento da diagonal principal for igual a zero. Caso isso aconteça, deve-se trocar duas linhas de lugar. Isso pode ser resolvido inserindo o código abaixo depois do primeiro for.

# Se o elemento da diagonal principal for 0, trocar as linhas
if(matriz[i, i] == 0) {

  ind <- which.max(abs(matriz[i:nrow(matriz), i])) + (i - 1)
  linha_troca <- matriz[i,]

  matriz[i,] <- matriz[ind,]
  matriz[ind,] <- linha_troca

  remove(ind, linha_troca)
}
comentou 4 horas atrás por Fabio Fujita (1 ponto)  
O exercício 7 do capítulo 1 do livro “Linear Algebra” de Georgi Shilov solicita o cálculo dos dois determinantes em referência. Conforme o colega citou em sua resposta, o código implementado poderia apresentar alguns problemas em alguns casos específicos, mas o determinante é calculado corretamente nos dois casos demandados.  

Entre as diversas soluções possíveis, o colega optou pelo método de eliminação Gaussiana, que consiste basicamente na aplicação de operações elementares sobre as linhas/colunas de uma matriz, de modo a obter uma matriz equivalente cujo cálculo do determinante seja mais simples de resolver. Busca-se, portanto, a obtenção de uma matriz triangular equivalente (superior ou inferior), uma vez que seu determinante pode ser facilmente obtido pelo produto dos elementos da diagonal principal da matriz.

O algoritmo de eliminação implementado pelo colega multiplica uma linha da matriz por uma constante conveniente, subtrai esta nova linha da linha inferior da matriz original e posteriormente retorna a linha superior ao seu valor original, sem o fator multiplicativo. Caso essa última operação não houvesse sido realizada, o valor do determinante ficaria indevidamente multiplicado por este fator, uma vez que ao multiplicarmos uma linha/coluna de uma matriz por uma constante, seu determinante também fica multiplicado pela mesma. As demais operações realizadas não alteram o valor do determinante.

Implementações alternativas seriam, por exemplo:
1.    substituir diretamente a linha inferior pela diferença entre esta linha e a linha superior multiplicada por uma constante conveniente (o determinante de uma matriz não é alterado quando uma linha/coluna é substituída pela soma desta linha/coluna com uma combinação linear das demais linhas/colunas); ou
2.    Ao invés de retornar a linha original sem o fator multiplicativo à matriz, registrar o histórico desses fatores. Para obter o determinante da matriz original, seria necessário multiplicar o produto desses fatores pelo produto dos elementos da diagonal principal da matriz triangular obtida.

Entre os outros métodos que poderiam ser utilizados, cita-se a aplicação do teorema de Laplace, que afirma que o determinante de uma matriz de ordem N pode ser obtido pela soma do produto dos N elementos de uma linha/coluna pelo cofator do elemento. Converte-se assim o problema do cálculo de um determinante de ordem N no cálculo de N determinantes de ordem N-1. O método é aplicado até a obtenção de um determinante cujo cálculo seja mais simples.

O método de eliminação Gaussina escolhido pelo colega é, no entanto, mais eficiente em termos computacionais. O assunto já foi amplamente discutido na literatura, tendo sido inclusive abordado anteriormente no Prorum na pergunta “Cálculo do determinante de uma matriz: eliminação Gaussiana ou teorema de Laplace, qual o algoritmo mais eficiente?”

http://prorum.com/?qa=3218/determinante-eliminacao-gaussiana-laplace-algoritmo-eficiente#:~:text=Elimina%C3%A7%C3%A3o%20de%20Gauss%20(ou%20m%C3%A9todo,resolver%20sistemas%20de%20equa%C3%A7%C3%B5es%20lineares.&text=Dessa%20forma%2C%20para%20aplicar%20o,um%20m%C3%BAltiplo%20de%20outra%20linha
...