root/tests/testKF.cpp @ 254

Revision 254, 2.6 kB (checked in by smidl, 15 years ago)

create namespace bdm

Line 
1#include <itpp/itbase.h>
2#include <estim/libKF.h>
3
4using namespace bdm;
5
6//These lines are needed for use of cout and endl
7using std::cout;
8using std::endl;
9
10int main() {
11        // Kalman filter
12        mat A, B,C,D,R,Q,P0;
13        vec mu0;
14        mat Mu0;;
15        // input from Matlab
16        it_file fin( "testKF.it" );
17
18        mat Dt;
19        int Ndat;
20
21        bool xxx= fin.seek( "d" );
22        if (!xxx){ it_error("testKF.it not found");}
23        fin >>Dt;
24        fin.seek( "A" ); 
25        fin >> A;
26        fin.seek( "B" ); 
27        fin >> B;
28        fin.seek( "C" ); 
29        fin >> C;
30        fin.seek( "D" ); 
31        fin >> D;
32        fin.seek( "R" ); 
33        fin >> R;
34        fin.seek( "Q" ); fin >> Q;
35        fin.seek( "P0" ); fin >> P0;
36        fin.seek( "mu0" ); fin >> Mu0; 
37        mu0=Mu0.get_col(0);
38       
39        Ndat = 10;//Dt.cols();
40        int dimx = A.rows();
41       
42        // Prepare for Kalman filters in BDM:
43        RV rx("{x }",vec_1(A.cols()));
44        RV ru("{u }",vec_1(B.cols()));
45        RV ry("{y }",vec_1(C.rows()));
46       
47//      // LDMAT
48//      Kalman<ldmat> KF(rx,ry,ru);
49//      KF.set_parameters(A,B,C,D,ldmat(R),ldmat(Q));
50//      KF.set_est(mu0,ldmat(P0) );
51//      epdf& KFep = KF._epdf();
52//      mat Xt(2,Ndat);
53//      Xt.set_col( 0,KFep.mean() );
54
55        //Chol
56        KalmanCh KF(rx,ry,ru);
57        KF.set_parameters(A,B,C,D,chmat(R),chmat(Q));
58        KF.set_est(mu0,chmat(P0) ); //prediction!
59        const epdf& KFep = KF._epdf();
60        mat Xt(dimx,Ndat);     
61        Xt.set_col( 0,KFep.mean() );
62       
63        //     
64        // FSQMAT
65        Kalman<ldmat> KFf(rx,ry,ru);
66        KFf.set_parameters(A,B,C,D,ldmat(R),ldmat(Q));
67        KFf.set_est(mu0,ldmat(P0) );
68        const   epdf& KFfep = KFf._epdf();
69        mat Xtf(dimx,Ndat);     
70        Xtf.set_col( 0,KFfep.mean() );
71       
72        // FULL
73        KalmanFull KF2( A,B,C,D,R,Q,P0,mu0 );
74        mat Xt2(dimx,Ndat);     
75        Xt2.set_col( 0,mu0);
76
77       
78        // EKF
79        bilinfn fxu(rx,ru,A,B);
80        bilinfn hxu(rx,ru,C,D);
81        EKFCh KFE(rx,ry,ru);
82        KFE.set_parameters(&fxu,&hxu,Q,R);
83        KFE.set_est(mu0,chmat(P0));
84        const epdf& KFEep = KFE._epdf();
85        mat XtE(dimx,Ndat);     
86        XtE.set_col( 0,KFEep.mean() );
87
88        //test performance of each filter
89        Real_Timer tt;
90        vec exec_times(4); // KF, KFf KF2, KFE
91       
92        tt.tic();
93        for ( int t=1;t<Ndat;t++ ) {
94                KF.bayes( Dt.get_col( t ));
95                Xt.set_col( t,KFep.mean() );
96        }
97        exec_times(0) = tt.toc();
98       
99        tt.tic();
100        for ( int t=1;t<Ndat;t++ ) {
101                KFf.bayes( Dt.get_col( t ));
102                Xtf.set_col( t,KFfep.mean() );
103        }
104        exec_times(1) = tt.toc();
105
106        tt.tic();
107        for ( int t=1;t<Ndat;t++ ) {
108                KF2.bayes( Dt.get_col( t ));
109                Xt2.set_col( t,KF2.mu);
110        }
111        exec_times(2) = tt.toc();
112
113        tt.tic();
114        for ( int t=1;t<Ndat;t++ ) {
115                KFE.bayes( Dt.get_col( t ));
116                XtE.set_col( t,KFEep.mean() );
117        }
118        exec_times(3) = tt.toc();
119
120
121        it_file fou( "testKF_res.it" );
122        fou << Name("xth") << Xt;
123        fou << Name("xthf") << Xtf;
124        fou << Name("xth2") << Xt2;
125        fou << Name("xthE") << XtE;
126        fou << Name("exec_times") << exec_times;
127        //Exit program:
128        return 0;
129
130}
Note: See TracBrowser for help on using the browser.