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

Como calcular o Determinante das matrizes abaixo?

0 votos
142 visitas
perguntada Fev 22 em Matemática por Thiago Lappicy (6 pontos)  
editado Mai 17 por Thiago Lappicy

Exercício 7 Adaptado do Capítulo 1 do livro "Linear Algebra - Georgi E. Shilov".

\[ \Delta_1 = \begin{vmatrix} 246 & 428 & 327\\ 1014 & 543 & 443\\ -342 & 721 & 621 \end{vmatrix} \]

\[ \Delta_2 = \begin{vmatrix} 2 & 1 & 1 & 1 & 1\\ 1 & 3 & 1 & 1 & 1\\ 1 & 1 & 4 & 1 & 1\\ 1 & 1 & 1 & 5 & 1\\ 1 & 1 & 1 & 1 & 6\\ \end{vmatrix} \]

Compartilhe
comentou Mai 17 por Thiago Lappicy (6 pontos)  
Corrigido!
Retirei a imagem e coloquei uma matriz escrita em latex.

Estarei fazendo o mesmo para as outras questões que coloquei imagem de matriz, equação ou tabela.

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 Mar 5 por Fabio Fujita (36 pontos)  
editado Mar 6 por Fabio Fujita
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 de uma 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. Os fatores multiplicativos são escolhidos de forma a obter uma matriz triangular superior ao término do processo.

Implementações alternativas seriam, por exemplo:
1.    substituir diretamente a linha inferior, na qual se busca zerar elementos, pela diferença entre esta linha e uma 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
comentou Mai 17 por danielcajueiro (5,581 pontos)  
Não olhei com cuidado a solução desse exercício. Mas acredito que essa não seja a proposta do exercício do Shilov usar um método numérico como eliminação gaussiana para calcular. Veja por exemplo a solução da questão anterior: http://prorum.com/?qa=5391/como-resolver-questao-cap-livro-linear-algebra-george-shilov. Ele provavelmente quer que vc busque propriedades interessantes que explicitem o resultado do determinante.
comentou Mai 17 por Fabio Fujita (36 pontos)  
Thiago e professor Daniel. Entendo que tanto a solução apresentada pelo Thiago quanto o comentário feito pelo professor são pertinentes. Por um lado, o enunciado do exercício solicita apenas o cálculo dos dois determinantes, sem especificar o método. Por outro lado, o exercício está inserido em um capítulo teórico do livro, em que métodos numéricos para solução de determinantes não são abordados, sendo abordadas as propriedades de determinantes.
Thiago, uma maneira de facilmente adaptar a sua solução considerando o comentário do professor é mostrar analiticamente os passos que são realizados pelo algoritmo que você implementou.
Para isso, basta escalonar as matrizes, buscando obter uma matriz triangular. Pelo Teorema 1.47a do capítulo 1 do livro, 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. Ao obter uma matriz diagonal, conforme provado no exemplo 1.55b do livro, o determinante será dado pelo produto dos elementos de sua diagonal principal.
Outro método possível, citado no meu comentário anterior, seria a aplicação do teorema de Laplace, abordado no capítulo do livro e 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, como matrizes 3x3 (obtendo os determinantes pela regra de Sarrus) ou matrizes 2x2 (obtendo os determinantes pela diferença das diagonais da matriz).
Como sabemos, essas são apenas algumas sugestões, havendo outras formas de obtenção dos resultados usando as propriedades, inclusive a combinação de métodos. Por se tratar de uma solução analítica, é possível avaliar caso a caso, com base nas características da matriz. Por exemplo, as características da matriz 2, sugerem que nesse caso o escalonamento para posterior obtenção do determinante pelo produto dos elementos da diagonal principal seja o método mais direto.
comentou Mai 17 por danielcajueiro (5,581 pontos)  
Normalmente, essas questões são para se usar propriedades de determinantes. Note que o segundo determinante tem um padrão claro. O primeiro o padrão não é explicito, mas o segundo tem um padrão e lembra (embora nao seja exatamente) o padrão desse determinante: http://prorum.com/?qa=836/calcular-determinante-diagonal-principal-constante-constante
comentou Mai 17 por danielcajueiro (5,581 pontos)  
No caso do segundo, acho que sai direto usando \(L_i\rightarrow L_i-L_6\). Fazendo isso, vc chega numa triangular superior cujo deteminante eh o produto da diagonal principal. Não é isso? Ou estou comendo mosca?
comentou Mai 17 por Fabio Fujita (36 pontos)  
Concordo professor. De fato, o padrão da matriz do exercício que você resolveu e citou é bastante parecido com o padrão da segunda matriz do exercício do Thiago. Nesse caso, como havia citado anteriormente, o escalonamento para obtenção da matriz triangular parece ser de fato o melhor caminho (como feito em http://prorum.com/?qa=836/calcular-determinante-diagonal-principal-constante-constante).
comentou Mai 17 por Fabio Fujita (36 pontos)  
Apenas para esclarecer, quando falo no escalonamento da matriz também estou me referindo ao uso das propriedades dos determinantes. Foi isso que tentei dizer quando escrevi:
"Para isso, basta escalonar as matrizes, buscando obter uma matriz triangular. Pelo Teorema 1.47a do capítulo 1 do livro, 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. Ao obter uma matriz diagonal, conforme provado no exemplo 1.55b do livro, o determinante será dado pelo produto dos elementos de sua diagonal principal".
comentou Mai 17 por Thiago Lappicy (6 pontos)  
Concordo com as colocações feitas aqui nos comentários. Realmente, acabei não usando nenhuma propriedade interessante de determinantes para resolver os problemas acima, o que pensei em fazer, que considerei "interessante" mas de um ponto de vista computacional, foi justamente criar uma função no R que pudesse realizar uma eliminação Gaussiana.

Penso que a maioria das linguagens de programação já devem ter alguma maneira de fazer isso diretamente. No próprio R, para obter a determinante de alguma matriz basta utilizar a função "det(MATRIZ)". O python, java, stata, matlab devem ter algo similar. E existem diversos outros softwares que podem fazer o mesmo (até mesmo online ou calculadores gráficas). Estivemos ao longo do semestre aprofundando também em uma questão de programação agregando a teoria vista em aula e pelos textos passados.

A minha intenção na questão era justamente poder fazer uma rotina dessas do 0 usando apenas operações matemáticas simples do R. Tomando o devido cuidado quando a matriz não fosse quadrada e trocando as linhas caso o elemento da diagonal principal fosse 0. Esse semestre estive melhorando minhas habilidades computacionais e achei que seria interessante poder criar algo do tipo. Além disso, também poderia aplicar essa função para ambas as matrizes do enunciado (e para qualquer outra matriz quadrada nesse quesito).

Ao criarmos uma rotina realmente entendemos o programa por completo, ao invés de apenas pegar algo "pronto" da sua linguagem de programação e aplicar. Entendemos as falhas e forças dele. Nesse mesmo que fiz percebi 2 falhas que corrigi enquanto testava para algumas matrizes (a matriz não ser quadrada e o elemento da diagonal principal ser igual a 0).

Mas devo concordar que de um ponto de vista teórico, poderia sim ter usado outras técnicas como comentado por ambos (professor e Fabio). E existem técnicas interessantes para serem exploradas nessa questão, como apontadas pelo professor no comentário acima!
...