root/pmsm/sim.cpp @ 217

Revision 217, 3.1 kB (checked in by smidl, 15 years ago)

sim

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 <stat/loggers.h>
19
20#include "pmsm.h"
21#include "simulator.h"
22#include "sim_profiles.h"
23
24using namespace itpp;
25int main() {
26        // Kalman filter
27        int Ndat = 9000;
28        double h = 1e-6;
29        int Nsimstep = 125;
30        int Npart = 50;
31       
32        dirfilelog L("exp/pmsm_sim2",Ndat);
33       
34        // internal model
35        IMpmsm fxu;
36        //                  Rs    Ls        dt           Fmag(Ypm) kp   p    J     Bf(Mz)
37        fxu.set_parameters ( 0.28, 0.003465, Nsimstep*h, 0.1989,   1.5 ,4.0, 0.04, 0.0 );
38        // observation model
39        OMpmsm hxu;
40
41        vec mu0= "0.0 0.0 0.0 0.0";
42//      vec Qdiag ( "0.01 0.01 0.01 0.0001" ); //zdenek: 0.01 0.01 0.0001 0.0001
43        vec Qdiag ( "0.07 0.056 0.0007 0.0007" ); //zdenek: 0.01 0.01 0.0001 0.0001
44        vec Rdiag ( "0.005 0.005" ); //var(diff(xth)) = "0.034 0.034"
45        EKFfull KFE ( rx,ry,ru );
46        KFE.set_est ( mu0, diag ( vec("1 1 1 3.1415") )  );
47        KFE.set_parameters ( &fxu,&hxu,diag(Qdiag),diag(Rdiag));
48       
49       
50        int X_log = L.add(rx,"X");
51        int Xp_log = L.add(rx,"Xp");
52        int Xp2_log = L.add(rx,"Xp2");
53        int E_log = L.add(rx,"E");
54        int V_log = L.add(rx,"V");
55        int U_log = L.add(ru,"U");
56        int U2_log = L.add(ru,"U2");
57        int R_log = L.add(RV("{_ }","4"),"R");
58//      int O_log = L.add(RV("{_ }","16"),"O");
59        L.init();
60
61        // SET SIMULATOR
62        //pmsmsim_set_parameters ( 0.28,0.003465,0.1989,0.0,4,1.5,0.04, 200., 3e-6, h );
63        pmsmsim_set_parameters ( 0.28,0.003465,0.1989,0.0,4,1.5,0.04, 200., 0.0*3e-6, h );
64        double Ww=0.0;
65        vec dt ( 2 );
66
67        vec xm = zeros(4);
68        vec xt = zeros(4);
69        vec xp = zeros(4);
70        vec xp2 = zeros(4);
71        vec xp3 = zeros(4);
72        vec u=zeros(2);
73        vec u2=zeros(2);
74        ldmat R(eye(4),0.001*ones(4));
75        mat Ch=zeros(4,4);
76        fsqmat eCh(4);
77        for ( int tK=1;tK<Ndat;tK++ ) {
78                //Number of steps of a simulator for one step of Kalman
79                for ( int ii=0; ii<Nsimstep;ii++ ) {
80                        //simulator
81                        //sim_profile_steps1(Ww);
82                        sim_profile_2slowrevs(Ww);
83                        pmsmsim_step ( Ww );
84                };
85               
86                u(0)= KalmanObs[0];
87                u(1)= KalmanObs[1];
88                dt(0)= KalmanObs[2];
89                dt(1)= KalmanObs[3];
90                u2(0) = KalmanObs[4];
91                u2(1) = KalmanObs[5];
92                // Try what our model would predict!
93                xp=fxu.eval(xm,u); 
94                xp2=fxu.eval(xm,u2); 
95                xp3=fxu.eval(xm,u2); 
96
97//              KFE.bayes(concat(dt,u));
98                // This is simulator prediction
99                xt=vec(x,4); //vec from C-array
100                //Covariance 
101                R*=0.7;
102                R.opupdt(xt-xp2,1.0);
103                Ch = diag(sqrt(R._D()))*R._L();
104                //eCh = KFE._e()->_R();
105                eCh = KFE._R();
106                xm = xt;
107                L.logit(X_log, xt       ); 
108                L.logit(Xp_log, xp      ); 
109                L.logit(Xp2_log, xp2    ); 
110                L.logit(U_log, u        ); 
111                L.logit(U2_log, u2      ); 
112                L.logit(R_log, diag(Ch.T()*Ch) ); //3.33=1/(1-0.7)
113                L.logit(V_log, diag(eCh.to_mat()) ); //3.33=1/(1-0.7)
114//              L.logit(E_log, KFE._e()->mean() );
115//              L.logit(O_log, vec(iCh._data(),16)); //3.33=1/(1-0.7)
116//              L.logit(Efix_log, KFEep.mean() );
117//              L.logit(M_log,  Mep.mean() );
118               
119                L.step();
120        }
121
122        L.finalize(); 
123        L.itsave("xxx.it");
124        return 0;
125}
Note: See TracBrowser for help on using the browser.