diff --git a/Chapter12_HInfinity_Filters/HInfinity_Filters.ipynb b/Chapter12_HInfinity_Filters/HInfinity_Filters.ipynb new file mode 100644 index 0000000..2bfd24c --- /dev/null +++ b/Chapter12_HInfinity_Filters/HInfinity_Filters.ipynb @@ -0,0 +1,389 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:7d487f11e312a7f42c8b0f26c54306db69a8a6b3fcec7863bf7db4070d9fc17e" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Table of Contents](http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb)" + ] + }, + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "$H_\\infty$ filter" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#format the book\n", + "%matplotlib inline\n", + "from __future__ import division, print_function\n", + "import sys\n", + "sys.path.insert(0,'../code') # allow us to format the book\n", + "import book_format\n", + "book_format.load_style()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "html": [ + "\n", + "\n" + ], + "metadata": {}, + "output_type": "pyout", + "prompt_number": 4, + "text": [ + "" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I am still mulling over how to write this chapter. In the meantime, Dan Simon has an accessible introduction here:\n", + "\n", + "http://academic.csuohio.edu/simond/courses/eec641/hinfinity.pdf\n", + "\n", + "In one sentence the $H_\\infty$ (H infinity) filter is like a Kalman filter, but it is robust in the face of non-Gaussian, non-predictable inputs.\n", + "\n", + "\n", + "My filterpy library contains an H-Infinity filter. I've pasted some test code below which implements the filter designed by Simon in the article above. Hope it helps." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from __future__ import (absolute_import, division, print_function,\n", + " unicode_literals)\n", + "\n", + "from numpy import array\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from filterpy.hinfinity import HInfinityFilter\n", + "\n", + "dt = 0.1\n", + "f = HInfinityFilter(2, 1, 0, gamma=.4)\n", + "\n", + "f.F = array([[1., dt],\n", + " [0., 1.]])\n", + "\n", + "f.H = array([[0., 1.]])\n", + "f.x = array([[0., 0.]]).T\n", + "#f.G = array([[dt**2 / 2, dt]]).T\n", + "\n", + "f.P = 0.01\n", + "f.W = array([[0.0003, 0.005],\n", + " [0.0050, 0.100]])/ 1000\n", + "\n", + "f.V = 0.01\n", + "f.Q = 0.01\n", + "\n", + "xs = []\n", + "vs = []\n", + "\n", + "for i in range(1,40):\n", + " f.update (5)\n", + " print(f.x.T)\n", + " xs.append(f.x[0,0])\n", + " vs.append(f.x[1,0])\n", + " f.predict()\n", + "\n", + "plt.subplot(211)\n", + "plt.plot(xs)\n", + "plt.subplot(212)\n", + "plt.plot(vs)\n", + "plt.show()\n" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[[ 0.250005 2.50005 ]]\n", + "[[ 0.66806083 3.34442646]]\n", + "[[ 1.1284151 3.77161316]]\n", + "[[ 1.60570517 4.03126553]]\n", + "[[ 2.09144161 4.20685183]]\n", + "[[ 2.58197401 4.33419113]]\n", + "[[ 3.07547127 4.4312003 ]]\n", + "[[ 3.57091268 4.50783208]]\n", + "[[ 4.06768385 4.57005637]]\n", + "[[ 4.56539275 4.62167173]]\n", + "[[ 5.06377767 4.66521177]]\n", + "[[ 5.56265755 4.7024333 ]]\n", + "[[ 6.06190354 4.73459514]]\n", + "[[ 6.5614219 4.76262524]]\n", + "[[ 7.0611432 4.78722492]]\n", + "[[ 7.56101536 4.80893611]]\n", + "[[ 8.06099891 4.828186 ]]\n", + "[[ 8.56106372 4.8453174 ]]\n", + "[[ 9.06118672 4.86060987]]\n", + "[[ 9.56135018 4.87429471]]\n", + "[[ 10.06154053 4.88656573]]\n", + "[[ 10.56174736 4.89758722]]\n", + "[[ 11.06196277 4.9074998 ]]\n", + "[[ 11.5621808 4.9164249]]\n", + "[[ 12.06239701 4.92446815]]\n", + "[[ 12.56260818 4.93172204]]\n", + "[[ 13.06281197 4.93826801]]\n", + "[[ 13.56300681 4.94417805]]\n", + "[[ 14.06319168 4.94951612]]\n", + "[[ 14.563366 4.95433916]]\n", + "[[ 15.0635295 4.95869805]]\n", + "[[ 15.56368218 4.96263833]]\n", + "[[ 16.06382423 4.96620086]]\n", + "[[ 16.56395596 4.96942231]]\n", + "[[ 17.06407777 4.97233571]]\n", + "[[ 17.56419015 4.97497078]]\n", + "[[ 18.0642936 4.97735429]]\n", + "[[ 18.56438866 4.97951041]]\n", + "[[ 19.06447587 4.98146094]]\n" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n5APPAo8H1zmxPSeJ03HtaZrmNfscyx3AX2GVDxzXnhPifNYwjBQc1J6GYfwucNI+Qh93XjSctpzL\n5D7j0AROYZpmi31/CGgAimMa0NQaUJveNMMwfICJdXLqHA79jE4SpyPbM8g0zQ+BC/bNce0ZNCbO\nEoe152bgIcMw6oAngD8CSgmzLeeyLPMuUGYYRg7WX/SlpmkeneE5c84wjEyg3zTNPsMwioEi4GJs\no5pSvLRpFtDnpDY1DMMFPA+8YJrma/Zqx7XnZHE68TNqGEYhMGCaZrv9K2MtVk8Pp7XnZHFeMAwj\n2SntaZrmN4Bv2PF+E7gK/C1wIpy2nLPkbtcJnwL226ti3tVoCuuA5w3DGAD8wGOmafbFOCYADMP4\nAfApYIlhGJewfqI7rk3HxJltx/lD4LMOa9NtwEPAOsMwvoT1E/d+nNeek8X5BM77jC4DfmgYBlil\nhCdN02xx4Hf+hjiB1TivPccxTXPIgW0pIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi\nIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiAPiBI/btezPs+zBwEjgB\nPDDLcYmISASuhrhfInAWyAFuAU7PWkQiIjItdxRfawtQC7QCl+zbhii+voiIhCiU5O4DDgPVwPZp\n9ssDGoEvAwbQBBREGqCIiIQvIYR9ioAW4E7gFWA1MDDN/s/Z9w8CgYiiExGRmxJKcm+x7w8BDUAx\n1gnTiRoZf6Seb68b57XXXgu43dGsBomIzH9tbW1nHnnkkdWh7j9Tcs8E+oE+rKReBFy0tz2DdWT+\nNXv5XaAM64SqD1gKHJ34gm63m5KSklDji4ns7Gx+9rOfsWPHjliHMi3FGT03G+PgsJ/egWF6+4fo\nGxymb2CYvkE/fYPD9A8Mj67rHxzzeMhP/+CY+0HrfmDIT/+gn4EhPwNDw/a9n377fmDQz0ggfn4M\nuwBvghuPx43X48bjdpHgceNxu/EmuPC43SR43CS4XXg8bhI8wXXW/fX9r693u69vG715xi5ff+we\n99g1bh+324XH5SItLZWjRz9g3dpbrf1c19/D7QK3vW7strHrXK4x20eXGX0/t+v6PisL0knyem6q\nLbOzs6murl4VznNmSu7rgOexyjB+4DGsRA/WkfnYT9og8BSw317+ajiBiMy2Yf8I1/qHuNY7yLX+\n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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 5 + } + ], + "metadata": {} + } + ] +} \ No newline at end of file