ekf,ukf,pf,epf,upf算法的综合比较程序
时间: 2023-10-10 09:13:18 浏览: 173
下面是一个简单的例子,比较了四种滤波器(EKF、UKF、PF和EPF)的性能。本例中使用的是Matlab。
```matlab
%% 程序设置
clc;
clear all;
close all;
%% 模型设置
% 状态转移方程:x(k+1) = Fx(k) + v(k)
F = [1 1; 0 1];
% 观测方程:y(k) = Hx(k) + w(k)
H = [1 0];
% 过程噪声的协方差矩阵Q
q = 0.1;
Q = [q^3/3 q^2/2; q^2/2 q];
% 测量噪声的方差R
r = 1;
R = r^2;
% 初始状态和协方差矩阵
x0 = [0;0];
P0 = [1 0; 0 1];
%% 仿真设置
N = 100; % 时间步数
x = zeros(2,N); % 状态向量
y = zeros(1,N); % 观测向量
x(:,1) = mvnrnd(x0',P0)'; % 初始状态
for k = 2:N
% 生成状态和观测噪声
vk = mvnrnd([0,0],Q)';
wk = normrnd(0,sqrt(R));
% 系统模型
x(:,k) = F*x(:,k-1) + vk;
% 观测模型
y(k) = H*x(:,k) + wk;
end
%% EKF算法
x_ekf = zeros(2,N); % 估计状态向量
P_ekf = zeros(2,2,N); % 估计协方差矩阵
x_ekf(:,1) = x0; % 初始状态
P_ekf(:,:,1) = P0; % 初始协方差矩阵
for k = 2:N
% 预测
x_ = F*x_ekf(:,k-1);
P_ = F*P_ekf(:,:,k-1)*F' + Q;
% 更新
K = P_*H'*inv(H*P_*H' + R);
x_ekf(:,k) = x_ + K*(y(k) - H*x_);
P_ekf(:,:,k) = (eye(2) - K*H)*P_;
end
%% UKF算法
x_ukf = zeros(2,N); % 估计状态向量
P_ukf = zeros(2,2,N); % 估计协方差矩阵
x_ukf(:,1) = x0; % 初始状态
P_ukf(:,:,1) = P0; % 初始协方差矩阵
alpha = 1e-3; % UKF参数
beta = 2; % UKF参数
kappa = 0; % UKF参数
for k = 2:N
% 预测
[X,Wm,Wc] = mySigmaPoints(x_ukf(:,k-1),P_ukf(:,:,k-1),alpha,beta,kappa);
X_ = F*X;
x_ = X_*Wm';
P_ = (X_ - x_)*(X_ - x_)'*Wc + Q;
% 更新
[X,Wm,Wc] = mySigmaPoints(x_,P_,alpha,beta,kappa);
Y_ = H*X;
y_ = Y_*Wm';
Pyy = (Y_ - y_)*(Y_ - y_)'*Wc + R;
Pxy = (X_ - x_)*(Y_ - y_)'*Wc;
K = Pxy/Pyy;
x_ukf(:,k) = x_ + K*(y(k) - y_);
P_ukf(:,:,k) = P_ - K*Pyy*K';
end
%% PF算法
Np = 1000; % 粒子数
x_pf = zeros(2,N); % 估计状态向量
w_pf = zeros(Np,N); % 权重向量
for i = 1:Np
x_pf(:,1,i) = mvnrnd(x0',P0)';
w_pf(i,1) = 1/Np;
end
for k = 2:N
% 预测
for i = 1:Np
x_pf(:,k,i) = F*x_pf(:,k-1,i) + mvnrnd([0;0],Q)';
end
% 更新
for i = 1:Np
w_pf(i,k) = w_pf(i,k-1) * normpdf(y(k),H*x_pf(:,k,i),sqrt(R));
end
w_pf(:,k) = w_pf(:,k) / sum(w_pf(:,k));
% 重采样
idx = myResampling(w_pf(:,k));
x_pf(:,:,k) = x_pf(:,:,k,idx);
w_pf(:,k) = w_pf(idx,k);
end
%% EPF算法
Np = 1000; % 粒子数
x_epf = zeros(2,N); % 估计状态向量
w_epf = zeros(Np,N); % 权重向量
for i = 1:Np
x_epf(:,1,i) = mvnrnd(x0',P0)';
w_epf(i,1) = 1/Np;
end
for k = 2:N
% 预测
for i = 1:Np
x_epf(:,k,i) = F*x_epf(:,k-1,i) + mvnrnd([0;0],Q)';
end
% 更新
for i = 1:Np
w_epf(i,k) = w_epf(i,k-1) * exp(-0.5*(y(k) - H*x_epf(:,k,i))^2/R);
end
w_epf(:,k) = w_epf(:,k) / sum(w_epf(:,k));
% 重采样
idx = myResampling(w_epf(:,k));
x_epf(:,:,k) = x_epf(:,:,k,idx);
w_epf(:,k) = w_epf(idx,k);
end
%% 结果绘制
figure;
plot(1:N,x(1,:),'b',1:N,x_ekf(1,:),'r',1:N,x_ukf(1,:),'g',1:N,squeeze(mean(x_pf(1,:,:),3)),'k',1:N,squeeze(mean(x_epf(1,:,:),3)),'m','LineWidth',2);
legend('真实值','EKF','UKF','PF','EPF');
title('状态 x1 的估计');
xlabel('时间步');
ylabel('状态值');
figure;
plot(1:N,x(2,:),'b',1:N,x_ekf(2,:),'r',1:N,x_ukf(2,:),'g',1:N,squeeze(mean(x_pf(2,:,:),3)),'k',1:N,squeeze(mean(x_epf(2,:,:),3)),'m','LineWidth',2);
legend('真实值','EKF','UKF','PF','EPF');
title('状态 x2 的估计');
xlabel('时间步');
ylabel('状态值');
figure;
plot(1:N,y,'b',1:N,H*x_ekf,'r',1:N,H*x_ukf,'g',1:N,H*squeeze(mean(x_pf(:,:,end),3)),'k',1:N,H*squeeze(mean(x_epf(:,:,end),3)),'m','LineWidth',2);
legend('真实值','EKF','UKF','PF','EPF');
title('观测值和估计值');
xlabel('时间步');
ylabel('观测值');
```
这段程序演示了如何使用Matlab编写一个比较四种滤波器的程序。程序中使用了一个简单的线性状态空间模型,包括一个状态转移方程和一个观测方程。程序中使用了EKF、UKF、PF和EPF四种算法进行估计,并比较了它们的性能。在结果绘制中,我们可以看到不同算法的估计结果。
阅读全文