【卡尔曼滤波】粗略模型和过滤技术在模型不确定情况下的应用研究(Matlab代码实现)

2024-01-21

???????????????? 欢迎来到本博客 ❤️❤️????????

????博主优势: ???????????? 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️ 座右铭: 行百里者,半于九十。

???????????? 本文目录如下: ????????????

目录

????1 概述

????2 运行结果

????3 参考文献

????4 Matlab代码及文献


????1 概述

摘要—本文讨论了在只有粗略模型可用时系统的估计和滤波问题。基于经典正则化最小二乘问题的修改版本,提出了一种新的设计准则,考虑了测量和创新作为不确定性的可能来源。在高斯假设下,它表现为最大后验贝叶斯估计的上界。通过利用非光滑分析工具获得最优解,最优解揭示了残差空间中的一个区域,其中估计的非变化是最优的。该方法以递归形式从随机角度提供了鲁棒估计器。为了说明,导出了类似卡尔曼滤波器,并与经典的最坏情况鲁棒设计滤波器进行了比较。
索引词—估计,不确定系统,卡尔曼滤波。
一、引言
从噪声观测中估计一组未知参数的问题在科学和工程中有着广泛的应用。然而,通常情况下,数据生成的精确模型可能不为人所知,因此需要一个鲁棒的估计器。
在文献中,主要有两种主要的鲁棒状态估计方法。第一种方法是H∞估计,试图最小化输入噪声对估计误差的最坏情况能量增益,参见[1],[2]。第二种方法是所谓的保证成本估计,其中设计了一个满足上限误差的估计算法,参见[3],[4]。此外,还有一种基于确定性正则化最小二乘问题的不同方法已被探索用于设计鲁棒估计器,参见[5],[6],[7]。然而,这些方法涉及基于最坏情况的优化,如果模型和测量的不确定性相当大,解决方案中可能存在高度保守性。
为了获得针对模型不确定性的鲁棒估计器,本文采用了较少保守性的随机观点,并依赖于经典正则化最小二乘问题的修改版本[8]。这使我们能够获得最小二乘鲁棒估计和卡尔曼滤波器的更新阶段。
该立场的主要贡献是一种用于模型不确定性的静态估计器和滤波器模型,采用了一种新颖的随机建模工具。结果表明,在高斯假设下,估计准则表现为最大后验贝叶斯估计的上界。
由于模型中嵌入了由估计变化的绝对值调制的随机噪声,这种滤波器的行为在某些情况下,最佳估计仍然是先验,而不是后验,考虑到系统动态提供的先验的信心和新测量的信心之间的权衡,这在现有的鲁棒滤波的文献中是不可见的,参见[5],[6],[9],[10]。与这些不同的是,得到的滤波器增益是非线性的。

???? 2 运行结果

主函数代码:

% This Matlab code implements the numerical example presented in the paper
% M. R. Fernandes, J. B. R. do Val and R. F. Souto, "Robust Estimation and
% Filtering for Poorly Known Models" in IEEE Control Systems Letters.
% doi: 10.1109/LCSYS.2019.2951611
% https://ieeexplore.ieee.org/document/8891731

close all
clear all
clc
rng('default'); rng(0)
%% System Model
n=2; %number of states
p=1; %number of outputs
A0=[0.9802 0.0196;0 0.9802]; %Nominal Dynamic Matrix
A1=[0 0.099;0 0];
H0=[1 -1]; %Measurement Matrix
G=eye(n);
Ef=[0 5];
Eg=[0 0];
M=[0.0198;0];

%% Noise Covariances
sigma=sqrtm([1.9608 0.0195;0.0195 1.9605]);
nu=eye(p);
Q = sigma*sigma';
R = nu*nu';

%% EVIU Parameters
sigmas.x=[0 0;0 0];
sigmas.bx=0.1*eye(n);
sigmas.y=[0 0.1];
sigmas.by=[0 0.1];
sigmas.v=[0 0.1];
sigmas.bv=sigmas.v;

%% Simulation
N=1000; %time horizon
a=-1:0.1:1; % grid for uncertain parameter
H=H0; %output matrix is considered exactly
gamma=99; %gain for the Hinf Filter

