root/pmsm/mpf_test.cpp @ 229

Revision 229, 3.6 kB (checked in by smidl, 15 years ago)

epdf has a new function: variance()

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