root/pmsm/mpf_u_delta.cpp @ 232

Revision 232, 5.1 kB (checked in by smidl, 15 years ago)

test 2 order Taylor

RevLine 
[223]1/*!
2  \file
3  \brief TR 2525 file for testing Toy Problem of mpf for Covariance Estimation
4  \author Vaclav Smidl.
5
[224]6  \ingroup PMSM
7
[223]8  -----------------------------------
9  BDM++ - C++ library for Bayesian Decision Making under Uncertainty
10
11  Using IT++ for numerical operations
12  -----------------------------------
13*/
14
15
16#include <itpp/itbase.h>
17#include <estim/libKF.h>
18#include <estim/libPF.h>
19#include <stat/libFN.h>
20
21#include "pmsm.h"
22#include "simulator.h"
23#include "sim_profiles.h"
24
25using namespace itpp;
26
[230]27//!Extended Kalman filter with unknown \c Q and delta u
28class EKFCh_du_kQ : public EKFCh , public BMcond {
29        chmat Qref;
[223]30public:
31        //! Default constructor
[230]32        EKFCh_du_kQ ( RV rx, RV ry,RV ru,RV rC ) :EKFCh ( rx,ry,ru ),BMcond ( rC ),Qref(rx.count()) {};
33        void set_ref(const chmat &Qref0){Qref=Qref0;}
[223]34        void condition ( const vec &val ) {
[230]35                pfxu->condition ( val.left(2) );
36               
37                Q = Qref*std::abs(val(2));
38                preA.set_submatrix ( dimy+dimx,dimy,Q._Ch() );
[223]39        };
40};
41
42class IMpmsm_delta :  public IMpmsm {
[226]43protected:
44        vec ud;
45public:
46        IMpmsm_delta() :IMpmsm(),ud ( 2 ) {ud=zeros ( 2 );};
[223]47        //! Set mechanical and electrical variables
48
[226]49        void condition ( const vec &val ) {ud = val;}
50        vec eval ( const vec &x0, const vec &u0 ) {
[223]51                // last state
[226]52                double iam = x0 ( 0 );
53                double ibm = x0 ( 1 );
54                double omm = x0 ( 2 );
55                double thm = x0 ( 3 );
56                double uam = u0 ( 0 );
57                double ubm = u0 ( 1 );
[223]58
[226]59                vec xk=zeros ( 4 );
[223]60                //ia
[226]61                xk ( 0 ) = ( 1.0- Rs/Ls*dt ) * iam + Ypm/Ls*dt*omm * sin ( thm ) + ( uam+ud ( 0 ) ) *dt/Ls;
[223]62                //ib
[226]63                xk ( 1 ) = ( 1.0- Rs/Ls*dt ) * ibm - Ypm/Ls*dt*omm * cos ( thm ) + ( ubm+ud ( 1 ) ) *dt/Ls;
[223]64                //om
[226]65                xk ( 2 ) = omm + kp*p*p * Ypm/J*dt* ( ibm * cos ( thm )-iam * sin ( thm ) ) - p/J*dt*Mz;
[223]66                //th
[226]67                xk ( 3 ) = thm + omm*dt; // <0..2pi>
68                if ( xk ( 3 ) >pi ) xk ( 3 )-=2*pi;
69                if ( xk ( 3 ) <-pi ) xk ( 3 ) +=2*pi;
70                return xk;
71        }
[223]72
73};
74
75
76int main() {
77        // Kalman filter
78        int Ndat = 9000;
79        double h = 1e-6;
80        int Nsimstep = 125;
[230]81        int Npart = 20;
[223]82
[226]83        mat Rnoise = randn ( 2,Ndat );
84
[223]85        // internal model
[232]86        IMpmsm2o fxu0;
[223]87        IMpmsm_delta fxu;
88        //                  Rs    Ls        dt       Fmag(Ypm)    kp   p    J     Bf(Mz)
89        fxu.set_parameters ( 0.28, 0.003465, Nsimstep*h, 0.1989, 1.5 ,4.0, 0.04, 0.0 );
[226]90        fxu0.set_parameters ( 0.28, 0.003465, Nsimstep*h, 0.1989, 1.5 ,4.0, 0.04, 0.0 );
[223]91        // observation model
92        OMpmsm hxu;
93
94        vec mu0= "0.0 0.0 0.0 0.0";
[226]95        vec Qdiag ( "0.4 0.4 0.001 0.000001" ); //zdenek: 0.01 0.01 0.0001 0.0001
[232]96        vec Rdiag ( "0.1 0.1" ); //var(diff(xth)) = "0.034 0.034"
[223]97        chmat Q ( Qdiag );
[232]98        mat Q2o=diag(Qdiag);
[223]99        chmat R ( Rdiag );
[232]100        EKFCh KFE ( rx,ry,rU );
[226]101        KFE.set_parameters ( &fxu0,&hxu,Q,R );
102        KFE.set_est ( mu0, chmat ( ones ( 4 ) ) );
[223]103
[230]104        RV rUd ( "{ud k}", "2 1" );
105        EKFCh_du_kQ KFEp ( rx,ry,ru,rUd );
[223]106        KFEp.set_parameters ( &fxu,&hxu,Q,R );
[230]107        KFEp.set_ref(Q);
[226]108        KFEp.set_est ( mu0, chmat ( ones ( 4 ) ) );
[223]109
110        mlnorm<ldmat> evolUd ( rUd,rUd );
[230]111        MPF<EKFCh_du_kQ> M ( rx,rUd,evolUd,evolUd,Npart,KFEp );
[223]112        // initialize
[232]113        vec Ud0="0 0 100.0";
114        evolUd.set_parameters ( eye ( 3 ), zeros(3), ldmat ( vec( "1 1 10" )));
[226]115        evolUd.condition ( Ud0 );
[223]116        epdf& pfinit=evolUd._epdf();
117        M.set_est ( pfinit );
[232]118        evolUd.set_parameters ( eye ( 3 ), zeros(3), ldmat ( vec(" 9e-8 9e-8 9e-7" )));
[226]119
[223]120        mat Xt=zeros ( Ndat ,4 ); //true state from simulator
[226]121        mat Dt=zeros ( Ndat,2+2+2 ); //observation
[223]122        mat XtE=zeros ( Ndat, 4 );
123        mat Qtr=zeros ( Ndat, 4 );
[230]124        mat XtM=zeros ( Ndat, 3+4 ); //W + x
[226]125        mat XtMTh=zeros ( Ndat,1 );
[223]126
127        // SET SIMULATOR
128        pmsmsim_set_parameters ( 0.28,0.003465,0.1989,0.0,4,1.5,0.04, 200., 3e-6, h );
129        vec dt ( 2 );
[232]130        vec ut ( 4 );
131        vec utm ( 4 );
[223]132        vec xt ( 4 );
[226]133        vec xtm=zeros ( 4 );
[223]134        double Ww=0.0;
[226]135        vec vecW="1 2 4 8 4 2 0 -4 -9 -16 -4 0 0 0";
[223]136        vecW*=10.0;
137
138        for ( int tK=1;tK<Ndat;tK++ ) {
139                //Number of steps of a simulator for one step of Kalman
140                for ( int ii=0; ii<Nsimstep;ii++ ) {
141                        //simulator
[226]142                        sim_profile_vec01t ( Ww,vecW );
[223]143                        pmsmsim_step ( Ww );
144                };
[226]145                ut ( 0 ) = KalmanObs[0];
146                ut ( 1 ) = KalmanObs[1];
[232]147                ut ( 2 ) = utm(0)-ut(0);
148                ut ( 3 ) = utm(1)-ut(1);
[226]149                dt ( 0 ) = KalmanObs[2]+0.3*Rnoise ( 0,t );
150                dt ( 1 ) = KalmanObs[3]+0.3*Rnoise ( 1,t );
151                xt = vec ( x,4 );
152
[232]153                utm =ut;
154               
155                Q2o*=0.9;
156                Q2o+=outer_product(x2o_dbg,x2o_dbg);
[223]157                //estimator
158                KFE.bayes ( concat ( dt,ut ) );
[232]159                for (int ii=0; ii<Npart; ii++){dynamic_cast<EKFCh_du_kQ*>(M._BM(ii))->set_ref(chmat(Q2o));}
[223]160                M.bayes ( concat ( dt,ut ) );
161
[226]162                Xt.set_row ( tK, xt ); //vec from C-array
[232]163                Dt.set_row ( tK, concat ( dt,ut.left(2), vec_2 ( KalmanObs[4],KalmanObs[5] ) ) );
[226]164                Qtr.set_row ( tK, Qdiag );
[223]165                XtE.set_row ( tK,KFE._e()->mean() );
166                XtM.set_row ( tK,M._e()->mean() );
[226]167                // correction for theta
168
169                {
170                        double sumSin=0.0;
171                        double sumCos=0.0;
172                        vec mea ( 4 );
173                        vec* _w;
174
175                        for ( int p=0; p<Npart;p++ ) {
176                                mea = M._BM ( p )->_e()->mean();
177                                _w = M.__w();
178                                sumSin += ( *_w ) ( p ) *sin ( mea ( 3 ) );
179                                sumCos += ( *_w ) ( p ) *cos ( mea ( 3 ) );
180                        }
181                        double Th = atan2 ( sumSin, sumCos );
182
183                        XtMTh.set_row ( tK,vec_1 ( Th ) );
184                }
185
[223]186        }
187
188        it_file fou ( "mpf_u_delta.it" );
189
190        fou << Name ( "xth" ) << Xt;
191        fou << Name ( "Dt" ) << Dt;
192        fou << Name ( "Qtr" ) << Qtr;
193        fou << Name ( "xthE" ) << XtE;
194        fou << Name ( "xthM" ) << XtM;
[226]195        fou << Name ( "xthMTh" ) << XtMTh;
[223]196        //Exit program:
197
198        return 0;
199}
Note: See TracBrowser for help on using the browser.