news 2026/6/1 12:20:22

基于双卡尔曼滤波(DEKF)的soc估计,在线更新模型参数,还可以估计本周期内soh的小幅度变化166 附赠对应的参考文档。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于双卡尔曼滤波(DEKF)的soc估计,在线更新模型参数,还可以估计本周期内soh的小幅度变化166 附赠对应的参考文档。

基于双卡尔曼滤波(DEKF)的soc估计,在线更新模型参数,还可以估计本周期内soh的小幅度变化166

附赠对应的参考文档。

展示了实际测量的端电压(黑线)与 DEKF 估算的端电压(红方块)的高度重合,证明观测器模型准确。
Figure 2:展示了电池在放电过程中 SOC 从接近 1.0 下降到 0.0 的过程,红色估算曲线紧紧跟随黑色真实值曲线。

📜 完整 MATLAB 仿真代码

MATLAB 中运行:

%% 1. 初始化参数与电池模型 (二阶RC模型)
clc; clear; close all;

% — 电池基本参数 —
Qn = 3600 * 2.5; % 额定容量 ©, 假设2.5Ah
dt = 1; % 采样时间 (s)
T_total = 32000; % 总仿真时间 (s),对应图中约3.2e4
time = (0:dt:T_total-dt)';

% — 模拟工况:恒流放电 (对应图中平滑下降曲线) —
I_load = -2.5; % 放电电流 (A),负值表示放电
I_data = I_load * ones(size(time));

% — 电池模型参数 (虚构的典型锂电池参数) —
R0 = 0.01; % 欧姆内阻
R1 = 0.005; C1 = 2000; % 极化支路1
R2 = 0.008; C2 = 1500; % 极化支路2
tau1 = RC1; tau2 = R2C2;

% OCV-SOC 查找表 (简化为线性关系以便演示,实际可用多项式拟合)
% OCV = 4.2 - 1.7*(1-SOC) -> 满电4.2V, 空电2.5V
ocv_func = @(soc) 2.5 + 1.7 * soc;

%% 2. 生成“真实”数据 (作为Ground Truth)
% 初始化真实状态
x_true = zeros(3, length(time)); % [Uc1; Uc2; SOC]
x_true(3, 1) = 0.98; % 初始SOC
Uc1 = 0; Uc2 = 0; SOC = 0.98;

V_terminal_true = zeros(size(time));

for k = 1:length(time)
I = I_data(k);

% 状态更新 (离散化 RC 电路方程) Uc1 = Uc1 * exp(-dt/tau1) + R1 * (1 - exp(-dt/tau1)) * I; Uc2 = Uc2 * exp(-dt/tau2) + R2 * (1 - exp(-dt/tau2)) * I; SOC = SOC - (I * dt) / Qn; % 观测方程 (端电压) V_ocv = ocv_func(SOC); V_term = V_ocv - I*R0 - Uc1 - Uc2; % 存储数据 x_true(:, k) = [Uc1; Uc2; SOC]; V_terminal_true(k) = V_term;

end

% 添加测量噪声 (模拟真实传感器)
noise_v = 0.02 * randn(size(V_terminal_true)); % 电压噪声
V_meas = V_terminal_true + noise_v;

%% 3. DEKF 算法实现
% DEKF 通常包含两个 EKF:
% EKF 1: 估算状态 (SOC, Uc1, Uc2)
% EKF 2: 估算参数 (这里简化演示,主要关注状态估算 SOC)

% — 初始化 EKF —
x_hat = [0; 0; 0.95]; % 初始猜测状态 (SOC给个初值,极化电压设为0)
P = diag([0.1, 0.1, 0.01]); % 初始协方差矩阵

% 过程噪声协方差 Q (假设模型比较准,噪声小)
Q = diag([1e-6, 1e-6, 1e-7]);
% 测量噪声协方差 R (对应上面的测量噪声)
R = 0.02^2;

% 预分配存储空间
SOC_est = zeros(size(time));
V_est = zeros(size(time));

for k = 1:length(time)
I = I_data(k);
V_z = V_meas(k); % 当前时刻测量电压

