Kalman filter example
Code: "kalman_filter.py". Programming language: Python DMelt Version 1. Last modified: 12/11/2015. License: Pro
https://datamelt.org/code/cache/kalman_filter_2431.py
To run this script using the DMelt IDE, copy the above URL link to the menu [File]→[Read script from URL] of the DMelt IDE.



from jhplot  import *
from java.util import Random
from jhplot.math.kalman import JKalman 
from jhplot.math.kalman.jama import Matrix

kal=JKalman(4,2)
rand =Random()

x,y=0,0
dx,dy=rand.nextDouble(),rand.nextDouble()
s =Matrix(4, 1)     #  state [x, y, dx, dy, dxy]        
c = Matrix(4, 1)    # corrected state [x, y, dx, dy, dxy]                

m = Matrix(2, 1)   #  measurement [x]
m.set(0, 0, x)
m.set(1, 0, y)

# transitions for x, y, dx, dy
tr = [ [1, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1] ]
kal.setTransition_matrix(Matrix(tr))

# 1s somewhere?
kal.setError_cov_post(kal.getError_cov_post().identity())
print "first x:" + str(x) + ", y:" +str(y) + ", dx:" + str(dx) + ", dy:" + str(dy)

print "no; x; y; dx; dy; predictionX; predictionY; predictionDx; predictionDy; correctionX; correctionY; correctionDx; correctionDy;";
for i in range(200):
     s = kal.Predict()                 # check state before
     m.set(1, 0, rand.nextDouble())  # function init
     x = rand.nextGaussian()
     y = rand.nextGaussian()
     m.set(0, 0, m.get(0, 0) + dx + rand.nextGaussian());
     m.set(1, 0, m.get(1, 0) + dy + rand.nextGaussian());
     # a missing value (more then 1/4 times)
     if rand.nextGaussian() < -0.8:
             print "", i , ";;;;;", s.get(0, 0), ";", s.get(1, 0), ";" , s.get(2, 0) , ";" , s.get(3, 0), ";"
else:   #  measurement is ok : 
      c = kal.Correct(m) # look better
      print "" , i, ";" , m.get(0, 0), ";" , m.get(1, 0), ";", x, ";", y , ";", s.get(0, 0) ,";",s.get(1, 0), ";" ,s.get(2, 0) ,";",s.get(3, 0), ";",c.get(0, 0), ";", c.get(1, 0), ";", c.get(2, 0), ";" ,c.get(3, 0),";"

Ads help maintain this website.