root/pmsm/TR2245/unitsteps.cpp @ 281

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

new version of mpf_test for TR2245

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
15#include <estim/libPF.h>
16#include <estim/ekf_templ.h>
17#include <stat/libFN.h>
18
19#include <stat/loggers_ui.h>
20
21#include "../pmsm.h"
22#include "simulator.h"
23#include "../sim_profiles.h"
24
25using namespace bdm;
26
27int main ( int argc, char* argv[] ) {
28        const char *fname;
29        if ( argc>1 ) {fname = argv[1]; }
30        else { fname = "unitsteps.cfg"; }
31        UIFile F ( fname );
32
33        int Ndat;
34        int Npart;
35        double h = 1e-6;
36        int Nsimstep = 125;
37
38        vec Qdiag;
39        vec Rdiag;
40        try {
41                // Kalman filter
42                F.lookupValue ( "ndat", Ndat );
43                F.lookupValue ( "Npart",Npart );
44
45                Qdiag= getvec ( F.lookup ( "dQ" ) ); //( "1e-6 1e-6 0.001 0.0001" ); //zdenek: 0.01 0.01 0.0001 0.0001
46                Rdiag=getvec ( F.lookup ( "dR" ) );// ( "1e-8 1e-8" ); //var(diff(xth)) = "0.034 0.034"
47        }
48        catch UICATCH;
49        // internal model
50       
51        IMpmsm fxu;
52        //                  Rs    Ls        dt       Fmag(Ypm)    kp   p    J     Bf(Mz)
53        fxu.set_parameters ( 0.28, 0.003465, Nsimstep*h, 0.1989, 1.5 ,4.0, 0.04, 0.0 );
54        // observation model
55        OMpmsm hxu;
56
57        vec mu0= "0.0 0.0 0.0 0.0";
58        chmat Q ( Qdiag );
59        chmat R ( Rdiag );
60        EKFCh KFE ;
61        KFE.set_parameters ( &fxu,&hxu,Q,R );
62        KFE.set_est ( mu0, chmat ( zeros ( 4 ) ) );
63
64        RV rQ ( "{Q }","4" );
65        EKFCh_unQ KFEp ;
66        KFEp.set_parameters ( &fxu,&hxu,Q,R );
67        KFEp.set_est ( mu0, chmat ( zeros ( 4 ) ) );
68
69        //mgamma_fix evolQ ( rQ,rQ );
70        migamma_fix evolQ ;
71        MPF<EKFCh_unQ> M ( &evolQ,&evolQ,Npart,KFEp );
72        // initialize
73        evolQ.set_parameters ( 0.1, 10*Qdiag, 1.0 ); //sigma = 1/10 mu
74        evolQ.condition ( 10*Qdiag ); //Zdenek default
75        M.set_est ( *evolQ._e() );
76        evolQ.set_parameters ( 0.10, 10*Qdiag,0.999 ); //sigma = 1/10 mu
77        //
78
79        const epdf& KFEep = KFE.posterior();
80        const epdf& Mep = M.posterior();
81
82        dirfilelog *L; UIbuild(F.lookup("logger"), L);// ( "exp/mpf_test",100 );
83        int l_X = L->add ( rx, "xt" );
84        int l_D = L->add ( concat ( ry,ru ), "" );
85        int l_XE= L->add ( rx, "xtE" );
86        int l_XM= L->add ( concat ( rQ,rx ), "xtM" );
87        int l_VE= L->add ( rx, "VE" );
88        int l_VM= L->add ( concat ( rQ,rx ), "VM" );
89        int l_Q= L->add ( rQ, "" );
90        L->init();
91
92        // SET SIMULATOR
93        pmsmsim_set_parameters ( 0.28,0.003465,0.1989,0.0,4,1.5,0.04, 200., 3e-6, h );
94        vec dt ( 2 );
95        vec ut ( 2 );
96        vec xt ( 4 );
97        vec xtm=zeros ( 4 );
98        double Ww=0.0;
99        vec vecW=getvec(F.lookup("profile"));
100
101        for ( int tK=1;tK<Ndat;tK++ ) {
102                //Number of steps of a simulator for one step of Kalman
103                for ( int ii=0; ii<Nsimstep;ii++ ) {
104                        //simulator
105                        sim_profile_vec01t ( Ww,vecW );
106                        pmsmsim_step ( Ww );
107                };
108                ut ( 0 ) = KalmanObs[4];
109                ut ( 1 ) = KalmanObs[5];
110                xt = fxu.eval ( xtm,ut ) + diag ( sqrt ( Qdiag ) ) *randn ( 4 );
111                dt = hxu.eval ( xt,ut );
112                xtm = xt;
113
114                //Variances
115                if ( tK==1000 )  Qdiag ( 0 ) *=10;
116                if ( tK==2000 ) Qdiag ( 0 ) /=10;
117                if ( tK==3000 )  Qdiag ( 1 ) *=10;
118                if ( tK==4000 ) Qdiag ( 1 ) /=10;
119                if ( tK==5000 )  Qdiag ( 2 ) *=10;
120                if ( tK==6000 ) Qdiag ( 2 ) /=10;
121                if ( tK==7000 )  Qdiag ( 3 ) *=10;
122                if ( tK==8000 ) Qdiag ( 3 ) /=10;
123
124                //estimator
125                KFE.bayes ( concat ( dt,ut ) );
126                M.bayes ( concat ( dt,ut ) );
127
128                vec mea=Mep.mean();
129                if (max(mea)>1e3){
130                        cout << "here"<<endl;
131                }
132                L->logit ( l_X,xt );
133                L->logit ( l_D,concat ( dt,ut ) );
134                L->logit ( l_XE,KFEep.mean() );
135                L->logit ( l_XM, mea);
136                L->logit ( l_VE,KFEep.variance() );
137                L->logit ( l_VM,Mep.variance() );
138                L->logit ( l_Q,Qdiag );
139                L->step();
140        }
141        L->finalize();
142        //Exit program:
143
144        delete L;
145        return 0;
146}
Note: See TracBrowser for help on using the browser.