锂离子电池二阶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) dtSimulink 模型结构代码与搭建步骤搭建步骤创建新模型新建一个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; % 极化电阻1C1 1000; % 极化电容1R2 0.008; % 极化电阻2C2 500; % 极化电容2Q 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/Qadd_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*R0add_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; endend%% 绘图 (匹配你图片的风格)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.0002k -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.0002Start time: 0Initial output: 0Constant模块Constant value: 0.8Sum模块List of signs: |- (表示第一个输入减去第二个输入)连线逻辑Constant - Sum (正端)Ramp - Sum (负端)Sum - Scope应用场景推测结合你之前询问的“二阶RC模型”和“卡尔曼滤波”这条直线很可能代表以下两种情况之一线性电流加载如果你的Y轴是电流这代表电流在随时间线性增加或者负斜率代表线性减小。SOC 估算的参考线在简单的安时积分法中如果电流恒定SOC 就会表现为这种线性下降。卡尔曼滤波的任务就是用这条直线去逼近真实的非线性电池电压曲线。
锂离子电池二阶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) dtSimulink 模型结构代码与搭建步骤搭建步骤创建新模型新建一个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; % 极化电阻1C1 1000; % 极化电容1R2 0.008; % 极化电阻2C2 500; % 极化电容2Q 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/Qadd_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*R0add_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; endend%% 绘图 (匹配你图片的风格)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.0002k -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.0002Start time: 0Initial output: 0Constant模块Constant value: 0.8Sum模块List of signs: |- (表示第一个输入减去第二个输入)连线逻辑Constant - Sum (正端)Ramp - Sum (负端)Sum - Scope应用场景推测结合你之前询问的“二阶RC模型”和“卡尔曼滤波”这条直线很可能代表以下两种情况之一线性电流加载如果你的Y轴是电流这代表电流在随时间线性增加或者负斜率代表线性减小。SOC 估算的参考线在简单的安时积分法中如果电流恒定SOC 就会表现为这种线性下降。卡尔曼滤波的任务就是用这条直线去逼近真实的非线性电池电压曲线。