%Make a grid on [-1,1] for the uncertain parameter and apply simultaneosly
%the EVIU, BDU, Hinf and Kalman filter.
for i=1:length(a)
A=A0+a(i)*A1; %define 'true' dynamic matrix
% Monte Carlo Simulation
for j=1:500
%% Initialization
clear x hx m hx2 hx_opt hx_s hx_hinf P P2 P_s P_hinf P_opt
x(:,1)=1*ones(n,1);%real states
hx(:,1)=zeros(n,1);%classic kalman states
hx_opt(:,1)=zeros(n,1);%opt states
m=zeros(n,1);
S=zeros(n,1); %beta0
hx2=hx; %eviu states
hx_s=hx; %BDU states
hx_hinf=hx; %hinf states
P=eye(n); %initial covariance
L=P;
P_s=P; %covariance for BDU filter
P2=P; %covariance for EVIU filter
Phinf=P; %covariance for Hinf filter
P_opt=P; %covariance for optimal filter
trP(1)=trace(P); %trace of KF covariance
trP2(j,1)=trP(1); %trace of EVIU covariance
trP_opt(j,1)=trP(1); %trace of Optimal covariance
trP_s(j,1)=trP(1); %trace of BDU covariance
trP_hinf(j,1)=trP(1); %trace of Hinf covariance
mse(j,1)=norm(hx(:,1)-x(:,1))^2; %KF error
mse2(j,1)=mse(j,1); % EVIU error
mse_opt(j,1)=mse(j,1); % Minimum error
mse_hinf(j,1)=mse(j,1); % Hinf error
mse_s(j,1)=mse(j,1); % BDU error
%time simulation
for k=1:N-1
%% real system
x(:,k+1)=A*x(:,k)+sigma*randn(n,1);
y(:,k+1)=H*x(:,k+1)+nu*randn(p,1);
%% Classic Kalman Filter (hx)
[hx(:,k+1),P]=kalman_filter(A0,H0,Q,R,hx(:,k),P,y(:,k+1));
trP(k+1)=trace(P);
mse(j,k+1)=norm(x(:,k+1)-hx(:,k+1))^2;
%% EVIU Filter (hx2)
[hx2(:,k+1),P2,m,L,S(:,k+1)]=eviu_filter(A0,H0,sigmas,Q,R,hx2(:,k),P2,m,L,S(:,k),y(:,k+1));
trP2(j,k+1)=trace(P2);
mse2(j,k+1)=norm(x(:,k+1)-hx2(:,k+1))^2;
%% Optimal Filter (Kalman with exactly model)
[hx_opt(:,k+1),P_opt]=kalman_filter(A,H,Q,R,hx_opt(:,k),P_opt,y(:,k+1));
trP_opt(j,k+1)=trace(P_opt);
%% BDU Filter
[hx_s(:,k+1),P_s]=BDU_filter(A0,H0,M,Ef,Eg,G,Q,R,hx_s(:,k),P_s,y(:,k+1));
trP_s(j,k+1)=trace(P_s);
mse_s(j,k+1)=norm(x(:,k+1)-hx_s(:,k+1))^2;
%% Hinf filter
[hx_hinf(:,k+1),Phinf]=hinf_filter(A0,H0,G,Q,R,hx_hinf(:,k),Phinf,y(:,k+1),eye(n),gamma);
trP_hinf(j,k+1)=trace(Phinf);
mse_hinf(j,k+1)=norm(x(:,k+1)-hx_hinf(:,k+1))^2;
end
end
mse=mean(mse); %KF
mse2=mean(mse2); %EVIU
mse_s=mean(mse_s); %BDU
trP_opt=mean(trP_opt); %Optimal
mse_hinf=mean(mse_hinf); %Hinf
mmse(i)=mean(mse); %KF
mmse2(i)=mean(mse2); %EVIU
mmse_s(i)=mean(mse_s); %BDU
mmse_hinf(i)=mean(mse_hinf); %Hinf
mmse_opt(i)=mean(trP_opt); % Optimal
fprintf('%d gain=%.3f\n',i,(1-mmse2(i)/mmse(i))*100)
end
%% Plot results
figure(1)
p1=plot(a,sqrt(mmse),'*-','linewidth',2);
hold on
p2=plot(a,sqrt(mmse2),'-','linewidth',2);
p3=plot(a,sqrt(mmse_s),'o-','linewidth',2);
p5=plot(a,sqrt(mmse_hinf),'c-','linewidth',2);
p4=plot(a,sqrt(mmse_opt),'--k','linewidth',2);
legend([p1,p2,p3,p5,p4],'KF','EVIU','BDU','$\mathcal{H}_\infty$','Optimal','Interpreter','latex')
ylabel('RMSE_{total}')
xlabel('\delta')
axis([-1 1 0 22])
grid on
figure(2)
%Worst-case (delta=1)
p1=semilogx(10*log10(mse),'-','linewidth',2);
hold on
p2=semilogx(10*log10(mse2),'linewidth',2);
p3=semilogx(10*log10(mse_s),'-','linewidth',2);
p4=semilogx(10*log10(trP_opt),'--k','linewidth',2);
p5=semilogx(10*log10(mse_hinf),'c-','linewidth',2);
ylabel('MSE(dB)')
xlabel('Tempo (k)')
grid on
legend([p1,p2,p3,p5,p4],'KF','EVIU','BDU','$\mathcal{H}_\infty$','Optimal','Interpreter','latex')

????3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

Marcos R. Fernandes, Joao Bosco R. do Val, Rafael. F. Souto.

???? 4 Matlab代码及文献

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【卡尔曼滤波】粗略模型和过滤技术在模型不确定情况下的应用研究(Matlab代码实现) 的相关文章

  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 从 Python 中的类元信息对 __init__ 函数进行类型提示

    我想做的是复制什么SQLAlchemy确实 以其DeclarativeMeta班级 有了这段代码 from sqlalchemy import Column Integer String from sqlalchemy ext declar
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数

随机推荐