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 <stat/libFN.h> |
---|
15 | #include <estim/ekf_templ.h> |
---|
16 | #include <stat/loggers.h> |
---|
17 | |
---|
18 | //include dopravni model |
---|
19 | #include "model.h" |
---|
20 | |
---|
21 | using namespace itpp; |
---|
22 | |
---|
23 | int main() { |
---|
24 | // Pocet dat |
---|
25 | int Ndat = 900; |
---|
26 | |
---|
27 | // Objekt pro ukladani vysledku |
---|
28 | memlog L(Ndat); |
---|
29 | |
---|
30 | //model vyvoje stavu |
---|
31 | IMk1 fxu; |
---|
32 | fxu.set_parameters (0.5, 0.5); // pokud nejake budou |
---|
33 | |
---|
34 | //model pozorovani |
---|
35 | OMk1 hxu; |
---|
36 | //hxu.set_parameters (); // odkomentovat pokud budou |
---|
37 | |
---|
38 | // ESTIMATOR --- EKF |
---|
39 | vec mu0= "0.0 0.0 0.0 0.0"; |
---|
40 | // Priprava covariancnich matic pro EKF |
---|
41 | vec Qdiag ( "1.0 10. 10 10" ); |
---|
42 | vec Rdiag ( "1 1" ); //var(diff(xth)) = "0.034 0.034" |
---|
43 | mat Q =diag( Qdiag ); |
---|
44 | mat R =diag ( Rdiag ); |
---|
45 | EKFfull Efix ( RVstav,RVpozor,RVut ); |
---|
46 | // pocatecni podminky |
---|
47 | Efix.set_est ( mu0, 1*eye ( 4 ) ); // nulova |
---|
48 | // nastaveni modelu pro EKF |
---|
49 | Efix.set_parameters ( &fxu,&hxu,Q,R); |
---|
50 | |
---|
51 | int L_xt = L.add(RVstav, "xt"); // Tady se rika jak velky vektor (pomoci obj. RV) se bude logovat |
---|
52 | // A jak se bude jsmenovat vysledek |
---|
53 | int L_ut = L.add(RVut, "ut"); // Tady se rika jak velky vektor (pomoci obj. RV) se bude logovat |
---|
54 | // A jak se bude jsmenovat vysledek |
---|
55 | int L_mean = L.add(RVstav, "odh_xt"); // Tady se rika jak velky vektor (pomoci obj. RV) se bude logovat |
---|
56 | // A jak se bude jsmenovat vysledek |
---|
57 | |
---|
58 | L.init(); // <<==== allocate memory for results |
---|
59 | // Priprava poli pro simulaci |
---|
60 | vec ut(RVut.count()); |
---|
61 | vec xt(RVstav.count()); |
---|
62 | vec dt(RVpozor.count()); |
---|
63 | // minuly stav |
---|
64 | vec xtm=zeros(RVstav.count()); // nulovy pocatecni stav |
---|
65 | for ( int t=1;t<Ndat;t++ ) { |
---|
66 | // Nastaveni vstupu |
---|
67 | ut(0) = 1+sin((double)t/10); // V ut jsou same jednicky |
---|
68 | ut(1) = 1+cos((double)t/10); // V ut jsou same jednicky |
---|
69 | |
---|
70 | // Generovani DAT modelem |
---|
71 | xt = fxu.eval(xtm,ut); |
---|
72 | dt = hxu.eval(xt,ut); |
---|
73 | xtm = xt; //save xt for the next step |
---|
74 | |
---|
75 | //ESTIMATE |
---|
76 | Efix.bayes(concat(dt,ut)); |
---|
77 | |
---|
78 | //LOG results |
---|
79 | L.logit(L_mean, Efix._epdf().mean() ); |
---|
80 | L.logit(L_xt, xt ); |
---|
81 | L.logit(L_ut, ut ); |
---|
82 | |
---|
83 | L.step(); |
---|
84 | } |
---|
85 | L.finalize(); |
---|
86 | L.itsave("k1.it"); |
---|
87 | return 0; |
---|
88 | } |
---|