帮我实现一个kalman滤波算法并画图python语法
以下是一个简单的kalman滤波算法示例,使用Python语法:
import numpy as np
import matplotlib.pyplot as plt
# 定义模型参数
dt = 0.1 # 时间间隔
A = np.array([[1, dt], [0, 1]]) # 状态转移矩阵
H = np.array([[1, 0]]) # 观测矩阵
Q = np.array([[1, 0], [0, 1]]) # 过程噪声协方差矩阵
R = np.array([[1]]) # 观测噪声协方差矩阵
# 定义初始状态和协方差矩阵
x0 = np.array([[0], [0]]) # 初始状态
P0 = np.array([[1, 0], [0, 1]]) # 初始协方差矩阵
# 生成模拟数据
t = np.arange(0, 10, dt)
n = len(t)
x = np.zeros((2, n))
y = np.zeros((1, n))
for i in range(n):
if i == 0:
x[:, i] = x0.flatten()
else:
x[:, i] = A.dot(x[:, i-1]) + np.random.multivariate_normal([0, 0], Q).reshape(2, 1)
y[:, i] = H.dot(x[:, i]) + np.random.normal(0, R)
# Kalman滤波
x_kalman = np.zeros((2, n))
P_kalman = np.zeros((2, 2, n))
x_kalman[:, 0] = x0.flatten()
P_kalman[:, :, 0] = P0
for i in range(1, n):
# 预测
x_pred = A.dot(x_kalman[:, i-1])
P_pred = A.dot(P_kalman[:, :, i-1]).dot(A.T) + Q
# 更新
K = P_pred.dot(H.T).dot(np.linalg.inv(H.dot(P_pred).dot(H.T) + R))
x_kalman[:, i] = x_pred + K.dot(y[:, i] - H.dot(x_pred))
P_kalman[:, :, i] = (np.eye(2) - K.dot(H)).dot(P_pred)
# 画图
plt.figure()
plt.plot(t, x[0, :], label='True Position')
plt.plot(t, y[0, :], label='Observation')
plt.plot(t, x_kalman[0, :], label='Kalman Filter')
plt.legend()
plt.xlabel('Time')
plt.ylabel('Position')
plt.show()
这个示例使用Kalman滤波器来估计一个物体的位置,模拟数据包括真实位置和带有高斯噪声的观测值。Kalman滤波器预测物体的位置,并使用观测值进行更新,以获得更准确的估计值。最后,将真实位置、观测值和Kalman滤波器估计值绘制在同一图形中以进行比较。
原文地址: https://www.cveoy.top/t/topic/bWms 著作权归作者所有。请勿转载和采集!