Changeset 62 for bdm/estim/libKF.cpp

Show
Ignore:
Timestamp:
04/06/08 20:14:56 (16 years ago)
Author:
smidl
Message:

nova simulace s EKFfixed a novy EKF na plnych maticich

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • bdm/estim/libKF.cpp

    r51 r62  
    5959} 
    6060 
     61 
     62 
     63 /////////////////////////////// EKFS 
     64EKFfull::EKFfull ( RV rvx0, RV rvy0, RV rvu0 ) : BM ( rvx0 ) {}; 
     65 
     66void 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 
     86void 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 
    61116void KalmanCh::set_parameters ( const mat &A0,const mat &B0,const mat &C0,const mat &D0,const chmat &R0,const chmat &Q0 ) { 
    62117 
     
    138193        preA.set_submatrix ( dimy,dimy, ( _P->_Ch() ) *A.T() ); 
    139194 
     195//      mat Sttm = _P->to_mat(); 
     196 
    140197//      if ( !qr ( preA,Q,postA ) ) it_warning ( "QR in kalman unstable!" ); 
    141198        if ( !qr ( preA,postA ) ) it_warning ( "QR in kalman unstable!" ); 
    142199 
    143200        ( _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(); 
    145202        ( _P->_Ch() ) = postA ( dimy,dimy+dimx-1,dimy,dimy+dimx-1 ); 
    146203        _Ry->inv ( *_iRy ); 
    147204        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 
    148213        *_yp = phxu->eval ( *_mu,u ); 
    149214         
    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 
    151220/*      _K = (_P->to_mat())*C.transpose() * ( _iRy->to_mat() ); 
    152221        *_mu = pfxu->eval ( *_mu ,u ) + ( _K )* ( y-*_yp );*/ 
     
    173242        R.setD ( R0 ); 
    174243}; 
     244 
     245