root/pmsm/sim.cpp @ 221

Revision 218, 3.3 kB (checked in by smidl, 16 years ago)

navrat simulatoru + zmeny v pmsm

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