Changeset 679 for library/bdm/estim/kalman.cpp
- Timestamp:
- 10/23/09 00:05:25 (15 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
library/bdm/estim/kalman.cpp
r653 r679 8 8 9 9 10 void KalmanFull::bayes ( const vec &dt ) { 11 bdm_assert_debug ( dt.length() == ( dimy + dimu ), "KalmanFull::bayes wrong size of dt" ); 12 13 vec u = dt.get ( dimy, dimy + dimu - 1 ); 14 vec y = dt.get ( 0, dimy - 1 ); 15 vec& mu = est->_mu(); 16 mat &P = est->_R(); 10 void KalmanFull::bayes ( const vec &yt, const vec &cond ) { 11 bdm_assert_debug ( yt.length() == ( dimy ), "KalmanFull::bayes wrong size of dt" ); 12 13 const vec &u = cond; // in this case cond=ut 14 const vec &y = yt; 15 16 vec& mu = est._mu(); 17 mat &P = est._R(); 17 18 mat& _Ry = fy._R(); 18 19 vec& yp = fy._mu(); … … 42 43 phxu = phxu0; 43 44 44 dimx = pfxu0->_dimx();45 set_dim( pfxu0->_dimx()); 45 46 dimy = phxu0->dimension(); 46 dim u= pfxu0->_dimu();47 est ->set_parameters( zeros(dimx), eye(dimx) );48 49 A.set_size ( dim x, dimx);50 C.set_size ( dimy, dim x);47 dimc = pfxu0->_dimu(); 48 est.set_parameters( zeros(dimension()), eye(dimension()) ); 49 50 A.set_size ( dimension(), dimension() ); 51 C.set_size ( dimy, dimension() ); 51 52 //initialize matrices A C, later, these will be only updated! 52 pfxu->dfdx_cond ( est ->_mu(), zeros ( dimu), A, true );53 pfxu->dfdx_cond ( est._mu(), zeros ( dimc ), A, true ); 53 54 B.clear(); 54 phxu->dfdx_cond ( est ->_mu(), zeros ( dimu), C, true );55 phxu->dfdx_cond ( est._mu(), zeros ( dimc ), C, true ); 55 56 D.clear(); 56 57 … … 59 60 } 60 61 61 void EKFfull::bayes ( const vec &dt ) { 62 bdm_assert_debug ( dt.length() == ( dimy + dimu ), "EKFull::bayes wrong size of dt" ); 63 64 vec u = dt.get ( dimy, dimy + dimu - 1 ); 65 vec y = dt.get ( 0, dimy - 1 ); 66 vec &mu = est->_mu(); 67 mat &P = est->_R(); 62 void EKFfull::bayes ( const vec &yt, const vec &cond) { 63 bdm_assert_debug ( yt.length() == ( dimy ), "EKFull::bayes wrong size of dt" ); 64 bdm_assert_debug ( cond.length() == ( dimc ), "EKFull::bayes wrong size of dt" ); 65 66 const vec &u = cond; 67 const vec &y = yt; //lazy to change it 68 vec &mu = est._mu(); 69 mat &P = est._R(); 68 70 mat& _Ry = fy._R(); 69 71 vec& yp = fy._mu(); 70 72 71 pfxu->dfdx_cond ( mu, zeros ( dim u), A, true );72 phxu->dfdx_cond ( mu, zeros ( dim u), C, true );73 pfxu->dfdx_cond ( mu, zeros ( dimc ), A, true ); 74 phxu->dfdx_cond ( mu, zeros ( dimc ), C, true ); 73 75 74 76 //Time update … … 94 96 ( ( StateSpace<chmat>* ) this )->set_parameters ( A0, B0, C0, D0, Q0, R0 ); 95 97 96 _K=zeros(dimx,dimy); 97 // Cholesky special! 98 initialize(); 98 _K=zeros(dimension(),dimy); 99 99 } 100 100 101 101 void KalmanCh::initialize(){ 102 preA = zeros ( dimy + dim x + dimx, dimy + dimx);102 preA = zeros ( dimy + dimension() + dimension(), dimy + dimension() ); 103 103 // preA.clear(); 104 104 preA.set_submatrix ( 0, 0, R._Ch() ); 105 preA.set_submatrix ( dimy + dimx, dimy, Q._Ch() ); 106 } 107 108 void KalmanCh::bayes ( const vec &dt ) { 109 110 vec u = dt.get ( dimy, dimy + dimu - 1 ); 111 vec y = dt.get ( 0, dimy - 1 ); 105 preA.set_submatrix ( dimy + dimension(), dimy, Q._Ch() ); 106 } 107 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 112 const vec &u = cond; 113 const vec &y = yt; 112 114 vec pom ( dimy ); 113 115 114 chmat &_P=est ->_R();115 vec &_mu = est ->_mu();116 mat _K(dim x,dimy);116 chmat &_P=est._R(); 117 vec &_mu = est._mu(); 118 mat _K(dimension(),dimy); 117 119 chmat &_Ry=fy._R(); 118 120 vec &_yp = fy._mu(); … … 130 132 131 133 ( _Ry._Ch() ) = postA ( 0, dimy - 1, 0, dimy - 1 ); 132 _K = inv ( A ) * ( postA ( 0, dimy - 1 , dimy, dimy + dim x- 1 ) ).T();133 ( _P._Ch() ) = postA ( dimy, dimy + dim x - 1, dimy, dimy + dimx- 1 );134 _K = inv ( A ) * ( postA ( 0, dimy - 1 , dimy, dimy + dimension() - 1 ) ).T(); 135 ( _P._Ch() ) = postA ( dimy, dimy + dimension() - 1, dimy, dimy + dimension() - 1 ); 134 136 135 137 _mu = A * ( _mu ) + B * u; … … 154 156 phxu = phxu0; 155 157 156 dimx = pfxu0->dimension();158 set_dim( pfxu0->_dimx()); 157 159 dimy = phxu0->dimension(); 158 dim u= pfxu0->_dimu();159 160 vec &_mu = est ->_mu();160 dimc = pfxu0->_dimu(); 161 162 vec &_mu = est._mu(); 161 163 // if mu is not set, set it to zeros, just for constant terms of A and C 162 if ( _mu.length() != dim x ) _mu = zeros ( dimx);163 A = zeros ( dim x, dimx);164 C = zeros ( dimy, dim x);165 preA = zeros ( dimy + dim x + dimx, dimy + dimx);164 if ( _mu.length() != dimension() ) _mu = zeros ( dimension() ); 165 A = zeros ( dimension(), dimension() ); 166 C = zeros ( dimy, dimension() ); 167 preA = zeros ( dimy + dimension() + dimension(), dimy + dimension() ); 166 168 167 169 //initialize matrices A C, later, these will be only updated! 168 pfxu->dfdx_cond ( _mu, zeros ( dim u), A, true );170 pfxu->dfdx_cond ( _mu, zeros ( dimc ), A, true ); 169 171 // pfxu->dfdu_cond ( *_mu,zeros ( dimu ),B,true ); 170 172 B.clear(); 171 phxu->dfdx_cond ( _mu, zeros ( dim u), C, true );173 phxu->dfdx_cond ( _mu, zeros ( dimc ), C, true ); 172 174 // phxu->dfdu_cond ( *_mu,zeros ( dimu ),D,true ); 173 175 D.clear(); … … 179 181 preA.clear(); 180 182 preA.set_submatrix ( 0, 0, R._Ch() ); 181 preA.set_submatrix ( dimy + dim x, dimy, Q._Ch() );182 } 183 184 185 void EKFCh::bayes ( const vec & dt) {183 preA.set_submatrix ( dimy + dimension(), dimy, Q._Ch() ); 184 } 185 186 187 void EKFCh::bayes ( const vec &yt, const vec &cond ) { 186 188 187 189 vec pom ( dimy ); 188 vec u = dt.get ( dimy, dimy + dimu - 1 );189 vec y = dt.get ( 0, dimy - 1 );190 vec &_mu = est ->_mu();191 chmat &_P = est ->_R();190 const vec &u = cond; 191 const vec &y = yt; 192 vec &_mu = est._mu(); 193 chmat &_P = est._R(); 192 194 chmat &_Ry = fy._R(); 193 195 vec &_yp = fy._mu(); … … 211 213 212 214 ( _Ry._Ch() ) = postA ( 0, dimy - 1, 0, dimy - 1 ); 213 _K = inv ( A ) * ( postA ( 0, dimy - 1 , dimy, dimy + dim x- 1 ) ).T();214 ( _P._Ch() ) = postA ( dimy, dimy + dim x - 1, dimy, dimy + dimx- 1 );215 _K = inv ( A ) * ( postA ( 0, dimy - 1 , dimy, dimy + dimension() - 1 ) ).T(); 216 ( _P._Ch() ) = postA ( dimy, dimy + dimension() - 1, dimy, dimy + dimension() - 1 ); 215 217 216 218 // mat iRY = inv(_Ry->to_mat()); … … 268 270 //connect 269 271 shared_ptr<RV> drv = UI::build<RV> ( set, "drv", UI::compulsory ); 270 set_ drv ( *drv );272 set_yrv ( *drv ); 271 273 shared_ptr<RV> rv = UI::build<RV> ( set, "rv", UI::compulsory ); 272 274 set_rv ( *rv ); … … 282 284 283 285 set_parameters ( A ); 284 set_ drv ( A ( 0 )->_drv() );286 set_yrv ( A ( 0 )->_yrv() ); 285 287 //set_rv(A(0)->_rv()); 286 288