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

📄 immmcrun.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
%
%IMMMCRUN  IMM algorithm -- Monte Carlo runs
% it's availabe only when SimulationFlag is 1,2,3
% Case 1 : No ExternalTruth, External Z : SimulationFlag = 1, 2 and no generation
% Case 2 : Exist ExternalTruth, No ExternalZ : SimulationFlag =1,2 and generation of ground truth or SimulationFlag = 3
% Case 3 : Extist ExternalTruth, ExternalZ : SimulationFlag =1,2 and generation truth and measurement or SimulationFlag =3 and generation measurement
% Case 4 : No ExternalTruth, ExternalZ : Simulation Flag = 4 <---Impossible with this file,see KFMCRUNFromMeasurement file

% Check whether NCT will be used during multi model system

if nmt > 1 
    if ~isempty( find ([ModeSystem{:,9}] == 3) ) ;
       nx = 5 ;   
       nv = 3 ;
   end
end

% 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
% End of Step 1

if nmt > 1 
    nxactual = Xactual(ncoor,nx,nxf,nmt,ModeSystem);
else
    nxactual = Xactual(ncoor,nx,nxf,nmt,0);
end

longxt=zeros(nx,kmax);
longx=zeros(nxf,kmax);longxp=longx;longsqP1=longx ;
longxe=zeros(nxactual,kmax);longnee=longxe;longRMS1=longxe;
longz=zeros(nzf,kmax);longzp=longz;longnun=longz; longnu=longz;
longv=zeros(nvf,kmax);
longw=zeros(nwf,kmax);
longmodePr=zeros(nmf,kmax);
longnees=zeros(1,kmax); longnis=longnees;
LongP=zeros(nxf*nxf,kmax);LongPP=LongP;
LongMSE=zeros(nxactual*nxactual, kmax);LongRMS2=LongMSE;LongsqP2=LongMSE;
S=zeros(nzf); W=zeros(nxf,nzf); PP=zeros(nxf);
LongS=zeros(nzf*nzf,kmax);
LongW=zeros(nxf*nzf,kmax);
LongRMS3=LongMSE;LongsqP3=LongMSE;
[c,maxsize]=computer;

if nx*nx*nx*kmax<=maxsize
  LLongRMS3=zeros(nxactual*nxactual*nxactual,kmax);LLongsqP3=LLongRMS3;
else
  errordlg('RMS3 and sqP3 are truncated.','error');
  LLongRMS3=zeros(nxactual*nxactual*nxactual,round(maxsize/(nx^3)));LLongsqP3=LLongRMS3;
end

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

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

colordef none;

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

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

