Changeset 737 for library/bdm/estim/kalman.cpp
- Timestamp:
- 11/25/09 12:14:38 (14 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
library/bdm/estim/kalman.cpp
r686 r737 13 13 const vec &u = cond; // in this case cond=ut 14 14 const vec &y = yt; 15 15 16 16 vec& mu = est._mu(); 17 17 mat &P = est._R(); … … 20 20 //Time update 21 21 mu = A * mu + B * u; 22 P = A * P * A.transpose() + ( mat)Q;22 P = A * P * A.transpose() + ( mat ) Q; 23 23 24 24 //Data update 25 _Ry = C * P * C.transpose() + ( mat)R;25 _Ry = C * P * C.transpose() + ( mat ) R; 26 26 _K = P * C.transpose() * inv ( _Ry ); 27 27 P -= _K * C * P; // P = P -KCP; … … 30 30 31 31 if ( evalll ) { 32 ll =fy.evallog(y);32 ll = fy.evallog ( y ); 33 33 } 34 34 }; … … 43 43 phxu = phxu0; 44 44 45 set_dim ( pfxu0->_dimx());45 set_dim ( pfxu0->_dimx() ); 46 46 dimy = phxu0->dimension(); 47 47 dimc = pfxu0->_dimu(); 48 est.set_parameters ( zeros(dimension()), eye(dimension()) );48 est.set_parameters ( zeros ( dimension() ), eye ( dimension() ) ); 49 49 50 50 A.set_size ( dimension(), dimension() ); … … 60 60 } 61 61 62 void EKFfull::bayes ( const vec &yt, const vec &cond ) {62 void EKFfull::bayes ( const vec &yt, const vec &cond ) { 63 63 bdm_assert_debug ( yt.length() == ( dimy ), "EKFull::bayes wrong size of dt" ); 64 64 bdm_assert_debug ( cond.length() == ( dimc ), "EKFull::bayes wrong size of dt" ); 65 65 66 66 const vec &u = cond; 67 67 const vec &y = yt; //lazy to change it … … 70 70 mat& _Ry = fy._R(); 71 71 vec& yp = fy._mu(); 72 72 73 73 pfxu->dfdx_cond ( mu, zeros ( dimc ), A, true ); 74 74 phxu->dfdx_cond ( mu, zeros ( dimc ), C, true ); … … 76 76 //Time update 77 77 mu = pfxu->eval ( mu, u );// A*mu + B*u; 78 P = A * P * A.transpose() + ( mat)Q;78 P = A * P * A.transpose() + ( mat ) Q; 79 79 80 80 //Data update 81 _Ry = C * P * C.transpose() + ( mat)R;81 _Ry = C * P * C.transpose() + ( mat ) R; 82 82 _K = P * C.transpose() * inv ( _Ry ); 83 83 P -= _K * C * P; // P = P -KCP; … … 86 86 87 87 if ( BM::evalll ) { 88 ll =fy.evallog(y);88 ll = fy.evallog ( y ); 89 89 } 90 90 }; … … 95 95 96 96 ( ( StateSpace<chmat>* ) this )->set_parameters ( A0, B0, C0, D0, Q0, R0 ); 97 98 _K =zeros(dimension(),dimy);99 } 100 101 void KalmanCh::initialize() {97 98 _K = zeros ( dimension(), dimy ); 99 } 100 101 void KalmanCh::initialize() { 102 102 preA = zeros ( dimy + dimension() + dimension(), dimy + dimension() ); 103 103 // preA.clear(); … … 107 107 108 108 void KalmanCh::bayes ( const vec &yt, const vec &cond ) { 109 bdm_assert_debug (yt.length()==dimy, "yt mismatch");110 bdm_assert_debug (cond.length()==dimc, "yt mismatch");111 109 bdm_assert_debug ( yt.length() == dimy, "yt mismatch" ); 110 bdm_assert_debug ( cond.length() == dimc, "yt mismatch" ); 111 112 112 const vec &u = cond; 113 113 const vec &y = yt; 114 114 vec pom ( dimy ); 115 115 116 chmat &_P =est._R();116 chmat &_P = est._R(); 117 117 vec &_mu = est._mu(); 118 mat _K (dimension(),dimy);119 chmat &_Ry =fy._R();118 mat _K ( dimension(), dimy ); 119 chmat &_Ry = fy._R(); 120 120 vec &_yp = fy._mu(); 121 121 //TODO get rid of Q in qr()! … … 156 156 phxu = phxu0; 157 157 158 set_dim ( pfxu0->_dimx());158 set_dim ( pfxu0->_dimx() ); 159 159 dimy = phxu0->dimension(); 160 160 dimc = pfxu0->_dimu(); 161 161 162 162 vec &_mu = est._mu(); 163 163 // if mu is not set, set it to zeros, just for constant terms of A and C 164 if ( _mu.length() != dimension() ) _mu = zeros ( dimension() ); 164 if ( _mu.length() != dimension() ) _mu = zeros ( dimension() ); 165 165 A = zeros ( dimension(), dimension() ); 166 166 C = zeros ( dimy, dimension() ); … … 194 194 chmat &_Ry = fy._R(); 195 195 vec &_yp = fy._mu(); 196 196 197 197 pfxu->dfdx_cond ( _mu, u, A, false ); //update A by a derivative of fx 198 198 phxu->dfdx_cond ( _mu, u, C, false ); //update A by a derivative of fx … … 244 244 245 245 void EKFCh::from_setting ( const Setting &set ) { 246 BM::from_setting (set);246 BM::from_setting ( set ); 247 247 shared_ptr<diffbifn> IM = UI::build<diffbifn> ( set, "IM", UI::compulsory ); 248 248 shared_ptr<diffbifn> OM = UI::build<diffbifn> ( set, "OM", UI::compulsory );