【状态估计】基于DEKF双扩展卡尔曼滤波的状态及其估计值研究(Matlab代码实现)
双扩展卡尔曼滤波(Dual Extended Kalman Filter, DEKF)是一种通过两个并行运行的扩展卡尔曼滤波器(EKF)实现状态与参数联合估计的算法。其核心在于分离状态与参数的时间尺度差异微观时间尺度:用于快速变化的系统状态(如电池SOC、车辆动态参数);宏观时间尺度:用于缓慢变化的模型参数(如电池内阻、AR模型权重)。算法流程DEKF通过双滤波器架构与多尺度处理,在复杂非线性系统
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能解答你胸中升起的一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
基于DEKF双扩展卡尔曼滤波的状态估计研究
一、DEKF的基本原理与核心定义
双扩展卡尔曼滤波(Dual Extended Kalman Filter, DEKF)是一种通过 两个并行运行的扩展卡尔曼滤波器(EKF) 实现状态与参数联合估计的算法。其核心在于分离状态与参数的时间尺度差异:
- 微观时间尺度:用于快速变化的系统状态(如电池SOC、车辆动态参数);
- 宏观时间尺度:用于缓慢变化的模型参数(如电池内阻、AR模型权重)。
算法流程:
二、DEKF与传统EKF的差异对比
| 特性 | EKF | DEKF |
|---|---|---|
| 目标 | 单一状态估计 | 状态与参数联合估计 |
| 模型复杂度 | 单滤波器,线性化近似 | 双滤波器并行,多尺度处理 |
| 参数处理 | 固定或外部输入 | 动态更新,适应时变特性 |
| 适用场景 | 线性化误差较小的系统 | 强非线性、参数时变系统(如电池老化) |
| 计算开销 | 较低 | 较高(需维护两个滤波器) |
| 收敛性 | 对初值敏感,易发散 | 通过参数自适应提高鲁棒性 |
| 典型应用 | 机器人定位、简单动态系统 | 电池SOC/SOH估计、手动控制行为建模 |
关键优势:DEKF通过分离状态与参数,避免了传统EKF中状态-参数耦合导致的线性化误差累积问题,尤其在电池参数时变场景下,估计误差可降低至1%以内。
三、DEKF的数学模型构建方法
四、DEKF实现的技术难点与解决方案
-
初始参数敏感性:
- 问题:错误的初始参数(如神经肌肉参数)可能导致发散或收敛缓慢。
- 解决方案:基于历史数据或离线辨识(如最小二乘法)初始化参数,并通过协方差矩阵调整加速收敛。
-
计算复杂度:
- 分布式DEKF:通过节点间信息交换(如协方差交叉融合)降低计算负担,适用于多传感器网络。
- 降维处理:将参数向量限制为关键时变参数(如电池容量),减少计算维度。
-
偏差与唯一性:
- 问题:噪声统计不准确导致估计偏差,多解问题影响唯一性。
- 验证方法:使用χ²检验标准化残差,或通过自相关函数验证白噪声特性。
-
实时性优化:
- 并行计算架构:利用GPU加速矩阵运算,满足实时状态监控需求(如车辆动态控制)。
五、典型应用案例研究
-
锂离子电池SOC/SOH估计:
- 场景:电池老化导致容量衰减,传统EKF无法跟踪内阻变化。
- DEKF方案:双滤波器分别估计SOC(状态)和容量(参数),结合协方差自适应将SOC误差控制在1%以内。
- 实验对比:在DST工况下,DEKF的SOC误差较EKF降低75%。
-
人类手动控制行为建模:
- 场景:驾驶员在疲劳或车辆动态变化时的控制参数时变。
- DEKF方案:状态滤波器估计操作力矩,参数滤波器识别神经肌肉延迟,实现实时人机交互优化。
-
货币政策参数估计:
- 场景:中央银行需动态调整通胀目标模型参数。
- DEKF方案:分离宏观经济状态(如GDP)与政策参数(如利率权重),应对非线性乘性噪声。
-
多无人艇协同定位:
- 场景:通信延迟导致定位误差累积。
- DEKF方案:通过状态估计误差补偿,将定位误差降低至可观测范围内。
六、总结与展望
DEKF通过双滤波器架构与多尺度处理,在复杂非线性系统中展现出显著优势,尤其在电池管理、动态控制等领域。未来研究方向包括:
- 自适应算法:结合深度学习优化噪声协方差矩阵;
- 分布式扩展:面向物联网的多节点协同估计;
- 硬件加速:嵌入式系统实时实现。
DEKF的广泛应用将推动高精度状态估计技术在智能制造、新能源等领域的深度融合。
📚2 运行结果






