The Kalman filter is an algorithm that seeks to find the optimal representation for a series of observations by averaging over successive states, a type of Bayesian model. In its simplest form, it exploits the mathematical fact that the product of two Gaussians is another Gaussian.

This Demonstration shows an interactive version of an example from [1] for estimating height and speed of a falling object that experiences aerodynamic drag. You can adjust the observation noise (sigma ζ), process noise (sigma ξ), number of Monte Carlo iterations, the random seed, the internal integrator for the nonlinear differential equations of motion (Euler, second-order Runge–Kutta, fourth-order Runge–Kutta), and the logarithm of the internal integration time step in seconds (, , ).

The filter diverges for many settings and converges for some with varying levels of execution speed. Convergence means the dots stay mostly inside the one-sigma rails on the residuals plots. Some of the settings are quite slow, on purpose, and your goal is to find the settings that yield convergence with the fastest execution time. This is an exercise in time-accuracy tradeoff.

The example uses advanced functional programming over lazy streams to integrate in constant memory and to modularize the integrators and other components. The code has many reusable parts and is worthy of study independently of the application to Kalman filtering.

Reference

[1] P. Zarchan and H. Musoff, Fundamentals of Kalman Filtering: A Practical Approach, 4th ed., Reston, VA: American Institute of Aeronautics and Astronautics, 2015 Chapter 7. doi:10.2514/4.102776.