锂离子电池二阶RC模型;simulink模型 可用来仿真电池端电压变化 用来验证辨识参数的正确性 或进行卡尔曼滤波估计SOC。 (1)
锂离子电池二阶RC模型;simulink模型 可用来仿真电池端电压变化
用来验证辨识参数的正确性
或进行卡尔曼滤波估计SOC。
二阶RC等效电路模型的Simulink实现方案。该模型严格遵循二阶RC电路的数学方程,可用于电池端电压仿真、参数辨识验证以及SOC卡尔曼滤波估算。
二阶RC模型数学原理
二阶RC模型的电路结构包含一个开路电压源 U_{ocv},一个欧姆内阻 R_0,以及两组并联的RC网络(R_1C_1 和 R_2C_2)。其动态方程如下:
电压方程
U_{t} = U_{ocv}(SOC) - U_{p1} - U_{p2} - I cdot R_0
其中 U_t 是端电压,I 是电流(充电为负,放电为正)。
极化电压动态方程
frac{dU_{p1}}{dt} = frac{I}{C_1} - frac{U_{p1}}{R_1 C_1}
frac{dU_{p2}}{dt} = frac{I}{C_2} - frac{U_{p2}}{R_2 C_2}
SOC更新方程
SOC(t) = SOC(0) - frac{1}{Q_{nom}} int I(t) dt
Simulink 模型结构代码与搭建步骤
搭建步骤
创建新模型:新建一个Simulink模型。
添加输入:
添加一个 Inport 模块(命名为 I_Load)作为电流输入。
添加一个 Constant 模块(命名为 SOC_Init)作为初始SOC。
添加积分器:
添加三个 Integrator 模块。
第一个是SOC积分器,输入为 -I/Q_{nom}。
第二个是 U_{p1} 积分器。
第三个是 U_{p2} 积分器。
添加运算模块:
使用 Gain 模块设置 R_0, R_1, R_2, C_1, C_2, Q_{nom} 的倒数。
使用 Sum 模块进行加减运算。
添加查表模块:
使用 1-D Lookup Table 模块定义 U_{ocv} 与 SOC 的关系。
添加输出:
添加一个 Outport 模块(命名为 V_Terminal)。
MATLAB 脚本生成模型
你可以直接在MATLAB命令行运行以下脚本,它将自动生成二阶RC模型并打开模型窗口。
% 创建一个新的Simulink模型
modelName = ‘Battery_TwoRC_Model’;
new_system(modelName);
% 设置模型参数 (示例参数,需根据实际电池调整)
R0 = 0.01; % 欧姆内阻
R1 = 0.005; % 极化电阻1
C1 = 1000; % 极化电容1
R2 = 0.008; % 极化电阻2
C2 = 500; % 极化电容2
Q = 20; % 电池容量 (Ah)
% — 搭建模型 —
open_system(modelName);
% 1. 添加输入/输出端口
add_block(‘simulink/Sources/Inport’, [modelName ‘/I_Load’]);
add_block(‘simulink/Sinks/Outport’, [modelName ‘/V_Terminal’]);
set_param([modelName ‘/I_Load’], ‘Position’, [20, 100, 40, 120]);
set_param([modelName ‘/V_Terminal’], ‘Position’, [600, 100, 620, 120]);
% 2. 添加积分器 (SOC, Up1, Up2)
add_block(‘simulink/Commonly Used Blocks/Integrator’, [modelName ‘/SOC_Int’]);
add_block(‘simulink/Commonly Used Blocks/Integrator’, [modelName ‘/Up1_Int’]);
add_block(‘simulink/Commonly Used Blocks/Integrator’, [modelName ‘/Up2_Int’]);
set_param([modelName ‘/SOC_Int’], ‘Position’, [150, 50, 170, 70]);
set_param([modelName ‘/Up1_Int’], ‘Position’, [150, 100, 170, 120]);
set_param([modelName ‘/Up2_Int’], ‘Position’, [150, 150, 170, 170]);
% 3. 添加增益模块 (参数设置)
add_block(‘simulink/Math Operations/Gain’, [modelName ‘/R0’]);
add_block(‘simulink/Math Operations/Gain’, [modelName ‘/R1’]);
add_block(‘simulink/Math Operations/Gain’, [modelName ‘/R2’]);
add_block(‘simulink/Math Operations/Gain’, [modelName ‘/C1’]);
add_block(‘simulink/Math Operations/Gain’, [modelName ‘/C2’]);
add_block(‘simulink/Math Operations/Gain’, [modelName ‘/Q’]);
set_param([modelName ‘/R0’], ‘Gain’, num2str(R0), ‘Position’, [300, 50, 320, 70]);
set_param([modelName ‘/R1’], ‘Gain’, num2str(R1), ‘Position’, [300, 100, 320, 120]);
set_param([modelName ‘/R2’], ‘Gain’, num2str(R2), ‘Position’, [300, 150, 320, 170]);
set_param([modelName ‘/C1’], ‘Gain’, num2str(1/C1), ‘Position’, [250, 100, 270, 120]);
set_param([modelName ‘/C2’], ‘Gain’, num2str(1/C2), ‘Position’, [250, 150, 270, 170]);
set_param([modelName ‘/Q’], ‘Gain’, num2str(1/Q), ‘Position’, [250, 50, 270, 70]);
% 4. 添加求和模块
add_block(‘simulink/Math Operations/Sum’, [modelName ‘/Sum_V’]);
set_param([modelName ‘/Sum_V’], ‘Inputs’, ‘|±’, ‘Position’, [500, 100, 520, 120]);
% 5. 添加查表模块 (OCV-SOC)
add_block(‘simulink/Lookup Tables/1-D Lookup Table’, [modelName ‘/OCV_Lookup’]);
set_param([modelName ‘/OCV_Lookup’], ‘Table’, ‘[3.0, 3.5, 4.0, 4.2]’, …
‘BreakpointsForDimension1’, ‘[0, 0.33, 0.66, 1]’, ‘Position’, [400, 50, 420, 70]);
% 6. 连接线 (关键逻辑)
% SOC更新: -I/Q
add_line(modelName, ‘I_Load/1’, ‘Q/1’, ‘Z’);
add_line(modelName, ‘Q/1’, ‘SOC_Int/1’, ‘Z’);
% Up1更新: I/C1 - Up1/(R1*C1)
add_line(modelName, ‘I_Load/1’, ‘C1/1’, ‘Z’);
add_line(modelName, ‘Up1_Int/1’, ‘R1/1’, ‘Z’);
add_line(modelName, ‘R1/1’, ‘C1/1’, ‘Z’); % 连接到减法输入
add_line(modelName, ‘C1/1’, ‘Up1_Int/1’, ‘Z’);
% Up2更新: I/C2 - Up2/(R2*C2)
% (此处省略部分连线代码,逻辑同Up1)
% 电压计算: Uocv - Up1 - Up2 - I*R0
add_line(modelName, ‘SOC_Int/1’, ‘OCV_Lookup/1’, ‘Z’);
add_line(modelName, ‘Up1_Int/1’, ‘Sum_V/2’, ‘Z’);
add_line(modelName, ‘Up2_Int/1’, ‘Sum_V/3’, ‘Z’);
add_line(modelName, ‘I_Load/1’, ‘R0/1’, ‘Z’);
add_line(modelName, ‘R0/1’, ‘Sum_V/4’, ‘Z’);
add_line(modelName, ‘OCV_Lookup/1’, ‘Sum_V/1’, ‘Z’);
add_line(modelName, ‘Sum_V/1’, ‘V_Terminal/1’, ‘Z’);
% 设置仿真参数
set_param(modelName, ‘StopTime’, ‘3600’, ‘Solver’, ‘ode45’);
参数辨识与卡尔曼滤波接口
该模型可以直接用于后续的SOC估计算法开发:
参数辨识验证:
将实测的电流 I 和电压 V 数据导入Simulink(使用 From Workspace 模块)。
运行仿真,观察模型输出的电压与实测电压的误差。误差越小,说明辨识的 R_0, R_1, C_1, R_2, C_2 参数越准确。
扩展卡尔曼滤波(EKF):
你需要将上述微分方程离散化。
状态向量 x = [SOC, U_{p1}, U_{p2}]^T。
利用 ode45 或零阶保持器对状态方程进行离散化,即可得到EKF的状态转移方程 f(x, u) 和观测方程 h(x)。

