root/tests/pmsm_unkQpf.cpp @ 33

Revision 33, 2.5 kB (checked in by smidl, 16 years ago)

Oprava PF a MPF + jejich implementace pro pmsm system

Line 
1/*
2  \file
3  \brief Models for synchronous electric drive using IT++ and BDM
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#include <itpp/itbase.h>
14#include <estim/libKF.h>
15#include <estim/libPF.h>
16#include <stat/libFN.h>
17
18#include "pmsm.h"
19
20using namespace itpp;
21
22//!Extended Kalman filter with unknown \c Q
23class EKF_unQ : public EKF<ldmat> , public BMcond {
24public:
25        //! Default constructor
26        EKF_unQ (RV rx, RV ry,RV ru,RV rQ ) :EKF<ldmat> ( rx,ry,ru ),BMcond ( rQ ) {};
27        void condition ( const vec &Q0 ) {Q.setD ( Q0,0 ); }; //set first two diag(Q)
28};
29
30int main() {
31        // Kalman filter
32        int Ndat = 10000;
33
34//      cout << KF;
35        // internal model
36        IMpmsm fxu;
37        //                  Rs    Ls        dt       Fmag(Ypm) kp   p    J     Bf(Mz)
38        fxu.set_parameters ( 0.28, 0.003465, 20*1e-6, 0.1989,   1.5 ,4.0, 0.04, 0.0 );
39        // observation model
40        OMpmsm hxu;
41
42        vec mu0= "100 100 100 1";
43        vec Qdiag ( "0.1 0.1 0.01 0.00001" );
44        vec Rdiag ( "0.02 0.02" );
45        vec vQ = "0.01:0.01:100";
46
47        ldmat Q = ldmat ( Qdiag );
48        ldmat R = ldmat ( Rdiag );
49
50        RV rQ ( "100","{Q}","2","0" );
51        EKF_unQ KFE ( rx,ry,ru,rQ );
52        KFE.set_parameters ( &fxu,&hxu,Q,R );
53        KFE.set_est ( mu0, ldmat ( 1000*ones ( 4 ) ) );
54
55        mgamma evolQ ( rQ,rQ );
56        evolQ.set_parameters ( 10000.0 ); //sigma = 1/10 mu
57
58        MPF<EKF_unQ> M ( rx,rQ,evolQ,evolQ,100,KFE );
59
60        epdf& KFEep = KFE._epdf();
61        epdf& Mep = M._epdf();
62        // initialize
63        evolQ.condition ( "0.5 0.5" );
64        epdf& pfinit=evolQ._epdf();
65        M.set_est ( pfinit );
66
67        //simulator values
68        vec dt ( 2 );
69        vec wt ( 2 );
70        vec ut ( 2 );
71        vec xt=mu0;
72        vec et ( 4 );
73
74        mat Xt=zeros ( 4,Ndat );
75        mat XtE=zeros ( 4,Ndat );
76        mat XtM=zeros ( 6,Ndat );
77        Xt.set_col ( 0,KFEep.mean() );
78        XtM.set_col ( 0,Mep.mean() );
79
80        for ( int t=1;t<Ndat;t++ ) {
81                //simulator
82                UniRNG.sample_vector ( 2,wt );
83
84                if ( rem ( t,500 ) <200 ) ut = rem ( t,500 ) *ones ( 2 );
85                else
86                        ut=zeros ( 2 );
87
88                NorRNG.sample_vector ( 4,et );
89                NorRNG.sample_vector ( 2,wt );
90                xt = fxu.eval ( xt,ut ) + Q.sqrt_mult ( et );
91                dt = hxu.eval ( xt,ut ) + R.sqrt_mult ( wt );
92
93                //estimator
94                KFE.bayes ( concat ( dt,ut ) );
95                M.bayes ( concat ( dt,ut ) );
96
97                Xt.set_col ( t,xt );
98                XtE.set_col ( t,KFEep.mean() );
99                XtM.set_col ( t,Mep.mean() );
100        }
101
102        it_file fou ( "pmsm.it" );
103
104        fou << Name ( "xth" ) << Xt;
105        fou << Name ( "xthE" ) << XtE;
106        fou << Name ( "xthM" ) << XtM;
107        //Exit program:
108        return 0;
109
110}
Note: See TracBrowser for help on using the browser.