library(lubridate)
library(FKF)
source("KalmanFilterFunction.R")
frameData <- function(){
dat <- read.csv("Data/data_building.csv")
vecTimeStamp <- ymd_hms(dat[, 1], "%Y%m%d %H:%M:%S", tz = "UTC")
numObs <- length(vecTimeStamp) - 1
dat <- data.frame("series" = seq(1, numObs), "time" = vecTimeStamp[1:numObs], "tempIn" = dat[,2],
"tempAir" = dat[,3], "heat" = dat[,4], "solar" = dat[,5])
return(dat)
}
dat <- frameData()
1 failed to parse.
rm(frameData)
numTrain <- length(dat$series) - 3
Question 4.2
plotTrainTestData <- function(vecX_all, vecY_all, numTrain, vecY_test, strNameData, strPosition = "topleft"){
numObs <- length(vecY_all)
plot(vecX_all, vecY_all, type = "l", col = "blue", lwd = 1, lty = 1, cex = 0.8, bty = "n",
main = paste("Training and Testing Data of", strNameData),
xlab = "Series", ylab = strNameData)
points(seq(numTrain + 1, numObs), vecY_test, col = "blue", lty = 1, pch = 16, cex = 0.8)
legend(strPosition, inset = .02, legend = c("Training Data", "Testing Data"), col = c("blue", "blue"),
pch = c(NaN, 16), lty = c(1, 1), lwd = c(2, 2))
}
plotTrainTestData(dat$series, dat$tempIn, numTrain, tail(dat$tempIn, n = 3), "Indoor Temperature")

plotTrainTestData(dat$series, dat$tempAir, numTrain, tail(dat$tempAir, n = 3), "Outdoor Temperature")

plotTrainTestData(dat$series, dat$solar, numTrain, tail(dat$solar, n = 3), "Solar Irradiation")

plotTrainTestData(dat$series, dat$heat, numTrain, tail(dat$heat, n = 3), "Heating Power")

Question 4.3
matU <- matrix(NA, nrow = 3, ncol = numTrain)
matU[1,] <- dat$tempAir[1:numTrain]
matU[2,] <- dat$heat[1:numTrain]
matU[3,] <- dat$solar[1:numTrain]
matA <- matrix(c(0.775, 0.1, 0.24, 0.9), nrow = 2)
matB <- matrix(c(0.005, 0, 0.127, 0, 0.335, 0), nrow = 2)
matC <- matrix(c(1, 0), nrow = 1)
matSigma1_1 <- matrix(c(0.5, 0, 0, 0.5), nrow = 2)
matSigma2_1 <- matrix(0.5)
modKalman_1 <- fkf(a0 = c(25, 25), P0 = diag(c(10, 10), 2), dt = matB %*% matU, ct = 0, Tt = matA, Zt = matC,
HHt = matSigma1_1, GGt = matSigma2_1, yt = matrix(dat$tempIn[1:numTrain], nrow = 1), check.input = TRUE)
plotRecons(100, 537, modKalman_1$att[1,], dat$tempIn, modKalman_1$Ptt)
matU.pred <- t(cbind(tail(dat$tempAir, n = 3), tail(dat$heat, n = 3), tail(dat$solar, n = 3)))
predictPlotKalmanFilter(modKalman_1, matSigma1_1, 10, matA, matB, matU.pred)

Question 4.4
resultOptim <- optim(c(25, 25, 10, 10, 0.5, 0.5, 0.5), logLikKalmanFilter, method = "L-BFGS-B", lower = rep(10^-6, 7),
upper = c(40, 40, 40, 40, 5, 5, 5))
modKalmanOptim <- calKalmanFilter(resultOptim$par)
matSigma1_optim <- matrix(c(resultOptim$par[5], 0, 0, resultOptim$par[6]), nrow = 2)
predictPlotKalmanFilter(modKalmanOptim, matSigma1_optim, 10, matA, matB, matU.pred)

