Changeset 62 for bdm/estim/libKF.cpp
- Timestamp:
- 04/06/08 20:14:56 (16 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
bdm/estim/libKF.cpp
r51 r62 59 59 } 60 60 61 62 63 /////////////////////////////// EKFS 64 EKFfull::EKFfull ( RV rvx0, RV rvy0, RV rvu0 ) : BM ( rvx0 ) {}; 65 66 void EKFfull::set_parameters ( diffbifn* pfxu0, diffbifn* phxu0,const mat Q0,const mat R0 ) { 67 pfxu = pfxu0; 68 phxu = phxu0; 69 70 dimx = rv.count(); 71 dimy = phxu0->_dimy(); 72 dimu = phxu0->_dimu(); 73 74 A.set_size(dimx,dimx); 75 C.set_size(dimy,dimx); 76 //initialize matrices A C, later, these will be only updated! 77 pfxu->dfdx_cond ( mu,zeros ( dimu ),A,true ); 78 B.clear(); 79 phxu->dfdx_cond ( mu,zeros ( dimu ),C,true ); 80 D.clear(); 81 82 R = R0; 83 Q = Q0; 84 } 85 86 void EKFfull::bayes ( const vec &dt ) { 87 it_assert_debug ( dt.length() == ( dimy+dimu ),"KalmanFull::bayes wrong size of dt" ); 88 89 vec u = dt.get ( dimy,dimy+dimu-1 ); 90 vec y = dt.get ( 0,dimy-1 ); 91 92 pfxu->dfdx_cond ( mu,zeros ( dimu ),A,true ); 93 phxu->dfdx_cond ( mu,zeros ( dimu ),C,true ); 94 95 //Time update 96 mu = pfxu->eval(mu,u);// A*mu + B*u; 97 P = A*P*A.transpose() + Q; 98 99 //Data update 100 _Ry = C*P*C.transpose() + R; 101 _iRy = inv ( _Ry ); 102 _K = P*C.transpose() *_iRy; 103 P -= _K*C*P; // P = P -KCP; 104 vec yp = phxu->eval(mu,u); 105 mu += _K* ( y-yp ); 106 107 if ( BM::evalll ) { 108 //from enorm 109 vec x=y-yp; 110 BM::ll = -0.5* ( R.cols() * 1.83787706640935 +log ( det ( _Ry ) ) +x* ( _iRy*x ) ); 111 } 112 }; 113 114 115 61 116 void KalmanCh::set_parameters ( const mat &A0,const mat &B0,const mat &C0,const mat &D0,const chmat &R0,const chmat &Q0 ) { 62 117 … … 138 193 preA.set_submatrix ( dimy,dimy, ( _P->_Ch() ) *A.T() ); 139 194 195 // mat Sttm = _P->to_mat(); 196 140 197 // if ( !qr ( preA,Q,postA ) ) it_warning ( "QR in kalman unstable!" ); 141 198 if ( !qr ( preA,postA ) ) it_warning ( "QR in kalman unstable!" ); 142 199 143 200 ( _Ry->_Ch() ) =postA ( 0,dimy-1, 0,dimy-1 ); 144 _K = ( postA ( 0,dimy-1 ,dimy,dimy+dimx-1 ) ).T();201 _K = inv(A)*( postA ( 0,dimy-1 ,dimy,dimy+dimx-1 ) ).T(); 145 202 ( _P->_Ch() ) = postA ( dimy,dimy+dimx-1,dimy,dimy+dimx-1 ); 146 203 _Ry->inv ( *_iRy ); 147 204 fy._cached ( true ); 205 206 // mat iRY = inv(_Ry->to_mat()); 207 // mat Stt = Sttm - Sttm * C.T() * iRY * C * Sttm; 208 // mat _K2 = Stt*C.T()*inv(R.to_mat()); 209 210 // prediction 211 *_mu = pfxu->eval ( *_mu ,u ); 212 148 213 *_yp = phxu->eval ( *_mu,u ); 149 214 150 *_mu = pfxu->eval ( *_mu ,u ) + ( _K ) * ( _iRy->_Ch() ).T() * ( y-*_yp ); 215 /* vec mu2 = *_mu + ( _K2 ) * ( y-*_yp );*/ 216 217 //correction //= initial value is already prediction! 218 *_mu += ( _K ) * ( _iRy->_Ch() ).T() * ( y-*_yp ); 219 151 220 /* _K = (_P->to_mat())*C.transpose() * ( _iRy->to_mat() ); 152 221 *_mu = pfxu->eval ( *_mu ,u ) + ( _K )* ( y-*_yp );*/ … … 173 242 R.setD ( R0 ); 174 243 }; 244 245