集合卡尔曼滤波(EnKF)原理及样例应用

文章详细介绍了EnKF(EnsembleKalmanFilter,集合卡尔曼滤波)的基本思想和操作流程,包括初始化、观测步、分析步和预测步。通过一个基于一维谐振子离散模型的简单实战,展示了如何用Python实现EnKF算法,处理带有高斯白噪声的观测数据,并进行状态估计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EnKF 是一种基于蒙特卡罗方法预测误差统计信息的卡尔曼滤波。它与 PF 的相同点是都采用了采样粒子的集合来表示状态概率空间,但 EnKF 在更新步使用卡尔曼更新,该方法以集合的形式进行模拟预报和 分析更新这两个过程,通过模式状态的集合来表征 误差协方差的信息,以最小化观测值和模拟值的误 差协方差为约束条件,对目标进行最优估计。

了解其基本思路,为便于理解,我们对该过程拆分简化为以下几个流程:

  1. 初始化:初始化系统状态变量 ,初始误差协方差矩阵 和初始状态预测集合 {}

  1. 数据同化:时刻,我们分别进行观测步、分析步、预测步,具体流程如下:

a.观测步:

  1. 计算观测集合:

  1. 计算观测误差协方差矩阵:

b.分析步:

  1. 计算卡尔曼增益矩阵:

  1. 计算分析集合:

  1. 计算分析集合均值:

  1. 计算分析误差协方差矩阵:

c.预测步:

  1. 计算预测集合:

  1. 计算预测集合均值:

  1. 计算预测误差协方差矩阵:

对EnKF算法原理了解之后,我们进入一个简单问题的实战(基于python):
考虑离散模型:

显然,这是如下的一维谐振子的数值实现:

这是一个离散的二阶方程,上式中x的系数与成比例。因此,状态向量有两个输入。

预解矩阵是:

对任意,观测算子为,观测方程为:

在高斯白噪声方差为 g 的情况下。这个方差的值应该是已知的。观测结果可能不是在每个时间步骤上都能得到的。

接下来进入代码运行环节:

相关函数定义

# 导入相关库
import numpy as np
import pandas as pd
import seaborn as sn
import warnings
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['KaiTi']     
plt.rcParams['axes.unicode_minus'] = False
from scipy.linalg import fractional_matrix_power
np.random.seed(None)
warnings.filterwarnings("ignore")
def EnKF(u0_f, P0_f, T, delta, H, X, lam, m): # EnKF函数定义
    X_f = [float(u0_f[1][0]), float(u0_f[0][0])]
    X_a = [float(u0_f[1][0])]
    Y = []
    u_f = np.matrix([[X_f[1]], [X_f[0]]])
    r = 100  # 生成集合的方差
    u1 = mean(float(u0_f[0][0]), r, m)
    u2 = mean(float(u0_f[1][0]), r, m)
    U_f = []
    for i in range(m):
        U_f.append(np.matrix([[u1[i]], [u2[i]]]))
    for i in range(1, T + 1):  # 迭代运算
        if i % delta == 0:  # 带有观测值时的情况
            # 计算增益
            r = mean(0, 1, m)
            y = X[i] + r
            r = np.matrix(r)
            u = np.matrix([[X[i]], [X[i - 1]]])
            R = float(r * r.T)  # 观测误差方差
            K = P0_f * H.T * (H * P0_f * H.T + R).I
            Y.append(X[i])
            U_a = []  # 初始化ua_i
            for j in range(m):
                U_a.append(U_f[j] + K * (y[j] - H * U_f[j]))
            u_a = sum(U_a) / m
            X_a.append(float(u_a[0][0]))
            # 预测步骤
            ind = i // delta
            M = matrix(w, lam, X_a[ind])
            for j in range(m):
                U_f[j] = M * U_a[j]
            u_f = sum(U_f) / m
            P0_f = 0
            for j in range(m):
                P0_f += (U_f[j] - u_f) * (U_f[j] - u_f).T
            P0_f = P0_f / (m - 1)

        else:  # 不带有观测值的情况,此时只预测
            M = matrix(w, lam, X_f[i])
            for j in range(m):
                U_f[j] = M * U_f[j]
            u_f = sum(U_f) / m
            P0_f = 0
            for j in range(m):
                P0_f += (U_f[j] - u_f) * (U_f[j] - u_f).T
            P0_f = P0_f / (m - 1)
        X_f.append(float(u_f[0][0]))
    return X_f, Y
def mean(j,r,m):  #定义固定均值的正态分布
    u = np.random.normal(j,r,m)
    s = sum(u)/m
    return u+(j-1*s)
def matrix(w,lam,x): #定义预解矩阵
    return np.matrix([[2+(w**2)-(lam**2) * (x**2),-1],[1,0]])

问题分析

# 初始化系统状态与误差协方差矩阵
u0_f = np.matrix([[1],[0]])
P0_f = np.array([[0.3, 0], [0, 0.3]])

# 预解矩阵
w = 0.035
lam = 0.0003
H = np.matrix([1,0]) # 观测算子
X = [0,1]

# 时间与时间间隔(步长)
T = 1000
delta = 25

for i in range(2,T+2):
    X.append((2+w**2)*X[i-1]-(lam**2)*X[i-1]**3-X[i-2])
    
m =50 # 定义集合的大小

X_f,Y = EnKF(u0_f,P0_f,T,delta,H,X,lam,m)

可视化展示

plt.plot(range(T+2), X, c='Lime', label="实际曲线")
plt.plot(range(T+2), X_f, c="g", linestyle='dashed',label="拟合曲线")
plt.scatter(list(range(delta,T+1,delta)), np.array(Y), c='r', label="观测值")
plt.legend()
plt.title("EnKF")
plt.show()
plt.savefig('EnKF.png')

以上即为EnKF算法的原理分析及简单实战,学海无涯,让我们继续一同探索吧!

集成卡尔曼滤波(EnKF)是一种基于蒙特卡罗方法的卡尔曼滤波算法。与粒子滤波(PF)类似,EnKF也使用了采粒子的集合来表示状态概率空间。但在更新步骤中,EnKF采用卡尔曼更新来模拟预测和分析更新的过程。它通过使用模式状态的集合来表征误差协方差的信息,并以最小化观测值和模拟值的误差协方差为约束条件,对目标进行最优估计。 在EnKF中,假设存在高斯白噪声,其中方差为g,并且这个方差的值是已知的。观测结果可能不是在每个时间步骤上都能得到。 总的来说,EnKF是一种利用集合卡尔曼滤波器估计在线数据的方法,通过模拟预测和分析更新的过程,以最小化观测值和模拟值的误差协方差为约束条件,实现高斯过程回归。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [GP-EnKF:利用集合卡尔曼滤波器估计,在线... 在线高斯过程回归和学习的集成卡尔曼滤波代码(Fusion 2018)论文](https://download.csdn.net/download/weixin_42135462/18331332)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [集合卡尔曼滤波EnKF原理应用](https://blog.csdn.net/uniquetzh/article/details/128828648)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值