《卡尔曼滤波原理及应用-MATLAB仿真》程序-5.3UKF

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 程序说明:对比UKF与EKF在非线性系统中应用的算法性能
%  详细原理介绍及中文注释请参考:
%  《卡尔曼滤波原理及应用-MATLAB仿真》,电子工业出版社,黄小平著。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ukf_ekf_compair_example
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N=50;
L=1;
Q=10;
R=1;
W=sqrtm(Q)*randn(L,N);
V=sqrt(R)*randn(1,N);
X=zeros(L,N);
X(:,1)=[0.1]';
Z=zeros(1,N);
Z(1)=X(:,1)^2/20+V(1);
Xukf=zeros(L,N);
Xukf(:,1)=X(:,1)+sqrtm(Q)*randn(L,1);
Pukf=eye(L);
Xekf=zeros(L,N);
Xekf(:,1)=X(:,1)+sqrtm(Q)*randn(L,1);
Pekf=eye(L);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for k=2:N
    X(:,k)=0.5*X(:,k-1)+2.5*X(:,k-1)/(1+X(:,k-1)^2)+8*cos(1.2*k)+W(k);
    Z(k)=X(:,k)^2/20+V(k);
    [Xekf(:,k),Pekf]=ekf(Xekf(:,k-1),Pekf,Z(k),Q,R,k);
    [Xukf(:,k),Pukf]=ukf(Xukf(:,k-1),Pukf,Z(k),Q,R,k);
end
err_ekf=zeros(1,N);
err_ukf=zeros(1,N);
for k=1:N
    err_ekf(k)=abs(Xekf(1,k)-X(1,k));
    err_ukf(k)=abs(Xukf(1,k)-X(1,k));
end
XX=X-W;
err_ave_ekf=sum(err_ekf)/N
err_ave_ukf=sum(err_ukf)/N
figure
hold on;box on;
plot(X,'-r*');
plot(Xekf,'-ko');
plot(Xukf,'-b+');
legend('真实状态','EKF估计','UKF估计')
xlabel('时间k/s')
ylabel('状态值')
figure
hold on;box on;
plot(err_ekf,'-ro');
plot(err_ukf,'-b+');
xlabel('时间k/s')
ylabel('偏差绝对值')
legend('EKF估计','UKF估计')
function [Xout,Pout]=ekf(Xin,P,Zin,Q,R,k)
Xpre=0.5*Xin+2.5*Xin/(1+Xin^2)+8*cos(1.2*k);
F=[0.5+(2.5*(1+Xpre^2)-2.5*Xpre*2*Xpre)/(1+Xpre^2)^2];
Ppre=F*P*F'+Q;
Zpre=Xpre^2/20;
H=[Xpre/10];
K=Ppre*H'/(H*Ppre*H'+R);
Xout=Xpre+K*(Zin-Zpre);
Pout=(eye(1)-K*H)*Ppre;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [Xout,Pout]=ukf(X,P0,Z,Q,R,k)
L=1;
alpha=1;
kalpha=0;
belta=2;
ramda=3-L;
for j=1:2*L+1
    Wm(j)=1/(2*(L+ramda));
    Wc(j)=1/(2*(L+ramda));
end
Wm(1)=ramda/(L+ramda);
Wc(1)=ramda/(L+ramda)+1-alpha^2+belta;
xestimate= X;
P=P0;
cho=(chol(P*(L+ramda)))';
for j=1:L
    xgamaP1(:,j)=xestimate+cho(:,j);
    xgamaP2(:,j)=xestimate-cho(:,j);
end
Xsigma=[xestimate,xgamaP1,xgamaP2];
for j=1:2*L+1
    Xsigmapre(:,j)=0.5*Xsigma(:,j)+2.5*Xsigma(:,j)/(1+Xsigma(:,j)^2)+8*cos(1.2*k);
end
Xpred=0;
for j=1:2*L+1
    Xpred=Xpred+Wm(j)*Xsigmapre(:,j);
end
Ppred=0;
for j=1:2*L+1
    Ppred=Ppred+Wc(j)*(Xsigmapre(:,j)-Xpred)*(Xsigmapre(:,j)-Xpred)';
end
Ppred=Ppred+Q;
chor=(chol((L+ramda)*Ppred))';
for j=1:L
    XaugsigmaP1(:,j)=Xpred+chor(:,j);
    XaugsigmaP2(:,j)=Xpred-chor(:,j);
end
Xaugsigma=[Xpred XaugsigmaP1 XaugsigmaP2];
for j=1:2*L+1
    Zsigmapre(1,j)=Xaugsigma(:,j)^2/20;
end
Zpred=0;
for j=1:2*L+1
    Zpred=Zpred+Wm(j)*Zsigmapre(1,j);
end
Pzz=0;
for j=1:2*L+1
    Pzz=Pzz+Wc(j)*(Zsigmapre(1,j)-Zpred)*(Zsigmapre(1,j)-Zpred)';
end
Pzz=Pzz+R;

Pxz=0;
for j=1:2*L+1
    Pxz=Pxz+Wc(j)*(Xaugsigma(:,j)-Xpred)*(Zsigmapre(1,j)-Zpred)';
