帮我写一个kalman滤波算法python语法
以下是一个基本的Kalman滤波器的Python实现,用于估计一个物理变量的状态并消除噪声。
import numpy as np
class KalmanFilter:
def __init__(self, A, B, H, Q, R, P, x0):
"""
:param A: 状态转移矩阵
:param B: 控制矩阵(如果有控制信号)
:param H: 观测矩阵
:param Q: 过程噪声协方差矩阵
:param R: 观测噪声协方差矩阵
:param P: 初始状态协方差矩阵
:param x0: 初始状态向量
"""
self.A = A
self.B = B
self.H = H
self.Q = Q
self.R = R
self.P = P
self.x = x0
def predict(self, u=0):
# 预测与控制
self.x = np.dot(self.A, self.x) + np.dot(self.B, u)
self.P = np.dot(np.dot(self.A, self.P), self.A.T) + self.Q
return self.x
def update(self, z):
# 更新状态
y = z - np.dot(self.H, self.x)
S = self.R + np.dot(np.dot(self.H, self.P), self.H.T)
K = np.dot(np.dot(self.P, self.H.T), np.linalg.inv(S))
self.x = self.x + np.dot(K, y)
self.P = np.dot((np.eye(self.P.shape[0]) - np.dot(K, self.H)), self.P)
return self.x
使用方法示例:
# 定义模型参数
A = np.array([[1, 0.1], [0, 1]])
B = np.zeros((2, 1))
H = np.array([[1, 0]])
Q = np.array([[1, 0], [0, 1]])
R = np.array([[0.1]])
P = np.array([[1, 0], [0, 1]])
x0 = np.array([[0], [0]])
# 创建Kalman滤波器对象
kf = KalmanFilter(A, B, H, Q, R, P, x0)
# 生成一些模拟数据
t = np.arange(0, 100, 0.1)
x = 0.1 * t + 5 * np.sin(0.5 * t)
z = x + np.random.randn(len(t)) * 0.5
# 使用Kalman滤波器进行估计和预测
filtered = []
predictions = []
for i in range(len(t)):
pred = kf.predict()
predictions.append(pred[0, 0])
filtered.append(kf.update(z[i]))
# 绘制结果
import matplotlib.pyplot as plt
plt.plot(t, z, label='Observations')
plt.plot(t, x, label='True value')
plt.plot(t, filtered, label='Filtered')
plt.plot(t, predictions, label='Predicted')
plt.legend()
plt.show()
原文地址: https://www.cveoy.top/t/topic/bWk7 著作权归作者所有。请勿转载和采集!