进阶篇,内附代码:锂电池二阶模型-离线与在线参数辨识

背景

锂电池一阶戴维南等效模型的参数辨识方法,已经在前面两期详细地讲解了一轮。

  1. 一阶模型-离线参数辨识
  2. 一阶模型-在线参数辨识

本期继续讲解一下如何进行二阶模型的离线与在线参数辨识。
此篇推文继续使用论文《基于RLS方法的磷酸铁锂电池模型辨识及SOC估计策略研究》中的方法,作者为西南交通大学-郑卫同学。
另外这一系列博客文章的图片绝大多数都是截自论文,但是因为CSDN上传时会自动加上水印-CSDN博客名,因此不代表编者想侵犯文章版权。转载时,请将本段话一并贴上,保护原论文作者权益。

二阶等效电路模型介绍

二阶RC等效电路模型是在一阶RC模型的基础上再增加一个并联的RC回路得到的拓扑结构,这种结构表示考虑了电池的电荷扩散阻抗。理论上,等效电路模型的阶数越高,则对电池动态特性的反应越精确,但是同时使得电路结构变得复杂,也增大了计算量。如图3-3所示,其中C1表示浓差极化电容,R1表示浓差极化电阻,C2表示电化学极化电容,R2表示电化学极化电阻。

话不多说,直接上图和公式,截图自论文内容。
在这里插入图片描述
在这里插入图片描述

二阶模型的离线参数辨识

参考一阶的参数识别原理,一组RC变为两组RC,拟合一下即可,见如下代码。
注:有一定概率识别出来的参数是负值。

% 执行该脚本前,请确认simulink模型与该脚本文件是否在同一路径
clear all;  % 清除工作区中的所有变量
close all; % 关闭所有已打开的图形窗口
clc;           % 清空命令窗口的内容

% 打印脚本开始的信息(可选)
fprintf('Script started.\n');

% 这里开始编写你的MATLAB脚本内容...

% 步骤1: 运行模型,并提取所需数据用于其他步骤(模型的数据已经通过设置,输入到工作区)
modelname = 'Battery.slx'; 
sim(modelname);

Ut      = ScopeData4.signals(2).values; % Scope中的数据索引似乎从1开始
Ibat = ScopeData4.signals(3).values; 

cutOffIndex = 1;
% 截取电流截至后的电压
for i = 2 :  size(Ibat, 1)
    if Ibat(i - 1) > 0 &&  Ibat(i) <= 0
        cutOffIndex = i + 1;
        break;
    end
end

UtNoneCurrent = Ut(cutOffIndex : size(Ut, 1));
timeNoneCurrent = ScopeData4.time(cutOffIndex : size(Ut, 1)) - ScopeData4.time(cutOffIndex - 1); % 获取时间向量
startSoc = ScopeData4.signals(1).values(cutOffIndex);

% 获取电流,用于计算R1
dischgCurrent = ScopeData4.signals(3).values(cutOffIndex - 2);   

% 基于SOC获取OCV -- 见论文的拟合公式
ocv = -95.82*(startSoc^8)+549.26*(startSoc^7)-1219.4*startSoc^6+1387.01*startSoc^5-883.38*startSoc^4+320.4*startSoc^3-64.45*startSoc^2+6.89*startSoc+2.91;
% 定义自定义函数模型 
fun = @(param,x) ocv - param(1)*exp(-x/param(2)) - param(3)*exp(-x/param(4)); 

% 初始参数估计 
init_param = [0.002, 2000, 0.002, 20000]; 
% 使用lsqcurvefit函数进行非线性最小二乘拟合
[param, ~] = lsqcurvefit(fun, init_param, timeNoneCurrent, UtNoneCurrent); 

% 输出拟合结果 
disp(['拟合参数:', num2str(param)]); 

% 计算并输出拟合曲线 
y_fit = fun(param, timeNoneCurrent); 
% 绘制原始数据与拟合曲线图 
plot(timeNoneCurrent, UtNoneCurrent, 'o',timeNoneCurrent, y_fit, '-');
legend('原始数据', '拟合曲线'); 
xlabel('x'); ylabel('y');

