电池SOC仿真系列-基于卡尔曼滤波算法的电池参数辨识

基于 卡尔曼滤波算法电池参数辨识

  本期在已经确定的电池模型的基础上,建立二阶RC等效电路模型。以数学模型中的五个参数变量为卡尔曼滤波的状态变量,根据已知的端电压数据估算出各个时刻的参数值,进而得到相应的模型参数值的。

1、电池数据导入

   clc;
   clear;
   load 动态工况.mat

2、OCV-SOC关系曲线

    SOC = [0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1];
    Voc = [3.2591,3.6095,3.7175,3.7559,3.8052,3.8052,3.8671,3.9477,4.0380,4.13066,4.193909]
    p=polyfit(SOC,Voc,9);
    SOC(1)=1;          
    Voc(1)=4.193909;
    for i=2:ts;
        SOC(i)=SOC(i-1)+I(i)*1/(2.48*3600);
        Voc(i)=polyval(p,SOC(i));
    end

3、构造端电压与开路电压差值

    y1 = Voc1-V1;      % k   开路电压与端电压的差值
    y2 = Voc2-V2;      % k-1 开路电压与端电压的差值
    y3 = Voc3-V3;      % k-2 开路电压与端电压的差值 

4、卡尔曼滤波算法递推

  由以上小节已经得知卡尔曼滤波的算法原理和参数的数学模型,现在运用卡尔曼算法来对模型参数进行实时辨识。根据卡尔曼滤波在k时间点所求出来的参数状态值,经过循环迭代可以得出各个时间点参数状态值,即k1~k5的值。通过上述公式就能求出各个时刻R1`C2的参数值根据已测得的数据来对算法进行验证,继而来获得动力电池实时参数。
  根据卡尔曼滤波的算法原理及二阶RC数学模型,现运用卡尔曼滤波算法对模型进行实时参数辨识。这里的系统状态变量为[k1,k2,k3,k4,k5],观测值y(k)为Voc-V(k),由此可得状态方程和观测方程为:

    Xkf = zeros(5,N);
    Xkf(:,1) = [0.0001 0.0001 0.0001 0.0001 0.0001];
    P0 = [1 0 0 0 0;
          0 1 0 0 0;
          0 0 1 0 0;
          0 0 0 1 0;
          0 0 0 0 1];    % 协方差阵初始值
    Q = 0.75 * eye(5);   % 过程噪声
    R = 0.25 * 0.25;     % 观测噪声
    F = [1 0 0 0 0;
         0 1 0 0 0;
         0 0 1 0 0;
         0 0 0 1 0;
         0 0 0 0 1];  % 状态转移矩阵
    k = ts-2;
    H = [y2(:,k),y3(:,k),I1(k),I2(k),I3(k)]; 

  卡尔曼滤波递推公式如下:
  时间更新方程
  1)状态变量的先验估计:

    Xn = F * Xkf(:,i-1);                 % 状态一步预测

  2)状态变量协方差矩阵的先验估计:

    P1 = F * P0 * F' + Q;                % 预测协方差阵

  测量更新方程
  3)卡尔曼增益:

    K = P1 * H' * inv(H * P1 * H' + R);  % 滤波增益矩阵

  4)状态变量的后验估计:

    Xkf(:,i) = Xn + K*(y1(:,i)-H*Xn);    % 状态更新

  5)状态变量协方差矩阵的后验估计:

    P0 = (eye(5) - K*H) * P1;            % 协方差阵更新

5、二阶RC模型参数递推

    k0(1,i) = 1/(Xkf(1,i)+Xkf(2,i)-1);
    a = Xkf(2,i)*k0(1,i);
    b = -k0(1,i)*(Xkf(1,i)+2*Xkf(2,i));
    c = k0(1,i)*(Xkf(3,i)+Xkf(4,i)+Xkf(5,i));
    d = -k0(1,i)*(Xkf(4,i)+2*Xkf(5,i));
    R0(1,i) = -Xkf(5,i)/Xkf(2,i);
    tao1(1,i)=min((b+sqrt(b^2-4*a))/2,(b-sqrt(b^2-4*a))/2);
    tao2(1,i)=max((b+sqrt(b^2-4*a))/2,(b-sqrt(b^2-4*a))/2);    
    R2(1,i) = (tao2(1,i)*c+b*R0(1,i)-tao2(1,i)*R0(1,i)-d)/(tao2(1,i)-tao1(1,i));
    R1(1,i) = c-R2(1,i)-R0(1,i);
    C1(1,i) = tao1(1,i)/R1(1,i);
    C2(1,i) = tao2(1,i)/R2(1,i);

6、仿真分析

  电池采用的是国内某电池公司2.4Ah的磷酸铁锂电池。试验环境包括:高低温试验箱、Arbin-BTS2000及上位机。Arbin-BTS2000可以根据设置的程序对电池进行充放电。记录的数据包括时间、电流、电压、温度和充放电量等。测量数据通过TCP/IP传输到主机电脑。电脑主机用于设置电池充放电流程序,实时接收并保存采集到的数据。
  在HPPC的工况下,通过卡尔曼滤波辨识的参数部分结果如下所示:
电池SOC仿真系列-基于卡尔曼滤波算法的电池参数辨识_第1张图片
  结果分析:通过观察上图可以显然看出,预测的输出端电压与实际输出的端电压基本上吻合,使用该方法所获得的预测输出端电压曲线与实际输出电压段曲线大体上基本一致,证明了该方法进行参数辨识的有效性。卡尔曼滤波的参数辨识方法与最小二乘法的结果类似,该两种方法都适合用于电池参数辨识中。
  后面几期会带来粒子群算法及遗传算法的电池参数辨识方法。(备注:需要本期文章试验数据和模型的同学可以联系QQ:2057034985或者关注微信公众号:xinnengyuanqiche666学习更多相关知识)

你可能感兴趣的:(电池参数辨识,卡尔曼滤波算法,二阶RC,matlab,simulink)