信息融合作业_UKF_一维

本文深入探讨了无迹卡尔曼滤波(UKF)算法在非线性动态系统中的应用。通过具体的MATLAB代码实现,展示了如何使用UKF进行状态估计,包括sigma点的选择、预测和更新步骤。同时,对估计误差协方差曲线的异常现象进行了分析。
clear all;
close all;
clc

Q=0.01;
R=0.01;
X0=1;
P0=0.01;
N=100;
W=sqrt(Q)*randn(1,N);
V=sqrt(R)*randn(1,N);

%模型
for k=1:N
   if k==1
   X(1)=X0+1/X0+W(k);
   else
X(k)=(X(k-1)+1/X(k-1))+W(k);
   end
end
for k=1:N
   if k==1
   Y(1)=X0^2+V(k);
   else
Y(k)=X(k)*X(k)+V(k);
   end
end

a=0.01;
k_=0;
b=2;
n=1;%%维数
%ramda=a*a*(n+k_)-n;  这个不对,存疑
ramda=0.01;%翻阅资料,randa取0.01后X估计值跟上了

Wm(2)=0.5*(n+ramda);
Wm(3)=0.5*(n+ramda);
Wc(2)=Wm(2);
Wc(3)=Wm(3);
Wm(1)=ramda/(n+ramda);
Wc(1)=(ramda/(n+ramda))+(1-a*a+b);
    %%%%%%%%%%%%%%%%%%%%%%%
    %%%f(x)=x+1/x,h(x)=x*x,f'(x)=1-1/(x*x),h'(x)=2*x;

for k=1:N
    if k==1
%X的sigma点集     
xgamaP0(k)=X0;
xgamaP1(k)=X0+sqrt((n+ramda)*P0);
xgamaP2(k)=X0-sqrt((n+ramda)*P0);  
%X的sigma预测值
Xsigma_prea(k)=xgamaP0(k)+1/xgamaP0(k);
Xsigma_preb(k)=xgamaP1(k)+1/xgamaP1(k);
Xsigma_prec(k)=xgamaP2(k)+1/xgamaP2(k);%把sigma点带入f(x)=x+1/x
%X的预测值
X_pre(k)=Wm(1)*Xsigma_prea(k)+Wm(2)*Xsigma_preb(k)+Wm(3)*Xsigma_prec(k);
%P的预测值
P_pre(k)=Wc(1)*(X_pre(k)-Xsigma_prea(k))*(X_pre(k)-Xsigma_prea(k))'+Wc(2)*(X_pre(k)-Xsigma_preb(k))*(X_pre(k)-Xsigma_preb(k))'+Wc(3)*(X_pre(k)-Xsigma_prec(k))*(X_pre(k)-Xsigma_prec(k))'+Q;
%%再次UT变换
xutgamaP0(k)=X_pre(k);
xutgamaP1(k)=X_pre(k)+sqrt((n+ramda)*P_pre(k));
xutgamaP2(k)=X_pre(k)-sqrt((n+ramda)*P_pre(k));
%Y的sigma预测值
Ysigma_prea(k)=xutgamaP0(k)*xutgamaP0(k);
Ysigma_preb(k)=xutgamaP1(k)*xutgamaP1(k);
Ysigma_prec(k)=xutgamaP2(k)*xutgamaP2(k);%把sigma点带入h(x)=x^2
%Y的预测值
Y_pre(k)=Wm(1)*Ysigma_prea(k)+Wm(2)*Ysigma_preb(k)+Wm(3)*Ysigma_prec(k);
Pxy(k)=Wc(1)*(X_pre(k)-Xsigma_prea(k))*(Y_pre(k)-Ysigma_prea(k))'+Wc(2)*(X_pre(k)-Xsigma_preb(k))*(Y_pre(k)-Ysigma_preb(k))'+Wc(3)*(X_pre(k)-Xsigma_prec(k))*(Y_pre(k)-Ysigma_prec(k))';
Pyy(k)=Wc(1)*(Y_pre(k)-Ysigma_prea(k))*(Y_pre(k)-Ysigma_prea(k))'+Wc(2)*(Y_pre(k)-Ysigma_preb(k))*(Y_pre(k)-Ysigma_preb(k))'+Wc(3)*(Y_pre(k)-Ysigma_prec(k))*(Y_pre(k)-Ysigma_prec(k))'+R;

