root/pmsm/mpf_u_delta.cpp @ 223

Revision 223, 3.9 kB (checked in by smidl, 15 years ago)

new experiment in pmsm

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
25//!Extended Kalman filter with unknown \c Q
26class EKFCh_cond : public EKFCh , public BMcond {
27public:
28        //! Default constructor
29        EKFCh_cond ( RV rx, RV ry,RV ru,RV rC ) :EKFCh ( rx,ry,ru ),BMcond ( rC ) {};
30        void condition ( const vec &val ) {
31                pfxu->condition( val );
32        };
33};
34
35class IMpmsm_delta :  public IMpmsm {
36        protected:
37                vec ud;
38        public:
39                IMpmsm_delta() :IMpmsm(),ud(2) {};
40        //! Set mechanical and electrical variables
41
42                void condition(const vec &val){ud = val;}
43                vec eval ( const vec &x0, const vec &u0 ) {
44                // last state
45                        double iam = x0 ( 0 );
46                        double ibm = x0 ( 1 );
47                        double omm = x0 ( 2 );
48                        double thm = x0 ( 3 );
49                        double uam = u0 ( 0 );
50                        double ubm = u0 ( 1 );
51
52                        vec xk=zeros ( 4 );
53                //ia
54                        xk ( 0 ) = ( 1.0- Rs/Ls*dt ) * iam + Ypm/Ls*dt*omm * sin ( thm ) + (uam+ud(0))*dt/Ls;
55                //ib
56                        xk ( 1 ) = ( 1.0- Rs/Ls*dt ) * ibm - Ypm/Ls*dt*omm * cos ( thm ) + (ubm+ud(1))*dt/Ls;
57                //om
58                        xk ( 2 ) = omm + kp*p*p * Ypm/J*dt* ( ibm * cos ( thm )-iam * sin ( thm ) ) - p/J*dt*Mz;
59                //th
60                        xk ( 3 ) = thm + omm*dt; // <0..2pi>
61                        if ( xk ( 3 ) >pi ) xk ( 3 )-=2*pi;
62                        if ( xk ( 3 ) <-pi ) xk ( 3 ) +=2*pi;
63                        return xk;
64                }
65
66};
67
68
69int main() {
70        // Kalman filter
71        int Ndat = 9000;
72        double h = 1e-6;
73        int Nsimstep = 125;
74        int Npart = 200;
75
76        // internal model
77        IMpmsm_delta fxu;
78        //                  Rs    Ls        dt       Fmag(Ypm)    kp   p    J     Bf(Mz)
79        fxu.set_parameters ( 0.28, 0.003465, Nsimstep*h, 0.1989, 1.5 ,4.0, 0.04, 0.0 );
80        // observation model
81        OMpmsm hxu;
82
83        vec mu0= "0.0 0.0 0.0 0.0";
84        vec Qdiag ( "0.6 0.6 0.001 0.000001" ); //zdenek: 0.01 0.01 0.0001 0.0001
85        vec Rdiag ( "1e-8 1e-8" ); //var(diff(xth)) = "0.034 0.034"
86        chmat Q ( Qdiag );
87        chmat R ( Rdiag );
88        EKFCh KFE ( rx,ry,ru );
89        KFE.set_parameters ( &fxu,&hxu,Q,R );
90        KFE.set_est ( mu0, chmat ( zeros ( 4 ) ) );
91
92        RV rUd ( "{ud }", "2" );
93        EKFCh_cond KFEp ( rx,ry,ru,rUd );
94        KFEp.set_parameters ( &fxu,&hxu,Q,R );
95        KFEp.set_est ( mu0, chmat ( zeros ( 4 ) ) );
96
97        mlnorm<ldmat> evolUd ( rUd,rUd );
98        MPF<EKFCh_cond> M ( rx,rUd,evolUd,evolUd,Npart,KFEp );
99        // initialize
100        vec Ud0="0 0";
101        evolUd.set_parameters ( eye(2), vec_2(0.0,0.0), ldmat(eye(2)) ); 
102        evolUd.condition (Ud0 );
103        epdf& pfinit=evolUd._epdf();
104        M.set_est ( pfinit );
105        evolUd.set_parameters ( eye(2), vec_2(0.0,0.0), ldmat(0.1*eye(2)) ); 
106       
107        mat Xt=zeros ( Ndat ,4 ); //true state from simulator
108        mat Dt=zeros ( Ndat,2+2 ); //observation
109        mat XtE=zeros ( Ndat, 4 );
110        mat Qtr=zeros ( Ndat, 4 );
111        mat XtM=zeros ( Ndat,2+4 ); //W + x
112
113        // SET SIMULATOR
114        pmsmsim_set_parameters ( 0.28,0.003465,0.1989,0.0,4,1.5,0.04, 200., 3e-6, h );
115        vec dt ( 2 );
116        vec ut ( 2 );
117        vec xt ( 4 );
118        vec xtm=zeros(4);
119        double Ww=0.0;
120        vec vecW="1 2 4 9 4 2 0 -4 -9 -16 -4 0 0 0";
121        vecW*=10.0;
122
123        for ( int tK=1;tK<Ndat;tK++ ) {
124                //Number of steps of a simulator for one step of Kalman
125                for ( int ii=0; ii<Nsimstep;ii++ ) {
126                        //simulator
127                        sim_profile_vec01t(Ww,vecW);
128                        pmsmsim_step ( Ww );
129                };
130                ut(0) = KalmanObs[0];
131                ut(1) = KalmanObs[1];
132                dt(0) = KalmanObs[2];
133                dt(1) = KalmanObs[3];
134                xt = vec(x,4);
135               
136                //estimator
137                KFE.bayes ( concat ( dt,ut ) );
138                M.bayes ( concat ( dt,ut ) );
139
140                Xt.set_row ( tK, xt); //vec from C-array
141                Dt.set_row ( tK, concat ( dt,ut));
142                Qtr.set_row ( tK, Qdiag);
143                XtE.set_row ( tK,KFE._e()->mean() );
144                XtM.set_row ( tK,M._e()->mean() );
145        }
146
147        it_file fou ( "mpf_u_delta.it" );
148
149        fou << Name ( "xth" ) << Xt;
150        fou << Name ( "Dt" ) << Dt;
151        fou << Name ( "Qtr" ) << Qtr;
152        fou << Name ( "xthE" ) << XtE;
153        fou << Name ( "xthM" ) << XtM;
154        //Exit program:
155
156        return 0;
157}
Note: See TracBrowser for help on using the browser.