⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mismatch.m

📁 Yaakov Bar-Shalom, X.-Rong Li,Thiagalingam Kirubarajan - Estimation with Applications to Tracking an
💻 M
字号:
%%% DynaEst 3.032 10/22/2000
% Copyright (c) 2000 Yaakov Bar-Shalom
%
%KFMismatch:  Kalman filter mismatch simulations-- Monte Carlo runs
% it's availabe only when SimulationFlag is 1 or 2 and nmt = 1 
% Case 1 : No ExternalTruth, External Z : SimulationFlag = 1, 2 

% if do not exist T, generate T
if exist('ExternalT','var') == 0
   if nmt == 1 
      ExternalT = Tmin+(Tmax-Tmin)*rand(1,nrun);
   else
      ExternalT = ones(1,nrun)*Tmulti ;
   end
end

longx=zeros(nx,kmax);longxt=longx;longxe=longx;longxp=longx;longnee=longx;
	             longRMS1=longx;  longsqP1=longx;
longz=zeros(nz,kmax);longzp=longz;longnun=longz; longnu=longz;
longv=zeros(nv,kmax);
longw=zeros(nw,kmax);
% longmodePr=zeros(nmf,kmax);
longnees=zeros(1,kmax); longnis=longnees;
LongP=zeros(nx*nx,kmax);LongMSE=LongP;LongPP=LongP;LongRMS2=LongP;LongsqP2=LongP;
LongS=zeros(nz*nz,kmax);
LongW=zeros(nx*nz,kmax);
LongRMS2=zeros(nx*nx,kmax);LongsqP2=LongRMS2;
LongRMS3=zeros(nx*nx,nx);LongsqP3=LongRMS3;
[c,maxsize]=computer;
if nx*nx*nx*kmax<=maxsize
  LLongRMS3=zeros(nx*nx*nx,kmax);LLongsqP3=LLongRMS3;
else
  errordlg('RMS3 and sqP3 are truncated.','error');
  LLongRMS3=zeros(nx*nx*nx,round(maxsize/(nx^3)));LLongsqP3=LLongRMS3;
end

Ft = zeros(nx,nx); Ff = zeros(nr,nr);
Gt = zeros(nx,nv); Gf = zeros(nr,nv);
Ht = zeros(nz,nx); Hf = zeros(nz,nr);
It = zeros(nz,nw); If = zeros(nz,nw);
Qt = zeros(nv,nv); Qf = zeros(nv,nv);
Rt = zeros(nw,nw); Rf = zeros(nw,nw);

Estimation = zeros(nrun,nx,kmax);
Truth = zeros(nrun,nx,kmax);
Measurement = zeros(nrun,nz,kmax);
FilterGain = zeros(nx,nz,kmax) ;

colordef none;

% Monte Carlo runs:
Hf_wait = waitbar(0,'Doing Monte Carlo runs. Please wait...');

existtruth = exist('ExternalTruth','var') ;
existZ = exist('ExternalZ','var') ;

for nmc=1:nrun,
  %disp(['run # ' num2str(nmc)])
  waitbar(nmc/nrun); 
  T = ExternalT(nmc);
  
  % Step 2
  if nmt == 1 
     if ~existtruth
        [Ft,Gt,Qt] = ProcessModel(SystemModelFlag,nx,nv,T,omega,xt0,Ftstr,Gtstr,Qtstr) ;
     end
     [Ht,It,Rt] = ObservationModel(nz,nw,Htstr,Itstr,Rtstr) ;
  else
     mode = 1 ;    
  end
   % End of Step 2
   
   [Ff,Gf,Qf] = ProcessModel(FilterModelFlag,nr,nv,T,omega,x0,Ffstr,Gfstr,Qfstr) ;
   [Hf,If,Rf] = ObservationModel(nz,nw,Hfstr,Ifstr,Rfstr) ;  
   
   % initial condition
   clear xt x P Ck_1k_1 Pr Xk_1;
   xt = zeros(nx,1) ;
   if ~existtruth 
      xt=xt0; 
   end
   x=x0; P=P0; z=zeros(nz,1);
   Ck_1k_1 = P0; Pf = P0;  Xk_1 = (Tx'*x0)*(Tx'*x0)'+P0;   
   
   for k=1:kmax,
      % Step 3
      if ~existtruth | ~existZ
         if nmt > 1 
            if k*T > FromTime(mode)
               [Ftstr, Gtstr,Htstr,Itstr,Qtstr,Rtstr] = FindMultiModel(k,T,FromTime,ToTime,ModeSystem,nmt) ;
               mode = mode + 1 ;
               if ~existtruth
                  [Ft,Gt,Qt] = ProcessModel(SystemModelFlag,nx,nv,T,omega,xt0,Ftstr,Gtstr,Qtstr) ;
               end
               if ~existZ
                  [Ht,It,Rt] = ObservationModel(nz,nw,Htstr,Itstr,Rtstr) ;
               end
            end
         end
      end
      % End of Step 3
      % generate true state and measurement at k
      if existtruth
         xt(:) = ExternalTruth(nmc,:,k);
         if exist('ExternalZ','var')
            z(:) = ExternalZ(nmc,:,k) ;
         else
            % generate z
            w = Normal(wmt,Rt);
            z = Ht*xt + It*w ;
         end
      else 
         [xt,z,v,w] = Xzgen(xt,Ft,Gt,Ht,It,Qt,Rt,vmt,wmt);
      end
      
      % store Truth and measurement
      for i=1:nx
         Truth(nmc,i,k) = xt(i);
      end
      for i=1:nz
         Measurement(nmc,i,k) = z(i);
      end
      
    clear x;
    x = Tx*xt;    
    % estimation using Kalman filter
    [x,Pf,xp,PP,S,W,zp,nu,P,Ck_1k_1,Xk_1]=...
       MismatchKalman(x,Pf,z,Qf,Rf,vmf,wmf,Ff,Gf,Hf,If,P,Ck_1k_1,Ft,Gt,Ht,Qt,Rt,Xk_1,Tx);
    
    if nmc == 1 
       for i =1:nx
          for j=1:nz
             FilterGain(i,j,k) = W(i,j) ;
          end
       end
    end

    
    for i=1:nr
       Estimation(nmc,i,k) = x(i);
    end
    for i=nr+1:nx
       Estimation(nmc,i,k) = 0;
    end

