Universidade Federal da Paraíba
Programa de Pós-Graduação em Economia
#------------------------------------------------------------
# Função para redução Gauss-Jordan
# Hilton M B Ramalho - PPGE/UFPB
# Adaptado de Jhon Fox
# Introduction to the R Statistical Computing Environment
#-------------------------------------------------------------
# Definir função
reducaoGJ <- function(A,x=NULL) {
# computar número de linhas e colunas da matriz A
n <- nrow(A)
m <- ncol(A)
d <- ncol(A[,-n])
# definir linha e coluna inicial
i <- j <- 1
# looping sobre linhas e colunas de A
while (i <= n && j <= m){
# iniciando looping nas colunas
while (j <= m){
Colatual <- A[,j]
Colatual[1:n < i] <- 0
# na coluna atual achar a posição do pivô máximo
pospivo <- which.max(abs(Colatual))
pivo <- Colatual[pospivo]
# checar se o pivô é zero
# caso verdadeiro, passar para a próxima coluna
if (pivo == 0) {
j <- j + 1
next
}
# se a linha do pivô for maior que a linha atual - trocar as linhas
if (pospivo > i) A[c(i, pospivo),] <- A[c(pospivo, i),]
# multiplicar a linha atual pelo inverso do pivô - primeiro elemento da linha = 1
A[i,] <- A[i,]/pivo
linha <- A[i,]
A <- A - outer(A[,j], linha) # fazer combinação usando matriz produto da linha pivo e coluna j
A[i,] <- linha # restaurar linha atual
j <- j + 1
break
}
i <- i + 1
}
# colocar linhas com zeros abaixo
zeros <- which(apply(A[,1:m], 1, function(x) all(x == 0)))
if (length(zeros) > 0){
zeroLinha <- A[zeros,]
A <- A[-zeros,]
A <- rbind(A, zeroLinha)
rownames(A) <- NULL
}
# Apenas para o caso de sistema nxn
if(!is.null(x) & n==d) {
cat("\n Solução do sistema:\n")
for(i in 1:n) cat(x[i],"=",A[i,m],"\n")
}
cat("\n Matriz reduzida - Gauss-Jordan\n")
return(A)
}
#----------------------------------------------------------
# .: Exemplo 1
# Considere o sistema linear
# m = 3, n = 3
# -2x1 + 4x2 + 6x3 = 2
# x1 - x2 = 0
# -x1 + x2 + x3 = 2
# Definir vetores Colunas -
# coeficientes do sistema linear
c1 <- c(-2,4,6)
c2 <- c(1,-1,0)
c3 <- c(-1,1,1)
b <- c(2,0,2)
# Definir matriz de variáveis
# do sistema
x <- c("x1","x2","x3")
# Definir matriz A(3,4).
# Matriz ampliada do sistema (A|b)
A <- cbind(c1,c2,c3,b)
# Matriz A
A
## c1 c2 c3 b
## [1,] -2 1 -1 2
## [2,] 4 -1 1 0
## [3,] 6 0 1 2
# Redução GJ com solução do sistema
# Observar função reducaoGJ na rotina
# Módulo 1 - Redução Gauss-Jordan.R
reducaoGJ(A,x)
##
## Solução do sistema:
## x1 = 1
## x2 = 0
## x3 = -4
##
## Matriz reduzida - Gauss-Jordan
## c1 c2 c3 b
## [1,] 1 0 0 1
## [2,] 0 1 0 0
## [3,] 0 0 1 -4
# Apenas redução GJ
reducaoGJ(A)
##
## Matriz reduzida - Gauss-Jordan
## c1 c2 c3 b
## [1,] 1 0 0 1
## [2,] 0 1 0 0
## [3,] 0 0 1 -4