使用EKF扩展卡尔曼滤波进行二阶RC模型的参数辨识

       

        这次来写一篇使用EKF扩展卡尔曼滤波进行二阶RC模型的参数辨识的程序及讲解,目前使用的比较多的参数辨识方法是离线参数辨识(指数拟合HPPC工况端电压数据)、遗忘因子最小二乘法这两种算法,而EKF用的多的地方是在参数辨识完成后的后续SOC估计中,下面就来介绍一下EKF算法进行参数辨识与最小二乘法的一些核心区别:

        EKF是一种针对非线性系统的状态估计算法,通过泰勒展开对非线性模型进行局部线性化,结合卡尔曼滤波框架实现参数和状态的联合估计。在二阶RC模型中,EKF将电路参数(如R0、R1、R2、C1、C2)和状态变量(如SOC、极化电压)共同作为状态向量,利用系统动态方程和观测方程进行递推更新其核心步骤包括状态预测、协方差预测、卡尔曼增益计算和状态更新,涉及雅可比矩阵的推导;

        最小二乘法是一种基于误差平方和最小化的优化方法,通过递推公式逐步更新参数估计值。递推最小二乘法(RLS)通过引入遗忘因子(如FRLS)降低旧数据的影响,解决数据饱和问题。在二阶RC模型中,RLS通常仅用于参数辨识,如辨识R0、R1等,而不涉及状态估计;

EKF在线参数辨识的原理及推导过程

        EKF的基本思想是将非线性系统线性化后,对线性化后的系统进行卡尔曼滤 波,实现状态变量的估计。 非线性系统的模型状态空间表达式进行离散化得到状态方程和输出方程:

        为适应EKF算法建立在线辨识锂离子电池参数的状态空间方程,引入离散状态方程和输出方程如下 :

        EKF在线参数辨识方法的具体步骤如表下:

步骤一:初始化参数状态变量和参数误差协方差 

步骤二:参数状态估计和参数误差协方差时间更新 

步骤三:计算卡尔曼增益矩阵 

步骤四:参数状态估计和参数误差协方差测量更新

        基于卡尔曼滤波算法的在线辨识方法主要由两个阶段构成,第一阶段为时间 更新,第二阶段为测量更新。时间更新过程在卡尔曼滤波中被称为预测过程,因 为它对当前状态变量进行推算,以提供下一个时刻的先验估计。而测量更新过程 在卡尔曼滤波中被称为校正过程,因为它通过反馈观测值来进行修正。基于 EKF 的模型在线参数辨识方法的工作原理流程图如图下图所示。

EKF参数辨识的实现代码分析

1.数据导入与仿真参数设置

load curvol
para_true.Cn = 2.3*3600; % 额定容量(A·s)
OCV_SOC = OCV_data;
Ts = 1;                  % 采样时间(s)
sim_time = 1179;         % 总仿真时间(s)
t = 0:Ts:sim_time;       % 时间序列
N = length(t);           % 数据点数
I = cur;
V_meas = vol; 

2.EKF参数初始化:待辨识参数初始猜测

para_est.R0 = 0.015;     
para_est.R1 = 0.003;    
para_est.R2 = 0.01;     
para_est.C1 = 5000;     
para_est.C2 = 10000;    
para_est.Cn = 2.3*3600; 

3.状态向量: [SOC; V1; V2; R0; R1; R2; C1; C2]

x_est = [0.5; 0; 0; para_est.R0; para_est.R1; para_est.R2;...
        para_est.C1; para_est.C2];
n_states = length(x_est);

4.协方差矩阵与噪声矩阵初始化

P = diag([1e-4, 1e-4, 1e-4, 1e-6, 1e-6, 1e-6, 1e-3, 1e-3]);
Q = diag([1e-6, 1e-6, 1e-6, 1e-8, 1e-8, 1e-8, 1e-4, 1e-4]);
R = 1e-4;

5.主循环 - EKF参数辨识

