Kalman滤波在温度测量中的应用(含MATLAB仿真)

Kalman滤波在温度测量中的应用(含MATLAB仿真)

1、原理介绍

研究的对象是一个房间的温度吗,根据经验判断,这个房间的温度是25℃左右,也就是说期盼值是25℃。

受空气流通、阳光等影响,房间温度会在25℃左右波动。

我们以一分钟为时间间隔用温度计采样室内温度。

假设过程噪声为 W ( k ) W(k) W(k),其方差大小为 Q = 0.01 Q=0.01 Q=0.01。一步转移矩阵 A = 1 A=1 A=1,噪声驱动矩阵 G = 1 G=1 G=1

所以系统状态方程和量测方程为:
X ( k ) = A X ( k − 1 ) + G W ( k − 1 ) X(k)=AX(k-1)+GW(k-1) X(k)=AX(k1)+GW(k1)

Z ( k ) = H X ( k ) + V ( k ) Z(k)=HX(k)+V(k) Z(k)=HX(k)+V(k)

假设初始房间温度为25.1℃,即 X ( 1 ) = 25.1 X(1)=25.1 X(1)=25.1

初始值方差为 P ( 1 ) = 0.01 P(1)=0.01 P(1)=0.01

初始测量值为 Z ( 1 ) = 24.9 Z(1)=24.9 Z(1)=24.9

Z ( 1 ) Z(1) Z(1)可以作为初始估计值, X k f ( 1 ) = Z ( 1 ) = 24.9 X_kf(1)=Z(1)=24.9 Xkf(1)=Z(1)=24.9

2、MATLAB仿真代码

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%功能说明:Kalman滤波用在一维温度数据测量系统中
function Kalman_Temperature
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N = 120;  %采样点的个数为120,时间单位是分钟,可以理解为进行了120分钟测量
CON = 25; %根据经验判断,室内温度理论值应该是25度左右,在这个25的基础上会有波动

%对状态和测量初始化
X_except = CON*ones(1,N); %期望温度是25度,但真实温度不可能是这样
X = zeros(1,N);           %房间各个时刻真实温度值
X_kf = 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;    
X_kf(1) = Z(1); %初始测量值是24.9度,可以作为滤波器的初始估计状态

%噪声
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
    %step1:随着时间的推移,房间温度真实波动变化
    %k时刻房间内的真实温度,对于温度计来说,这个真实值是不知道的,但它的存在是客观事实
    X(k) = F*X(k-1) + G*W(k-1); %动态方程
    %step2:随着时间的推移,获取实时数据
    %温度计对k时刻房间温度的测量,Kalman滤波是站在温度计角度进行的,
    %它不知道此时的真实状态X(k),
    %只能利用本次测量值Z(k)和上一次估计值X_kf(k)来做处理,
    %最大限度的降低量测噪声R的影响,尽可能的逼近X(k),这也是Kalman滤波目的所在
    Z(k) = H*X(k) + V(k);
    %step3:Kalman滤波
    %有了k时刻的观测Z(k)和k-1时刻的状态,那么就可以进行滤波了
    X_pre = F*X_kf(k-1);                 %状态预测
    P_pre = F*P(k-1)*F' + Q;             %协方差预测
    Kg = P_pre*inv(H*P_pre*H' + R)       %计算Kalman增益
    e = Z(k) - H*X_pre;                  %新息
    X_kf(k) = X_pre + Kg*e;              %状态更新
    P(k) = (I-Kg*H)*P_pre;               %协方差更新
end

%计算误差
Error_Messure = zeros(1,N);         %测量值与真实值之间的误差
Error_Kalman = zeros(1,N);          %Kalman估计与真实值之间的偏差
for k = 1:N
    Error_Messure(k) = abs(Z(k)-X(k));       
    Error_Kalman(k) = abs(X_kf(k)-X(k));    
end

t = 1:N;
%figure('Name','Kalman Filter Simulation','NumberTitle','off');
figure %画图显示
plot(t,X_except,'-b',t,X,'-r.',t,Z,'-ko',t,X_kf,'-g*');
legend('期望值','真实值','观测值','Kalman滤波值');
xlabel('采样时间/s');
ylabel('温度值/℃');

figure %误差分析图
plot(t,Error_Messure,'-b.',t,Error_Kalman,'-k*');
legend('测量偏差','Kalman滤波偏差');
xlabel('采样时间/s');
ylabel('温度偏差值/℃');
 

3、仿真结果

figure1

image-20220611163605851

figure2

image-20220611163553136

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

工藤赵一

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

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

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

打赏作者

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

抵扣说明:

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

余额充值