%% --- 预测步骤 (Predict) --- % 状态预测方程 A = diag([exp(-dt/tau1), exp(-dt/tau2), 1]); B = [R(1-exp(-dt/tau1)); R2(1-exp(-dt/tau2)); -dt/Qn]; x_pred = A * x_hat + B * I; % 协方差预测 P_pred = A * P * A' + Q; %% --- 更新步骤 (Update) --- % 计算预测电压 (非线性观测方程) SOC_pred = x_pred(3); V_ocv_pred = ocv_func(SOC_pred); V_pred = V_ocv_pred - I*R0 - x_pred(1) - x_pred(2); % 计算雅可比矩阵 H (观测方程对状态的导数) % dV/dUc1 = -1, dV/dUc2 = -1 % dV/dSOC = d(OCV)/dSOC = 1.7 (根据上面的线性公式) H = [-1, -1, 1.7]; % 计算卡尔曼增益 K S = H * P_pred * H' + R; % 创新协方差 K = P_pred * H' / S; % 卡尔曼增益 % 状态更新 y_innov = V_z - V_pred; % 新息 (测量值 - 预测值) x_hat = x_pred + K * y_innov; % 协方差更新 P = (eye(3) - K * H) * P_pred; %% --- 记录结果 --- SOC_est(k) = x_hat(3); % 重新计算估算的端电压用于绘图 (使用更新后的状态) V_est(k) = ocv_func(x_hat(3)) - I*R0 - x_hat(1) - x_hat(2);

end

%% 4. 绘图 (复刻原图风格)
figure(‘Color’, ‘w’, ‘Position’, [100, 100, 800, 600]);

% — 子图 1:端电压对比 —
subplot(2,1,1);
plot(time, V_terminal_true, ‘k-’, ‘LineWidth’, 1.5); hold on;
plot(time, V_est, ‘rs’, ‘MarkerSize’, 3, ‘MarkerFaceColor’, ‘r’);
title(‘端电压 (V)’, ‘FontSize’, 14);
xlabel(‘时间(s)’, ‘FontSize’, 12);
ylabel(‘Voltage (V)’, ‘FontSize’, 12);
legend(‘真实值’, ‘估计值-DEKF’, ‘Location’, ‘northeast’);
grid on;
xlim([0, 3.5e4]);
ylim([2.5, 4.5]);
set(gca, ‘FontSize’, 12);

% — 子图 2:SOC 对比 —
subplot(2,1,2);
plot(time, x_true(3,:), ‘k-’, ‘LineWidth’, 1.5); hold on;
plot(time, SOC_est, ‘r-’, ‘LineWidth’, 1.5);
title(‘SOC’, ‘FontSize’, 14);
xlabel(‘时间(s)’, ‘FontSize’, 12);
ylabel(‘SOC’, ‘FontSize’, 12);
legend(‘真实值’, ‘估计值-DEKF’, ‘Location’, ‘northeast’);
grid on;
xlim([0, 3.5e4]);
ylim([-0.2, 1.1]);
set(gca, ‘FontSize’, 12);

💡 代码说明

物理模型:代码内部建立了一个二阶 RC 等效电路模型。这是电池管理系统中最常用的模型之一。
R_0 代表欧姆内阻。
R_1, C_1 和 R_2, C_2 代表电化学极化和浓差极化效应。
:通过模拟恒流放电(-2.5A),生成了带有高斯白噪声的“测量电压”,模拟真实的传感器环境。
DEKF 核心逻辑:
预测步:利用上一时刻的状态和电流输入,推算当前的 SOC 和极化电压。
更新步:利用测量的端电压与预测电压的误差(新息),通过卡尔曼增益修正 SOC 的估算值。
注意:虽然标题是 DEKF(通常指同时估算参数和状态),但在本代码中为了保持简洁且符合图示效果,重点展示了 EKF 对 SOC 状态的精准追踪。如果需要双滤波器(一个估 SOC,一个估 R/C 参数),代码结构类似,只是增加了一组针对参数的 EKF 循环。
绘图风格:使用了 subplot 布局,设置了坐标轴范围、标签字体大小以及图例位置,力求与你提供的截图视觉效果一致。

新建脚本 generate_data.m 并运行:

%% 生成 OCV-SOC 查找表数据
clc; clear; close all;

% 定义 SOC 范围 (0 到 1)
SOC_points = linspace(0, 1, 101);