% Monte Carlo runs:
for nmc=1:nrun
   waitbar(nmc/nrun);
   T = ExternalT(nmc);
   %  TotalTime = TotalTime + T;
   % 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

   
   for immmode=1:nmf
      Ffstr = modeFfstr{immmode}; 
      Gfstr = modeGfstr{immmode};
      Hfstr = modeHfstr{immmode}; 
      Ifstr = modeIfstr{immmode};
      Qfstr = modeQfstr{immmode}; 
      Rfstr = modeRfstr{immmode};
      
      x0 = modex0(: ,immmode) ;
      [Ff,Gf,Qf] = ProcessModel(FilterModelFlag,nxf,nvf,T,omegaf,x0,Ffstr,Gfstr,Qfstr) ;
      [Hf,If,Rf] = ObservationModel(nzf,nwf,Hfstr,Ifstr,Rfstr) ;  
      
      modeFf(:,immmode)=Ff(:); modeGf(:,immmode)=Gf(:);
      modeHf(:,immmode)=Hf(:); modeIf(:,immmode)=If(:);
      modeQf(:,immmode)=Qf(:); modeRf(:,immmode)=Rf(:);
   end
   
      % get TranPr
   if TransitionProbabilityFlag == 2
      TranPr = zeros(nmf,nmf);
      for i=1:nmf
         TranPr(i,i) = min(UpperLimit(i),max( LowerLimit(i), 1-T/SojournTime(i) ));                
         for j= 1:nmf
            if i ~= j
               TranPr(i,j) = TranProEdit(i,j)*(1-TranPr(i,i));                
            end
         end        
      end       
   end
   % initial condition
   clear P x modex modeP modePr;
   xt = zeros(nx,1) ;
   if ~existtruth 
      xt=xt0; 
   end
   z=zeros(nz,1);  
   x=modex0*modePr0; modex=modex0; modeP=modeP0; modePr=modePr0;
   
   if nmt > 1
      SystemModelFlag = ModeSystem{1,9} ;
   end
   for k=1:kmax
      % Step 3
      if nmt > 1 
          if k*T > FromTime(mode)
              PrevSystemModelFlag = SystemModelFlag ;
              [Ftstr, Gtstr,Htstr,Itstr,Qtstr,Rtstr vmt wmt SystemModelFlag omega] = 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
              xt = ModeChanging(PrevSystemModelFlag,SystemModelFlag,xt,omega);
          end
      end
      % End of Step 3
      % generate true state and measurement at k
      if existtruth
          w = Normal(wmt,Rt);
          if nx==5 & SystemModelFlag ~= 3 ;
             xt(:) = ExternalTruth(nmc,1:4,k) ;                          
          else
              xt(:) = ExternalTruth(nmc,:,k);
          end
          if exist('ExternalZ','var')
              z(:) = ExternalZ(nmc,:,k) ;
          else
              % generate z
              z = Ht*xt + It*w ;
          end
      else 
          [xt,z,v,w] = Xzgen(xt,Ft,Gt,Ht,It,Qt,Rt,vmt,wmt);
          if SystemModelFlag == 3
              temp = xt(5) ;
              Ft = [ 1 ( sin(temp*T) )/temp 0 -(1-cos(temp*T))/temp 0 ;
                  0 cos(temp*T) 0 -sin(temp*T) 0 ;
                  0 (1-cos(temp*T))/temp 1 ( sin(temp*T) )/temp 0 ;
                  0 sin(temp*T) 0 cos(temp*T) 0 ;
                  0 0 0 0 1] ;   
          end
      end
    
    % store truth and measurement
    if nx == 5 & SystemModelFlag ~=3 
        xttemp = [ xt' 0]' ;
    else
        xttemp = xt ;
    end
    Truth(nmc,:,k) = xttemp;
    Measurement(nmc,:,k) = z;
    
    % estimation using IMM
    
    [x,P,modex,modeP,modePr,modexp,modePP,modeS,modeW,modezp,modenu,...
          likelihood]=ImmKf(modex,modeP,z,...
       modeQf,modeRf,modevmf,modewmf,modeFf,modeGf,modeHf,modeIf,TransPr,modePr);
   
   if FilterModelFlag == 3
       temp = x(5) ;
       Ff = [ 1 ( sin(temp*T) )/temp 0 -(1-cos(temp*T))/temp 0 ;
          0 cos(temp*T) 0 -sin(temp*T) 0 ;
          0 (1-cos(temp*T))/temp 1 ( sin(temp*T) )/temp 0 ;
          0 sin(temp*T) 0 cos(temp*T) 0 ;
          0 0 0 0 1] ;        
       for mode=1:nmf
          modeFf(:,mode)=Ff(:); 
       end  
    end
    Estimation(nmc,:,k) = x;
        
    S(:)=modeS*modePr;
    W(:)=modeW*modePr;
    PP(:)=modePP*modePr;
    xp=modexp*modePr;
    zp=modezp*modePr;
    nu=modenu*modePr;
    longmodePr(:,k)  = longmodePr(:,k) + modePr/nrun;
    longxt(:,k) = longxt(:,k) + xttemp/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;
    clear xe;
    xe = Xerror(nxactual,nx,xt,nxf,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:nxf, dummy(i) = P(i,i); end
    longsqP1(:,k)= longsqP1(:,k) + dummy'/nrun;
    
    clear RMS2 sqP2;
    for i=1:nxactual
        for j=1:nxactual 
            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;
    % do not need RMS3 ================================= 
    %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;
    if nxactual == 4 ;
        Ptemp = P(1:4,1:4) ;
        nees = xe'*inv(Ptemp)*xe;
    else
        nees = xe'*inv(P)*xe;
    end

    longnees(k) = longnees(k) + nees/nrun;
    for i=1:nxactual, 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:nzf, 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 temp ;
clear existtruth existZ mode xttemp ;
clear modeFf modeGf modeHf modeIf modeQf modeRf ;
clear PrevSystemModelFlag ;
close(Hf_wait);

% The End

⌨️ 快捷键说明

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