Iteradores: KalmanIterator
Un iterador debe contener la información de un paso del filtro de kalman.
La función next_iteration!(iterator::KalmanIterator, control) permite generar una nueva iteración, pero requiere que se implementen los siguientes métodos:
| Métodos a implementar | Breve descripción |
|---|---|
update_inner_state!(iterator, control) | Si el iterador guarda un estado interno $x_n$, este método debería actualizarlo a $x_{n+1}$. Si no (como cuando se está observando un sistema físico real del que solo se tienen mediciones), puede estar en blanco. |
forecast_observed_state!(iterator, control) | Actualiza la estimación a priori de $\hat{x}_{n+1,n}$, usando el control $u_n$. |
observe_inner_system(iterator) | Entrega una observación $y_{n+1}$ del sistema real. |
analyse!(iterator, observation) | Analiza la observación $y_{n+1}$ para generar una nueva estimación a posteriori $\hat{x}_{n+1,n+1}$. |
update_updater!(iterator) | Permite actualizar el updater luego de la iteración. Puede usarse por ejemplo, con un updater no lineal que debe ser linealizado tras cada iteración. Puede dejarse en blanco. |
Hay dos opciones disponibles
LinearKalmanIterator
Permite realizar iterar con el filtro de Kalman de toda la vida.
KalmanFilter.LinearKalmanIterator — Typemutable struct LinearKalmanIterator{T} <: KalmanFilter.KalmanIteratorDefine un iterator de Kalman que almacena tanto un estado interno (que corresponde al sistema real) como un sistema aproximado, el cual es ajustado a partir de observaciones del sistema interno.
Campos
nNúmero de iteración actual $n$. Se inicializa en 0.
uControl $u_{n-1}$ usado para llegar al estado actual
systemSistema
hatXAproximación del estado interno $\hat{x}_{n,n}$, y una estimación de la matriz de covarianzas $\hat{P}_{n,n}$ del error $x_n - \hat{x}_{n,n}$.
next_hatXEstimación $\hat{x}_{n,n-1}$ del estado $x_n$ antes de conocer la observación $y_n$ (solo contando con información hasta $y_{n-1}$).
updaterKalmanUpdaterque permite actualizar tanto el estado interno como las aproximaciones.observerUn observador lineal que entrega observaciones $y_n$ del estado real.
noiserUna distribución que permite agregar ruido al sistema. Por defecto es una $\mathcal{N}(0,1)$.
EnKF
Permite iterar un ensamble de estados aproximados, los que representan una muestra de la distribución de los estados en el tiempo indicado. Esto permite generar aproximaciones con el promedio y la covarianza muestral de los datos.
KalmanFilter.EnKF — TypeKalmanIterator que permite aproximar un estado mediante la técnica Ensemble Kalman Filter.
n::Int64Número de iteración actual $n$. Se inicializa en 0.
N::Int64Tamaño del ensamble $N$, cantidad de estimaciones que se trabajarán.
u::RealControl $u_{n-1}$ usado para llegar al estado actual
system::KalmanFilter.ObservableSystemSistema
states_hatx::AnyArray de aproximaciones $\{ \hat{x}^{(i)}_{n,n} \}_i$ del estado real $x_n$.
states_next_hatx::AnyArray de estimaciones $\{ \hat{x}^{(i)}_{n,n-1} \}_i$ del estado real $x_n$, antes de conocer la observación $y_n$ (solo contando con información hasta $y_{n-1}$).
kalman_gain::AbstractArrayMatriz de ganancia de Kalman $K_n$
updater::KalmanFilter.KalmanUpdaterKalmanUpdaterque permite actualizar tanto el estado interno como las aproximaciones. No es necesario usar un updater linealizable, aunque sea NL.
observer::KalmanFilter.LinearObserverUn observador lineal que entrega observaciones $y_n$ del estado real.
noiser::Distribution{Univariate,S} where S<:ValueSupportUna distribución que permite agregar ruido al sistema. Por defecto es una normal $\mathcal{N}(0,1)$.
Hasta ahora es necesario que el usuario cuide que las condiciones iniciales estén correctamente inicializadas tanto en KalmanObserver (para el caso en que se guarda un sistema interno) y para KalmanUpdater (importa en la linearización inicial de un sistema no lineal).