import numpy as np
# 定义卡尔曼滤波器类
class KalmanFilter:
def __init__(self, A, B, H, Q, R, P, x):
"""
初始化卡尔曼滤波器参数
:param A: 状态转移矩阵
:param B: 控制输入矩阵
:param H: 观测矩阵
:param Q: 过程噪声协方差矩阵
:param R: 观测噪声协方差矩阵
:param P: 估计误差协方差矩阵
:param x: 初始状态向量
"""
self.A = A
self.B = B
self.H = H
self.Q = Q
self.R = R
self.P = P
self.x = x
def predict(self, u=0):
"""
预测步骤
:param u: 控制输入向量,默认为0(无控制输入)
:return: 预测的状态向量
"""
# 预测状态
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):
"""
更新步骤
:param z: 观测值
:return: 更新后的状态向量
"""
# 计算卡尔曼增益
S = np.dot(self.H, np.dot(self.P, self.H.T)) + self.R
K = np.dot(np.dot(self.P, self.H.T), np.linalg.inv(S))
# 更新状态向量
self.x = self.x + np.dot(K, (z - np.dot(self.H, self.x)))
# 更新估计误差协方差
I = np.eye(self.H.shape[1])
self.P = np.dot(I - np.dot(K, self.H), self.P)
return self.x
# 示例使用
if __name__ == "__main__":
# 定义系统参数
dt = 1.0 # 时间间隔
A = np.array([[1, dt], [0, 1]]) # 状态转移矩阵
B = np.array([0]) # 无控制输入
H = np.array([1, 0]).reshape(1, 2) # 观测矩阵
Q = np.array([[1, 0], [0, 3]]) # 过程噪声协方差矩阵
R = np.array([10]).reshape(1, 1) # 观测噪声协方差矩阵
P = np.array([[100, 0], [0, 100]]) # 初始估计误差协方差矩阵
x = np.array([0, 20]).reshape(2, 1) # 初始状态向量 [位置, 速度]
# 创建卡尔曼滤波器对象
kf = KalmanFilter(A, B, H, Q, R, P, x)
# 模拟数据
measurements = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 假设观测到的位置数据
# 应用卡尔曼滤波
for z in measurements:
kf.predict()
filtered_state = kf.update(z)
print(f"Filtered state: {filtered_state.flatten()}")
A、控制输入矩阵 B、观测矩阵 H、过程噪声协方差矩阵 Q、观测噪声协方差矩阵 R、估计误差协方差矩阵 P 和初始状态向量 x。希望这段代码能帮助你理解如何实现卡尔曼滤波器。
上一篇:python gis
下一篇:python word转图片
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站