for k = 1:N
    % 获取当前输入
    current = I(k);
    
    % EKF预测步骤
    [x_pred, F] = ekfPredict(x_est, current, Ts);
    
    % 协方差预测
    P_pred = F*P*F' + Q;
    
    % EKF更新步骤
    [V_est, H] = getObsModel(x_pred, current, OCV_SOC);
    y_res = V_meas(k) - V_est;
    
    % 卡尔曼增益
    S = H*P_pred*H' + R;
    K = P_pred*H'/S;
    
    % 状态更新
    x_est = x_pred + K*y_res;
    
    % 协方差更新
    P = (eye(n_states) - K*H)*P_pred;
    
    % 参数限幅(保证物理合理性)
    x_est(4:8) = max(x_est(4:8), [0.001; 0.001; 0.001; 100; 100]);
    
    % 保存参数和电压估计
    para_history(k,:) = x_est(4:8)';
    voltage_est(k) = V_est;
end

6.结果可视化,绘图。

figure('Position', [100,100,1000,800])
% 电压对比
V_meas=V_meas(1:1180);
subplot(3,1,1)
plot(t, V_meas, 'b', t, voltage_est, 'r')
title(sprintf('端电压对比 (RMSE=%.4f V)', sqrt(mean((V_meas-voltage_est).^2))))
ylabel('Voltage(V)'), legend('Measured', 'Estimated'), grid on
% 电阻参数收敛
subplot(3,1,2)
plot(t, para_history(:,1:3), 'LineWidth',1.5)
hold on
plot(t,para_history(:,1), 'k--');
plot(t,para_history(:,2), 'k--');
plot(t,para_history(:,3), 'k--');
% plot([t(1) t(end)], [para_true.R0 para_true.R0], 'k--')
% plot([t(1) t(end)], [para_true.R1 para_true.R1], 'k--')
% plot([t(1) t(end)], [para_true.R2 para_true.R2], 'k--')
title('电阻参数收敛过程'), ylabel('R(Ω)')
legend('R0','R1','R2','True Values'), grid on
% 电容参数收敛
subplot(3,1,3)
plot(t, para_history(:,4:5), 'LineWidth',1.5)
hold on
plot(t,para_history(:,4), 'k--');
plot(t,para_history(:,5), 'k--');
title('电容参数收敛过程'), xlabel('Time(s)'), ylabel('C(F)')
legend('C1','C2','True Values'), grid on

7.function函数——电池模型仿真函数

function [V, SOC] = simBatteryModel(para, I, Ts, OCV_SOC)
    n = length(I);
    SOC = zeros(n,1);
    V1 = zeros(n,1);
    V2 = zeros(n,1);
    
    for k = 2:n
        % SOC更新
        SOC(k) = SOC(k-1) - I(k-1)*Ts/para.Cn;
        SOC(k) = max(min(SOC(k),1),0);
        
        % RC动态
        V1(k) = exp(-Ts/(para.R1*para.C1))*V1(k-1) + ...
                para.R1*(1-exp(-Ts/(para.R1*para.C1)))*I(k-1);
        V2(k) = exp(-Ts/(para.R2*para.C2))*V2(k-1) + ...
                para.R2*(1-exp(-Ts/(para.R2*para.C2)))*I(k-1);
    end
    % 端电压计算
    OCV = interp1(OCV_SOC(:,1), OCV_SOC(:,2), SOC);
    V = OCV - I*para.R0 - V1 - V2;
end

8.EKF预测模型

