赞
踩
之前写过一篇通过指数拟合来辨识电池模型参数的文章,今天就来给大家介绍如何使用simulink搭建最小二乘法来在线辨识电池模型参数。
本节首先介绍最小二乘法的基本原理,并在次基础上推导出递推最小二乘法及其改进算法的基本递推公式。
在一个系统中,通过测量输出输入数据,从一组给定模型类中,确定一个与所测系统等价的模型,这种方法称为辨识。简而言之,辨识就是通过某种优化算法,通过模型输出与实际输出间的误差不断修正模型参数,最终得到最优模型的过程。最小二乘法在参数辨识领域是一种最基本的估算方法,可运用于静态系统及动态系统,线性系统及非线性系统,方法简单易于实施。最小二乘法辨识的基本思想是在给定模型结构框架下,计算得到最优解,使得误差平方和最小。
假设被辨识系统的离散数学模型为:
其中,y(k)为系统输出,而 u(k)是系统输入,k=1,2,3,若令
其中,θ°为被辨识系统的真实参数向量,则 (3-10) 式可以改写成:
令 k=n+i,n+i+1,...,N+i(其中i,N 都是正整数)则可得到矩阵:
其中,
根据被辨识系统的离散数学模型:
式中,e(k,0)为向量方程误差,
将上式写成矩阵形式为:
根据最小二乘法的基本思想就可以找出被辨识系统参数的最优估计值θ,使误差的平方和取最小值。θhat的推导公式如下式所示:
从上式可以看出,最小二乘法模型参数辨识,可一次性求出模型所有参数,即批量求出参数的估计值,但是在运算过程中涉及到矩阵求逆问题,并且矩阵维数越大,所需存储空间越大,甚至形成病态方程,并且只能离线辨识,实时性较差,而递推最小二乘法可以克服这些缺点,详见下文。
递推最小二乘法的基本思想是在系统运行过程中,每测量一组新数据,就通过递推公式修正前一时刻的预测值来获得当前时刻的参数值估计值。即新的参数估计值=旧的参数估计值+修正值。这种方法占据存储空间小,应用更加广泛。
递推最小二乘法(RLS)的递推公式如下:
上式中,当前时刻的实际观测值 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 之间) 可以减弱旧数据的作用而增强新数据的作用。改进后的评价函数为:
递推最小二乘法改进算法的递推公式如下式所示:
在利用递推最小二乘法进行电池模型参数辨识时,需将所确定的磷酸铁锂电池二阶 RC 等效电路模型转化为最小二乘法基本结构形式如下式所示。基于二阶 RC 电路模型,推导建立了在 z 域下电池电压、电流以及模型参数间的数学关系,最终得到电池电压、电流、模型参数间的离散数学公式,为后文改进的递推最小二乘法参数辨识奠定基础。
从上图可以推导出该电路模型的在复频域中的输出方程为:
定义Ul(s)=Uoc(s)-uL(s),ZT(s)为电路阻抗,则
经双线性变换原理离散得到的传递函数与原传递函数相比,阶数相同,并且当采样周期T足够小时,两传递函数差距很小。根据双线性变换原理:
可得离散传递函数:
则离散化后的差分方程如下所示:
则公式(3-23)可以写成递推最小二乘法形式如式下式所示,进而估算出θ的最优估计。
公式(3-20)与(3-25)对比可得模型参数如下
以上就是遗忘因子最小二乘法的递推全过程,下面来讲述一下如何使用simulink来搭建模型。
首先是待辨识数据的导入。
将数据导入到工作区,并分别提取时间、电压、电流、温度数据用以接下来的参数辨识。
- load('LiBatt_PulseDataEVE.mat');
- time = 1:50243;
- Vol = data(:,1);
- Cur = -data(:,2);
- Temp = ones(50243,1)*25;
给电池容量赋值,并 初始化辨识参数矩阵。
- Capacity = 38;%%%电池容量
- Len=round(length(Vol)); %取前80%数据进行辨识,SOC低于20%时已辨识不准
- cs0= [0;
- 0;
- 0;
- 0;
- 0];
导入SOC-OCV曲线并对其进行七次多项式拟合。
- ocv_lut = [2.789261,3.20478,3.242465,3.275661,3.289715,3.290776,3.293613,3.329685,3.330853,3.33225,3.380374];
- soc_lut=0.02439:0.09756:1;
- pfit = polyfit(soc_lut,ocv_lut,7);
初始化
- U=Vol(1:Len)-Vocv(1:Len); % 构造向量,以便在最小二乘法时直接带入(相当于误差)
- F1=[0 0 Cur(1) 0 0]'; %%%设初值%k=1时刻的初始数据
- F2=[U(1) 0 Cur(2) Cur(1) 0]'; %k=2时刻的初始数据
- fai=[F1,F2,zeros(5,Len-2)];%%%%因为RLS要从k=3时刻开始
- Pk_1=10^4*eye(5,5);
- lamda=1;
- e_ksum=zeros(1,Len-3);
开始迭代寻优。
- for k=3:Len
- fai(:,k)=[U(k-1),U(k-2),Cur(k),Cur(k-1),Cur(k-2)]'; %数据向量
- K_k = Pk_1*fai(:,k)/(lamda+fai(:,k)'*Pk_1*fai(:,k)); %求出Kk的值
- e_k = U(k) - fai(:,k)'*cs(:,k-1);
- e_ksum(:,k)=e_k;
- cs(:,k) = cs(:,k-1) + K_k*e_k; %求被辨识参数c
- P_k = (Pk_1-K_k*fai(:,k)'*Pk_1)/lamda;
- Pk_1 = P_k; %给下次循环用
绘图。
- figure
- plot(i,Vocv,'r--');legend('开路电压OCV');
- figure
- plot(i,R0,'r--');legend('欧姆内阻R0');
- figure
- plot(i,R1,'k-');legend('极化电阻R1');
- figure
- plot(i,R2,'g-');legend('极化电阻R2');
- figure
- plot(i,C1,'b--');legend('极化电容C1');
- figure
- plot(i,C2,'m-');legend('极化电容C2');
- figure
- plot(i,e_ksum,'m-');legend('误差');
-
-
-
- [volt]=ModelTest(Cur,Vol,Vocv,Len,R0,R1,R2,C1,C2);
-
- figure;
- plot(i,Vol(1:Len),'-k',i,volt,'-r','lineWidth',2); grid on
- legend('真实值','模型值');
- ylabel('端电压','Fontsize', 16)
- xlabel('时间(s)', 'Fontsize', 16)
-
- V_error=Vol(1:Len)'-volt;
- V_error_mean=mean(abs(V_error));
- V_error_max=max(abs(V_error));
- figure;
- plot(1000*V_error,'k','lineWidth',2); grid on
- legend('模型误差(mV)');
- ylabel('端电压(mV)','Fontsize', 16)
- xlabel('时间(s)', 'Fontsize', 16)
运行后的结果如下图所示:
1.参数辨识结果:
SOC估计结果及误差:
估计的SOC误差如下图所示:SOC的平均误差低于1%,具有较高的精度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。