目录
电池状态估算是电动汽车和储能系统中的一个重要环节,它涉及到电池的荷电状态(State of Charge, SoC)、健康状态(State of Health, SoH)等参数的精确估计。电池的荷电状态(State of Charge, SoC)是指电池剩余电量与其最大容量之间的比例,它是电池管理系统(Battery Management System, BMS)中的一个关键参数。准确的SoC估算对于保证电池安全运行、延长电池寿命以及提高电池利用率都至关重要。卡尔曼滤波(Kalman Filter, KF)和粒子滤波(Particle Filter, PF)是两种广泛应用于电池状态估算的统计推断方法。
1. 卡尔曼滤波(KF)
卡尔曼滤波是一种强大的工具,可以有效地处理线性高斯系统中的状态估计问题。通过结合系统的动态模型和观测数据,卡尔曼滤波能够提供最优的线性最小方差估计。在电池SoC估算等应用中,卡尔曼滤波可以显著提高估计的准确性和鲁棒性。不过需要注意的是,卡尔曼滤波的有效性依赖于合理的系统模型和噪声统计特性估计。卡尔曼滤波是一种递归的线性最小方差估计器,主要用于线性高斯系统的状态估计。
卡尔曼滤波分为预测和更新两个步骤。
2. 粒子滤波(PF)
粒子滤波是一种基于蒙特卡洛方法的非线性递归贝叶斯滤波器,适用于非线性非高斯系统的状态估计。粒子滤波同样基于状态空间模型,但在非线性情况下,状态方程和观测方程可能不再线性。
3. 应用于电池状态估算
电池的荷电状态(State of Charge, SoC)是指电池剩余电量与其最大容量之间的比例,它是电池管理系统(Battery Management System, BMS)中的一个关键参数。准确的SoC估算对于保证电池安全运行、延长电池寿命以及提高电池利用率都至关重要。假设初始时电池处于满电状态,即SoC0=100%,则在任何时刻的SoC可以表示为:
在电池状态估计算法中,卡尔曼滤波和粒子滤波都可以用来估计电池的SoC、SoH等状态参数。电池模型通常包括电池的等效电路模型(如Thevenin模型)和电池老化模型等。
4. MATLAB仿真程序
...........................................................
% 滤波循环
for k = 2:n_iter
% 预测
x_pred(k) = A*x_est(k-1) + B*u(k-1); % 状态预测
y_pred(k) = C*x_pred(k); % 测量预测
P_pred(k) = A*P_est(k-1)*A' + Rww_fil; % 状态协方差预测
% 创新
innov(k) = y(k) - y_pred(k); % 创新
R_innov(k) = C*P_pred(k)*C' + Rvv_fil; % 创新协方差
% 卡尔曼增益
Kgain(k) = P_pred(k)*C/R_innov(k); % 卡尔曼增益
% 更新
x_est(k) = x_pred(k) + Kgain(k)*innov(k); % 状态估计
P_est(k) = (1 - Kgain(k)*C)*P_pred(k); % 状态协方差估计
% 平滑窗口
if k <= win
winSm(k) = mean(y(1:k+win))/2;
elseif k < (n_iter-win)
winSm(k) = mean(y(k-win:k+win))/2;
else
winSm(k) = mean(y(k-win:end))/2;
end
end
% 显示滤波结果
figure
subplot(2,2,1)
plot(t,x);
hold on;
plot(t,x_est);
% plot(t,winSm);
grid on;
xlabel('时间 [秒]');
ylabel('状态');
title(sprintf('状态估计,$$x_0=%1.1f$$ 和 $$P_0=%1.0d$$', x_est(1), P_est(1)));
legend('真实状态', '卡尔曼滤波估计');
subplot(2,2,2)
error = x-x_est;
plot(t,error);
hold on;
plot(t,2*sqrt(P_est));
plot(t,-2*sqrt(P_est));
grid on;
xlabel('时间 [秒]');
ylabel('误差');
title('状态估计误差');
legend('误差', '$$+2\sqrt{P_{est}}$$', '$$-2\sqrt{P_{est}}$$');
subplot(2,2,3)
plot(t,error);
hold on;
plot(t,2*sqrt(P_est));
plot(t,-2*sqrt(P_est));
maximo = max(error);
minimo = min(error);
delta = maximo-minimo;
ylim([minimo-0.25*delta, maximo+0.25*delta]);
grid on;
xlabel('时间 [秒]');
ylabel('误差');
title('状态估计误差');
legend('误差', '$$+2\sqrt{P_{est}}$$', '$$-2\sqrt{P_{est}}$$');
subplot(2,2,4)
plot(t(2:end),Kgain(2:end));
hold on;
grid on;
xlabel('时间 [秒]');
ylabel('增益');
title('卡尔曼增益变化');
up4135
..............................
% 滤波循环
for k = 2:n_iter
% 预测
x_pred(k) = A*x_est(k-1) + B*u(k-1); % 状态预测
y_pred(k) = C*x_pred(k); % 测量预测
P_pred(k) = A*P_est(k-1)*A' + Rww_fil; % 状态协方差预测
% 创新
innov(k) = y(k) - y_pred(k); % 创新
R_innov(k) = C*P_pred(k)*C' + Rvv_fil; % 创新协方差
% 卡尔曼增益
Kgain(k) = P_pred(k)*C/R_innov(k); % 卡尔曼增益
% 更新
x_est(k) = x_pred(k) + Kgain(k)*innov(k); % 状态估计
P_est(k) = (1 - Kgain(k)*C)*P_pred(k); % 状态协方差估计
% 平滑窗口
if k <= win
winSm(k) = mean(y(1:k+win))/2;
elseif k < (n_iter-win)
winSm(k) = mean(y(k-win:k+win))/2;
else
winSm(k) = mean(y(k-win:end))/2;
end
end
% 显示滤波结果
figure
subplot(2,2,1)
plot(t,x);
hold on;
plot(t,x_est);
% plot(t,winSm);
grid on;
xlabel('时间 [秒]');
ylabel('状态');
title(sprintf('状态估计,$$x_0=%1.1f$$ 和 $$P_0=%1.0d$$', x_est(1), P_est(1)));
legend('真实状态', '卡尔曼滤波估计');
subplot(2,2,2)
error = x-x_est;
plot(t,error);
hold on;
plot(t,2*sqrt(P_est));
plot(t,-2*sqrt(P_est));
grid on;
xlabel('时间 [秒]');
ylabel('误差');
title('状态估计误差');
legend('误差', '$$+2\sqrt{P_{est}}$$', '$$-2\sqrt{P_{est}}$$');
subplot(2,2,3)
plot(t,error);
hold on;
plot(t,2*sqrt(P_est));
plot(t,-2*sqrt(P_est));
maximo = max(error);
minimo = min(error);
delta = maximo-minimo;
ylim([minimo-0.25*delta, maximo+0.25*delta]);
grid on;
xlabel('时间 [秒]');
ylabel('误差');
title('状态估计误差');
legend('误差', '$$+2\sqrt{P_{est}}$$', '$$-2\sqrt{P_{est}}$$');
subplot(2,2,4)
plot(t(2:end),Kgain(2:end));
hold on;
grid on;
xlabel('时间 [秒]');
ylabel('增益');
title('卡尔曼增益变化');
5.仿真结论
卡尔曼滤波和粒子滤波都是有效的电池状态估计算法。卡尔曼滤波适用于线性高斯系统,而粒子滤波则更适合非线性非高斯系统。通过合理选择滤波器类型,并根据具体应用场合调整滤波器参数,可以提高电池状态估算的精度和可靠性。