end
K=Pxz*inv(Pzz);
xestimate=Xpred+K*(Z-Zpred);
P=Ppred-K*Pzz*K';
Pout=P;
Xout=xestimate;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

结果:


  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 卡尔曼滤波是一种用于实时估计动态系统状态的算法。它在许多领域中被广泛应用,如航空航天、导航、机器人等。卡尔曼滤波算法通过结合系统的测量数据和模型预测值,来动态地更新系统的状态估计。它的核心思想是将已有的信息与新的观测结果进行加权平均,从而得到对系统真实状态更准确的估计。 在Matlab中,我们可以通过编写卡尔曼滤波仿真程序来实现对系统状态的估计。首先,我们需要定义系统的状态方程和观测方程,以及系统的初始状态和噪声模型。然后,使用kalman函数来进行滤波处理,将观测数据输入到滤波器中,得到对状态的估计值。 具体而言,我们可以按照以下步骤来编写卡尔曼滤波Matlab仿真程序: 1. 定义系统的状态方程和观测方程,并初始化系统状态和滤波器的状态估计。 2. 定义系统的噪声模型,包括过程噪声和观测噪声的协方差矩阵。 3. 生成系统的真实状态序列和对应的观测数据。 4. 使用kalman函数进行滤波处理,将观测数据输入到滤波器中,得到对状态的估计值。 5. 计算滤波器的误差协方差矩阵,评估滤波器性能。 6. 绘制真实状态序列、观测数据和滤波器估计值的曲线图,以及滤波器误差的方差曲线图。 在编写程序时,我们还可以尝试不同的参数设置和噪声模型,以及对结果进行分析和优化。 总之,通过在Matlab中编写卡尔曼滤波仿真程序,我们可以更好地理解卡尔曼滤波原理应用,并对其进行调试和优化,从而实现更准确的状态估计。 ### 回答2: 卡尔曼滤波是一种用于估计状态变量的方法,它通过将测量观测值与先验估计进行加权平均,来获得更准确的状态估计值。这种滤波方法常用于控制系统中,尤其是在传感器测量带有噪声的情况下。 卡尔曼滤波原理主要包含两个步骤:预测和更新。在预测步骤中,使用系统的状态转移方程预测下一时刻的状态变量;而在更新步骤中,根据已有的观测值和预测值之间的误差,计算卡尔曼增益,从而对预测值进行修正,得到更准确的状态估计。 Matlab是一种广泛使用的科学计算与数据分析工具,提供了丰富的数学函数和工具箱,可以方便地进行卡尔曼滤波仿真。在Matlab中,可以使用kalman函数来实现卡尔曼滤波。具体步骤如下: 1. 定义系统的状态转移方程、观测方程和噪声协方差矩阵。 2. 初始化系统的状态向量和协方差矩阵。 3. 通过循环迭代,对每个时刻进行滤波。 4. 在预测步骤中,使用状态转移方程进行状态的预测。 5. 在更新步骤中,计算观测值与预测值之间的误差,并计算卡尔曼增益。 6. 根据卡尔曼增益修正预测值,得到更准确的状态估计。 7. 更新协方差矩阵,并记录滤波结果。 Matlab还提供了一些用于可视化和分析滤波结果的函数,如plot函数和mean函数等。 通过使用Matlab进行卡尔曼滤波仿真,我们可以观察到滤波结果与真实值的接近程度,评估滤波算法的性能并进行参数调整,以获得更准确的状态估计。这对于控制系统的设计和实际应用具有重要意义。 ### 回答3: 卡尔曼滤波是一种最优化的滤波方法,用于估计系统的状态。它通过融合系统的测量值和预测值,提供对未知状态的最优估计。卡尔曼滤波原理是基于贝叶斯定理,它假设系统的状态满足线性动力学方程,并且状态的噪声满足高斯分布。在卡尔曼滤波中,有两个主要的步骤:预测步骤和更新步骤。 预测步骤是根据上一个时刻的状态估计值,预测当前时刻的状态估计值和协方差矩阵。更新步骤是通过测量值,根据预测的状态估计值和当前测量值之间的差异,进行状态的修正和协方差矩阵的更新。 Matlab中提供了卡尔曼滤波仿真工具箱,可以通过设置系统模型、测量模型、协方差矩阵以及初始状态值等参数,实现对状态的估计。 随书程序是指在教科书中附带的示例程序卡尔曼滤波的随书程序是指通过Matlab编写的卡尔曼滤波的代码示例。这些示例程序可以帮助读者理解卡尔曼滤波原理应用,并且可以通过修改参数和增加噪声等操作,进行仿真实验,观察估计结果的变化。 通过使用Matlab编写随书程序,读者可以更好地理解卡尔曼滤波的算法,掌握卡尔曼滤波的实现方法,并且可以在实际应用中进行调试和参数优化。 总之,卡尔曼滤波原理应用的随书程序是一种辅助学习和实验的工具,通过使用Matlab编写,可以更好地理解卡尔曼滤波的算法,并且可以进行仿真实验,优化参数,提高对系统状态的估计精度。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值