LS0tCnRpdGxlOiAiRFRVMDI0MTdBNDogU3RhdGUgU3BhY2UgTW9kZWwgYW5kIEthbG1hbiBGaWx0ZXIiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6IEVkd2FyZCBKLiBYdQpkYXRlOiBNYXkgMTZ0aCwgMjAxOQotLS0KCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQojIENsZWFyIHZhcmlhYmxlcwpybShsaXN0ID0gbHMoKSkKbGlicmFyeShrbml0cikKYGBgCgpgYGB7cn0KbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoRktGKQpzb3VyY2UoIkthbG1hbkZpbHRlckZ1bmN0aW9uLlIiKQpgYGAKCmBgYHtyfQpmcmFtZURhdGEgPC0gZnVuY3Rpb24oKXsKICAgIGRhdCA8LSByZWFkLmNzdigiRGF0YS9kYXRhX2J1aWxkaW5nLmNzdiIpCiAgICB2ZWNUaW1lU3RhbXAgPC0geW1kX2htcyhkYXRbLCAxXSwgIiVZJW0lZCAlSDolTTolUyIsIHR6ID0gIlVUQyIpCiAgICBudW1PYnMgPC0gbGVuZ3RoKHZlY1RpbWVTdGFtcCkgLSAxCiAgICBkYXQgPC0gZGF0YS5mcmFtZSgic2VyaWVzIiA9IHNlcSgxLCBudW1PYnMpLCAidGltZSIgPSB2ZWNUaW1lU3RhbXBbMTpudW1PYnNdLCAidGVtcEluIiA9IGRhdFssMl0sIAogICAgICAgICAgICAgICAgICAgICAgInRlbXBBaXIiID0gZGF0WywzXSwgImhlYXQiID0gZGF0Wyw0XSwgInNvbGFyIiA9IGRhdFssNV0pCiAgICByZXR1cm4oZGF0KQp9CmRhdCA8LSBmcmFtZURhdGEoKQpybShmcmFtZURhdGEpCm51bVRyYWluIDwtIGxlbmd0aChkYXQkc2VyaWVzKSAtIDMKYGBgCgojIFF1ZXN0aW9uIDQuMgoKYGBge3J9CnBsb3RUcmFpblRlc3REYXRhIDwtIGZ1bmN0aW9uKHZlY1hfYWxsLCB2ZWNZX2FsbCwgbnVtVHJhaW4sIHZlY1lfdGVzdCwgc3RyTmFtZURhdGEsIHN0clBvc2l0aW9uID0gInRvcGxlZnQiKXsKICAgIG51bU9icyA8LSBsZW5ndGgodmVjWV9hbGwpCiAgICBwbG90KHZlY1hfYWxsLCB2ZWNZX2FsbCwgdHlwZSA9ICJsIiwgY29sID0gImJsdWUiLCBsd2QgPSAxLCBsdHkgPSAxLCBjZXggPSAwLjgsIGJ0eSA9ICJuIiwgCiAgICAgICAgIG1haW4gPSBwYXN0ZSgiVHJhaW5pbmcgYW5kIFRlc3RpbmcgRGF0YSBvZiIsIHN0ck5hbWVEYXRhKSwgCiAgICAgICAgIHhsYWIgPSAiU2VyaWVzIiwgeWxhYiA9IHN0ck5hbWVEYXRhKQogICAgcG9pbnRzKHNlcShudW1UcmFpbiArIDEsIG51bU9icyksIHZlY1lfdGVzdCwgY29sID0gImJsdWUiLCBsdHkgPSAxLCBwY2ggPSAxNiwgY2V4ID0gMC44KQogICAgbGVnZW5kKHN0clBvc2l0aW9uLCBpbnNldCA9IC4wMiwgbGVnZW5kID0gYygiVHJhaW5pbmcgRGF0YSIsICJUZXN0aW5nIERhdGEiKSwgY29sID0gYygiYmx1ZSIsICJibHVlIiksIAogICAgICAgICAgIHBjaCA9IGMoTmFOLCAxNiksIGx0eSA9IGMoMSwgMSksIGx3ZCA9IGMoMiwgMikpCn0KYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQgPSA2LCBmaWcud2lkdGggPSAxMX0KcGxvdFRyYWluVGVzdERhdGEoZGF0JHNlcmllcywgZGF0JHRlbXBJbiwgbnVtVHJhaW4sIHRhaWwoZGF0JHRlbXBJbiwgbiA9IDMpLCAiSW5kb29yIFRlbXBlcmF0dXJlIikKYGBgCgpgYGB7ciwgZmlnLmhlaWdodCA9IDYsIGZpZy53aWR0aCA9IDExfQpwbG90VHJhaW5UZXN0RGF0YShkYXQkc2VyaWVzLCBkYXQkdGVtcEFpciwgbnVtVHJhaW4sIHRhaWwoZGF0JHRlbXBBaXIsIG4gPSAzKSwgIk91dGRvb3IgVGVtcGVyYXR1cmUiKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLndpZHRoID0gMTF9CnBsb3RUcmFpblRlc3REYXRhKGRhdCRzZXJpZXMsIGRhdCRzb2xhciwgbnVtVHJhaW4sIHRhaWwoZGF0JHNvbGFyLCBuID0gMyksICJTb2xhciBJcnJhZGlhdGlvbiIpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQgPSA2LCBmaWcud2lkdGggPSAxMX0KcGxvdFRyYWluVGVzdERhdGEoZGF0JHNlcmllcywgZGF0JGhlYXQsIG51bVRyYWluLCB0YWlsKGRhdCRoZWF0LCBuID0gMyksICJIZWF0aW5nIFBvd2VyIikKYGBgCgojIFF1ZXN0aW9uIDQuMwoKYGBge3J9Cm1hdFUgPC0gbWF0cml4KE5BLCBucm93ID0gMywgbmNvbCA9IG51bVRyYWluKQptYXRVWzEsXSA8LSBkYXQkdGVtcEFpclsxOm51bVRyYWluXQptYXRVWzIsXSA8LSBkYXQkaGVhdFsxOm51bVRyYWluXQptYXRVWzMsXSA8LSBkYXQkc29sYXJbMTpudW1UcmFpbl0KbWF0QSA8LSBtYXRyaXgoYygwLjc3NSwgMC4xLCAwLjI0LCAwLjkpLCBucm93ID0gMikgICAgICAgCm1hdEIgPC0gbWF0cml4KGMoMC4wMDUsIDAsIDAuMTI3LCAwLCAwLjMzNSwgMCksIG5yb3cgPSAyKSAgICAgIAptYXRDIDwtIG1hdHJpeChjKDEsIDApLCBucm93ID0gMSkKbWF0U2lnbWExXzEgPC0gbWF0cml4KGMoMC41LCAwLCAwLCAwLjUpLCBucm93ID0gMikKbWF0U2lnbWEyXzEgPC0gbWF0cml4KDAuNSkKbW9kS2FsbWFuXzEgPC0gZmtmKGEwID0gYygyNSwgMjUpLCBQMCA9IGRpYWcoYygxMCwgMTApLCAyKSwgZHQgPSBtYXRCICUqJSBtYXRVLCBjdCA9IDAsIFR0ID0gbWF0QSwgWnQgPSBtYXRDLCAKICAgIEhIdCA9IG1hdFNpZ21hMV8xLCBHR3QgPSBtYXRTaWdtYTJfMSwgeXQgPSBtYXRyaXgoZGF0JHRlbXBJblsxOm51bVRyYWluXSwgbnJvdyA9IDEpLCBjaGVjay5pbnB1dCA9IFRSVUUpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQgPSA2LCBmaWcud2lkdGggPSAxMSwgZXZhbD1GQUxTRX0KcGxvdFJlY29ucygxMDAsIDUzNywgbW9kS2FsbWFuXzEkYXR0WzEsXSwgZGF0JHRlbXBJbiwgbW9kS2FsbWFuXzEkUHR0KQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLndpZHRoID0gMTF9Cm1hdFUucHJlZCA8LSB0KGNiaW5kKHRhaWwoZGF0JHRlbXBBaXIsIG4gPSAzKSwgdGFpbChkYXQkaGVhdCwgbiA9IDMpLCB0YWlsKGRhdCRzb2xhciwgbiA9IDMpKSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodCA9IDYsIGZpZy53aWR0aCA9IDExfQpwcmVkaWN0UGxvdEthbG1hbkZpbHRlcihtb2RLYWxtYW5fMSwgbWF0U2lnbWExXzEsIDEwLCBtYXRBLCBtYXRCLCBtYXRVLnByZWQpCmBgYAoKIyBRdWVzdGlvbiA0LjQKCmBgYHtyfQpyZXN1bHRPcHRpbSA8LSBvcHRpbShjKDI1LCAyNSwgMTAsIDEwLCAwLjUsIDAuNSwgMC41KSwgbG9nTGlrS2FsbWFuRmlsdGVyLCBtZXRob2QgPSAiTC1CRkdTLUIiLCBsb3dlciA9IHJlcCgxMF4tNiwgNyksIAogICAgICB1cHBlciA9IGMoNDAsIDQwLCA0MCwgNDAsIDUsIDUsIDUpKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLndpZHRoID0gMTF9Cm1vZEthbG1hbk9wdGltIDwtIGNhbEthbG1hbkZpbHRlcihyZXN1bHRPcHRpbSRwYXIpCm1hdFNpZ21hMV9vcHRpbSA8LSBtYXRyaXgoYyhyZXN1bHRPcHRpbSRwYXJbNV0sIDAsIDAsIHJlc3VsdE9wdGltJHBhcls2XSksIG5yb3cgPSAyKQpwcmVkaWN0UGxvdEthbG1hbkZpbHRlcihtb2RLYWxtYW5PcHRpbSwgbWF0U2lnbWExX29wdGltLCAxMCwgbWF0QSwgbWF0QiwgbWF0VS5wcmVkKQpgYGAKCg==