root/pmsm/mpf_test.cpp @ 228

Revision 227, 3.7 kB (checked in by smidl, 15 years ago)

novy test

Line 
1/*!
2  \file
3  \brief TR 2525 file for testing Toy Problem of mpf for Covariance Estimation
4  \author Vaclav Smidl.
5
6  -----------------------------------
7  BDM++ - C++ library for Bayesian Decision Making under Uncertainty
8
9  Using IT++ for numerical operations
10  -----------------------------------
11*/
12
13
14#include <itpp/itbase.h>
15#include <estim/libKF.h>
16#include <estim/libPF.h>
17#include <stat/libFN.h>
18
19#include "pmsm.h"
20#include "simulator.h"
21#include "sim_profiles.h"
22
23using namespace itpp;
24//!Extended Kalman filter with unknown \c Q
25class EKF_unQ : public EKFCh , public BMcond {
26public:
27        //! Default constructor
28        EKF_unQ ( RV rx, RV ry,RV ru,RV rQ ) :EKFCh ( rx,ry,ru ),BMcond ( rQ ) {};
29        void condition ( const vec &Q0 ) {
30                Q.setD ( Q0,0 );
31                //from EKF
32                preA.set_submatrix ( dimy+dimx,dimy,Q._Ch() );
33        };
34};
35
36
37int main() {
38        // Kalman filter
39        int Ndat = 9000;
40        double h = 1e-6;
41        int Nsimstep = 125;
42        int Npart = 20;
43
44        // internal model
45        IMpmsm fxu;
46        //                  Rs    Ls        dt       Fmag(Ypm)    kp   p    J     Bf(Mz)
47        fxu.set_parameters ( 0.28, 0.003465, Nsimstep*h, 0.1989, 1.5 ,4.0, 0.04, 0.0 );
48        // observation model
49        OMpmsm hxu;
50
51        vec mu0= "0.0 0.0 0.0 0.0";
52        vec Qdiag ( "1e-6 1e-6 0.001 0.0001" ); //zdenek: 0.01 0.01 0.0001 0.0001
53        vec Rdiag ( "1e-8 1e-8" ); //var(diff(xth)) = "0.034 0.034"
54        chmat Q ( Qdiag );
55        chmat R ( Rdiag );
56        EKFCh KFE ( rx,ry,ru );
57        KFE.set_parameters ( &fxu,&hxu,Q,R );
58        KFE.set_est ( mu0, chmat ( zeros ( 4 ) ) );
59
60        RV rQ ( "{Q }","4" );
61        EKF_unQ KFEp ( rx,ry,ru,rQ );
62        KFEp.set_parameters ( &fxu,&hxu,Q,R );
63        KFEp.set_est ( mu0, chmat ( zeros ( 4 ) ) );
64
65        //mgamma_fix evolQ ( rQ,rQ );
66        migamma_fix evolQ ( rQ,rQ );
67        MPF<EKF_unQ> M ( rx,rQ,evolQ,evolQ,Npart,KFEp );
68        // initialize
69        evolQ.set_parameters ( 0.1, Qdiag, 1.0); //sigma = 1/10 mu
70        evolQ.condition (Qdiag ); //Zdenek default
71        double xxx;
72        cout << Qdiag <<endl << "smp:"<< evolQ.samplecond(Qdiag,xxx) <<endl;
73        eigamma* pfinit=dynamic_cast<eigamma*>(evolQ._e());
74        cout << pfinit->mean()<<endl;
75        M.set_est ( *pfinit );
76        evolQ.set_parameters ( 0.10, Qdiag,0.995); //sigma = 1/10 mu
77        cout << Qdiag <<endl << "smp:"<< evolQ.samplecond(Qdiag,xxx) <<endl;
78       
79        //
80
81        const epdf& KFEep = KFE._epdf();
82        const epdf& Mep = M._epdf();
83
84        mat Xt=zeros ( Ndat ,4 ); //true state from simulator
85        mat Dt=zeros ( Ndat,2+2 ); //observation
86        mat XtE=zeros ( Ndat, 4 );
87        mat Qtr=zeros ( Ndat, 4 );
88        mat XtM=zeros ( Ndat,4+4 ); //Q + x
89
90        // SET SIMULATOR
91        pmsmsim_set_parameters ( 0.28,0.003465,0.1989,0.0,4,1.5,0.04, 200., 3e-6, h );
92        vec dt ( 2 );
93        vec ut ( 2 );
94        vec xt ( 4 );
95        vec xtm=zeros(4);
96        double Ww=0.0;
97        vec vecW="1 2 4 9 4 2 0 -4 -9 -16 -4 0 0";
98
99        for ( int tK=1;tK<Ndat;tK++ ) {
100                //Number of steps of a simulator for one step of Kalman
101                for ( int ii=0; ii<Nsimstep;ii++ ) {
102                        //simulator
103                        sim_profile_vec01t(Ww,vecW);
104                        pmsmsim_step ( Ww );
105                };
106                ut(0) = KalmanObs[4];
107                ut(1) = KalmanObs[5];
108                xt = fxu.eval(xtm,ut) + diag(sqrt(Qdiag))*randn(4);
109                dt = hxu.eval(xt,ut);
110                xtm = xt;
111               
112               
113                //Variances
114                if (tK==1000)  Qdiag(0)*=10; 
115                if (tK==2000) Qdiag(0)/=10; 
116                if (tK==3000)  Qdiag(1)*=10; 
117                if (tK==4000) Qdiag(1)/=10; 
118                if (tK==5000)  Qdiag(2)*=10; 
119                if (tK==6000) Qdiag(2)/=10; 
120                if (tK==7000)  Qdiag(3)*=10; 
121                if (tK==8000) Qdiag(3)/=10; 
122               
123                //estimator
124                KFE.bayes ( concat ( dt,ut ) );
125                M.bayes ( concat ( dt,ut ) );
126
127                Xt.set_row ( tK, xt); //vec from C-array
128                Dt.set_row ( tK, concat ( dt,ut));
129                Qtr.set_row ( tK, Qdiag);
130                XtE.set_row ( tK,KFEep.mean() );
131                XtM.set_row ( tK,Mep.mean() );
132        }
133
134        it_file fou ( "mpf_test.it" );
135
136        fou << Name ( "xth" ) << Xt;
137        fou << Name ( "Dt" ) << Dt;
138        fou << Name ( "Qtr" ) << Qtr;
139        fou << Name ( "xthE" ) << XtE;
140        fou << Name ( "xthM" ) << XtM;
141        //Exit program:
142
143        return 0;
144}
Note: See TracBrowser for help on using the browser.