二阶模型的RLS表达式

### 回答1: 以下是锂电池二阶RC参数最小二乘法在线辨识和EKFSOC估计的MATLAB代码。 首先,我们需要定义锂电池的电路模型,这里使用的是二阶RC模型: ```matlab function [V, SOC] = battery_model(R0, R1, C1, R2, C2, I, V0, SOC0, dt) % R0: 内阻 % R1, C1: 第一阶RC参数 % R2, C2: 第二阶RC参数 % I: 当前电流 % V0: 上一个时刻的电压 % SOC0: 上一个时刻的SOC % dt: 时间间隔 Q = 2.9*3600; % 电池容量 I = I/1000; % 将电流转换为安培 SOC = SOC0 - I*dt/Q; SOC = max(min(SOC, 1), 0); Voc = 3.7*SOC + 0.01*(1-SOC) - R0*I; V1 = V0 - dt/(R1*C1)*(V0 - Voc) + dt/C1*I; V = V1 - dt/(R2*C2)*(V1 - Voc); end ``` 接下来是最小二乘法在线辨识的代码: ```matlab clear all; close all; % 训练数据 data = load('train_data.mat'); I = data.I; V = data.V; dt = data.dt; % 初始参数估计 R0 = 0.1; R1 = 0.1; C1 = 1000; R2 = 0.1; C2 = 1000; % 最小二乘法在线辨识 for k=1:length(I) [V(k), SOC(k+1)] = battery_model(R0, R1, C1, R2, C2, I(k), V(k), SOC(k), dt); A = [-V(k)/R1, (V(k)-Voc)/R1, -1/(R1*C1); -V(k)/R2, (V(k)-Voc)/R2, -1/(R2*C2)]; B = [0; 0; I(k)/(C1*R1)]; X = pinv(A)*B; R1 = R1 + X(1)*dt; R2 = R2 + X(2)*dt; C1 = C1 + X(3)*dt; end % 测试数据 data = load('test_data.mat'); I = data.I; V = data.V; dt = data.dt; % 用辨识出来的参数进行预测 SOC = zeros(length(I)+1, 1); for k=1:length(I) [V(k), SOC(k+1)] = battery_model(R0, R1, C1, R2, C2, I(k), V(k), SOC(k), dt); end % 绘图 figure; plot(SOC); title('SOC'); xlabel('Time(s)'); ylabel('SOC'); figure; plot(V); title('Voltage'); xlabel('Time(s)'); ylabel('Voltage(V)'); ``` 最后是基于扩展卡尔曼滤波(EKF)的SOC估计的代码: ```matlab clear all; close all; % 训练数据 data = load('train_data.mat'); I = data.I; V = data.V; dt = data.dt; % 初始参数估计 R0 = 0.1; R1 = 0.1; C1 = 1000; R2 = 0.1; C2 = 1000; % 最小二乘法在线辨识 for k=1:length(I) [V(k), SOC(k+1)] = battery_model(R0, R1, C1, R2, C2, I(k), V(k), SOC(k), dt); A = [-V(k)/R1, (V(k)-Voc)/R1, -1/(R1*C1); -V(k)/R2, (V(k)-Voc)/R2, -1/(R2*C2)]; B = [0; 0; I(k)/(C1*R1)]; X = pinv(A)*B; R1 = R1 + X(1)*dt; R2 = R2 + X(2)*dt; C1 = C1 + X(3)*dt; end % 测试数据 data = load('test_data.mat'); I = data.I; V = data.V; dt = data.dt; % 扩展卡尔曼滤波估计SOC SOC_EKF = zeros(length(I)+1, 1); P = eye(2); Q = diag([0.001, 0.001]); R = 0.001; for k=1:length(I) [V(k), SOC(k+1)] = battery_model(R0, R1, C1, R2, C2, I(k), V(k), SOC(k), dt); F = [1-dt/(R1*C1), 0; 0, 1-dt/(R2*C2)]; G = [dt/C1; 0]; H = 3.7; K = P*H'/(H*P*H' + R); SOC_EKF(k+1) = SOC_EKF(k) + K*(V(k) - H*SOC_EKF(k+1)); P = F*P*F' + G*Q*G'; end % 绘图 figure; plot(SOC); hold on; plot(SOC_EKF); legend('True SOC', 'EKF'); title('SOC'); xlabel('Time(s)'); ylabel('SOC'); figure; plot(V); title('Voltage'); xlabel('Time(s)'); ylabel('Voltage(V)'); ``` 以上代码仅供参考,具体实现需要根据具体情况进行修改。 ### 回答2: 锂电池是一种重要的储能设备,它广泛应用于电动汽车、无人机等领域。锂电池二阶RC参数是描述其动态特性的重要参数之一。在锂电池的充放电过程中,通过二阶RC模型可以较好地描述电压和电流之间的关系。 在MATLAB中,可以利用最小二乘法进行锂电池二阶RC参数在线辨识。最小二乘法是一种常见的参数估计方法,通过最小化观测值与模型预测值之间的误差平方和,来估计模型参数。以二阶RC模型为例,可以建立如下的非线性方程: y(t)=R1*C1*u(t)+(1-R1*C1)*R2*C2*du(t)/dt 其中,y(t)是电池的输出电压,u(t)是输入电流,R1、C1、R2、C2分别是RC模型参数。 在MATLAB中,可以使用lsqcurvefit函数进行最小二乘法参数估计。具体的代码如下: ```matlab % 定义二阶RC模型函数 RC_model = @(x,u) x(1)*x(2)*u+(1-x(1)*x(2))*x(3)*x(4)*gradient(u); % 假设已经有一组观测数据,分别是时间、输入电流和输出电压 t = [0, 1, 2, 3, 4, 5]; % 时间 u = [1, 2, 3, 4, 5, 6]; % 输入电流 y = [1.5, 3.2, 4.7, 6.1, 7.8, 9.2]; % 输出电压 % 初始参数估计值 x0 = [0.5, 0.5, 0.5, 0.5]; % 使用最小二乘法进行参数估计 x = lsqcurvefit(RC_model, x0, u, y); % 输出结果 R1 = x(1); C1 = x(2); R2 = x(3); C2 = x(4); % 输出估计的二阶RC参数 disp(['R1=',num2str(R1)]); disp(['C1=',num2str(C1)]); disp(['R2=',num2str(R2)]); disp(['C2=',num2str(C2)]); ``` 使用上述代码,可以通过最小二乘法在线辨识锂电池二阶RC参数,并输出估计的参数值。 除了二阶RC参数在线辨识,还可以使用扩展卡尔曼滤波(EKF)进行锂电池SOC(State of Charge)的估计。SOC是描述锂电池电量剩余量的指标,是电动车等设备进行能量管理和电池状态监测的重要参考。EKF是一种基于卡尔曼滤波的扩展滤波算法,可以对非线性系统进行状态估计。在锂电池SOC估计中,可以利用电压、电流和温度等信息,通过EKF实时估计SOC的值。 在MATLAB中,可以使用ExtendedKalmanFilter函数进行EKF算法的实现,具体的代码如下: ```matlab % 定义锂电池SOC模型 SOC_model = @(x,u,t) x(1)-x(2)*integral(@(tau) u(tau),0,t); % 假设已经有一组观测数据,分别是时间、输入电流、输出电压和温度 t = [0, 1, 2, 3, 4, 5]; % 时间 u = [1, 2, 3, 4, 5, 6]; % 输入电流 y = [1.5, 3.2, 4.7, 6.1, 7.8, 9.2]; % 输出电压 temp = [25, 26, 27, 28, 29, 30]; % 温度 % 初始化EKF滤波器 xEst = [0.5, 0.5]; % 初始状态估计值 PEst = eye(2); % 初始状态估计误差协方差 % 实时更新SOC估计值 SOC_est = zeros(length(t),1); for k = 1:length(t) % 更新EKF滤波器 xPred = SOC_model(xEst,u,t(k)); PPred = PEst; % 根据测量值更新状态估计值 yPred = RC_model(xEst(1:2),u(k)); yMeas = y(k); innov = yMeas - yPred; S = RC_model(xEst(1:2),u(k)) * Q * RC_model(xEst(1:2),u(k))' + R; K = PPred * RC_model(xEst(1:2),u(k))' / S; xEst = xPred + K*innov; PEst = (eye(2) - K) * PPred; % 输出估计的SOCSOC_est(k) = xEst(1); end % 绘制SOC估计结果曲线 plot(t, SOC_est); xlabel('时间'); ylabel('SOC估计值'); ``` 使用上述代码,可以通过EKF算法实时估计锂电池SOC值,并绘制SOC估计结果曲线。 总结起来,锂电池二阶RC参数的最小二乘法在线辨识和EKFSOC估计的MATLAB代码段如上所示,通过这些代码可以对锂电池的动态特性和剩余电量进行较为准确的估计。 ### 回答3: 锂电池二阶RC参数的最小二乘法在线辨识和EKFSOC估计是用于估计锂电池状态的常用方法之一。以下是使用MATLAB编写的代码示例。 首先,导入所需的库和数据: ``` MATLAB clear all; close all; % 导入电池测试数据 data = xlsread('battery_data.xlsx'); ``` 接下来,我们可以计算锂电池SOC(State of Charge): ``` MATLAB % 计算SOC soc = data(:,1)./data(:,2); ``` 然后,通过最小二乘法在线辨识锂电池二阶RC参数: ``` MATLAB % 在线辨识 N = length(soc); % 初始化参数估计 R = zeros(N,1); C = zeros(N,1); % 递归最小二乘法在线辨识 for k=3:N Y = [-soc(k-1);-soc(k-2)]; H = [R(k-1) -C(k-1); C(k-1) R(k-1)]; phi = H*Y; % 参数更新 R(k) = R(k-1) + phi(1); C(k) = C(k-1) + phi(2); end % 输出RC参数 R_estimated = R(end) C_estimated = C(end) ``` 最后,使用扩展卡尔曼滤波(EKF)进行SOC的估计: ``` MATLAB % EKF状态估计 Q = 0.01; % 过程噪声协方差 R = 0.1; % 测量噪声协方差 x = [0.5;0.5]; % 初始状态估计 P = eye(2); % 初始协方差矩阵 soc_estimated = zeros(N,1); for k=1:N % 预测步骤 x_predicted = [exp(-data(k,1)/(R_estimated*C_estimated))*x(1); data(k,2)]; P_predicted = [exp(-data(k,1)/(R_estimated*C_estimated))^2*P(1,1)+Q 0; 0 P(2,2)]; % 更新步骤 K = P_predicted/(P_predicted+R); x_updated = x_predicted + K*(soc(k)-x_predicted(2)); P_updated = (eye(2)-K)*P_predicted; % 更新估计值和协方差矩阵 x = x_updated; P = P_updated; % 输出估计的SOC soc_estimated(k) = x(2); end % 绘制SOC估计结果 figure; plot(data(:,1),soc,'b','LineWidth',2); hold on; plot(data(:,1),soc_estimated,'r--','LineWidth',2); xlabel('时间'); ylabel('SOC'); legend('实际SOC','估计SOC'); ``` 以上是一个锂电池二阶RC参数最小二乘法在线辨识和EKFSOC估计的MATLAB代码示例,通过该代码,我们可以估计锂电池SOC并获得准确的参数估计。注意,代码中的数据文件(battery_data.xlsx)需要根据实际情况进行替换。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

跨界程序猿-Vincent

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

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

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

打赏作者

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

抵扣说明:

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

余额充值