写一个卡尔曼滤波的代码。
时间: 2024-11-27 18:17:11 浏览: 3
卡尔曼滤波是一种递推估计算法,常用于处理随机过程并估计其状态。以下是一个简单的Python版卡尔曼滤波的基本框架示例,假设我们有一个线性动态系统和一个观测模型:
```python
import numpy as np
class KalmanFilter:
def __init__(self, dim_x, dim_z, dt):
# 初始化滤波器参数
self.dim_x = dim_x
self.dim_z = dim_z
self.dt = dt
# 状态转移矩阵 A
self.A = np.eye(dim_x) + np.array([[0], [dt]])
# 控制输入矩阵 B (如果存在)
self.B = np.zeros((dim_x, 1))
# 预测误差协方差 Q
self.Q = np.eye(dim_x) * dt**2 * 0.1
# 测量矩阵 H
self.H = np.eye(dim_z)
# 测量噪声协方差 R
self.R = np.eye(dim_z) * 1.0
# 状态协方差 P
self.P = np.eye(dim_x) * 10.0
# 初始状态均值 x0 和协方差 P0
self.x = np.zeros(dim_x)
self.P = np.eye(dim_x)
def predict(self, u=0):
# 预测步骤
self.x = np.dot(self.A, self.x) + np.dot(self.B, u) if self.B else np.dot(self.A, self.x)
self.P = np.dot(np.dot(self.A, self.P), self.A.T) + self.Q
def update(self, z):
# 更新步骤
K = np.dot(self.P, self.H.T) / np.dot(np.dot(self.H, self.P), self.H.T) + self.R
self.x = self.x + np.dot(K, (z - np.dot(self.H, self.x)))
I_KH = np.eye(self.dim_x) - np.dot(K, self.H)
self.P = np.dot(I_KH, self.P)
# 使用示例
kf = KalmanFilter(2, 1, 0.1) # 二维系统,一维观测
kalman_step(kf, np.array([1]), np.array([5])) # 预测并更新,给定输入u和观测z
```
这个例子非常基础,实际应用中可能会需要根据具体的动态模型、测量模型以及噪声特性调整参数。注意卡尔曼滤波适用于连续系统的动态估计,并假设过程噪声和测量噪声是加性白噪声。
阅读全文