[R-br] Dúvida em erro na função Filtro de Kalman
Victor Eduardo
victorduca08 em gmail.com
Segunda Maio 14 08:45:29 BRT 2012
Galera, estou com um problema que não estou entendendo o motivo do erro que
está na função filtro_kalman. Estou realizando um exercício que é para
construir uma função que realiza o filtro de kalman. Utilizei o modelo de
tendencia linear local no filtro de kalman:
#Função para gerar as matrizes do sistema para o
#Modelo de tendencia linear local
matriz_Tll<-function(fi,sig2_eta,sig2_eps,sig2_qui,n){
#Definindo as dimensões das matrizes do sistema
ar_Z<-array( ,dim=c(1,2,n))
ar_T<-array( ,dim=c(2,2,n))
ar_C<-array( ,dim=c(2,1,n))
ar_D<-array( ,dim=c(1,1,n))
ar_R<-array( ,dim=c(2,2,n))
ar_H<-array( ,dim=c(1,1,n))
ar_Q<-array( ,dim=c(2,2,n))
#Iniciando um 'for' para 'construir' as matrizes do sistema
for(t in 1:n){
ar_Z[ , ,t]<-matrix(c(1,0),nc=2)
ar_T[ , ,t]<-matrix(c(1,0,1,fi),nc=2)
ar_C[ , ,t]<-matrix(c(0,0))
ar_D[ , ,t]<-matrix(0)
ar_R[ , ,t]<-matrix(c(1,0,0,1),nc=2)
ar_H[ , ,t]<-matrix(sig2_eps,nc=1)
ar_Q[ , ,t]<-matrix(c(sig2_eta,0,0,sig2_qui),nc=2)
}
return(list(ar_Z,ar_T,ar_C,ar_D,ar_R,ar_H,ar_Q))
}
fi<-0.5 #com |fi|<1 temos um modelo de tendencia amortecida
sig2_eta<-4
sig2_eps<-6
sig2_qui<-10
n<-100 #número pequeno apenas para teste
mat_sist<-matriz_Tll(fi,sig2_eta,sig2_eps,sig2_qui,n)
ar_Z<-mat_sist[[1]]
ar_T<-mat_sist[[2]]
ar_C<-mat_sist[[3]]
ar_D<-mat_sist[[4]]
ar_R<-mat_sist[[5]]
ar_H<-mat_sist[[6]]
ar_Q<-mat_sist[[7]]
#Função para modelo em espaço de estado em geral
gerador_EE<-function(ar_Z,ar_T,ar_C,ar_D,ar_R,ar_H,ar_Q,a1,p1){
n<-dim(ar_Z)[3] #nº de matrizes do array Z ou D ou H
p<-dim(ar_H)[1] #nº linhas de H, D ou Z
m<-dim(ar_T)[1] #nº linhas de T, C ou R
r<-dim(ar_Q)[1] #nº linhas de Q
ar_Y<-array(,dim=c(p,1,n))
eps<-array(,dim=c(p,1,n))
eta<-array(,dim=c(r,1,n))
alfa<-array(,dim=c(m,1,n+1))
alfa[,,1]<-a1+chol(p1)%*%matrix(rnorm(m,0,1),nc=1)
for(t in 1:n){
eps[,,t]<-0+chol(ar_H[,,t])%*%matrix(rnorm(p,0,1),nc=1)
ar_Y[,,t]<-ar_Z[,,t]%*%alfa[,,t]+ar_D[,,t]+eps[,,t]
eta[,,t]<-0+chol(ar_Q[,,t])%*%matrix(rnorm(r,0,1),nc=1)
alfa[,,t+1]<-ar_T[,,t]%*%alfa[,,t]+ar_C[,,t]+ar_R[,,t]%*%eta[,,t]
}
return(ar_Y)
}
a1<-matrix(1:2,nc=1)
p1<-matrix(c(3,1,1,2),nc=2)
geracao<-gerador_EE(ar_Z,ar_T,ar_C,ar_D,ar_R,ar_H,ar_Q,a1,p1)
#Gráfico dos valores gerados para Y
plot(geracao,type='l')
#Filtro de Kalman
install.packages('MASS')
require(MASS)
Filtro_Kalman<-function(ar_Z,ar_T,ar_C,ar_D,ar_R,ar_H,ar_Q,a1,p1){
n<-dim(ar_Z)[3] #nº de matrizes do array Z ou D ou H
p<-dim(ar_H)[1] #nº linhas de H, D ou Z
m<-dim(ar_T)[1] #nº linhas de T, C ou R
r<-dim(ar_Q)[1] #nº linhas de Q
ar_Y<-array(,dim=c(p,1,n))
ar_U<-array(,dim=c(p,1,n))
ar_F<-array(,dim=c(p,p,n))
ar_AA<-array(,dim=c(m,1,n))
ar_PP<-array(,dim=c(m,m,n))
ar_A<-array(,dim=c(m,1,n+1))
ar_P<-array(,dim=c(m,m,n+1))
ar_A[,,1]<-a1
ar_P[,,1]<-p1
ar_Y<-gerador_EE(ar_Z,ar_T,ar_C,ar_D,ar_R,ar_H,ar_Q,a1,p1)
for(t in 1:2){
ar_U[,,t]<-ar_Y[,,t]-ar_Z[,,t,drop=FALSE]%*%ar_A[,,t,drop=FALSE]-ar_D[,,t,drop=FALSE]
ar_F[,,t]<-ar_Z[,,t,drop=FALSE]%*%ar_P[,,t,drop=FALSE]%*%t(ar_Z[,,t,drop=FALSE])+ar_H[,,t,drop=FALSE]
ar_AA[,,t]<-ar_A[,,t,drop=FALSE]+ar_P[,,t,drop=FALSE]%*%ar_Z[,,t,drop=FALSE]%*%ginv(ar_F[,,t,drop=FALSE])%*%ar_U[,,t,drop=FALSE]
ar_PP[,,t]<-ar_P[,,t,drop=FALSE]-ar_P[,,t,drop=FALSE]%*%t(ar_Z[,,t,drop=FALSE])%*%ginv(ar_F[,,t,drop=FALSE])%*%ar_Z[,,t,drop=FALSE]%*%ar_P[,,t]
ar_A[,,t+1]<-ar_T[,,t,drop=FALSE]%*%ar_AA[,,t,drop=FALSE]+ar_C[,,t,drop=FALSE]
ar_P[,,t+1]<-ar_T[,,t,drop=FALSE]%*%ar_PP[,,t,drop=FALSE]%*%t(ar_PP[,,t,drop=FALSE])+ar_R[,,t,drop=FALSE]%*%ar_Q[,,t,drop=FALSE]%*%t(ar_R[,,t,drop=FALSE])
}
return(list(ar_A,ar_P))
}
Filtro_Kalman(ar_Z,ar_T,ar_C,ar_D,ar_R,ar_H,ar_Q,a1,p1)
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20120514/39d2ac20/attachment.html>
Mais detalhes sobre a lista de discussão R-br