In [1]:
# rm(list=ls())
options(OutDec = ",")
#==============================================================================
# Funcao para a decomposicao de Cholesky
# Seja A uma matriz positiva definida: A = U' * U
#==============================================================================
decomp.cholesky <- function(A){
n <- dim(A)[1]
for(i in 1:n)
for(j in 1:i )
if(A[i,j]!=A[j,i]){
print("A matriz inserida nao e' simetrica!")
return(NA)
}
if(A[1,1]<=0.0){ # A matriz nao e' positiva definida!
print("A decomposicao de Cholesky falhou!")
print("A matriz inserida nao e' positiva definida!")
return(NA)
}
U <- matrix(0,n,n)
# Para i=1
U[1,1] <- sqrt(A[1,1])
U[1,2:n] <- A[1,2:n]
for(i in 2:n){
for(j in i:n){
alpha <- A[i,j]
for(k in 1:(i-1)){
alpha <- alpha - U[k,i]*U[k,j]
}
if(i==j){
if(alpha<=0.0){ # A matriz nao e' positiva definida!
print("A decomposicao de Cholesky falhou!")
print("A matriz inserida nao e' positiva definida!")
return(NA)
}
U[i,i] <- sqrt(alpha)
} else {
U[i,j] <- alpha/U[i,i]
}
}
}
return(U)
}
In [2]:
#==============================================================================
# Exemplo
#==============================================================================
aux <- c(1.0,0.7,0.5,0.7,1.0,0.8,0.5,0.8,1.0)
A <- matrix(aux,3,3,byrow=T)
print(A)
[,1] [,2] [,3] [1,] 1,0 0,7 0,5 [2,] 0,7 1,0 0,8 [3,] 0,5 0,8 1,0
In [3]:
#==============================================================================
# Decomposicao de Cholesky utilizando a funcao do R
#==============================================================================
print(chol(A))
[,1] [,2] [,3] [1,] 1 0,7000000 0,5000000 [2,] 0 0,7141428 0,6301260 [3,] 0 0,0000000 0,5940885
In [4]:
#==============================================================================
U <- decomp.cholesky(A)
print("===============================")
print(U)
print("===============================")
B <- t(U)%*%U
print(B)
[1] "==============================="
[,1] [,2] [,3]
[1,] 1 0,7000000 0,5000000
[2,] 0 0,7141428 0,6301260
[3,] 0 0,0000000 0,5940885
[1] "==============================="
[,1] [,2] [,3]
[1,] 1,0 0,7 0,5
[2,] 0,7 1,0 0,8
[3,] 0,5 0,8 1,0
In [5]:
# rm(list=ls())
#==============================================================================
# Fim
#==============================================================================