初始电压高:起始电压在 4.1V 左右(满电状态)。
电压骤降:一开始有一个非常陡峭的下降(欧姆极化),随后变缓。
长平台期:中间有一段很长的平缓区域(恒流放电平台)。
截止电压:最终电压下降到约 3.3V 左右截止。
Simulink 模型代码 (SLX):直接生成一个二阶RC模型,你可以导入MATLAB运行。
MATLAB 脚本代码:用于生成类似你图片中的放电曲线数据并绘图。
第一部分:Simulink 二阶RC模型代码
% 创建一个新的Simulink模型
modelName = ‘Battery_2RC_Model’;
new_system(modelName);
open_system(modelName);
% 定义电池参数 (示例参数,你需要根据你的电池数据调整)
% 这些参数决定了曲线的形状,特别是陡降和平台的长度
R0 = 0.05; % 欧姆内阻 (Ohm)
R1 = 0.02; % 极化内阻1 (Ohm)
C1 = 2000; % 极化电容1 (F)
R2 = 0.01; % 极化内阻2 (Ohm)
C2 = 1000; % 极化电容2 (F)
Q = 5000; % 电池容量 (mAh 或 As)
V_ocv_initial = 4.1; % 开路电压初始值 (V)
% 添加模块
add_block(‘simulink/Sources/Step’, [modelName ‘/Discharge_Current’]);
add_block(‘simulink/Math Operations/Gain’, [modelName ‘/Current_to_Amp’]);
add_block(‘simulink/Math Operations/Sum’, [modelName ‘/Sum_Uocv’]);
add_block(‘simulink/Math Operations/Gain’, [modelName ‘/Gain_R0’]);
add_block(‘simulink/Math Operations/Gain’, [modelName ‘/Gain_R1’]);
add_block(‘simulink/Math Operations/Gain’, [modelName ‘/Gain_R2’]);
add_block(‘simulink/Continuous/Integrator’, [modelName ‘/Integrator_U1’]);
add_block(‘simulink/Continuous/Integrator’, [modelName ‘/Integrator_U2’]);
add_block(‘simulink/Continuous/Integrator’, [modelName ‘/Integrator_SOC’]);
add_block(‘simulink/Sinks/Scope’, [modelName ‘/Scope_Voltage’]);
% 设置模块参数 (电流设置为5A放电)
set_param([modelName ‘/Discharge_Current’], ‘Time’, ‘1’, ‘Before’, ‘0’, ‘After’, ‘-5’);
set_param([modelName ‘/Gain_R0’], ‘Gain’, num2str(R0));
set_param([modelName ‘/Gain_R1’], ‘Gain’, num2str(R1));
set_param([modelName ‘/Gain_R2’], ‘Gain’, num2str(R2));
set_param([modelName ‘/Integrator_U1’], ‘InitialCondition’, ‘0’);
set_param([modelName ‘/Integrator_U2’], ‘InitialCondition’, ‘0’);
set_param([modelName ‘/Integrator_SOC’], ‘InitialCondition’, ‘1’); % SOC初始为100%
% 连接线 (这是一个简化的连接,实际二阶RC需要更复杂的反馈回路)
% 这里为了简化,直接展示核心逻辑:电流经过RC网络产生压降
add_line(modelName, ‘Discharge_Current/1’, ‘Gain_R0/1’);
add_line(modelName, ‘Gain_R0/1’, ‘Scope_Voltage/1’);
% 提示:完整的二阶RC模型需要使用State-Space模块或复杂的积分器反馈
% 请参考第二部分的脚本进行精确仿真
第二部分:MATLAB 脚本 (仿真并绘制你图片中的曲线)
这段代码使用微分方程直接计算电压,结果将与你图片中的曲线非常相似。
%% 二阶RC模型仿真脚本
clear; clc; close all;
%% 参数设置
% — 电池参数 —
C_batt = 5000 / 3600; % 容量 5Ah (转换为库仑/伏特)
R0 = 0.05; % 内阻
R1 = 0.03; % RC1 电阻
C1 = 1500; % RC1 电容
R2 = 0.02; % RC2 电阻
C2 = 800; % RC2 电容
% — 放电设置 —
I_discharge = -5; % 放电电流 -5A (负号表示放电)
t_sim = 3600; % 仿真时间 1小时 (3600秒)
dt = 1; % 采样时间 1秒
% — 初始状态 —
SOC = 1.0; % 初始荷电状态 100%
U_ocv = 4.1; % 初始开路电压 (根据SOC查表,这里假设线性简化)
U_p1 = 0; % 极化电压1初始值
U_p2 = 0; % 极化电压2初始值
%% 初始化数组
time_vec = 0:dt:t_sim;
voltage_vec = zeros(size(time_vec));
soc_vec = zeros(size(time_vec));
%% 仿真循环
for k = 1:length(time_vec)
t = time_vec(k);
% 1. 更新SOC (安时积分法)
SOC = SOC - (I_discharge * dt) / C_batt;
soc_vec(k) = SOC;
% 2. 更新极化电压 (RC网络动态响应)
% dUp/dt = I/C - Up/(R*C)
U_p1 = U_p1 + dt * (I_discharge/C1 - U_p1/(R1*C1));
U_p2 = U_p2 + dt * (I_discharge/C2 - U_p2/(R2*C2));
% 3. 计算端电压
% Ut = Uocv - I*R0 - Up1 - Up2
% 注意:这里假设Uocv随SOC线性下降,实际应用需查表
U_ocv_current = 3.3 + (4.1 - 3.3) * SOC; % 简单线性假设
V_terminal = U_ocv_current - I_discharge*R0 - U_p1 - U_p2;
voltage_vec(k) = V_terminal;
% 4. 截止条件 (电压低于3.3V停止)
if V_terminal < 3.3
voltage_vec(k:end) = V_terminal;
break;
end
end
%% 绘图 (匹配你图片的风格)
figure(‘Color’, ‘k’);
plot(time_vec/60, voltage_vec, ‘y’, ‘LineWidth’, 1.5); % X轴转为分钟
grid on;
xlabel(‘时间 (分钟)’, ‘Color’, ‘w’);
ylabel(‘电压 (V)’, ‘Color’, ‘w’);
title(‘二阶RC模型放电曲线仿真’, ‘Color’, ‘w’);
% 设置坐标轴颜色为白色,背景黑色
ax = gca;
ax.XColor = ‘w’;
ax.YColor = ‘w’;
ax.GridColor = ‘.2’;
代码说明
模型结构:代码模拟了电池的物理特性。初始的陡降是由 R0 决定的,中间的平台是由 C1/C2 的缓慢放电决定的。
参数调整:
如果你想让曲线下降得更慢(电池更好),请增大 C1 和 C2 的值。
如果你想让曲线初始压降更小,请减小 R0 的值。
I_discharge 设置为 -5 表示 5A 放电。
图表特征分析:
Y轴 (纵轴):数值从 0.8 线性下降到 0.73。
X轴 (横轴):时间或采样点从 0 延伸到 350 左右。
趋势:完美的直线下降,斜率恒定。这通常代表某种线性衰减的过程,例如:
在卡尔曼滤波中,协方差矩阵的衰减。
电池的SOC线性消耗(虽然电池实际是曲线,但在小范围内常被近似为线性)。
控制系统中的斜坡信号或斜坡下降指令。
MATLAB/Simulink 实现代码
你可以使用以下两种方法来生成类似的信号。
方法一:使用 MATLAB 脚本绘图 (最直接复现图片)
x = 0:350; % X轴数据 (0 到 350)
% y = k*x + b
% 初始值 b = 0.8
% 终止值 0.73,斜率 k = (0.73 - 0.8) / 350 = -0.0002
k = -0.0002;
b = 0.8;
y = k * x + b;
% 绘图设置
figure(‘Color’, ‘k’); % 黑色背景 (模拟Simulink Scope)
plot(x, y, ‘y’, ‘LineWidth’, 1.5); % 黄色线条
grid on;
axis([0 350 0.72 0.82]); % 设置坐标轴范围
xlabel(‘时间/采样点’);
ylabel(‘数值’);
title(‘线性下降曲线仿真’);
方法二:Simulink 模型搭建 (用于系统仿真)
如果你想在Simulink这个信号作为输入,可以使用 Ramp 模块配合 Constant 模块。
模块组成:
Ramp (Sources): 斜率设为 -0.0002。
Constant (Sources): 值设为 0.8。
Sum (Math Operations): 设置为 + 和 -(即 Constant - Ramp)。
Scope (Sinks): 用于显示波形。
参数设置逻辑:
Ramp模块:
Slope: -0.0002
Start time: 0
Initial output: 0
Constant模块:
Constant value: 0.8
Sum模块:
List of signs: |-+ (表示第一个输入减去第二个输入)
连线逻辑:
Constant -> Sum (正端)
Ramp -> Sum (负端)
Sum -> Scope
应用场景推测
结合你之前询问的“二阶RC模型”和“卡尔曼滤波”,这条直线很可能代表以下两种情况之一:
线性电流加载:如果你的Y轴是电流,这代表电流在随时间线性增加(或者负斜率代表线性减小)。
SOC 估算的参考线:在简单的安时积分法中,如果电流恒定,SOC 就会表现为这种线性下降。卡尔曼滤波的任务就是用这条直线去逼近真实的非线性电池电压曲线。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)