当前位置:   article > 正文

使用遗忘因子最小二乘法(FFRLS)的锂离子电池二阶RC参数辨识

ffrls

 之前写过一篇通过指数拟合来辨识电池模型参数的文章,今天就来给大家介绍如何使用simulink搭建最小二乘法来在线辨识电池模型参数。

       本节首先介绍最小二乘法的基本原理,并在次基础上推导出递推最小二乘法及其改进算法的基本递推公式。

1.最小二乘法基本原理

       在一个系统中,通过测量输出输入数据,从一组给定模型类中,确定一个与所测系统等价的模型,这种方法称为辨识。简而言之,辨识就是通过某种优化算法,通过模型输出与实际输出间的误差不断修正模型参数,最终得到最优模型的过程。最小二乘法在参数辨识领域是一种最基本的估算方法,可运用于静态系统及动态系统,线性系统及非线性系统,方法简单易于实施。最小二乘法辨识的基本思想是在给定模型结构框架下,计算得到最优解,使得误差平方和最小。

       假设被辨识系统的离散数学模型为:

51534e4bd4e445bd8f7c292816f1a676.png

 其中,y(k)为系统输出,而 u(k)是系统输入,k=1,2,3,若令

751b4f82ed8c4c6b83512af035f296a6.png

 其中,θ°为被辨识系统的真实参数向量,则 (3-10) 式可以改写成:

b698883e763243b8852eed6c765353b2.png

 令 k=n+i,n+i+1,...,N+i(其中i,N 都是正整数)则可得到矩阵:

516761bf23b2465a9b8f72fea4007b5c.png

 其中,

620d26644dcb46bda5ab06d6af7084a8.png

7e17fcca5c3a466cb1630cce4320c4af.png

 根据被辨识系统的离散数学模型:

81edf6dacd3940acbaa184cf48e51db8.png

 式中,e(k,0)为向量方程误差,

将上式写成矩阵形式为:

bbc70fa610bf4fe28e33603073e9ca4c.png

 根据最小二乘法的基本思想就可以找出被辨识系统参数的最优估计值θ,使误差的平方和取最小值。θhat的推导公式如下式所示:

b8c7e075ceed4ad4a34911b6a17e93e2.png

 从上式可以看出,最小二乘法模型参数辨识,可一次性求出模型所有参数,即批量求出参数的估计值,但是在运算过程中涉及到矩阵求逆问题,并且矩阵维数越大,所需存储空间越大,甚至形成病态方程,并且只能离线辨识,实时性较差,而递推最小二乘法可以克服这些缺点,详见下文。

2递推最小二乘法及其改进算法

递推最小二乘法的基本思想是在系统运行过程中,每测量一组新数据,就通过递推公式修正前一时刻的预测值来获得当前时刻的参数值估计值。即新的参数估计值=旧的参数估计值+修正值。这种方法占据存储空间小,应用更加广泛。

递推最小二乘法(RLS)的递推公式如下:

437cda3bf6d14d0984f5c976aa164140.png

 上式中,当前时刻的实际观测值 y(k)与当前时刻的预测值o(k)θhat(k -1)相减,即为当前时刻的预测误差,当前时刻的增益因子 K(k)与预测误差相乘即为当前时刻的修正值,最后与前一时刻的参数预测值相加,即可得到当前时刻的最优估计值θhat(k)。P(k)为协方差矩阵,在系统运行过程中不断更新,使参数收敛。

为启动算法,需为θhat(0)及 P(0)提供初值,一般设定 P(0)=a I,I为单位矩阵,a 是很大的正实数。在递推最小二乘法中,P(k)随着递推的进行逐渐趋于零,最终算法将对参数失去修正能力,出现所谓的“滤波饱和”现象。引入遗忘因子入(数值在 0.95~0.99 之间) 可以减弱旧数据的作用而增强新数据的作用。改进后的评价函数为:

dc286edbbd464c7e993c6ff62d5b13c1.png

 递推最小二乘法改进算法的递推公式如下式所示:

bb9a3221e78e48c89082d527fb3b23f5.png

 3.电池模型数学公式推导

在利用递推最小二乘法进行电池模型参数辨识时,需将所确定的磷酸铁锂电池二阶 RC 等效电路模型转化为最小二乘法基本结构形式如下式所示。基于二阶 RC 电路模型,推导建立了在 z 域下电池电压、电流以及模型参数间的数学关系,最终得到电池电压、电流、模型参数间的离散数学公式,为后文改进的递推最小二乘法参数辨识奠定基础。

20a329d21d404816ba0f0da9bde6105c.png

从上图可以推导出该电路模型的在复频域中的输出方程为:

76d0621cbb424346b1d85bfb3c635fb1.png

 定义Ul(s)=Uoc(s)-uL(s),ZT(s)为电路阻抗,则

b9bc7a6a30a94228bff83e0f638042d7.png

 经双线性变换原理离散得到的传递函数与原传递函数相比,阶数相同,并且当采样周期T足够小时,两传递函数差距很小。根据双线性变换原理:

