using namespace std;
{
arma::uword Nsamp = 120;
arma::uword N = 6;
arma::uword M = 2;
arma::uword L = 1;
double P0 = 100;
double Q0 = 0.00003;
double R0 = 25;
double dT = 0.1;
arma::mat x = { 0, 10, 1, 50, -0.08, -9 };
arma::mat A = { { 1, 0, dT, 0, dT * dT / 2, 0 }, { 0, 1, 0, dT, 0, dT * dT / 2 }, { 0, 0, 1, 0, dT, 0 }, { 0, 0, 0, 1, 0, dT }, { 0, 0, 0, 0, 1, 0 }, { 0, 0, 0, 0, 0, 1 } };
arma::mat H = { { 1, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 0 } };
arma::mat P = P0 * arma::eye( N, N );
arma::mat Q = arma::zeros( N, N );
Q( N - 2, N - 2 ) = 1;
Q( N - 1, N - 1 ) = 1;
Q = Q0 * Q;
arma::mat R = R0 * arma::eye( M, M );
arma::mat z( M, Nsamp, arma::fill::zeros );
arma::mat z0( M, Nsamp, arma::fill::zeros );
arma::mat xx( N, 1, arma::fill::zeros );
xx = x.t();
for( arma::uword n = 1; n < Nsamp; n++ )
{
xx = A * xx + 0.1 * Q * arma::randn( N, 1 );
z0.col( n ) = H * xx;
}
z.row( 0 ) = z0.row( 0 ) + 0.001 * R0 * arma::randn( 1, Nsamp );
z.row( 1 ) = z0.row( 1 ) + 0.8 * R0 * arma::randn( 1, Nsamp );
arma::mat x_log( N, Nsamp );
arma::mat e_log( M, Nsamp );
arma::cube P_log( N, N, Nsamp );
arma::mat xs_log( M, Nsamp );
arma::cube Ps_log( N, N, Nsamp );
for( arma::uword n = 0; n < Nsamp; n++ )
{
}
kalman.
rts_smooth( x_log, P_log, xs_log, Ps_log );
gp0.
window(
"Plot", 10, 10, 500, 500 );
gp0.
plot_add( z0.row( 0 ), z0.row( 1 ),
"True Y",
"lines dashtype 2 linecolor \"black\"" );
gp0.
plot_add( z.row( 0 ), z.row( 1 ),
"Meas Y",
"points" );
gp0.
plot_add( x_log.row( 0 ), x_log.row( 1 ),
"Kalman" );
gp0.
plot_add( xs_log.row( 0 ), xs_log.row( 1 ),
"RTS smooth" );
return 0;
}
void plot_show(void)
Show plots.
void set_term(const char *ttype)
Set output terminal.
void plot_add(const T1 &x, const T2 &y, const std::string lb, const std::string ls="lines")
Push plot y vs. x with label and linespec.
void window(const int fig, const char *name, const int x, const int y, const int width, const int height)
Configure the figure used Windows environment.
arma::mat get_err_cov(void)
void rts_smooth(const arma::mat &Xf, const arma::cube &Pf, arma::mat &Xs, arma::cube &Ps)
Rauch-Tung-Striebel smoother. See https://users.aalto.fi/~ssarkka/course_k2012/full_course_booklet_20...
arma::mat get_state_vec(void)
void set_meas_noise(const arma::mat &_R)
void set_state_vec(const arma::mat &_x)
void set_meas_mat(const arma::mat &_H)
void set_err_cov(const arma::mat &_P)
void set_trans_mat(const arma::mat &_A)
void set_proc_noise(const arma::mat &_Q)
void predict(const arma::mat u)
Predict the internal states using a control input.
void update(const arma::mat z)
Correct and update the internal states.