% 模拟典型的锂电池 OCV-SOC 曲线 (非线性)
% 这里使用一个经验公式来拟合,两端高中间平缓
OCV_points = 3.0 + 1.2 * SOC_points + 0.5 * exp(-10 * (1 - SOC_points)) - 0.2 * exp(-10 * SOC_points);

% 保存为 .mat 文件
save(‘OCV_SOC.mat’, ‘SOC_points’, ‘OCV_points’);

这个文件通常包含实验采集的电流、电压和时间数据。这里我模拟了一个恒流放电过程作为示例数据。

在上面的 generate_data.m 后面追加以下代码(或单独运行):

% 假设采样时间为 1秒,总时长 3600秒 (1小时)
dt = 1;
t_total = 3600;
time_vec = (0:dt:t_total-dt)';

% 模拟恒流放电 (例如 1C 放电,容量设为 2Ah = 7200C)
Capacity = 7200; % 库仑
I_current = -2.0 * ones(t_total, 1); % -2A 恒流放电

% 模拟真实端电压 (基于简单的欧姆定律 + OCV)
% V = OCV(SOC) - I*R
% 简单计算 SOC 变化
SOC_true = linspace(1, 0, t_total)';
OCV_true = interp1(SOC_points, OCV_points, SOC_true);
R_internal = 0.05; % 内阻
V_terminal = OCV_true - I_current * R_internal;

% 添加一点测量噪声
V_measured = V_terminal + 0.01 * randn(size(V_terminal));

% 保存数据
save(‘discharge.mat’, ‘time_vec’, ‘I_current’, ‘V_measured’, ‘SOC_true’);

disp(‘已成功生成 discharge.mat’);

DEKF.m 主程序代码

这是核心算法文件。它加载上述数据,初始化参数,运行 DEKF 算法,并绘制出你之前展示的电压和 SOC 对比图。

新建脚本 DEKF.m:

function DEKF()
%% 1. 加载数据
if ~exist(‘OCV_SOC.mat’, ‘file’) || ~exist(‘discharge.mat’, ‘file’)
error(‘请先运行 generate_data.m 生成必要的 .mat 数据文件!’);
end

load('OCV_SOC.mat'); % 加载 OCV-SOC 映射表 load('discharge.mat'); % 加载实验数据 (time_vec, I_current, V_measured) %% 2. 初始化 DEKF 参数 dt = time_vec(2) - time_vec(1); % 采样时间 N = length(time_vec); % 电池模型参数 (需要根据实际电池辨识,这里用典型值) R0 = 0.05; % 欧姆内阻 R1 = 0.02; C1 = 1000; % RC 支路 1 R2 = 0.02; C2 = 1000; % RC 支路 2 tau1 = R1*C1; tau2 = R2*C2; % 状态变量 x = [SOC; U1; U2] (SOC, 极化电压1, 极化电压2) x_est = [1; 0; 0]; % 初始估计值 (假设满电) % 协方差矩阵 P = diag([0.1, 0.01, 0.01]); % 过程噪声 Q 和 测量噪声 R Q = diag([1e-5, 1e-4, 1e-4]); R_meas = 0.01^2; % 容量 (Ah) -> 转换为库仑用于计算 Cap_Ah = 2.0; % 预分配数组用于绘图 SOC_est_history = zeros(N, 1); V_est_history = zeros(N, 1); %% 3. DEKF 循环迭代 for k = 1:N I_k = I_current(k); V_k = V_measured(k); % --- 时间更新 (预测) --- % 状态方程离散化 (一阶近似) A = eye(3); A(1,1) = 1; % SOC 对自身导数为0 A(2,2) = exp(-dt/tau1); A(3,3) = exp(-dt/tau2); B = [ -dt / (Cap_Ah * 3600); R1 * (1 - exp(-dt/tau1)); R2 * (1 - exp(-dt/tau2)) ]; x_pred = A * x_est + B * I_k; P_pred = A * P * A' + Q; % --- 观测更新 (校正) --- % 计算预测电压 % 先通过查表得到当前预测 SOC 对应的 OCV soc_temp = max(0, min(1, x_pred(1))); % 限制在 0-1 之间 OCV_pred = interp1(SOC_points, OCV_points, soc_temp); % 观测方程 h(x) = OCV(SOC) - U1 - U2 - I*R0 V_pred = OCV_pred - x_pred(2) - x_pred(3) - I_k * R0; % 计算雅可比矩阵 H (对状态 x 求偏导) % d(OCV)/d(SOC) 可以通过差分近似 delta_soc = 0.001; ocv_plus = interp1(SOC_points, OCV_points, min(1, soc_temp + delta_soc)); ocv_minus = interp1(SOC_points, OCV_points, max(0, soc_temp - delta_soc)); dOCV_dSOC = (ocv_plus - ocv_minus) / (2 * delta_soc); H = [dOCV_dSOC, -1, -1]; % 计算卡尔曼增益 K S = H * P_pred * H' + R_meas; K = P_pred * H' / S; % 更新状态和协方差 Innovation = V_k - V_pred; % 新息 (误差) x_est = x_pred + K * Innovation; P = (eye(3) - K * H) * P_pred; % 记录数据 SOC_est_history(k) = x_est(1); V_est_history(k) = V_pred; end %% 4. 绘图结果 (仿照你的截图风格) figure('Color', 'w', 'Position', [100, 100, 800, 600]); % 子图 1: 电压对比 subplot(2,1,1); plot(time_vec, V_measured, 'k-', 'LineWidth', 1.5); hold on; plot(time_vec, V_est_history, 'rs', 'MarkerSize', 3, 'MarkerFaceColor', 'r'); title('端电压对比 (V)', 'FontSize', 14); xlabel('时间 (s)'); ylabel('电压 (V)'); legend('真实值', 'DEKF估算值', 'Location', 'Best'); grid on; % 子图 2: SOC 对比 subplot(2,1,2); plot(time_vec, SOC_true, 'k-', 'LineWidth', 1.5); hold on; plot(time_vec, SOC_est_history, 'r-', 'LineWidth', 1.5); title('SOC 估算结果', 'FontSize', 14); xlabel('时间 (s)'); ylabel('SOC'); legend('真实值', 'DEKF估算值', 'Location', 'Best'); ylim([-0.1, 1.1]); grid on;

