代码
clc;
clear;
%%录入数据
year=[1953:2020]';
N_year=[58796;60266;61465;62828;64653;65994;67207;66207;65859;67296;69172;...
70499;72538;74542;76368;78534;80671;82992;85229;87177;89211;90859;92420;...
93717;94974;96259;97542;98705;100072;101654;103008;104357;105851;107507;...
109300;111026;112704;114333;115823;117171;118517;119850;121121;122389;...
123626;124761;125786;126743;127627;128453;129227;129988;130756;131448;...
132129;132802;133450;134091;134916;135922;136726;137646;138326;139232;...
140011;140541;141008;141178];
%%卡尔曼滤波参数设定
T=1; %采样步长
N=68/T; %总的采样次数
X=zeros(1,N); %真实值
Xkf=zeros(1,N); %卡尔曼滤波值
Z=N_year; %卡尔曼观测值
P=zeros(1,N); %状态一步预测协方差
%%赋初值
X(1)=58796;
P(1)=1;
Z(1)=58796;
Xkf(1)=Z(1);
%%噪声值设定
Q=0.01; %系统噪声
R=0.01; %测量噪声
W=sqrt(Q)*randn(1,N); %方差决定噪声大小
V=sqrt(R)*randn(1,N); %方差决定噪声大小
%系统矩阵
F=1;
G=1;
H=1;
I=eye(1); %本系统状态为一维
%模拟钢包温度及测量过程,并滤波
for k=2:N
%第一步,随时间推移,真实温度波动变化
%k时刻的真实温度,温度计是不知道的,但是它又是真实存在的,因此我们要过滤杂波,尽量收敛到真实温度
X(k)=FX(k-1)+GW(k-1);
%第二步,随着时间推移,获取实时数据
%温度计对k时刻温度的测量,Kalman滤波是站在温度计角度进行的。
%他不知道此刻真实温度,只能站在本次测量值和上一次估计值来做处理。其目的是最大限度降低测量噪声R的影响。尽可能的逼近X(k);
Z(k)=H*X(k)+V(k);
%第三步,卡尔曼滤波。
%有了k时刻的观测和k-1时刻的状态就可以滤波了。
X_pre=F*Xkf(k-1)+V(k-1); %状态预测
P_pre=F*P(k-1)*F'+Q; %协方差预测
Kg=P_pre*inv(H*P_pre*H'+R); %计算卡尔曼增益
e=Z(k)-H*X_pre; %新息
Xkf(k)=X_pre+Kg*e; %状态更新
P(k)=(I-Kg*H)*P_pre; %协方差更新
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%计算误差
Err_Messure=zeros(1,N); %测量值与真实值之间的偏差
Err_Kalman=zeros(1,N); %估计值与真实值之间的偏差
for k=1:N
Err_Messure(k)=abs(Z(k)-X(k));
Err_Kalman(k)=abs(Xkf(k)-X(k));
end
t=1:N;
%%卡尔曼滤波图
figure(1);
plot(year,X,'-r',year,N_year,'-ko',year,Xkf,'-g*');
legend('真实值','观测值','卡尔曼滤波值');
xlabel('年份');
ylabel('总人口数/万人');
%%误差分析图
figure(2)
plot(year,Err_Messure,'-b',year,Err_Kalman,'-k*');
legend('测量偏差','卡尔曼滤波偏差');
xlabel('年份');
ylabel('总人口数/万人');
问题描述
想问下就是参数该怎么调,为啥图上只有观测值曲线?
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。