我有一组数据想看看卡尔曼滤波后的效果如何,便用chatgpt写了一分代码,经过调试发现,效果还是可以的,上图看看滤波效果:
可见chatgpt写的代码还是可以用的,具体代码附在下边:
import numpy as np import matplotlib.pyplot as plt import xlrd#导入xlrd库 file='自己的.xlsx'#文件路径 wb=xlrd.open_workbook(filename=file)#用方法打开该文件路径下的文件 ws=wb.sheet_by_name("Sheet1")#打开该表格里的表单 dataset=[] for r in range(ws.nrows):#遍历行 col=[] for l in range(ws.ncols):#遍历列 col.append((ws.cell(r, l).value))#将单元格中的值加入到列表中(r,l)相当于坐标系,cell()为单元格,value为单元格的值 dataset.append(col) # 状态转移矩阵A A = np.array([[1, 1], [0, 1]]) # 状态噪声矩阵Q Q = np.array([[0.01, 0], [0, 0.01]]) # 观测矩阵H H = np.array([[1, 0]]) # 观测噪声矩阵R R = np.array([[5]]) # 初始状态值 x0 = np.array([[90], [0]]) P0 = np.eye(2) * 10 def kalman_filter(data): n = len(data) x = np.zeros((2, n)) x[:, 0] = x0.flatten() P = np.zeros((2, 2, n)) P[:, :, 0] = P0 for i in range(1, n): # 预测状态向量和协方差矩阵 x[:, i] = np.dot(A, x[:, i-1]) P[:, :, i] = np.dot(np.dot(A, P[:, :, i-1]), A.T) + Q # 计算卡尔曼增益 K = np.dot(np.dot(P[:, :, i], H.T), np.linalg.inv(np.dot(np.dot(H, P[:, :, i]), H.T) + R)) # 更新状态向量和协方差矩阵 x[:, i] = x[:, i] + np.dot(K, (data[i] - np.dot(H, x[:, i]))) P[:, :, i] = np.dot((np.eye(2) - np.dot(K, H)), P[:, :, i]) return x[0, :], P[0, 0, :] # 生成带噪声的角度数据 t = np.arange(0, 200, 1) data = np.sin(t) + np.random.randn(len(t)) * 0.1 # 使用卡尔曼滤波对角度数据进行平滑处理 smooth_data, var_data = kalman_filter(data) # 绘制原始数据、滤波后的数据以及方差曲线 plt.rcParams['font.sans-serif']=['SimHei'] plt.figure(figsize=(12, 6)) plt.plot(t, data, label='原始数据') plt.plot(t, smooth_data, label='滤波数据') plt.fill_between(t, smooth_data - np.sqrt(var_data), smooth_data + np.sqrt(var_data), alpha=0.5, label='方差') plt.legend() plt.xlabel('读取次数') plt.ylabel('距离') plt.title('数据') plt.show()