部分代码:
subplot(2,1,1)
hold on
plot(yk(1:final_pos),'ko');
plot(y(1:final_pos), 'r','LineWidth',4);
plot(x_estim,'b-.','LineWidth',4);
set (gca, "fontsize", 16)
xlim([0,2500])
L=legend('Observations', 'True States', 'Estimated', 'location', 'north', 'orientation', 'horizontal');
FL1= findall(L,'-property','FontName');
set(FL1,'FontName','/usr/share/fonts/msttcore/cour.ttf');
set(L,'FontSize',16);
ylabel('Value','FontSize',16);
subplot(2,1,2)
plot(norm_diff_wk);
set (gca, "fontsize", 16)
xlim([0,2500])
xlabel('Sample','FontSize',16);
ylabel('Value','FontSize',16);
L=legend('Neural net delta weight');
FL1= findall(L,'-property','FontName');
set(FL1,'FontName','/usr/share/fonts/msttcore/cour.ttf');
set(L,'FontSize',16);
H = 9; W = 12;
set(h,'PaperUnits','inches')
set(h,'PaperOrientation','portrait');
set(h,'PaperSize',[H,W])
set(h,'PaperPosition',[0,0,W,H])
h = figure(2);
FN = findall(h,'-property','FontName');
set(FN,'FontName','/usr/share/fonts/dejavu/DejaVuSerifCondensed.ttf');
FS = findall(h,'-property','FontSize');
set(FS,'FontSize',16);
hold on
plot(yk(1:500),'ko','LineWidth',2);
plot(y(1:500), 'r','LineWidth',4);
plot(x_estim(1:500),'b--','LineWidth',4);
set (gca, "fontsize", 16)
xlim([0,500])
ylim([-4,6])
L=legend('Observations', 'True States', 'Estimated', 'location', 'north', 'orientation', 'horizontal');
FL1= findall(L,'-property','FontName');
set(FL1,'FontName','/usr/share/fonts/msttcore/cour.ttf');
set(L,'FontSize',16);
ylabel('Value','FontSize',16);
xlabel('Sample','FontSize',16);
H = 9; W = 12;
set(h,'PaperUnits','inches')
set(h,'PaperOrientation','portrait');
set(h,'PaperSize',[H,W])
set(h,'PaperPosition',[0,0,W,H])
%%print(h,'-dpng','-color','impacto_snr_trecho1.png');
h = figure(3);
FN = findall(h,'-property','FontName');
set(FN,'FontName','/usr/share/fonts/dejavu/DejaVuSerifCondensed.ttf');
FS = findall(h,'-property','FontSize');
set(FS,'FontSize',16);
hold on
plot([501:1000], yk(501:1000),'ko','LineWidth',2);
plot([501:1000],y(501:1000), 'r','LineWidth',4);
plot([501:1000],x_estim(501:1000),'b--','LineWidth',4);
set (gca, "fontsize", 16)
L=legend('Observations', 'True States', 'Estimated', 'location', 'north', 'orientation', 'horizontal');
FL1= findall(L,'-property','FontName');
set(FL1,'FontName','/usr/share/fonts/msttcore/cour.ttf');
set(L,'FontSize',16);
ylabel('Value','FontSize',16);
xlabel('Sample','FontSize',16);
H = 9; W = 12;
set(h,'PaperUnits','inches')
set(h,'PaperOrientation','portrait');
set(h,'PaperSize',[H,W])
set(h,'PaperPosition',[0,0,W,H])
%%print(h,'-dpng','-color','impacto_snr_trecho2.png');
h = figure(4);
FN = findall(h,'-property','FontName');
set(FN,'FontName','/usr/share/fonts/dejavu/DejaVuSerifCondensed.ttf');
FS = findall(h,'-property','FontSize');
set(FS,'FontSize',16);
hold on
plot([2001:2500], yk(2001:2500),'ko','LineWidth',2);
plot([2001:2500], y(2001:2500), 'r','LineWidth',4);
plot([2001:2500], x_estim(2001:2500),'b--','LineWidth',4);
set (gca, "fontsize", 16)
L=legend('Observations', 'True States', 'Estimated', 'location', 'north', 'orientation', 'horizontal');
FL1= findall(L,'-property','FontName');
set(FL1,'FontName','/usr/share/fonts/msttcore/cour.ttf');
set(L,'FontSize',16);
ylabel('Value','FontSize',16);
xlabel('Sample','FontSize',16);
H = 9; W = 12;
set(h,'PaperUnits','inches')
set(h,'PaperOrientation','portrait');
set(h,'PaperSize',[H,W])
set(h,'PaperPosition',[0,0,W,H])
%print(h,'-dpng','-color','impacto_snr_trecho3.png');
h = figure(5);
FN = findall(h,'-property','FontName');
set(FN,'FontName','/usr/share/fonts/dejavu/DejaVuSerifCondensed.ttf');
FS = findall(h,'-property','FontSize');
set(FS,'FontSize',16);
hold on
plot([251:750], yk(251:750),'ko','LineWidth',2);
plot([251:750], y(251:750), 'r','LineWidth',4);
plot([251:750], x_estim(251:750),'b--','LineWidth',4);
xlim([250,750])
set (gca, "fontsize", 16)
L=legend('Observations', 'True States', 'Estimated', 'location', 'north', 'orientation', 'horizontal');
FL1= findall(L,'-property','FontName');
set(FL1,'FontName','/usr/share/fonts/msttcore/cour.ttf');
set(L,'FontSize',16);
ylabel('Value','FontSize',16);
xlabel('Sample','FontSize',16);
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)
[1]胡丹.基于双扩展卡尔曼滤波的汽车状态及路面附着系数估计算法研究[D].吉林大学,2009.
[2]胡丹.基于双扩展卡尔曼滤波的汽车状态及路面附着系数估计算法研究[D].吉林大学,2009.
🌈4 Matlab代码实现
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取

更多推荐




所有评论(0)