%    longxt(:,k) = longxt(:,k) + xt/nrun;
%    longz(:,k)  = longz(:,k)  + z/nrun;
%    longv(:,k)  = longv(:,k)  + v/nrun;
%    longw(:,k)  = longw(:,k)  + w/nrun;
%    longx(:,k)  = longx(:,k)  + x/nrun;
%    LongP(:,k)  = LongP(:,k)  + P(:)/nrun;
%    longmodePr(:,k)  = longmodePr(:,k) + modePr/nrun;
    xe          = xt-Tx'*x;
    longxe(:,k) = longxe(:,k) + xe/nrun;
    dummy       = xe*xe';
    LongMSE(:,k)= LongMSE(:,k) + dummy(:)/nrun;
    LongPP(:,k) = LongPP(:,k) + PP(:)/nrun;
    LongS(:,k)  = LongS(:,k) + S(:)/nrun;
    LongW(:,k)  = LongW(:,k) + W(:)/nrun;
    longRMS1(:,k)= longRMS1(:,k) + xe.*xe/nrun;
    dummy=[]; for i=1:nx, dummy(i) = P(i,i); end
    longsqP1(:,k)= longsqP1(:,k) + dummy'/nrun;
    
    clear RMS2 sqP2;
    for i=1:nx, for j=1:nx, 
       RMS2(i,j) = xe(i)^2+xe(j)^2; 
       sqP2(i,j) = P(i,j);
    end, end

    LongRMS2(:,k)= LongRMS2(:,k) + RMS2(:)/nrun;
    LongsqP2(:,k)= LongsqP2(:,k) + sqP2(:)/nrun;
    
    clear RMS3 sqP3;
    for l=1:nx, 
      for i=1:nx, for j=1:nx,
        RMS3(i,j) = xe(i)^2+xe(j)^2+xe(l)^2;
        sqP3(i,j) = P(i,i)+P(j,j)+P(l,l);
      end, end
      LongRMS3(:,l) = RMS3(:);
      LongsqP3(:,l) = sqP3(:);
    end
    if k<=maxsize/(nx^3)
      LLongRMS3(:,k)=LLongRMS3(:,k) + LongRMS3(:)/nrun;
      LLongsqP3(:,k)=LLongsqP3(:,k) + LongsqP3(:)/nrun;
    end

    longxp(:,k) = longxp(:,k) + xp/nrun;
    longzp(:,k) = longzp(:,k) + zp/nrun;
    longnu(:,k) = longnu(:,k) + nu/nrun;
    nees        = xe'*inv(P)*xe;
    longnees(k) = longnees(k) + nees/nrun;
    for i=1:nx, longnee(i,k) = longnee(i,k) + xe(i)/sqrt(P(i,i))/nrun; end
    nis         = nu'*inv(S)*nu;
    longnis(k)  = longnis(k) + nis/nrun;
    for i=1:nz, longnun(i,k) = longnun(i,k) + nu(i)/sqrt(S(i,i))/nrun; end
  end
end
longRMS1=sqrt(longRMS1);
longsqP1=sqrt(longsqP1);
LongRMS2 = sqrt(LongRMS2);
LongsqP2 = sqrt(LongsqP2);
LLongRMS3 = sqrt(LLongRMS3);
LLongsqP3 = sqrt(LLongsqP3);

clear longxt longz longx longRMS1 longsqP1;
clear existtruth existZ  mode ;
close(Hf_wait);

% The End

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -