sage-huga改进SITAN

news/2025/2/26 8:26:10

Sage-Husa自适应滤波算法

Sage-Husa自适应滤波算法是一种在递推滤波过程中实时估计和修正系统噪声和观测噪声统计特性的算法,从而降低系统模型误差,提高滤波精度。该算法基于卡尔曼滤波,并通过自适应调整噪声协方差矩阵来优化滤波效果。

算法原理

Sage-Husa滤波器的核心思想是通过最大似然估计和自适应因子来动态调整噪声协方差矩阵。具体来说,算法通过以下步骤实现:

  1. 系统状态方程和观测方程: 状态方程:xk = Akxk−1 + wk 观测方程:zk = Hkxk + vk 其中,Ak和Hk分别为状态转移矩阵和观测矩阵,wk和vk为过程噪声和观测噪声,其协方差矩阵分别为Qk和Rk1

  2. 卡尔曼滤波更新过程: 预测状态:xk = Akxk−1 预测协方差:Pk = AkPk−1AkT + Qk 卡尔曼增益:Kk = PkHkT(HkPkHkT + Rk)−1 更新状态:xk = xk + Kk(zk − Hkxk) 更新协方差:Pk = (I − KkHk)Pk1

  3. 自适应调整噪声协方差矩阵: 基于新息的观测噪声协方差矩阵(IAE):通过新息向量vk = zk − Hkxk估计Rk1。 基于残差的观测噪声协方差矩阵(RAE):通过残差向量v^k = zk − Hkxk估计Rk1^。 系统状态噪声协方差矩阵:通过状态误差Δxk = xk − xk−1估计Qk1

代码示例

以下是一个Sage-Husa自适应滤波算法的Python实现示例:

import numpy as np

def sage_husa_kf(F, G, H, Q0, R0, X0, Z, P0, b, s):
N = len(Z)
M = len(X0)
X = np.zeros((M, N))
X[:, 0] = X0
P = P0
q = np.zeros(M)
r = 0
Q = Q0
R = R0

for k in range(1, N):
X_est = F @ X[:, k-1] + q
P_pre = F @ P @ F.T + G @ Q @ G.T
e = Z[:, k] - H @ X_est - r
K = P_pre @ H.T @ np.linalg.inv(H @ P_pre @ H.T + R)
X[:, k] = X_est + K @ e
P = (np.eye(M) - K @ H) @ P_pre

r = 1/k * ((k-1) * r + Z[:, k] - H @ X_est)
q = 1/k * ((k-1) * q + X[:, k] - F @ X[:, k-1])
R = 1/k * ((k-1) * R + Z[:, k] @ Z[:, k].T - H @ P @ H.T)
Q = 1/k * ((k-1) * Q + K @ e @ e.T @ K.T + P - F @ P @ F.T)

return X, e, P

# 示例参数
F = np.array([[0.0673, 0.1553], [1, 0]])
G = np.array([[1, -0.575], [0, 0]])
H = np.array([[1, 0]])
Q0 = np.diag([0.1, 0.1])
R0 = 0.5
X0 = np.array([0, 0])
Z = np.random.randn(2, 100) # 示例观测数据
P0 = np.eye(2) * 10000
b = 0
s = np.eye(2)

X, e, P = sage_husa_kf(F, G, H, Q0, R0, X0, Z, P0, b, s)

重要考虑事项

Sage-Husa自适应滤波算法在处理高维系统时,计算量较大,实时性难以保证。此外,在线估计R和Q矩阵有时会导致滤波发散现象,影响算法的稳定性和收敛性。

  1. https://blog.csdn.net/weiziqi_fan/article/details/128040416
  2. https://blog.csdn.net/Aaags/article/details/128165326
  3. https://blog.csdn.net/taosanzang6121/article/details/123882033

http://www.niftyadmin.cn/n/5868384.html

相关文章

面向对象程序设计-实验十一

&#xff08;给出题目描述&#xff09; 6-1 时钟模拟 代码清单&#xff1a; #include<iostream> using namespace std; class MyTime { private: int m_h; int m_m; int m_s; public: MyTime(int h, int m, int s) { m_h h; m_m m; m_s s; } MyTime() { this-&…

JVM之JVM的组成

Java 虚拟机&#xff08;JVM&#xff09;是 Java 程序的运行核心&#xff0c;它主要由类加载系统、运行时数据区、执行引擎和本地方法接口这几个关键部分组成。 类加载系统&#xff08;Class Loading System&#xff09; 类加载系统负责在程序运行时动态地将 Java 类加载到 J…

375_C++_cloud手机推送,添加人脸告警信息到任务队列中,UploadAlarmPush是典型的工厂模式应用,为什么使用工厂模式完成这部分代码

一:AlarmFaceInfo的应用 让我帮你解析这个lambda表达式的实现: // ...................... .h ...........................// struct RsMsgPushTask_S : public Task{AlarmType_E mainAlarmType;unsigned int subAlarmType;DateTime alarmTime

STM32CUBEIDE FreeRTOS操作教程(十三):task api 任务访问函数

STM32CUBEIDE FreeRTOS操作教程&#xff08;十三&#xff09;&#xff1a;task api 任务访问函数 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板…

Spring Boot集成RocketMQ:真实项目应用场景

第一部分&#xff1a;基础配置与简单示例 1. 项目初始化 使用Spring Boot创建一个项目&#xff0c;添加RocketMQ依赖。 POM依赖&#xff08;Maven&#xff09;&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spr…

DeepSeek回答:AI时代Go语言学习路线

最近有小伙伴经常会问&#xff1a;**该如何学习入门Go语言&#xff1f;怎样提升Go语言Coding水平&#xff1f;**这篇文章我们就使用DeepSeek来梳理下Go语言在AI时代的学习路线。 向DeepSeek提问的问题原文&#xff1a; 你现在是一名资深的Go语言工程师&#xff0c;精通Go语言并…

MySQL索引失效

MySQL索引失效会导致查询性能下降&#xff0c;常见原因及解决方案如下&#xff1a; 一、使用OR条件 原因&#xff1a;当OR条件中有一个列没有索引时&#xff0c;索引可能失效 解决方法&#xff1a;确保OR条件中的所有列都有索引&#xff0c;或使用UNION替代OR -- 不推荐 SE…

进程状态(R|S|D|t|T|X|Z)、僵尸进程及孤儿进程

文章目录 一.进程状态进程排队状态&#xff1a;运行、阻塞、挂起 二.Linux下的进程状态R 运行状态&#xff08;running&#xff09;S 睡眠状态&#xff08;sleeping)D 磁盘休眠状态&#xff08;Disk sleep&#xff09;t 停止、暂停状态(tracing stopped)T 停止、暂停状态(stopp…