More advanced filtering algorithms for non-linear non-Gaussian models can be derived, see ...
where is the state, is the system output, are state matrices of appropriate dimensions, are zero mean Gaussian noises with covariance matrices , respectively.
Both prior and posterior densities on the state are Gaussian, i.e. of the class enorm.
There is a range of classes that implements this functionality, namely:
where are general non-linear functions which have finite derivatives. Remaining variables have the same meaning as in the Kalman Filter.
In order to use this class, the non-linear functions and their derivatives must be defined as an instance of class diffbifn
.
Two classes are defined:
#include "estim/kalman.h" using namespace bdm; // estimation of AR(0) model int main() { //dimensions int dx = 3, dy = 3, du = 1; // matrices mat A = eye ( dx ); mat B = zeros ( dx, du ); mat C = eye ( dx ); mat D = zeros ( dy, du ); mat Q = eye ( dx ); mat R = 0.1 * eye ( dy ); //prior mat P0 = 100 * eye ( dx ); vec mu0 = zeros ( dx ); // Estimator KalmanCh KF; KF.set_parameters ( A, B, C, D,/*covariances*/ Q, R ); KF.set_statistics ( mu0, P0 ); // Estimation loop for ( int i = 0; i < 100; i++ ) { KF.bayes ( randn ( dx + du ) ); } //print results cout << "Posterior estimate of x is: " << endl; cout << "mean: " << KF.posterior().mean() << endl; cout << "variance: " << KF.posterior().variance() << endl; }