kalman滤波在温度测量中的应用
MATLAB代码如下:
function main
N=120;
CON=25; %采样点
Xexpect=CON*ones(1,N); %期望值
X=zeros(1,N); %真值
Xkf=zeros(1,N); %KALMAN滤波处理状态,估计值
Z=zeros(1,N); %测量值
P=zeros(1,N);
%赋初值
X(1)=25.1; %初始值房间温度25.1%
P(1)=0.01; %初始值协方差
Z(1)=24.9; %初始测量值
Xkf(1)=Z(1); %初始测量值作为初始估计状态
%噪声
Q=0.01;
R=0.25;
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
%1 :随时间变化真实温度波动变化
X(k)=F*X(k-1)+G*W(k-1);
%2 :随时间推移,获取实时数据
Z(k)=H*X(k)+V(k);
%3 :卡尔曼滤波
X_pre=F*Xkf(k-1); %状态预测
P_pre=F*P(k-1)*F'+Q; %协方差预测
Kg=P_pre*inv(H*P_pre*H'+R); %计算卡尔曼增益 inv求逆矩阵
e=Z(k)-H*X_pre; %信息
Xkf(k)=X_pre+Kg*e; %状态更新
P(k)=(1-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)); %abs绝对值和复数的模
Err_Kalman(k)=abs(Xkf(k)-X(k));
end
t=1:N;
%画图显示
figure
plot(t,Xexpect,'-b',t,X,'-r.',t,Z,'-ko',t,Xkf,'-g*');
legend('期望值','真实值','观测值','Kalman滤波值');
xlabel('采样时间/s');
ylabel('温度值/℃');
%误差分析图
figure
plot(t,Err_Messure,'-b',t,Err_Kalman,'-k*');
legend('测量偏差','Kalman滤波偏差');
xlabel('采样时间/s');
ylabel('温度偏差值/℃');
运行结果:
房间温度估计
房间温度误差分析