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)
}