function [x_pred, F] = ekfPredict(x, I, Ts)
    % 状态分解
    SOC = x(1);
    V1 = x(2);
    V2 = x(3);
    R0 = x(4);
    R1 = x(5);
    R2 = x(6);
    C1 = x(7);
    C2 = x(8);
    
    % SOC预测
    SOC_pred = SOC - I*Ts/C2;
    
    % RC动态预测
    tau1 = R1*C1;
    alpha1 = exp(-Ts/tau1);
    beta1 = R1*(1-alpha1);
    
    tau2 = R2*C2;
    alpha2 = exp(-Ts/tau2);
    beta2 = R2*(1-alpha2);
    
    V1_pred = alpha1*V1 + beta1*I;
    V2_pred = alpha2*V2 + beta2*I;
    
    % 参数动态(假设缓慢变化)
    R0_pred = R0;
    R1_pred = R1;
    R2_pred = R2;
    C1_pred = C1;
    C2_pred = C2;
    
    x_pred = [SOC_pred; V1_pred; V2_pred; R0_pred; R1_pred; R2_pred; C1_pred; C2_pred];
    
    % 雅可比矩阵计算
    F = zeros(8,8);
    
    % SOC相关
    F(1,1) = 1;          % ∂SOC/∂SOC
    F(1,8) = I*Ts/C2^2;  % ∂SOC/∂C2
    
    % V1相关
    F(2,2) = alpha1;     % ∂V1/∂V1
    F(2,5) = (Ts*V1/(R1^2*C1)) * alpha1 + (I*Ts/C1) * alpha1;  % ∂V1/∂R1
    F(2,7) = (Ts*V1/(R1*C1^2)) * alpha1 + (I*Ts/(R1*C1^2)) * (1-alpha1);  % ∂V1/∂C1
    F(2,5) = F(2,5) - beta1*I/R1;  % 修正项
    
    % V2相关
    F(3,3) = alpha2;     % ∂V2/∂V2
    F(3,6) = (Ts*V2/(R2^2*C2)) * alpha2 + (I*Ts/C2) * alpha2;  % ∂V2/∂R2
    F(3,8) = (Ts*V2/(R2*C2^2)) * alpha2 + (I*Ts/(R2*C2^2)) * (1-alpha2);  % ∂V2/∂C2
    F(3,6) = F(3,6) - beta2*I/R2;  % 修正项
    
    % 参数自相关
    F(4:8,4:8) = eye(5);
end

辨识结果及分析

        最后来演示下最终的参数辨识结果,由于MATLAB版本的问题,导致显示不出标题,下图中从上到下的标题分别为:仿真的端电压与真实端电压的对比、电阻参数收敛过程、电容参数收敛过程。从图中可以看出,所提出的EKF算法可以迅速收敛到真实值附近,参数辨识的精度也能够满足后续SOC估计的需求。通过锂离子电池动态工况实验中的FUDS动态工况对锂离子电池二阶RC等 效电路模型进行EKF在线参数辨识。锂离子电池二阶RC等效电路模型在线辨识的各电阻、电容参数辨识结果如下图所示。通过EKF辨识结果可以看出欧姆内阻和极化内阻在辨识初期参数变化比较剧烈,这是因为模型在初始化阶段选取初值不当。R0在整个工况下辨识基本在40毫欧左右;R1和 R2保持在0.1Ω左右;C1和C2电容基本在5000法拉和10000法拉左右。参数的变化说明锂离子电池是一个时变系统。

在整个工况下R0、R1、R2是呈上升趋势,所以总电阻是增加的,C1、C2变化趋势相同,呈缓慢下降趋势。两个RC 环节的时间常数也存在数量级的差异, 并且 R1C1<R2C2,符合锂离子电池的放电特性。 

EKF TDOA参数设置是指在使用扩展卡尔曼滤波EKF算法进行时差到达(TDOA)定位时,需要对算法参数进行设置。TDOA定位是一种基于测量物体到多个接收器之间的到达时间差来进行定位的技术。 首先,参数设置中的一个重要参数是初始状态。这个参数表示物体的初始位置和速度估计,可以根据先前的定位测量或启发式算法进行设置。 其次,观测噪声参数也是非常关键的。这个参数表示测量误差的统计特性,包括观测误差的方差、协方差矩阵等。通常,可以通过实验测量或经验估计来设置这个参数。 另外,EKF算法中的系统噪声参数也需要进行设置。系统噪声表示模型中未考虑到的因素或者模型误差,它会影响到状态预测。对于TDOA定位,系统噪声参数可以包括物体移动速度的方差、加速度的方差等。 最后,时间间隔参数也是进行EKF TDOA参数设置时需要考虑的。时间间隔指的是两次测量之间的时间差,它可以通过传感器采样率来设置。时间间隔的选择会影响到EKF算法的精度和效率,需要根据具体应用场景进行合理的设置。 总之,EKF TDOA参数设置需要考虑初始状态、观测噪声、系统噪声和时间间隔等因素,合理设置这些参数可以提高TDOA定位的精度和稳定性。根据具体应用场景和实验数据,可以通过实验测量、经验估计等方法来设置这些参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新能源BMS佬大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值