K(k)=Pxy(k)*inv(Pyy(k)); %增益系数
X_est(k)=X_pre(k)+K(k)*(Y(k)-Y_pre(k));%X的估计值
P_est(k)=P_pre(k)-K(k)*Pyy(k)*K(k)';%P的估计值

    else
 %X的UT变换,X的sigma点集    
xgamaP0(k)=X_est(k-1);  
xgamaP1(k)=X_est(k-1)+sqrt((n+ramda)*P_est(k-1));
xgamaP2(k)=X_est(k-1)-sqrt((n+ramda)*P_est(k-1));
%X 的sigma预测值
Xsigma_prea(k)=xgamaP0(k)+1/xgamaP0(k); 
Xsigma_preb(k)=xgamaP1(k)+1/xgamaP1(k);
Xsigma_prec(k)=xgamaP2(k)+1/xgamaP2(k);%把sigma点带入f(x)=x+1/x
%X的预测值
X_pre(k)=Wm(1)*Xsigma_prea(k)+Wm(2)*Xsigma_preb(k)+Wm(3)*Xsigma_prec(k);
%P的预测值
P_pre(k)=Wc(1)*(X_pre(k)-Xsigma_prea(k))*(X_pre(k)-Xsigma_prea(k))'+Wc(2)*(X_pre(k)-Xsigma_preb(k))*(X_pre(k)-Xsigma_preb(k))'+Wc(3)*(X_pre(k)-Xsigma_prec(k))*(X_pre(k)-Xsigma_prec(k))'+Q;

%%再次UT变换
xutgamaP0(k)=X_pre(k);
xutgamaP1(k)=X_pre(k)+sqrt((n+ramda)*P_pre(k));
xutgamaP2(k)=X_pre(k)-sqrt((n+ramda)*P_pre(k));
%Y 的sigma预测值
Ysigma_prea(k)=xutgamaP0(k)*xutgamaP0(k); %Y 的sigma预测值
Ysigma_preb(k)=xutgamaP1(k)*xutgamaP1(k);
Ysigma_prec(k)=xutgamaP2(k)*xutgamaP2(k);%把sigma点带入h(x)=x^2
%Y 的预测值
Y_pre(k)=Wm(1)*Ysigma_prea(k)+Wm(2)*Ysigma_preb(k)+Wm(3)*Ysigma_prec(k);
Pxy(k)=Wc(1)*(X_pre(k)-Xsigma_prea(k))*(Y_pre(k)-Ysigma_prea(k))'+Wc(2)*(X_pre(k)-Xsigma_preb(k))*(Y_pre(k)-Ysigma_preb(k))'+Wc(3)*(X_pre(k)-Xsigma_prec(k))*(Y_pre(k)-Ysigma_prec(k))';
Pyy(k)=Wc(1)*(Y_pre(k)-Ysigma_prea(k))*(Y_pre(k)-Ysigma_prea(k))'+Wc(2)*(Y_pre(k)-Ysigma_preb(k))*(Y_pre(k)-Ysigma_preb(k))'+Wc(3)*(Y_pre(k)-Ysigma_prec(k))*(Y_pre(k)-Ysigma_prec(k))'+R;
K(k)=Pxy(k)*inv(Pyy(k)); %增益系数
X_est(k)=X_pre(k)+K(k)*(Y(k)-Y_pre(k));%X估计值
P_est(k)=P_pre(k)-K(k)*Pyy(k)*K(k)';%P估计值
    end
end
%绘图分析:
figure(1)
k=1:N;
plot(k,X(k),'-o',k,X_est(k),'-x');
xlabel('时间'),ylabel('状态值');
legend ('X的状态值','X的估计值');
title('UKF算法X的状态值和估计值曲线');
for k = 1:N
    e(k)=X(k)-X_est(k);
end

figure(2)
k=1:N;
plot(k,e(k),'-');
xlabel('时间');
ylabel('误差');
title('UKF算法X的状态值与估计值的误差');

figure(3)
plot(k,P_est(k),'-');
xlabel('时间'),ylabel('误差');
title('UKF算法估计误差协方差曲线');



图三估计误差协方差有误.当ranmda取0时候,P_est无限变小.ramda=a*a*(n+k_)-n;公式在此不适用.
                
    
    
    
    
    
    

状态值估计值曲线

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潘诺西亚的火山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值