电池参数辨识之最小二乘法

 版权声明:本文为博主原创文章,未经博主允许不得转载。

首先,锂离子电池中的参数辨识方法大体有三类:
(1)脉冲放电然后利用Matlab的cftool工具箱拟合:李玲慧(天津大学硕士毕业论文)“电池管理系统的研究与设计”:链接:https://pan.baidu.com/s/1geCOUjh4tT8LU3ne_BmG1g 提取码:1mzf
(2)最小二乘法,本节将主要讨论,具体定义、种类以及原理过程步骤,这类相关的资料很多,博主不谈了,会介绍自己用的比较实用的论文和其他资料,主要分享递推最小二乘法的调参经验以及会给出算法的具体步骤(PS.会给出算法的具体框架,具体数据你要带入你自己的,这是一套数据);
(3)阻抗特性分析,需要电化学工作站或者电池测试柜(博主买不起设备);
————好吧,下面进入正题,递推最小二乘法辨识模型参数。————
1.最小二乘法的准备知识
  博主推荐一篇论文和一份相关的PDF,对于理解和编写最小二乘法很实用。郭向伟(华南理工大学博士学位论文)“电动汽车电池荷电状态估计及均衡技术研究”:链接:https://pan.baidu.com/s/1LlQ9ITz4ym95iMbGhKcPlg 提取码:i3ix
备注:这篇论文中,理论知识和推理过程都很详细,但是存在错误,可能是论文作者的拼写或者其他方面原因,博主经反复推导验证,已改正并标注出
  盛晓婷(西安理工大学)“各种最小二乘算法总结”:
  链接:https://pan.baidu.com/s/1coGS02FHJNJi1K3Z0pVUwA 提取码:zn1n
备注:这篇介绍的最小二乘法种类很多,并且每个最小二乘法都配有一个例子,至于你们怎么运用这个。。。。电池参数辨识之最小二乘法_第1张图片

2.最小二乘法算法框架
  下面便会给出代码具体过程,最重要的是中间的最小二乘法的算法框架以及对应模型的转换关系,还有的是下面的我遗传因子取值是1所以本质上是递推最小二乘法,一般你取0.95-1这个范围内就是带遗传因子的最小二乘法。最后强调一下,本代码的框架是在别人的基础上改进的带遗传因子的递推最小二乘法。

%%%----------------离线递推最小二乘法(带遗忘因子)----------------%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  递推最小二乘法(RLS)辨识模型参数
%  等效电路模型:二阶等效电路模型
%  额定容量3000mAH,实际容量2987.1mAH,截止电压2.5V
%  编程人:a往南向北,日期:2018/05/20
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
close all;clear all;clc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%1.输入输出信号
num=xlsread('1-3-25HPPC5a.xls','Detail_94_1_3','F15057:G62677');%代入你自己数据
ts= ;                      %总的采样时间
x=num(1:ts,1)';             %实际电流
y=num(1:ts,2)';             %实际电压
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
soc=[];   
ocv=[];      %代入你自己ocv-soc数据
p=polyfit(soc,ocv,8);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
soc(1)=;          
ocv(1)=;%你自己初始ocv-soc数据
for i=2:ts;
    soc(i)=soc(i-1)+x(i)*1/(2.9871*3600);
    ocv(i)=polyval(p,soc(i));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%2.RLS递推最小二乘辨识
%%%y(k)=h1'*cs(k);
%%%%2.1直接给出被辨识参数的初始值,即一个充分小的实向量以及直接给出初始状态P0,即一个充分大的实数单位矩阵
cs0=[]';   %代入你自己的初始值
p0=10^(3)*eye(5,5);
E=10^(-20);                   %相对误差E
cs=[cs0,cs0,zeros(5,ts-2)];           %被辨识参数矩阵的初始值及大小
e=zeros(5,ts);                  %相对误差的初始值及大小