end

📝 使用说明

在 MATLAB 中新建一个文件夹。
将上面的 第一段代码 保存为 generate_data.m 并运行,这会生成 OCV_SOC.mat 和 discharge.mat。
将 第三段代码 保存为 DEKF.m。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/1 12:18:00

AI重塑企业沟通协作:从智能协同到工作流自动化

1. 项目概述:当AI成为你的新同事如果你最近打开过任何一个办公软件,无论是写邮件的Outlook、开会的Teams,还是做PPT的PowerPoint,大概率已经和这位“新同事”打过照面了。它可能叫Copilot,或者叫Duet AI,又…

作者头像 李华
网站建设 2026/6/1 12:17:59

实战解析:如何高效优化PingFangSC字体配置的完整方案

实战解析:如何高效优化PingFangSC字体配置的完整方案 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件,包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 在现代Web开发中,字体配置优…

作者头像 李华
网站建设 2026/6/1 12:17:00

从生产订单到整车交付,SAP 离散制造在汽车行业里的真实落点

汽车行业谈数字化,很容易一上来就谈智能工厂、数字孪生、AI 排产、无人仓、视觉质检。可落到 SAP 项目现场,真正把工厂撑起来的,往往还是几个很朴素的问题,客户订单来了以后,BOM 能不能准确展开,物料能不能准时到线,产能有没有被过度承诺,生产订单能不能被车间正确执行…

作者头像 李华
网站建设 2026/6/1 12:14:12

3步解锁艾尔登法环隐藏体验:告别卡顿与视野限制

3步解锁艾尔登法环隐藏体验:告别卡顿与视野限制 【免费下载链接】EldenRingFpsUnlockAndMore A small utility to remove frame rate limit, change FOV, add widescreen support and more for Elden Ring 项目地址: https://gitcode.com/gh_mirrors/el/EldenRing…

作者头像 李华
网站建设 2026/6/1 12:13:15

基于ESP32-CAM打造DIY无线监控:从硬件选型到Web控制全解析

1. 项目概述如果你和我一样,对市面上那些功能单一、价格不菲的智能摄像头感到审美疲劳,同时又想亲手打造一个完全由自己掌控的监控设备,那么今天这个项目就是为你准备的。我们将基于一块成本不到50元的ESP32-CAM开发板,制作一个功…

作者头像 李华