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

📄 eimm_smooth.m

📁 kalman滤波
💻 M
字号:
%EIMM_SMOOTH  EKF based fixed-interval IMM smoother using two IMM-EKF filters.%% Syntax:%   [X_S,P_S,X_IS,P_IS,MU_S] = EIMM_SMOOTH(MM,PP,MM_i,PP_i,MU,p_ij,mu_0j,ind,dims,A,a,a_param,Q,R,H,h,h_param,Y)%% In:%   MM    - Means of forward-time IMM-filter on each time step%   PP    - Covariances of forward-time IMM-filter on each time step%   MM_i  - Model-conditional means of forward-time IMM-filter on each time step %   PP_i  - Model-conditional covariances of forward-time IMM-filter on each time step%   MU    - Model probabilities of forward-time IMM-filter on each time step %   p_ij  - Model transition probability matrix%   ind   - Indices of state components for each model as a cell array%   dims  - Total number of different state components in the combined system%   A     - Dynamic model matrices for each linear model and Jacobians of each%           non-linear model's measurement model function as a cell array%   a     - Cell array containing function handles for dynamic functions%           for each model having non-linear dynamics%   a_param - Parameters of a as a cell array.%   Q     - Process noise matrices for each model as a cell array.%   R     - Measurement noise matrices for each model as a cell array.%   H     - Measurement matrices for each linear model and Jacobians of each%           non-linear model's measurement model function as a cell array%   h     - Cell array containing function handles for measurement functions%           for each model having non-linear measurements%   h_param - Parameters of h as a cell array.%   Y     - Measurement sequence%% Out:%   X_S  - Smoothed state means for each time step%   P_S  - Smoothed state covariances for each time step%   X_IS - Model-conditioned smoothed state means for each time step%   P_IS - Model-conditioned smoothed state covariances for each time step%   MU_S - Smoothed model probabilities for each time step%   % Description:%   EKF based two-filter fixed-interval IMM smoother.%% See also:%   EIMM_UPDATE, EIMM_PREDICT% History:%   09.01.2008 JH The first official version.%% Copyright (C) 2007,2008 Jouni Hartikainen%% $Id: imm_update.m 111 2007-11-01 12:09:23Z jmjharti $%% This software is distributed under the GNU General Public % Licence (version 2 or later); please refer to the file % Licence.txt, included with the software, for details. function [x_sk,P_sk,x_sik,P_sik,mu_sk] = eimm_smooth(MM,PP,MM_i,PP_i,MU,p_ij,mu_0j,ind,dims,A,a,a_param,Q,R,H,h,h_param,Y)    % Default values for mean and covariance    MM_def = zeros(dims,1);    PP_def = diag(ones(dims,1));    % Number of models    m = length(A);        % Number of measurements    n = size(Y,2);        % The prior model probabilities for each step    p_jk = zeros(m,n);    p_jk(:,1) = mu_0j;    for i1 = 2:n        for i2 = 1:m            p_jk(i2,i1) = sum(p_ij(:,i2).*p_jk(:,i1-1));        end    end         % Backward-time transition probabilities    p_ijb = cell(1,n);    for k = 1:n        for i1 = 1:m            % Normalizing constant            b_i = sum(p_ij(:,i1).*p_jk(:,k));            for j = 1:m                p_ijb{k}(i1,j) = 1/b_i.*p_ij(j,i1).*p_jk(j,k);            end        end    end        % Space for overall smoothed estimates    x_sk = zeros(dims,n);    P_sk = zeros(dims,dims,n);    mu_sk = zeros(m,n);        % Values of smoothed estimates at the last time step.    x_sk(:,end)   = MM(:,end);    P_sk(:,:,end) = PP(:,:,end);    mu_sk(:,end)  = MU(:,end);        % Space for model-conditioned smoothed estimates    x_sik = cell(m,n);    P_sik = cell(m,n);        % Values for last time step    x_sik(:,end) = MM_i(:,end);    P_sik(:,end) = PP_i(:,end);        % Backward-time estimated model probabilities    mu_bp = MU(:,end);        % Space for model-conditioned backward-time updated means and covariances    x_bki = cell(1,m);    P_bki = cell(1,m);        % Initialize with default values    for i1 = 1:m       x_bki{i1} = MM_def;       x_bki{i1}(ind{i1}) = MM_i{i1,end};       P_bki{i1} = PP_def;       P_bki{i1}(ind{i1},ind{i1}) = PP_i{i1,end};    end        % Space for model-conditioned backward-time predicted means and covariances    x_kp = cell(1,m);    P_kp = cell(1,m);        % Initialize with default values    for i1 = 1:m       x_kp{i1} = MM_def;       P_kp{i1} = PP_def;    end    for k = n-1:-1:1        % Space for normalizing constants and conditional model probabilities        a_j = zeros(1,m);        mu_bijp = zeros(m,m);                for i2 = 1:m            % Normalizing constant            a_j(i2) = sum(p_ijb{k}(:,i2).*mu_bp(:));             % Conditional model probability            mu_bijp(:,i2) = 1/a_j(i2).*p_ijb{k}(:,i2).*mu_bp(:);                         % Retrieve the transition matrix or the Jacobian of the dynamic model            if isnumeric(A{i2})                A2 = A{i2};            elseif isstr(A{i2}) | strcmp(class(A{i2}),'function_handle')                A2 = feval(A{i2},x_bki{i2}(ind{i2}),a_param{i2});            else                A2 = A{i2}(x_bki{i2}(ind{i2}),a_param{i2});            end                        % Backward-time EKF prediction step            [x_kp{i2}(ind{i2}), P_kp{i2}(ind{i2},ind{i2})] = ekf_predict1(x_bki{i2}(ind{i2}),...                                                              P_bki{i2}(ind{i2},ind{i2}),...                                                              inv(A2),Q{i2},a{i2},[],a_param{i2});                    end                 % Space for mixed predicted mean and covariance        x_kp0 = cell(1,m);        P_kp0 = cell(1,m);                % Space for measurement likelihoods        lhood_j = zeros(1,m);                for i2 = 1:m            % Initialize with default values            x_kp0{i2} = MM_def;            P_kp0{i2} = PP_def;                        P_kp0{i2}(ind{i2},ind{i2}) = zeros(length(ind{i2}),length(ind{i2}));                        % Mix the mean            for i1 = 1:m                x_kp0{i2}(ind{i2}) = x_kp0{i2}(ind{i2}) + mu_bijp(i1,i2)*x_kp{i1}(ind{i2});            end                        % Mix the covariance             for i1 = 1:m                P_kp0{i2}(ind{i2},ind{i2}) = P_kp0{i2}(ind{i2},ind{i2}) + mu_bijp(i1,i2)*(P_kp{i1}(ind{i2},ind{i2})+(x_kp{i1}(ind{i2})-x_kp0{i2}(ind{i2}))*(x_kp{i1}(ind{i2})-x_kp0{i2}(ind{i2}))');             end            % Backward-time EKF update             %            % If the measurement model is linear don't pass h and h_param to ekf_update1            if isempty(h) | isempty(h{i2})                [x_bki{i2}(ind{i2}), P_bki{i2}(ind{i2},ind{i2}),K,MUP,S,lhood_j(i2)] = ekf_update1(x_kp0{i2}(ind{i2}),P_kp0{i2}(ind{i2},ind{i2}),Y(:,k),H{i2},R{i2},[],[],[]);            else                [x_bki{i2}(ind{i2}), P_bki{i2}(ind{i2},ind{i2}),K,MUP,S,lhood_j(i2)] = ekf_update1(x_kp0{i2}(ind{i2}),P_kp0{i2}(ind{i2},ind{i2}),Y(:,k),H{i2},R{i2},h{i2},[],h_param{i2});            end        end                % Normalizing constant        a_s = sum(lhood_j.*a_j);        % Updated model probabilities        mu_bp = 1/a_s.*a_j.*lhood_j;                        % Space for conditional measurement likelihoods        lhood_ji = zeros(m,m);        for i1 = 1:m            for i2 = 1:m                d_ijk = MM_def;                D_ijk = PP_def;                d_ijk = d_ijk + x_kp{i1};                d_ijk(ind{i2}) = d_ijk(ind{i2}) - MM_i{i2,k};                PP2 = zeros(dims,dims);                PP2(ind{i2},ind{i2}) = PP_i{i2,k};                D_ijk = P_kp{i1} + PP2;                % Calculate the (approximate) conditional measurement likelihoods                lhood_ji(i2,i1) = gauss_pdf(d_ijk,0,D_ijk);                            end        end                d_j = zeros(m,1);        for i2 = 1:m           d_j(i2) = sum(p_ij(i2,:).*lhood_ji(i2,:));         end        d = sum(d_j.*MU(:,k));                mu_ijsp = zeros(m,m);        for i1 = 1:m            for i2 = 1:m                mu_ijsp(i1,i2) = 1./d_j(i2)*p_ij(i2,i1)*lhood_ji(i2,i1);            end        end                        mu_sk(:,k) = 1/d.*d_j.*MU(:,k);                % Space for two-step conditional smoothing distributions p(x_k^j|m_{k+1}^i,y_{1:N}),        % which are a products of two Gaussians        x_jis = cell(m,m);        P_jis = cell(m,m);        for i2 = 1:m            for i1 = 1:m                MM1 = MM_def;                MM1(ind{i2}) = MM_i{i2,k};                                PP1 = PP_def;                PP1(ind{i2},ind{i2}) = PP_i{i2,k};                iPP1 = inv(PP1);                iPP2 = inv(P_kp{i1});                                % Covariance of the Gaussian product                P_jis{i2,i1} = inv(iPP1+iPP2);                % Mean of the Gaussian product                x_jis{i2,i1} = P_jis{i2,i1}*(iPP1*MM1 + iPP2*x_kp{i1});            end        end                % Mix the two-step conditional distributions to yield model-conditioned        % smoothing distributions.        for i2 = 1:m            % Initialize with default values            x_sik{i2,k} = MM_def;            P_sik{i2,k} = PP_def;            P_sik{i2,k}(ind{i2},ind{i2}) = zeros(length(ind{i2}),length(ind{i2}));                        % Mixed mean            for i1 = 1:m                x_sik{i2,k} = x_sik{i2,k} + mu_ijsp(i1,i2)*x_jis{i2,i1};            end                        % Mixed covariance            for i1 = 1:m                P_sik{i2,k} = P_sik{i2,k} + mu_ijsp(i1,i2)*(P_jis{i2,i1} + (x_jis{i2,i1}-x_sik{i2,k})*(x_jis{i2,i1}-x_sik{i2,k})');             end        end                % Mix the overall smoothed mean        for i1 = 1:m            x_sk(:,k) = x_sk(:,k) + mu_sk(i1,k)*x_sik{i1,k};        end                % Mix the overall smoothed covariance        for i1 = 1:m            P_sk(:,:,k) = P_sk(:,:,k) + mu_sk(i1,k)*(P_sik{i1,k} + (x_sik{i1,k}-x_sk(:,k))*(x_sik{i1,k}-x_sk(:,k))');        end            end    

⌨️ 快捷键说明

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