kalman预测器

%二维系统.
%状态转移矩阵F=[1,1;0,1],观测矩阵H=[0.9,0;0,1.1],过程噪声方差Q=[0.01,0;0,0.01],R=[0.1,0;0,0.1]观测噪声方差R=1
%初始状态X0=[1;0.3],初始协方差P0=[0.1,0;0,0.1]
%状态方程X(k+1)=F(k+1,k)X(k)+w(k+1),假设X第一维度是位移,第二维度是速度
%观测方程Y(k+1)=H(k+1)X(k+1)+v(k+1)
%根据观测方程和状态方程的性质,如果X为n维,Y为m维.则F是n*n矩阵,H为m*n矩阵
%X_pre 是一个2*1 不断更新的列向量
%P_pre 是一个2*2 不断更新的2*2矩阵,用三维矩阵更新二维矩阵
%K 是一个2*2 不断更新的2*2矩阵,用三维矩阵更新二维矩阵
%X_est 是一个2*1 不断更新的列向量
%P_est 是一个2*2 不断更新的2*2矩阵,用三维矩阵更新二维矩阵
%编程如下:
F=[1,1;0,1];
H=[0.9,0;0,1.1];
Q=[0.01,0;0,0.01];
R=[0.1,0;0,0.1];
X0=[1;0.3];
P0=[0.1,0;0,0.1];
N=100;
W=sqrt(Q)*randn(2,N);
V=sqrt(R)*randn(2,N);
%模拟观测:
X(:,1)=F*X0+W(:,1);
for k=2:N
    X(:,k)=F*X(:,k-1)+W(:,k);
end
for k=1:N
    Y(:,k)=H*X(:,k)+V(:,k);
end
for k=1:N
    if k==1
        X_pre(:,k)=F*X0;
        Y_pre(:,k)=H*X0;
        P_pre(:,:,k)=F*P0*F'+Q;
        Pxy(:,:,k)=P_pre(:,:,k)*H';
        Pyy(:,:,k)=H*P_pre(:,:,k)*H'+R;
        K(:,:,k)=Pxy(:,:,k)*inv(Pyy(:,:,k));  
        X_est(:,k)=F*(X_pre(:,k)+K(:,:,k)*(Y(:,k)-Y_pre(:,k)));
        P_est(:,:,k)=F*(P_pre(:,:,k)-K(:,:,k)*H*P_pre(:,:,k))*F'+Q;
    else
        X_pre(:,k)=F*X_est(:,k-1);
        Y_pre(:,k)=H*X_est(:,k-1);
        P_pre(:,:,k)=F*P_est(:,:,k-1)*F'+Q;
        Pxy(:,:,k)=P_pre(:,:,k-1)*H';
        Pyy(:,:,k)=H*P_pre(:,:,k-1)*H'+R;
        K(:,:,k)=Pxy(:,:,k)*inv(Pyy(:,:,k));  
        X_est(:,k)=F*(X_pre(:,k)+K(:,:,k)*(Y(:,k)-Y_pre(:,k)));
        P_est(:,:,k)=F*(P_pre(:,:,k)-K(:,:,k)*H*P_pre(:,:,k))*F'+Q;
    end
end

e1=zeros(1,N);
e2=zeros(1,N);
for k=1:N
    e1(1,k)=abs(X(1,k)-X_est(1,k));
    e2(1,k)=abs(X(2,k)-X_est(2,k));
end
%绘图分析:
figure(1)
k=1:N;
plot(k,X(1,k),'-o',k,X_est(1,k),'-x');
xlabel('时间'),ylabel('状态值和估计值');
legend ('位移状态值','位移估计值');
title('位移的状态值和估计值曲线');

figure(2)
k=1:N;
plot(k,X(2,k),'-o',k,X_est(2,k),'-x');
xlabel('时间'),ylabel('状态值和估计值');
legend ('速度状态值','速度的估计值');
title('速度的状态值和估计值曲线');

figure(3)
subplot(2,1,1);
plot(e1,'b-');
xlabel('时间'),ylabel('误差绝对值');
title('位移状态值与估计值的误差绝对值');
subplot(2,1,2);
plot(e2,'k-');
xlabel('时间'),ylabel('误差绝对值');
title('速度状态值与估计值的误差绝对值');

figure(4)
k=1:N;
subplot(2,1,1);
plot(P_est(1,k),'b-');
xlabel('时间'),ylabel('估计误差协方差误差1');
title('估计误差协方差误差1');
subplot(2,1,2);
plot(P_est(2,k),'k-');
xlabel('时间'),ylabel('估计误差协方差误差2');
title('估计误差协方差误差2');


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

潘诺西亚的火山

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

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

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

打赏作者

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

抵扣说明:

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

余额充值