ff=1;                           %遗忘因子
T=1;                            %采样时间
%2.2计算增益矩阵以及求辨识参数
for k=3:ts;                     %开始求K 
    ev(k)=ocv(k)-y(k);
    h1=[ev(k-1),ev(k-2),-x(k),-x(k-1),-x(k-2)]';
    q=h1'*p0*h1+ff;            %遗忘因子1
    q1=inv(q);                 %开始求K(k)
    k1=p0*h1*q1;               %求出K(k)的值
    error1(k)=ev(k)-h1'*cs0;      %求电压实验值和理论值误差
    cs1=cs0+k1*error1(k);
    e1=cs1-cs0;               %求参数当前值与上一次的值的差值
    e2=e1./cs0 ;              %求参数的相对变化
    e(:,k)=e2;                %把当前相对变化的列向量加入误差矩阵的最后一列       
    cs0=cs1;                  %新获得的参数作为下一次递推的旧参数
    cs(:,k)=cs1;              %把辨识参数c 列向量加入辨识参数矩阵的最后一列 
    p1=(p0-k1*h1'*p0)/ff;          %求出 p(k)的值
    p0=p1;                    %递推
    if abs(e2)<=E break;      %若参数收敛满足要求,终止计算
    end                       %小循环结束
end                           %大循环结束
cs;                            %显示被辨识参数
e;                             %显示辨识结果的收敛情况
e2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%3.分离参数
a1=cs(1,1:ts); a2=cs(2,1:ts); a3=cs(3,1:ts); a4=cs(4,1:ts); a5=cs(5,1:ts);
ea1=e(1,:); ea2=e(2,:);ea3=e(3,:); ea4=e(4,:);ea5=e(5,:); 

%%4.代入逆变方程求最终参数
% R=(a3-a4+a5)/(1+a1-a2);
% ts*tp=T^2*(1+a1-a2)/(4*(1-a1-a2));
% ts+tp=T*(1+a2)/(1-a1-a2);
% R+Rs+Rp=(a3+a4+a5)/(1-a1-a2);
% R*ts+R*tp+Rp*ts+Rs*tp=T*(a3-a5)/(1-a1-a2);
% T为采样时间;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
b0=(a3-a4+a5)./(1+a1-a2);
b1=T*T*(1+a1-a2)./(4*(1-a1-a2));
b2=T*(1+a2)./(1-a1-a2);
b3=(a3+a4+a5)./(1-a1-a2);
b4=T*(a3-a5)./(1-a1-a2);

dd=b2.*b2-4*b1;
tsp=[(b2+sqrt(dd))/2;(b2-sqrt(dd))/2];

R0=b0;
t2=tsp(1,:);
t1=tsp(2,:);
R2=(b4-R0.*t1-b3.*t2)./(t1-t2);
R1=b3-R0-R2;
C2=t2./R2;
C1=t1./R1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%预处理,这里取段平均值
R00=mean(R0,2);
R11=mean(R1,2);
R22=mean(R2,2);
C11=mean(C1);
C22=mean(C2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%5.画出辨识参数曲线以及误差曲线    %这部分不给出了,出图多少看你自己需求

3.调参经验
  调参,又可分为离线和在线情况。但是本质都是一样,主要有三个方面: (1)用的实验工况是什么,个人经验,用的一般脉冲放电工况和HPPC工况辨识结果差距很大,建议HPPC实验工况。
   (2)ocv-soc关系曲线准确程度,因为在matlab里面高阶拟合过程中过拟合的情况属于很正常的。
   (3)最后一个是最关键的,是算法中初始参数的设置,特别是参数初始值和协方差初始矩阵,还有的是soc初始值、电压初始值以及遗忘因子的选择(0.95-1)等等,这都需要反复调试和尝试。
   我也只能谈到此,具体问题还要具体分析,祝大家百折不弯,做个直男,加油↖(ω)↗!加油↖(ω)↗!

你可能感兴趣的:(电池管理系统BMS)