No artigo anterior, apresentamos como se processa a resolução de sistemas lineares pelo método direto denominado Triangularização de Gauss. Agora, vamos para a prática em computador, com a descrição de um script em linguagem R. Doravante, os nossos scripts serão numerados sequencialmente, começando por este Script GK1.
Como exemplo para aplicação desse script, vamos usar os mesmos dados de um sistema de equações lineares 3 X 3 (Dunn e Parberry, 2011, p. 131). A matriz dos coeficientes é definida como um data frame, que contém a matriz dos coeficientes A e o vetor b (Linha 1).
Para fins de convenção, adota-se escrever Linha para se referir à linha do script e linha para a matriz dos coeficientes. O número de linhas é lido diretamente do data frame (Linha 2) e o número de colunas é o número de linhas mais um, porque o vetor b foi adicionado (Linha 3).
Entre as Linhas 4 e 17, tem-se um comando em laço que percorre a diagonal principal de 1 até (n-1). Agora, entre as Linhas 5 e 16 há outro comando em laço percorrendo as linhas abaixo da diagonal principal (k).
Em seguida, entre as Linhas 6 e 12, faz-se a condensação pivotal, se for o caso, ou seja, quando o elemento abaixo da diagonal principal (A[i,k]) for maior que o elemento da diagonal principal (A[k,k]).
Para fazer a permutação de linhas, cria-se um objeto de armazenamento temporário chamado (xtemp).
Nas Linhas 13 a 15, executa-se a multiplicação da linha que está sobre a diagonal principal pelo multiplicador (mult) e se soma à linha i, conforme o comando em laço que começa na Linha 5.
Feito isso, o elemento abaixo da diagonal principal foi zerado. Repete-se esse procedimento para todas as demais linhas abaixo da diagonal principal. Assim, tem-se a matriz dos coeficientes como uma matriz triangular superior, ficando a n-ésima equação do sistema com apenas uma incógnita, que é determinada na Linha 20.
Em seguida, faz-se a substituição reversa se calculando a (n-1)-ésima incógnita, conhecida a n-ésima e assim por diante.
> A
c..5..2..1. c.1..2..0. c.1..4...3. c..10..12..9.
1 -5 1.0 1.000000 -10.000000
2 0 2.4 4.400000 8.000000
3 0 0.0 -3.166667 6.333333
> x
[1] 3 7 -2
>
Os resultados obtidos conferem com aqueles apresentados por Dunn e Parberry (2011, p. 131). Na linguagem R, tem-se a função solve() que resolve sistemas de equações lineares, como se pode verificar no Script GK2.
A=matrix(c(2,2,4,-5,1,1,1,0,-3),nrow=3,ncol=3,byrow=TRUE)
b=matrix(c(12,-10,9),nrow=3,ncol=1)
X=solve(A,b)
X
Como se pode verificar a seguir, os resultados foram absolutamente iguais aos obtidos no script GK1, validando o algoritmo descrito e programado em R.
> X
[,1]
[1,] 3
[2,] 7
[3,] -2
>
Este foi um dos algoritmos que a Geokrigagem está migrando para a linguagem R, conforme a decisão publicada no artigo: “Migração de algoritmos para a linguagem R”.
Referências bibliográficas
Dunn, F.; Parberry, I. 2011. 3D Math primer for graphics and game development. Boca Raton, CRC Press. 824p.
Press, W.H.; Flannery, B.P.; Teukolsky, S.A.; Vetterling, W.T. 1989. Numerical recipes in Pascal. New York, Cambridge University Press. 759p.
Próximo artigo
Esse artigo é uma continuação do Método de Triangularização de Gauss – Parte 1.
No próximo artigo vamos aplicar o sistema gerador de equações lineares associado à solução pelo método de triangularização de Gauss, para qualquer dimensão.
Observações importantes:
- Os Scripts Gk1 e Gk2 foram executados sob a versão 4.0.0 da linguagem R.
- Este artigo foi derivado de um capítulo de um livro em preparação Yamamoto, J.K. 2020. R na prática. São Paulo, JK Yamamoto-EIRELI.