13ec076568c044839ca2c05a52cac510.png

 可得离散传递函数:

20153801f9ed461e9ea6d96767c92e54.png

 则离散化后的差分方程如下所示:

4997e1e6bfe14cca889a29c16da19a92.png

 则公式(3-23)可以写成递推最小二乘法形式如式下式所示,进而估算出θ的最优估计。

ab93741df30044cda78abebfd984327f.png

165a2f0208b84fb6993cf8081d18d8d9.png

 公式(3-20)与(3-25)对比可得模型参数如下

9992ed2e08ee41f39f474750b8ad004d.png

       以上就是遗忘因子最小二乘法的递推全过程,下面来讲述一下如何使用simulink来搭建模型。

首先是待辨识数据的导入。

将数据导入到工作区,并分别提取时间、电压、电流、温度数据用以接下来的参数辨识。

  1. load('LiBatt_PulseDataEVE.mat');
  2. time = 1:50243;
  3. Vol = data(:,1);
  4. Cur = -data(:,2);
  5. Temp = ones(50243,1)*25;

给电池容量赋值,并 初始化辨识参数矩阵。

  1. Capacity = 38;%%%电池容量
  2. Len=round(length(Vol)); %取前80%数据进行辨识,SOC低于20%时已辨识不准
  3. cs0= [0;
  4. 0;
  5. 0;
  6. 0;
  7. 0];

导入SOC-OCV曲线并对其进行七次多项式拟合。

  1. ocv_lut = [2.789261,3.20478,3.242465,3.275661,3.289715,3.290776,3.293613,3.329685,3.330853,3.33225,3.380374];
  2. soc_lut=0.02439:0.09756:1;
  3. pfit = polyfit(soc_lut,ocv_lut,7);

 初始化

  1. U=Vol(1:Len)-Vocv(1:Len); % 构造向量,以便在最小二乘法时直接带入(相当于误差)
  2. F1=[0 0 Cur(1) 0 0]'; %%%设初值%k=1时刻的初始数据
  3. F2=[U(1) 0 Cur(2) Cur(1) 0]'; %k=2时刻的初始数据
  4. fai=[F1,F2,zeros(5,Len-2)];%%%%因为RLS要从k=3时刻开始
  5. Pk_1=10^4*eye(5,5);
  6. lamda=1;
  7. e_ksum=zeros(1,Len-3);

开始迭代寻优。

  1. for k=3:Len
  2. fai(:,k)=[U(k-1),U(k-2),Cur(k),Cur(k-1),Cur(k-2)]'; %数据向量
  3. K_k = Pk_1*fai(:,k)/(lamda+fai(:,k)'*Pk_1*fai(:,k)); %求出Kk的值
  4. e_k = U(k) - fai(:,k)'*cs(:,k-1);
  5. e_ksum(:,k)=e_k;
  6. cs(:,k) = cs(:,k-1) + K_k*e_k; %求被辨识参数c
  7. P_k = (Pk_1-K_k*fai(:,k)'*Pk_1)/lamda;
  8. Pk_1 = P_k; %给下次循环用

 绘图。

  1. figure
  2. plot(i,Vocv,'r--');legend('开路电压OCV');
  3. figure
  4. plot(i,R0,'r--');legend('欧姆内阻R0');
  5. figure
  6. plot(i,R1,'k-');legend('极化电阻R1');
  7. figure
  8. plot(i,R2,'g-');legend('极化电阻R2');
  9. figure
  10. plot(i,C1,'b--');legend('极化电容C1');
  11. figure
  12. plot(i,C2,'m-');legend('极化电容C2');
  13. figure
  14. plot(i,e_ksum,'m-');legend('误差');
  15. [volt]=ModelTest(Cur,Vol,Vocv,Len,R0,R1,R2,C1,C2);
  16. figure;
  17. plot(i,Vol(1:Len),'-k',i,volt,'-r','lineWidth',2); grid on
  18. legend('真实值','模型值');
  19. ylabel('端电压','Fontsize', 16)
  20. xlabel('时间(s)', 'Fontsize', 16)
  21. V_error=Vol(1:Len)'-volt;
  22. V_error_mean=mean(abs(V_error));
  23. V_error_max=max(abs(V_error));
  24. figure;
  25. plot(1000*V_error,'k','lineWidth',2); grid on
  26. legend('模型误差(mV)');
  27. ylabel('端电压(mV)','Fontsize', 16)
  28. xlabel('时间(s)', 'Fontsize', 16)

完整程序请滑到文章底部 

运行后的结果如下图所示:

1.参数辨识结果:

 SOC估计结果及误差: 

 估计的SOC误差如下图所示:SOC的平均误差低于1%,具有较高的精度。

      硕博期间所有的程序代码,一共2个多g,可以给你指导,赠送半个小时的语音电话答疑。电池数据+辨识程序+各种卡尔曼滤波算法都在里面了,后续还会有新模型的更新。快速入门BMS软件。某鹅:2629471989

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/355236
推荐阅读
相关标签
  

闽ICP备14008679号