👨🎓个人主页
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
基于粒子滤波与卡尔曼滤波的锂离子电池放电时间预测与使用特征研究
💥1 概述
文献来源:
摘要:我们提出了一个基于粒子滤波的预测框架的实现,该框架利用使用概况的统计特征来(i)估计充电状态(SOC), (ii)预测储能设备(锂离子电池)的放电时间。该方法采用了一种新的经验状态空间模型,该模型受到电池现象学的启发,并使用粒子滤波算法实时估计SOC和其他未知模型参数。滤波阶段采用的自适应机制提高了状态估计的收敛性,为预测阶段提供了充分的初始条件。SOC预测使用基于粒子滤波的框架来实现,该框架考虑了基于两态马尔可夫链转移概率的最大似然估计的未来放电曲线的不确定性的统计特征。所有的算法都经过了训练和验证,使用了一个锂离子26650和两个锂离子18650电池的实验数据,并考虑了不同的操作条件。
索引术语:锂离子电池,马尔可夫链,粒子滤波,充电状态预测。
原文摘要:
Abstract—We present the implementation of a particle-filtering-based prognostic framework that utilizes statistical characteriza-tion of use profiles to (i) estimate the state-of-charge (SOC), and (ii)predict the discharge time of energy storage devices (lithium-ion batteries). The proposed approach uses a novel empirical state-space model, inspired by battery phenomenology, and particle-fil-tering algorithms to estimate SOC and other unknown model pa-rameters in real-time. The adaptation mechanism used during the filtering stage improves the convergence of the state estimate, and provides adequate initial conditions for the prognosis stage. SOC prognosis is implemented using a particle-filtering-based frame-work that considers a statistical characterization of uncertainty for future discharge profiles based on maximum likelihood estimates of transition probabilities for a two-state Markov chain. All algo-rithms have been trained and validated using experimental data acquired from one Li-Ion 26650 and two Li-Ion 18650 cells, and considering different operating conditions.
Index Terms—Lithium-ion battery, Markov chain, particle fil-tering, state-of-charge prognosis.
文献下载:
链接:夸克网盘分享
提取码:vSvu
基于粒子滤波与卡尔曼滤波的锂离子电池放电时间预测与使用特征研究
锂离子电池的状态估计(如SOC、SOH)及放电时间预测是电池管理系统(BMS)的核心任务。本文结合粒子滤波(PF)与卡尔曼滤波(KF)的算法原理、性能对比、影响因素及模型构建方法,系统阐述其在放电时间预测中的应用,并分析关键使用特征的影响机制。
一、粒子滤波(PF)与卡尔曼滤波(KF)的算法原理及应用
1. 粒子滤波(PF)在电池状态估计中的应用
粒子滤波是一种基于蒙特卡洛采样和贝叶斯估计的非线性滤波方法,适用于非高斯、强非线性系统。其核心步骤如下:
- 建模:构建电池的状态方程(描述SOC与内部电阻、极化电阻等参数的关系)和观测方程(输出电压与SOC的对应关系)。
- 粒子生成与权重更新:通过随机采样生成状态空间的粒子集,计算各粒子的权重(基于观测值与预测值的匹配度),并归一化权重以近似后验概率密度。
- 重采样:消除低权重粒子,保留高权重粒子,避免粒子退化问题。
- SOC估计与验证:输出加权平均的SOC值,并作为模糊控制器的输入以验证准确性。
优势:PF对模型误差鲁棒性强,尤其适用于动态工况(如温度突变、电流波动)下的SOC估计,实验表明其误差较扩展卡尔曼滤波(EKF)减少40%。
2. 卡尔曼滤波(KF)在电池状态估计中的应用
卡尔曼滤波基于线性/轻度非线性高斯系统,通过迭代融合模型预测与实测数据优化估计:
- 预测阶段:利用状态方程(如等效电路模型)预测当前SOC和端电压。
- 校正阶段:结合实测电压和电流,通过卡尔曼增益调整状态估计。增益大小由误差协方差矩阵和噪声统计特性决定。
- 自适应噪声校正:动态调整噪声协方差矩阵以应对系统噪声变化。
优势:计算效率高(解析解),在模型精确时估计精度优异,适用于恒定工况。例如,EKF在磷酸铁锂电池SOC估计中误差可控制在2.5%以内。
二、PF与KF的性能对比分析
特性 | 卡尔曼滤波(EKF/UKF) | 粒子滤波(PF) |
---|---|---|
适用系统 | 线性/轻度非线性高斯系统 | 强非线性、非高斯系统 |
计算复杂度 | 低(依赖解析解) | 高(依赖粒子数量,通常需>1000粒子) |
模型依赖性 | 需精确模型与噪声统计 | 对模型误差鲁棒性强 |
典型场景 | 恒定工况(如实验室环境) | 动态工况(如电动汽车频繁启停) |
精度对比 | 模型可靠时更优 | 模型不精确时优于KF |
案例表现 | 误差<2.5%(EKF) | 误差较EKF减少40%(PF) |
融合方法:改进算法如无迹卡尔曼粒子滤波(UKPF)结合了KF的预测效率与PF的非线性处理能力,在SOC估计中误差进一步降低至1.5%。
三、锂离子电池放电时间预测的关键影响因素
放电时间预测依赖于SOC估计的准确性,并受以下使用特征显著影响:
-
温度:
- 低温(<5℃) :电解液黏度增加,锂离子迁移受阻,放电容量下降30%~50%,磷酸铁锂电池容量衰减尤为显著。
- 高温(>40℃) :副反应加速(如SEI膜分解),循环寿命缩短,但短期放电容量可能增加(因离子活性提升)。
-
放电倍率(C-rate):
- 高倍率(如2C)导致极化加剧,可用容量减少(例如0.5C放电容量保持率92%,1.5C降至89%),且温升显著(镍钴铝酸锂电池在20C下温升达30℃)。
-
充放电循环:
- 循环次数增加导致活性物质损失,容量衰减不可逆。例如,2000次循环后,三元锂电池容量保持率降至89%。
- 放电深度(DOD) :浅充浅放(如DOD 20%~80%)可延长循环寿命,较深充深放(DOD 0%~100%)寿命提升30%。
-
自放电与老化:
- 物理微短路和化学副反应导致自放电率上升,长期储存后容量损失显著。
- 健康状态(SOH)下降直接缩短放电时间,MPF算法在SOH估计中较传统方法降低RMSE 25%。
四、基于PF与KF的电池状态估计模型构建步骤
-
电池模型建立:
- 等效电路模型:如Thevenin模型(包含RC网络描述极化效应)。
- 参数辨识:通过充放电实验拟合内阻、极化电阻和电容参数。
-
算法实现:
- KF框架:定义状态方程(如SOC变化率与电流关系)和观测方程(端电压与SOC关系),初始化协方差矩阵。
- PF框架:生成粒子集,结合重采样策略(如系统重采样)更新权重。
- 融合算法:采用EKPF(扩展卡尔曼粒子滤波),利用EKF线性化更新粒子,提升收敛速度。
-
验证与优化:
- 实验数据采集:实际工况下的电流、电压、温度数据。
- 误差分析:比较预测SOC与真实值(如库仑积分法结果),调整噪声协方差或粒子数量。
- 实时性优化:采用并行计算或降维方法(如重要性采样)降低PF计算负载。
五、结论与展望
粒子滤波与卡尔曼滤波在电池状态估计中各具优势:PF适用于复杂非线性场景,KF在模型精确时效率更高。实际应用中,融合算法(如UKPF)和考虑多因素耦合模型(如温度-老化联合影响)是未来研究方向。同时,放电时间预测需结合实时工况数据与机器学习方法(如LSTM网络),以进一步提升动态环境下的预测精度。
📚2 运行结果
2.1 kalmanFilter
2.2 basicNonlinear
2.3 battery
部分代码:
%Leer entrada de corriente
input = csvread('2015_vali1_current.csv');
i_meas = input(:,2);
L = length(i_meas);
dt = 2; %paso de tiempo en segundos
t = dt*(0:(L-1));
%Simular voltaje
v = zeros(L,1);
v_meas = zeros(L,1);
x1 = zeros(L,1);
x2 = zeros(L,1);
%Noise
sigma_1 = 1e-8;
sigma_2 = 1e-8;
sigma_n = 1e-4;
%Initial conditions
x1(1) = Zp;
x2(1) = 1;
v(1) = v0 - i_meas(1)*x1(1);
v_meas(1) = v(1) + sqrt(sigma_n)*randn;
for k = 2:L
%State transition
x1(k) = x1(k-1) + sqrt(sigma_1)*randn;
x2(k) = x2(k-1) - v(k-1)*i_meas(k-1)*dt/Ecrit + sqrt(sigma_2)*randn;
if x2(k)<0
x2(k) = 0;
end
%Measurement
v(k) = vl + (v0-vl)*exp(gamma*(x2(k)-1))...
+ alfa*vl*(x2(k)-1) + (1-alfa)*vl*( exp(-beta)-exp(-beta*sqrt(x2(k))))...
- i_meas(k)*x1(k);
v_meas(k) = v(k) + sqrt(sigma_n)*randn;
end
%Mostrar los datos simulados
figure
subplot(2,2,1)
plot(t,i_meas);
grid, xlabel('Time [s]'), ylabel('Current [A]'), title('Measured Discharge Current');
subplot(2,2,2)
plot(t,v_meas);
grid, xlabel('Time [s]'), ylabel('Voltage [V]'), title('Simulated Measured Discharge Voltage');
%Mostrar los datos simulados
%figure
subplot(2,2,4)
plot(t,v);
grid, xlabel('Time [s]'), ylabel('Voltage [V]'), title('Simulated True Discharge Voltage');
subplot(2,2,3)
plot(t,x2);
grid, xlabel('Time [s]'), ylabel('SOC'), title('Simulated True SOC');
%%
%Filtrado
%--------------PF Bootstrap---------------
n_part = 100;
%Ruidos filtro
w_1 = sigma_1;
w_2 = 1e-5; %sigma_2;
Rnn = 1e-2; %sigma_n;
%Resampling
N_t = n_part;
%Inicializacion de particulas
particle = zeros(n_part,2);
particle_pred = zeros(n_part,2);
particle(:,1) = ones(n_part,1)*Zp;
particle(:,2) = unifrnd(0.8,0.9, n_part, 1); %soc
weight = ones(n_part,1)/n_part;
%Estimadores
x1_est_mmse = zeros(L,1);
x1_est_mmse(1) = mean(particle(:,1));
x2_est_mmse = zeros(L,1); %soc
x2_est_mmse(1) = mean(particle(:,2));
v_model = zeros(n_part,1);
for k=2:L
for i=1:n_part
%Modelo de voltaje para la particula anterior (k-1)
v_model(i) = vl + (v0-vl)*exp(gamma*(particle(i,2)-1))...
+ alfa*vl*(particle(i,2)-1) + (1-alfa)*vl*( exp(-beta)-exp(-beta*sqrt(particle(i,2))))...
- i_meas(k-1)*particle(i,1);
%Importance sampling (prediccion desde k-1 hacia k)
r1 = sqrt(w_1)*randn;
r2 = sqrt(w_2)*randn;
particle_pred(i,1) = particle(i,1) + r1;
particle_pred(i,2) = particle(i,2) - v_model(i)*i_meas(k-1)*dt/Ecrit + r2;
if particle_pred(i,2)<0
particle_pred(i,2) = 0;
end
%Weight update (medicion de valor en k)
v_model(i) = vl + (v0-vl)*exp(gamma*(particle_pred(i,2)-1))...
+ alfa*vl*(particle_pred(i,2)-1) + (1-alfa)*vl*( exp(-beta)-exp(-beta*sqrt(particle_pred(i,2))))...
- i_meas(k)*particle_pred(i,1); %prediccion de medicion en k
innov = v_meas(k) - v_model(i); %innovacion
%weight(i) = exp( -(( innov )^2)/(2*Rnn) )/(sqrt(2*pi*Rnn));
weight(i) = exp( -log(sqrt(2*pi*Rnn)) -(( innov )^2)/(2*Rnn) );
end
if sum(weight)==0
%disp(weight);
disp(innov);
disp('Error');
disp(k);
disp(i);
end
%Normalizar pesos
weight = weight/sum(weight);
N_eff = 1/( sum(weight.^2) );
if N_eff < N_t
%Resampling
cdf = cumsum(weight);
%Systematic resampling
sam = rand/n_part;
for i=1:n_part
samInd = sam + (i-1)/n_part;
ind = find( samInd<=cdf ,1);
particle(i,:) = particle_pred(ind,:);
end
else
for i=1:n_part
particle(i,:) = particle_pred(i,:);
end
end
%Estimacion del estado
x1_est_mmse(k) = mean(particle(:,1));
x2_est_mmse(k) = mean(particle(:,2));
end
figure, plot(t,x2_est_mmse)
hold on
plot(t, x2)
grid, xlabel('Time [s]'), ylabel('SOC'), title('Particle-Filtered SOC ');
legend('Estimate','Ground Truth');
figure
subplot(2,1,1)
plot(t,x2);
hold on
plot(t,x2_est_mmse);
grid, xlabel('Time [s]'), ylabel('State'), title(sprintf('SOC Estimation with $$x^{(2)}_0=$$ %1.1f and $$P_0^{(2)}=$$ %1.0d',x2_est_mmse(1), 1e-5));
legend('True State','BPF Estimate');
subplot(2,1,2)
error = x2-x2_est_mmse;
plot(t,error);
ylim([-4e-2,4e-2]);
grid, xlabel('Time [s]'), ylabel('Error');
%title(sprintf('State Estimation Error with $$x_0=$$ %1.1f and $$P_0=$$ %1.0d',x_est(1), P_est(1)));
title('SOC Estimation Error');
%%
%Filtrado
%--------------EKF---------------
%Ruidos filtro
w_1 = sigma_1;
w_2 = sigma_2;
Rnn = sigma_n;
Rww = [w_1,0;0,w_2];
%Inicializacion de arreglos
x1_est = zeros(L,1); %state estimate
x1_pred = zeros(L,1); %state estimate prediction
P2_est = zeros(L,1);
x2_est = zeros(L,1); %state estimate soc
x2_pred = zeros(L,1); %state estimate prediction soc
v_pred = zeros(L,1); %measurement prediction
innov = zeros(L,1); %innovation
R_innov = zeros(L,1); %innovation covariance
🎉3 参考文献
部分理论来源于网络,如有侵权请联系删除。