Changeset 653

Show
Ignore:
Timestamp:
10/12/09 19:38:54 (15 years ago)
Author:
smidl
Message:

corrections in Kalman and particles

Files:
5 modified

Legend:

Unmodified
Added
Removed
  • applications/bdmtoolbox/CMakeLists.txt

    r406 r653  
    1212 
    1313include_directories (${BDM_SOURCE_DIR}/bdm) 
    14 link_directories (${BDM_BINARY_DIR}/bdm) 
     14link_directories (${BDM_SOURCE_DIR}/bdm) 
    1515 
    1616#EXEC(estimator) 
  • applications/bdmtoolbox/mex/estimator.cpp

    r640 r653  
    204204        } 
    205205#endif 
     206        for (int i=0;i<Dls_buf.length(); i++){delete Dls_buf(i);} 
     207        for (int i=0;i<Dls.length(); i++){delete Dls(i);} 
    206208} 
  • library/bdm/estim/kalman.cpp

    r583 r653  
    1616        mat &P = est->_R(); 
    1717        mat& _Ry = fy._R(); 
     18        vec& yp = fy._mu(); 
    1819        //Time update 
    1920        mu = A * mu + B * u; 
     
    2425        _K = P * C.transpose() * inv ( _Ry ); 
    2526        P -= _K * C * P; // P = P -KCP; 
    26         mu += _K * ( y - C * mu - D * u ); 
     27        yp = C * mu + D * u; 
     28        mu += _K * ( y - yp ); 
    2729 
    2830        if ( evalll ) { 
    29                 ll=est->evallog(y); 
     31                ll=fy.evallog(y); 
    3032        } 
    3133}; 
     
    6567        mat &P = est->_R(); 
    6668        mat& _Ry = fy._R(); 
     69        vec& yp = fy._mu(); 
    6770         
    6871        pfxu->dfdx_cond ( mu, zeros ( dimu ), A, true ); 
     
    7780        _K = P * C.transpose() * inv ( _Ry ); 
    7881        P -= _K * C * P; // P = P -KCP; 
    79         vec yp = phxu->eval ( mu, u ); 
     82        yp = phxu->eval ( mu, u ); 
    8083        mu += _K * ( y - yp ); 
    8184 
  • library/bdm/estim/kalman.h

    r625 r653  
    5454        public: 
    5555                StateSpace() : dimx (0), dimy (0), dimu (0), A(), B(), C(), D(), Q(), R() {} 
     56                StateSpace(const StateSpace<sq_T> &S0) : dimx (S0.dimx), dimy (S0.dimy), dimu (S0.dimu), A(S0.A), B(S0.B), C(S0.C), D(S0.D), Q(S0.Q), R(S0.R) {} 
    5657                void set_parameters (const mat &A0, const  mat &B0, const  mat &C0, const  mat &D0, const  sq_T &Q0, const sq_T &R0); 
    5758                void validate(); 
     
    114115                enorm<sq_T>  fy; 
    115116        public: 
    116                 Kalman() : BM(), StateSpace<sq_T>(), yrv(),urv(), _K(),  est(new enorm<sq_T>){} 
     117                Kalman<sq_T>() : BM(), StateSpace<sq_T>(), yrv(),urv(), _K(),  est(new enorm<sq_T>){} 
     118                Kalman<sq_T>(const Kalman<sq_T> &K0) : BM(K0), StateSpace<sq_T>(K0), yrv(K0.yrv),urv(K0.urv), _K(K0._K),  est(new enorm<sq_T>(*K0.est)), fy(K0.fy){} 
    117119                void set_statistics (const vec &mu0, const mat &P0) {est->set_parameters (mu0, P0); }; 
    118120                void set_statistics (const vec &mu0, const sq_T &P0) {est->set_parameters (mu0, P0); }; 
     
    152154                //! Here dt = [yt;ut] of appropriate dimensions 
    153155                void bayes (const vec &dt); 
     156                BM* _copy_() const { 
     157                        KalmanFull* K = new KalmanFull; 
     158                        K->set_parameters (A, B, C, D, Q, R); 
     159                        K->set_statistics (est->_mu(), est->_R()); 
     160                        return K; 
     161                } 
    154162}; 
    155163UIREGISTER(KalmanFull); 
     
    236244                const mat _R() { 
    237245                        return est->_R().to_mat(); 
     246                } 
     247                void from_setting (const Setting &set) { 
     248                        shared_ptr<diffbifn> IM = UI::build<diffbifn> ( set, "IM", UI::compulsory ); 
     249                        shared_ptr<diffbifn> OM = UI::build<diffbifn> ( set, "OM", UI::compulsory ); 
     250                         
     251                        //statistics 
     252                        int dim = IM->dimension(); 
     253                        vec mu0; 
     254                        if ( !UI::get ( mu0, set, "mu0" ) ) 
     255                                mu0 = zeros ( dim ); 
     256                         
     257                        mat P0; 
     258                        vec dP0; 
     259                        if ( UI::get ( dP0, set, "dP0" ) ) 
     260                                P0 = diag ( dP0 ); 
     261                        else if ( !UI::get ( P0, set, "P0" ) ) 
     262                                P0 = eye ( dim ); 
     263                         
     264                        set_statistics ( mu0, P0 ); 
     265                         
     266                        //parameters 
     267                        vec dQ, dR; 
     268                        UI::get ( dQ, set, "dQ", UI::compulsory ); 
     269                        UI::get ( dR, set, "dR", UI::compulsory ); 
     270                        set_parameters ( IM, OM, diag ( dQ ), diag ( dR ) ); 
     271                         
     272                        //connect 
     273                        shared_ptr<RV> drv = UI::build<RV> ( set, "drv", UI::compulsory ); 
     274                        set_drv ( *drv ); 
     275                        shared_ptr<RV> rv = UI::build<RV> ( set, "rv", UI::compulsory ); 
     276                        set_rv ( *rv ); 
     277                         
     278                        string options; 
     279                        if ( UI::get ( options, set, "options" ) ) 
     280                                set_options ( options ); 
     281//                      pfxu = UI::build<diffbifn>(set, "IM", UI::compulsory); 
     282//                      phxu = UI::build<diffbifn>(set, "OM", UI::compulsory); 
     283//                       
     284//                      mat R0; 
     285//                      UI::get(R0, set, "R",UI::compulsory); 
     286//                      mat Q0; 
     287//                      UI::get(Q0, set, "Q",UI::compulsory); 
     288//                       
     289//                       
     290//                      mat P0; vec mu0; 
     291//                      UI::get(mu0, set, "mu0", UI::optional); 
     292//                      UI::get(P0, set,  "P0", UI::optional); 
     293//                      set_statistics(mu0,P0); 
     294//                      // Initial values 
     295//                      UI::get (yrv, set, "yrv", UI::optional); 
     296//                      UI::get (urv, set, "urv", UI::optional); 
     297//                      set_drv(concat(yrv,urv)); 
     298//  
     299//                      // setup StateSpace 
     300//                      pfxu->dfdu_cond(mu0, zeros(pfxu->_dimu()), A,true); 
     301//                      phxu->dfdu_cond(mu0, zeros(pfxu->_dimu()), C,true); 
     302//                       
     303                        validate(); 
     304                } 
     305                void validate() { 
     306                        // check stats and IM and OM 
    238307                } 
    239308}; 
     
    448517void StateSpace<sq_T>::set_parameters (const mat &A0, const  mat &B0, const  mat &C0, const  mat &D0, const  sq_T &Q0, const sq_T &R0) 
    449518{ 
    450         dimx = A0.rows(); 
    451         dimu = B0.cols(); 
    452         dimy = C0.rows(); 
    453519 
    454520        A = A0; 
     
    463529template<class sq_T> 
    464530void StateSpace<sq_T>::validate(){ 
     531        dimx = A.rows(); 
     532        dimu = B.cols(); 
     533        dimy = C.rows(); 
    465534        bdm_assert (A.cols() == dimx, "KalmanFull: A is not square"); 
    466535        bdm_assert (B.rows() == dimx, "KalmanFull: B is not compatible"); 
    467536        bdm_assert (C.cols() == dimx, "KalmanFull: C is not square"); 
    468         bdm_assert ( (D.rows() == dimy) || (D.cols() == dimu), "KalmanFull: D is not compatible"); 
    469         bdm_assert ( (Q.cols() == dimx) || (Q.rows() == dimx), "KalmanFull: Q is not compatible"); 
    470         bdm_assert ( (R.cols() == dimy) || (R.rows() == dimy), "KalmanFull: R is not compatible"); 
     537        bdm_assert ( (D.rows() == dimy) && (D.cols() == dimu), "KalmanFull: D is not compatible"); 
     538        bdm_assert ( (Q.cols() == dimx) && (Q.rows() == dimx), "KalmanFull: Q is not compatible"); 
     539        bdm_assert ( (R.cols() == dimy) && (R.rows() == dimy), "KalmanFull: R is not compatible"); 
    471540} 
    472541 
  • library/bdm/estim/particles.h

    r638 r653  
    190190                est.resample(ind,resmethod); 
    191191        } 
     192        Array<vec>& __samples(){return _samples;} 
    192193}; 
    193194UIREGISTER(PF); 
     
    201202 
    202203class MPF : public BM  { 
    203     shared_ptr<PF> pf; 
     204        protected: 
     205        shared_ptr<PF> pf; 
    204206        Array<BM*> BMs; 
    205207