美文网首页
卡尔曼滤波及基于Python的简单实现

卡尔曼滤波及基于Python的简单实现

作者: Greyish | 来源:发表于2019-05-27 14:24 被阅读0次

卡尔曼滤波应该是本专业最最基础的内容之一,但是一直不是很熟悉,最近在上蔡远利教授的课,有相关的作业,所以决定认真掌握一下。

基本思路:

新的最佳估计基于原最佳估计已知外部影响校正后得到的预测。
新的不确定性基于原不确定性外部环境的不确定性得到的预测。

数学理论:

卡尔曼滤波算法

示例:

昆虫问题
  • 代码
from numpy import *
import pylab
import math

# 参数初始化
n_iter = 100
sz = (n_iter,) # size of array

# 分配数组空间
x = zeros(sz)
xes = zeros(sz)
f = zeros(sz)
fes = zeros(sz)
kk1 = zeros(n_iter-1)
kk2 = zeros(n_iter-1)

A = mat([[0.5,2],[0,1]])
B = mat([[0],[1]])
C = mat([1,0])

P = mat([[500,0],[0,200]])
Q = mat([[0,0],[0,10]])
I = mat([[1,0],[0,1]])

U = random.normal(0,math.sqrt(10),n_iter)
V = random.normal(0,math.sqrt(10),n_iter)

# 真实值
x[0]=650
f[0]=250

# 估计值
xes[0]=600
fes[0]=200

R = 10

# intial guesses
xhat = mat([[650],[250]])

for k in range(1,n_iter):

    # 一步预测
    xhat = A*xhat + B*U[k-1]  #X(k|k-1) = AX(k-1|k-1) + BU(k)
    y = C*xhat + V[k-1]
    P = A*P*A.T + Q
    x[k] = xhat[0][0]
    f[k] = xhat[1][0]

    # 量测修正
    inv = linalg.inv(C*P*C.T+R)
    K = P*C.T*inv #Kg(k)=P(k|k-1)H'/[HP(k|k-1)H' + R]
    kk1[k-1] = K[0][0]
    kk2[k-1] = K[1][0]
    xhat = xhat+K*(y-C*xhat) #X(k|k) = X(k|k-1) + Kg(k)[Z(k) - HX(k|k-1)]
    xes[k] = xhat[0][0]
    fes[k] = xhat[1][0]
    P = (I-K*C)*P #P(k|k) = (1 - Kg(k)H)P(k|k-1)
    print(P)
pylab.figure()
pylab.plot(x,'k*',label='simulation system')
pylab.plot(xes,'b^',label='estimation')
pylab.title('The number of insects')
pylab.xticks(arange(0,n_iter,1))
pylab.legend()
pylab.xlabel('Iteration')
pylab.ylabel('quantity')

pylab.figure()
pylab.plot(f,'k*',label='simulation system')
pylab.plot(fes,'b^',label='estimation')
pylab.title('The number of food')
pylab.xticks(arange(0,n_iter,1))
pylab.legend()
pylab.xlabel('Iteration')
pylab.ylabel('quantity')

pylab.figure()
pylab.plot(kk1,'k-',label='insects')
pylab.plot(kk2,'b-',label='food')
pylab.title('Kalman gain curve')
pylab.xticks(arange(0,n_iter-1,1))
pylab.legend()
pylab.xlabel('Iteration')
pylab.ylabel('quantity')
pylab.show()
  • 结论


    昆虫数量随时间演化示意图
    食物供给量随时间演化示意图
    卡尔曼增益曲线

相关文章

  • 卡尔曼滤波及基于Python的简单实现

    卡尔曼滤波应该是本专业最最基础的内容之一,但是一直不是很熟悉,最近在上蔡远利教授的课,有相关的作业,所以决定认真掌...

  • 卡尔曼滤波系列1_基础

    卡尔曼滤波系列1_基础 1 基础知识 [1] 卡尔曼增益最后会变成定值吗?[2] 如何通俗并尽可能详细解释卡尔曼滤...

  • 卡尔曼滤波:滤了谁?

    姓名:朱晶晶 学号:20021110270 转载自 https://mp.weixin.qq.com/s/qI0...

  • 轻松理解卡尔曼滤波

    此前学习和实现卡尔曼滤波花费了很多时间,其实想要理解其原理并不算很复杂。只是简单套用卡尔曼滤波的公式,而没有系统理...

  • Python学习-卡尔曼滤波

    依旧是Python课程 _(:з」∠)_ 期末需要完成小组作业,选题内容主要是用卡尔曼滤波来实现交通参数的...

  • 卡尔曼滤波

    把卡尔曼滤波写一下吧,思想很简单,不详细写了,就是根据方差实现的一种最优估计方法。 卡尔曼滤波五个基本的公式 1....

  • 补充卡尔曼滤波 - 笔记(二)

    继卡尔曼滤波 - 笔记(一)的补充。 最小二乘与贝叶斯 上一篇的最后,介绍了通过最小二乘和贝叶斯都可以推导卡尔曼滤...

  • 新词发现

    python3实现互信息和左右熵的新词发现 python简单实现新词发现 用python实现新词发现程序——基于凝...

  • 卡尔曼滤波及其无人驾驶应用

    无人驾驶汽车系统感知模块的重要技术——卡尔曼滤波,应用包括:卡尔曼滤波与行人状态估计扩展卡尔曼滤波(EKF)与传感...

  • 卡尔曼滤波的简单实现(Matlab&OC

网友评论

      本文标题:卡尔曼滤波及基于Python的简单实现

      本文链接:https://www.haomeiwen.com/subject/qjinzqtx.html