应用Basic Kalman Filter 过滤一个随机行走的时间曲线: 随机行走模型: X_t=X_(t-1)+ξ_t 假设ξ_t的方差σ_ξ^2=1 对X_t(eg. 离中心点距离)的观测值为: y_t=X_t+ε_t 观测误差σ_ε^2 随时
时间: 2024-03-19 18:44:15 浏览: 73
时间测量中的随机误差数据
好的,以下是 Python 实现 Kalman Filter 过滤随机行走时间曲线的代码示例:
```python
import numpy as np
import matplotlib.pyplot as plt
# 随机行走模型参数
sigma_xi = 1
# 观测误差参数
sigma_epsilon = np.random.normal(0, 2, 20)
# 状态转移矩阵
A = np.array([[1]])
# 状态转移噪声协方差矩阵
Q = np.array([[sigma_xi ** 2]])
# 观测矩阵
H = np.array([[1]])
# 观测噪声协方差矩阵
R = np.diag(sigma_epsilon ** 2)
# 初始化状态和协方差矩阵
X = np.array([[0]])
P = np.array([[1]])
# 保存滤波结果
X_filtered = [X[0, 0]]
# Kalman Filter 过滤
for i in range(20):
# 预测
X_predict = np.dot(A, X)
P_predict = np.dot(A, np.dot(P, A.T)) + Q
# 更新
K = np.dot(P_predict, np.dot(H.T, np.linalg.inv(np.dot(H, np.dot(P_predict, H.T)) + R)))
X = X_predict + np.dot(K, (np.array([[i]]) - np.dot(H, X_predict)))
P = np.dot(np.eye(1) - np.dot(K, H), P_predict)
# 保存滤波结果
X_filtered.append(X[0, 0])
# 绘制滤波结果和原始数据
plt.plot(X_filtered, label="filtered")
plt.plot(range(20), label="original")
plt.legend()
plt.show()
```
运行以上代码,可以得到滤波后的时间曲线和原始数据的对比结果。
阅读全文