Changeset 1154 for library

Show
Ignore:
Timestamp:
07/28/10 10:45:59 (14 years ago)
Author:
smidl
Message:

UKF

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/estim/kalman.h

    r1077 r1154  
    426426SHAREDPTR ( EKFCh ); 
    427427 
     428class UKFCh : public EKFCh{ 
     429        public: 
     430                double kappa; 
     431                 
     432        void bayes ( const vec &yt, const vec &cond = empty_vec ){ 
     433                 
     434                vec &_mu = est._mu(); 
     435                chmat &_P = est._R(); 
     436                chmat &_Ry = fy._R(); 
     437                vec &_yp = fy._mu(); 
     438                 
     439                int dim = dimension(); 
     440                int dim2 = 1+dim+dim; 
     441                 
     442                double npk =dim+kappa;//n+kappa 
     443                mat Xi(dim,dim2); 
     444                vec w=ones(dim2)* 0.5/npk; 
     445                w(0) = (npk-dim)/npk; // mean is special 
     446                 
     447                //step 1. 
     448                int i; 
     449                Xi.set_col(0,_mu);  
     450                 
     451                for ( i=0;i<dim; i++){ 
     452                        vec tmp=sqrt(npk)*_P._Ch().get_col(i); 
     453                        Xi.set_col(i+1, _mu+tmp); 
     454                        Xi.set_col(i+1+dim, _mu-tmp); 
     455                } 
     456                 
     457                // step 2. 
     458                mat Xik(dim,dim2); 
     459                for (i=0; i<dim2; i++){ 
     460                        Xik.set_col(i, pfxu->eval(Xi.get_col(i), cond)); 
     461                } 
     462                 
     463                //step 3 
     464                vec xp=zeros(dim); 
     465                for (i=0;i<dim2;i++){ 
     466                        xp += w(i) * Xik.get_col(i); 
     467                } 
     468         
     469                //step 4 
     470                mat Xpred_dif(dim2,dim); 
     471                for (i=0;i<dim2;i++){ 
     472                        Xpred_dif.set_row(i, sqrt(w(i)) * (Xik.get_col(i) - xp)); 
     473                }                
     474                 
     475                // NEW Sigma points 
     476                mat tmp; 
     477                qr(concat_vertical(Xpred_dif,Q._Ch()), tmp); 
     478                mat Ppred=tmp.get_rows(0,dim-1); 
     479                // New Xi(k+1) 
     480                Xik.set_col(0,xp); 
     481                for ( i=0;i<dim; i++){ 
     482                        vec tmp=sqrt(npk)*Ppred.get_col(i); 
     483                        Xik.set_col(i+1, _mu+tmp); 
     484                        Xik.set_col(i+1+dim, _mu-tmp); 
     485                } 
     486                for (i=0;i<dim2;i++){ 
     487                        Xpred_dif.set_row(i, sqrt(w(i)) * (Xik.get_col(i) - xp)); 
     488                }                
     489                 
     490                 
     491                 
     492                //step 5 
     493                mat Yi(dimy,dim2); 
     494                for (i=0; i<dim2; i++){ 
     495                        Yi.set_col(i, phxu->eval(Xik.get_col(i), cond)); 
     496                } 
     497                //step 6 
     498                _yp.clear(); 
     499                for (i=0;i<dim2;i++){ 
     500                        _yp += w(i) * Yi.get_col(i); 
     501                } 
     502                //step 7 
     503                mat Ypred_dif(dim2,dimy); 
     504                 
     505                for (i=0; i<dim2; i++){ 
     506                        Ypred_dif.set_row(i, sqrt(w(i))*(Yi.get_col(i)-_yp)); 
     507                } 
     508                if (!qr(concat_vertical(Ypred_dif,R._Ch()) ,tmp)){ bdm_warning("QR failed");} 
     509                _Ry._Ch() = tmp.get_rows(0,dimy-1); 
     510                 
     511                // step 8 
     512                mat Pxy=Xpred_dif.T()*Ypred_dif; 
     513                mat iRy=inv(_Ry._Ch()); 
     514                 
     515                //filtering????? -- correction 
     516                mat K=Pxy*iRy*iRy.T(); 
     517                mat K2=Pxy*inv(_Ry.to_mat()); 
     518                 
     519                /////////////// new filtering density 
     520                _mu = xp + K*(yt - _yp); 
     521                // fill the space in Ppred; 
     522                mat Rpred =concat_vertical(Xpred_dif - Ypred_dif*K.T(), _Ry._Ch()*K.T()); 
     523                 
     524                if(!qr(Rpred,tmp)) {bdm_warning("QR failed");} 
     525                _P._Ch()=tmp.get_rows(0,dim-1); 
     526        } 
     527        void from_setting(const Setting &set){ 
     528                EKFCh::from_setting(set); 
     529                kappa = 1.0; 
     530                UI::get(kappa,set,"kappa"); 
     531        } 
     532}; 
     533UIREGISTER(UKFCh); 
    428534 
    429535//////// INstance