锂电池二阶模型-在线参数辨识
- 背景
- 二阶等效电路模型介绍
- 二阶模型的离线参数辨识
- 二阶模型的RLS表达式
- 递推代码
- 已知问题
背景
锂电池一阶戴维南等效模型的参数辨识方法,已经在前面两期详细地讲解了一轮。
- 一阶模型-离线参数辨识
- 一阶模型-在线参数辨识
本期继续讲解一下如何进行二阶模型的离线与在线参数辨识。
此篇推文继续使用论文《基于RLS方法的磷酸铁锂电池模型辨识及SOC估计策略研究》中的方法,作者为西南交通大学-郑卫同学。
另外这一系列博客文章的图片绝大多数都是截自论文,但是因为CSDN上传时会自动加上水印-CSDN博客名,因此不代表编者想侵犯文章版权。转载时,请将本段话一并贴上,保护原论文作者权益。
二阶等效电路模型介绍
二阶RC等效电路模型是在一阶RC模型的基础上再增加一个并联的RC回路得到的拓扑结构,这种结构表示考虑了电池的电荷扩散阻抗。理论上,等效电路模型的阶数越高,则对电池动态特性的反应越精确,但是同时使得电路结构变得复杂,也增大了计算量。如图3-3所示,其中C1表示浓差极化电容,R1表示浓差极化电阻,C2表示电化学极化电容,R2表示电化学极化电阻。
话不多说,直接上图和公式,截图自论文内容。
二阶模型的离线参数辨识
参考一阶的参数识别原理,一组RC变为两组RC,拟合一下即可,见如下代码。
注:有一定概率识别出来的参数是负值。
% 执行该脚本前,请确认simulink模型与该脚本文件是否在同一路径
clear all; % 清除工作区中的所有变量
close all; % 关闭所有已打开的图形窗口
clc; % 清空命令窗口的内容
% 打印脚本开始的信息(可选)
fprintf('Script started.\n');
% 这里开始编写你的MATLAB脚本内容...
% 步骤1: 运行模型,并提取所需数据用于其他步骤(模型的数据已经通过设置,输入到工作区)
modelname = 'Battery.slx';
sim(modelname);
Ut = ScopeData4.signals(2).values; % Scope中的数据索引似乎从1开始
Ibat = ScopeData4.signals(3).values;
cutOffIndex = 1;
% 截取电流截至后的电压
for i = 2 : size(Ibat, 1)
if Ibat(i - 1) > 0 && Ibat(i) <= 0
cutOffIndex = i + 1;
break;
end
end
UtNoneCurrent = Ut(cutOffIndex : size(Ut, 1));
timeNoneCurrent = ScopeData4.time(cutOffIndex : size(Ut, 1)) - ScopeData4.time(cutOffIndex - 1); % 获取时间向量
startSoc = ScopeData4.signals(1).values(cutOffIndex);
% 获取电流,用于计算R1
dischgCurrent = ScopeData4.signals(3).values(cutOffIndex - 2);
% 基于SOC获取OCV -- 见论文的拟合公式
ocv = -95.82*(startSoc^8)+549.26*(startSoc^7)-1219.4*startSoc^6+1387.01*startSoc^5-883.38*startSoc^4+320.4*startSoc^3-64.45*startSoc^2+6.89*startSoc+2.91;
% 定义自定义函数模型
fun = @(param,x) ocv - param(1)*exp(-x/param(2)) - param(3)*exp(-x/param(4));
% 初始参数估计
init_param = [0.002, 2000, 0.002, 20000];
% 使用lsqcurvefit函数进行非线性最小二乘拟合
[param, ~] = lsqcurvefit(fun, init_param, timeNoneCurrent, UtNoneCurrent);
% 输出拟合结果
disp(['拟合参数:', num2str(param)]);
% 计算并输出拟合曲线
y_fit = fun(param, timeNoneCurrent);
% 绘制原始数据与拟合曲线图
plot(timeNoneCurrent, UtNoneCurrent, 'o',timeNoneCurrent, y_fit, '-');
legend('原始数据', '拟合曲线');
xlabel('x'); ylabel('y');
二阶模型的RLS表达式