{
 "metadata": {
  "name": "",
  "signature": "sha256:dd34f4987a60a8a3c453361b731ac3f9a06c88bce6e4f0c67907f60ea9ab99fc"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "Kalman Filter Math"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "#format the book\n",
      "%matplotlib inline\n",
      "from __future__ import division, print_function\n",
      "import matplotlib.pyplot as plt\n",
      "import book_format\n",
      "book_format.load_style()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": [
        "<style>\n",
        "@import url('http://fonts.googleapis.com/css?family=Source+Code+Pro');\n",
        "\n",
        "    div.cell{\n",
        "        width: 850px;\n",
        "        margin-left: 0% !important;\n",
        "        margin-right: auto;\n",
        "    }\n",
        "    div.text_cell code {\n",
        "        background: #FFFFFF;\n",
        "        color: #000000;\n",
        "        font-weight: 600;\n",
        "        font-size: 13pt;\n",
        "        font-style: bold;\n",
        "        font-family:  'Source Code Pro', Consolas, monocco, monospace;\n",
        "   }\n",
        "    h1 {\n",
        "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
        "\t}\n",
        "\t\n",
        "    div.input_area {\n",
        "        background: #F6F6F9;\n",
        "        border: 1px solid #586e75;\n",
        "    }\n",
        "\n",
        "    .text_cell_render h1 {\n",
        "        font-weight: 200;\n",
        "        font-size: 30pt;\n",
        "        line-height: 100%;\n",
        "        color:#c76c0c;\n",
        "        margin-bottom: 0.5em;\n",
        "        margin-top: 1em;\n",
        "        display: block;\n",
        "        white-space: wrap;\n",
        "    } \n",
        "    h2 {\n",
        "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
        "    }\n",
        "    .text_cell_render h2 {\n",
        "        font-weight: 200;\n",
        "        font-size: 20pt;\n",
        "        font-style: italic;\n",
        "        line-height: 100%;\n",
        "        color:#c76c0c;\n",
        "        margin-bottom: 0.5em;\n",
        "        margin-top: 1.5em;\n",
        "        display: block;\n",
        "        white-space: nowrap;\n",
        "    } \n",
        "    h3 {\n",
        "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
        "    }\n",
        "    .text_cell_render h3 {\n",
        "        font-weight: 300;\n",
        "        font-size: 18pt;\n",
        "        line-height: 100%;\n",
        "        color:#d77c0c;\n",
        "        margin-bottom: 0.5em;\n",
        "        margin-top: 2em;\n",
        "        display: block;\n",
        "        white-space: nowrap;\n",
        "    }\n",
        "    h4 {\n",
        "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
        "    }\n",
        "    .text_cell_render h4 {\n",
        "        font-weight: 300;\n",
        "        font-size: 16pt;\n",
        "        color:#d77c0c;\n",
        "        margin-bottom: 0.5em;\n",
        "        margin-top: 0.5em;\n",
        "        display: block;\n",
        "        white-space: nowrap;\n",
        "    }\n",
        "    h5 {\n",
        "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
        "    }\n",
        "    .text_cell_render h5 {\n",
        "        font-weight: 300;\n",
        "        font-style: normal;\n",
        "        color: #1d3b84;\n",
        "        font-size: 16pt;\n",
        "        margin-bottom: 0em;\n",
        "        margin-top: 1.5em;\n",
        "        display: block;\n",
        "        white-space: nowrap;\n",
        "    }\n",
        "    div.text_cell_render{\n",
        "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
        "        line-height: 135%;\n",
        "        font-size: 110%;\n",
        "        width:750px;\n",
        "        margin-left:auto;\n",
        "        margin-right:auto;\n",
        "        text-align:justify;\n",
        "        text-justify:inter-word;\n",
        "    }\n",
        "    div.output_subarea.output_text.output_pyout {\n",
        "        overflow-x: auto;\n",
        "        overflow-y: scroll;\n",
        "        max-height: 300px;\n",
        "    }\n",
        "    div.output_subarea.output_stream.output_stdout.output_text {\n",
        "        overflow-x: auto;\n",
        "        overflow-y: scroll;\n",
        "        max-height: 300px;\n",
        "    }\n",
        "    code{\n",
        "      font-size: 70%;\n",
        "    }\n",
        "    .rendered_html code{\n",
        "    background-color: transparent;\n",
        "    }\n",
        "    ul{\n",
        "        margin: 2em;\n",
        "    }\n",
        "    ul li{\n",
        "        padding-left: 0.5em; \n",
        "        margin-bottom: 0.5em; \n",
        "        margin-top: 0.5em; \n",
        "    }\n",
        "    ul li li{\n",
        "        padding-left: 0.2em; \n",
        "        margin-bottom: 0.2em; \n",
        "        margin-top: 0.2em; \n",
        "    }\n",
        "    ol{\n",
        "        margin: 2em;\n",
        "    }\n",
        "    ol li{\n",
        "        padding-left: 0.5em; \n",
        "        margin-bottom: 0.5em; \n",
        "        margin-top: 0.5em; \n",
        "    }\n",
        "    ul li{\n",
        "        padding-left: 0.5em; \n",
        "        margin-bottom: 0.5em; \n",
        "        margin-top: 0.2em; \n",
        "    }\n",
        "    a:link{\n",
        "       font-weight: bold;\n",
        "       color:#447adb;\n",
        "    }\n",
        "    a:visited{\n",
        "       font-weight: bold;\n",
        "       color: #1d3b84;\n",
        "    }\n",
        "    a:hover{\n",
        "       font-weight: bold;\n",
        "       color: #1d3b84;\n",
        "    }\n",
        "    a:focus{\n",
        "       font-weight: bold;\n",
        "       color:#447adb;\n",
        "    }\n",
        "    a:active{\n",
        "       font-weight: bold;\n",
        "       color:#447adb;\n",
        "    }\n",
        "    .rendered_html :link {\n",
        "       text-decoration: underline; \n",
        "    }\n",
        "    .rendered_html :hover {\n",
        "       text-decoration: none; \n",
        "    }\n",
        "    .rendered_html :visited {\n",
        "      text-decoration: none;\n",
        "    }\n",
        "    .rendered_html :focus {\n",
        "      text-decoration: none;\n",
        "    }\n",
        "    .rendered_html :active {\n",
        "      text-decoration: none;\n",
        "    }\n",
        "    .warning{\n",
        "        color: rgb( 240, 20, 20 )\n",
        "    } \n",
        "    hr {\n",
        "      color: #f3f3f3;\n",
        "      background-color: #f3f3f3;\n",
        "      height: 1px;\n",
        "    }\n",
        "    blockquote{\n",
        "      display:block;\n",
        "      background: #fcfcfc;\n",
        "      border-left: 5px solid #c76c0c;\n",
        "      font-family: 'Open sans',verdana,arial,sans-serif;\n",
        "      width:680px;\n",
        "      padding: 10px 10px 10px 10px;\n",
        "      text-align:justify;\n",
        "      text-justify:inter-word;\n",
        "      }\n",
        "      blockquote p {\n",
        "        margin-bottom: 0;\n",
        "        line-height: 125%;\n",
        "        font-size: 100%;\n",
        "      }\n",
        "</style>\n",
        "<script>\n",
        "    MathJax.Hub.Config({\n",
        "                        TeX: {\n",
        "                           extensions: [\"AMSmath.js\"]\n",
        "                           },\n",
        "                tex2jax: {\n",
        "                    inlineMath: [ ['$','$'], [\"\\\\(\",\"\\\\)\"] ],\n",
        "                    displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"] ]\n",
        "                },\n",
        "                displayAlign: 'center', // Change this to 'center' to center equations.\n",
        "                \"HTML-CSS\": {\n",
        "                    styles: {'.MathJax_Display': {\"margin\": 4}}\n",
        "                }\n",
        "        });\n",
        "</script>\n"
       ],
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 1,
       "text": [
        "<IPython.core.display.HTML at 0x2d55b90>"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "This chapter is optional, especially the first time you go through this material. If you are a hobbiest you will be able to get quite far by just skipping this chapter and going on to learn the examples. However, to have any hope of reading the literature or to design more sophsticated kilters you will have to acquire some of the more formal mathematics. I will not endevour to teach linear algebra, statistics, or calculus here as each topic deserves a book on its own. \n",
      "\n",
      "blah blah blah\n",
      "\n",
      "**authors note: need to start with continuous equations with $\\phi$, etc. Then discuss linearization into discrete case.**"
     ]
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Walking Through the Kalman Filter Equations"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "I promised that you would not have to understand how to derive Kalman filter equations, and that is true. However, I do think it is worth walking through the equations one by one and becoming familiar with the variables. If this is your first time through the material feel free to skip ahead to the next section. However, you will eventually want to work through this material, so why not now? You will need to have passing familarity with these equations to read material written about the Kalman filter, as they all presuppose that you are familiar with the equations. I will reiterate them here for easy reference.\n",
      "\n",
      "\n",
      "$$\n",
      "\\begin{aligned}\n",
      "\\text{Predict Step}\\\\\n",
      "\\mathbf{x}' &= \\mathbf{F x} + \\mathbf{B u}\\;\\;\\;\\;&(1) \\\\\n",
      "\\mathbf{P} &= \\mathbf{FP{F}}^T + \\mathbf{Q}\\;\\;\\;\\;&(2) \\\\\n",
      "\\\\\n",
      "\\text{Update Step}\\\\\n",
      "\\mathbf{\\gamma} &= \\mathbf{z} - \\mathbf{H x}\\;\\;\\;\\;&(3) \\\\\n",
      "\\mathbf{K}&= \\mathbf{PH}^T (\\mathbf{HPH}^T + \\mathbf{R})^{-1}\\;\\;\\;\\;&(4) \\\\\n",
      "\\mathbf{x}&=\\mathbf{x}' +\\mathbf{K\\gamma}\\;\\;\\;\\;&(5) \\\\\n",
      "\\mathbf{P}&= (\\mathbf{I}-\\mathbf{KH})\\mathbf{P}\\;\\;\\;\\;&(6)\n",
      "\\end{aligned}\n",
      "$$\n",
      "\n",
      "I will start with the measurement step, as that is what we started with in the one dimensional Kalman filter case. Our first equation is\n",
      "\n",
      "$$\n",
      "\\mathbf{\\gamma} = \\mathbf{z} - \\mathbf{H x}\\tag{3}\n",
      "$$\n",
      "\n",
      "On the right we have $\\mathbf{Hx}$. That should be recognizable as the measurement function. Multiplying $\\mathbf{H}$ with $\\mathbf{x}$ puts $\\mathbf{x}$ into *measurement space*; in other words, the same basis and units as the sensor's measurements. The variable $\\mathbf{z}$ is just the measurement; it is typical, but not universal to use $\\mathbf{z}$ to denote measurements in the literature ($\\mathbf{y}$ is also sometimes used). Do you remember this chart?"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import mkf_internal\n",
      "mkf_internal.show_residual_chart()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAF9CAYAAAAKk97ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8VGWi//HvpHd6AE1oK0VdaugkIF1XcX+KDSwLLiw/\nVn+KLgosFhAX4S7ci9xVBHRB9op3LegVVuMVlCogrFSlawplQKUF05Pz+yNkliGZMCFPkjkzn/fr\nxQvmzMmZZ76cZJ48+c6Jw7IsSwAAAECACKrtAQAAAAA1iQkwAAAAAgoTYAAAAAQUJsAAAAAIKEyA\nAQAAEFCYAAMAACCgMAEGfMCECRMUFBSkoKAg9e/fv7aHY8zatWsVFBSkjIwMt+07d+50Pd/y7keJ\npUuXKiio/C/TQUFBWrZsWbU+flpamoKCgrR+/fpqfZya5q/PC4D3mAADVXT5RKSgoEB33nmn2rRp\no+PHj3t1jBdffFEnTpzQH/7wBzkcjuoaqjGXTl5L/wQHB5d5vn369JHT6VRCQoLb9vbt28vpdOqr\nr7664mO1aNFC06dPNzr+ymrRooXrecbExKhTp07661//Wqtjcjqduueee67640eNGnXFb7aaNWsm\np9OpXr16XfXjVEV53wDU9uS1ur/xyM3N1TPPPKPrrrtOkZGRSkxM1H333aczZ8647Tdt2jS1bNmy\n2sYB+DsmwIBBhYWFuu+++/TNN99o7dq1uuaaa7z6uJiYGDVu3FjR0dGyy++mefnll+V0Ol1/Tpw4\noaZNm7rtExoaqvj4+DKTmODgYMXHx6thw4ZXfBxf+IbA4XBo4sSJcjqd2rlzp371q19pzJgxev/9\n92ttTPHx8YqIiKjWxwgKClJ8fLxCQ0Or9XHsovRzszo/RydMmKDly5frlVde0YEDB/TWW2+pYcOG\n+vnnn6vtMYFAxAQYMKSwsFAjRozQ3r179cUXX7hNfv/whz/o+uuvV1RUlOLj4zVmzBidO3fO62Mv\nXbpUnTp1UnJysuLj4/X666+rVatWat68ufbu3StJys/P18MPP6xf/OIXioiIUEJCgiZOnKj8/HzX\ncaZNm6b+/ftr5syZaty4seLj4/Xcc89d1fOtU6eO4uPj3f6UTla3bNlS5YpD6aprenq6pk+f7jrW\nCy+84Lbf7Nmz1apVK0VFRalz585auXJlmWMFBQXptdde09ixY1W3bl3VqVNHM2bMqNR4YmJiFB8f\nr+uuu04zZ85U69attWLFCtf9pSuTK1as0J133qnY2Fg1aNDAbaV4yZIluv766xUZGakbbrhBb7zx\nhttj7NixQ927d1dERIR69uypQ4cOlRlHRESEK4s333yz3LHu3btXt912m+rWrau6devqlltu0ZEj\nRySVrPyWrmKuW7fOdawBAwa4Pt7pdLr9/61bt67MY5w7d06jRo1SgwYNFBUVpSFDhujAgQOu+0vr\nL//4xz/Upk0bxcXF6e677zY+kStdJf7rX/+qpk2bqk6dOvrd737ndt6fPn1aw4cPV3R0tFq1aqVV\nq1a5HcObz53Sn3JI0ujRo13ZXLoanJ+fr6effloJCQmKiYlR7969tXnz5ko9n3fffVdPPPGEhg4d\nqmbNmqlv3776y1/+4vopyrRp01yfB+np6a5xtGrVyu04X375pfr27auoqCg1b95cEydOVF5enuv+\nm266Sffee6/uu+8+RUVFqVWrVnrnnXcqNVbAzpgAAwYUFhbq/vvv1+7du8tMfiUpJydH8+fP17ff\nfqsPP/xQX375pcaPH1+px0hLS9Orr76qAQMGaOLEifrggw/Up08fLViwQFLJi294eLiWLFmigwcP\naunSpXrrrbc0bdo0t+Ns27ZNZ8+e1Zdffqmnn35aL774oldVhMtVtArWtWtXOZ3OKq2Q/vOf/9SJ\nEydck5HSleY//OEPrn3++Mc/6pVXXtFf/vIXffvtt3rkkUc0fPhwff3112WON2vWLCUkJGjr1q1a\nvXq12rRpc9Vjk6SwsDAVFBSU2T558mT1799fO3bs0AcffKAmTZpIkhYtWqQnn3xS06ZN0/79+zVj\nxgxNmDBBH374oaSS6swdd9yhZs2aadeuXXriiSc0f/78MivgmZmZOnHihKTyV8czMzOVkpKikJAQ\nrVmzRlu2bNGwYcN09OhRSdL8+fN14sQJ3XPPPerdu7cr10sn840bN3arqJT3OI899pg2btyoDz/8\nUF999ZWCgoJ0++23q6ioyG2/xYsX68MPP9R7772njz/+WK+88orXGVfG0qVL9b//+7/64IMPtHLl\nSr344ouu+/7f//t/2rdvn9auXau33npL//mf/+n2sd587pT+lENy/+nHpTWUUaNG6dNPP9Xy5cu1\nZ88e/epXv9LgwYN17Ngxr59H3bp1tWbNGmVnZ5d7/1NPPeX6PEhISHCNY9u2ba59du/erUGDBmnI\nkCHas2ePli9frk8++USTJk1yO9aKFSt0ww03aNeuXXr44Yd1//33l/tNF+CXLABV4nA4rGuvvdZy\nOBzWHXfc4dXHzJ8/34qLiyuz/fnnn7duuummMtuXLFli9ejRw7Isy3r11Vetnj17WpZlWQsWLLB+\n9atfeXycJ5980urQoYPb8a+55hqruLjYta1OnTrWX/7yF6/GXcrhcFgRERFWTEyM689DDz1UZr8v\nvvjCcjgcVnp6ernH+f777yu837Isq0WLFtb06dPLbM/KyrIiIiKsd99912370KFDrfHjx5cZ7/Dh\nw715ah7HMG3aNMuyLCs/P9967bXXLIfDYS1cuLDMc/nDH/5Q7jGuvfZa689//rPbtnHjxlm33HKL\nZVmWtXLlSisoKMhyOp2u+8eOHWs5HI5yj+dwOKw333yzzPYpU6ZY11xzjZWXl1fhc/rNb35T7rl2\nqdLntG7dOrft586ds0JCQqzly5e7tmVkZFgOh8P6+OOPLcv61//9vn37XPsMGzasUv8PS5YsKfP8\nLx9T6T5btmxx7TNr1iyrUaNGlmVZ1pkzZ6yQkBDr73//u+v+t956q9zndanLP3dKecr94MGDlsPh\nsLZt2+a2vV27dtbs2bO9eLYlUlNTrQYNGlhRUVHW4MGDrTlz5lgnT54ss9/zzz9vtWjRotxj3H//\n/datt97qtu3tt9+2oqKiXLf79etnXX/99WXG+tRTT3k9VsDOQmp7Ag74g5iYGH344YcaPny43njj\nDf32t791u/+DDz7Qf/zHf+jw4cPKyspSYWFhuauHFYmMjHT9Xdr9jIiIUE5OjmufxYsXa/HixUpP\nT1d2drby8/OVmJjodpxWrVq5rejVq1dPp0+frtRYJGnGjBm68847XbdjYmIqfYyq+Pbbb5WXl6ff\n/OY3Gj16tGv7pT/mvVRKSspVP5ZlWZo5c6bmzJmj3NxcRUVFacqUKfrd737n1eOcOnVKx48f13PP\nPef2hr78/HzXG5kOHTqkBg0aqHHjxq77O3ToUOmx7ty5Uz169FBYWFilP9Zb3333nYqKitSxY0fX\ntsTERNWvX1+HDx922/fSlfb69etX2xU/2rdv7/r3jTfeqB9//FFZWVn6/vvvVVRU5HZ/ebl687lT\nkR07dkhSmTcW5ubm6rvvvvP6OEOHDlVmZqZWr16t9evX67XXXtPMmTO1du1at+dQka+//lpHjhxR\nbGysa1tRUZHy8vLkdDpdP5X45S9/6fZxv/zlL8v8/wH+igkwYMCUKVN0++23a8qUKZowYYL69eun\n6667TpK0detW3XffffrTn/6kIUOGKCYmRsuXL7/q7u3lrItVhHfffVdPPvmk5s2bp549eyoyMlL/\n9m//pk8//dRt/5CQsp/21lW8qSc+Pr5M77A2vPfee2rbtq3bttJvFi5Vr169q34Mh8Oh8ePH67HH\nHnN1gT2p6HFefvllDRw40G1b6RvMTL3Zz+FweP3/WRNvMLz8DZCVOdcqevPd5feV91wsy/LqOXr7\nueONTZs2lflmMC4urlLHiIyM1LBhwzRs2DC99NJLSkpK0ty5c7V06VKvPt7hcOjBBx/UH//4xzL3\nNWrUyOPHXc3XAcCumAADBpS+yD733HNatWqVHnjgAW3atEnBwcHauHGj2rdvr4kTJ7r2z8zMLPeF\nOSYmxmP370rWr1+voUOHuq0+f//99z5xFQVPSicKFT1nT13b66+/XuHh4UpPT9ctt9xSbWMsVb9+\n/aue8MfHx+vaa6/VkSNHNHbs2HL3ad26tX766Se3Fbrdu3dX+v+vU6dOWrp0qfLy8hQeHu5xP0+5\neqNly5YKCgrSzp07dcMNN0iSMjIydPr0adc3fp5U5vnUr19fUkmHvvSbmgsXLrjdV2r37t3q0aOH\npJI3ATZs2FBxcXFq2bKlgoODtXv3bl1//fWufS9Vmc+d0NBQFRYWltneqVMnSdLx48d18803e/0c\nryQkJEQtWrRwPe9SYWFh5Y5Dkjp37qxvvvnmiufrnj173G7v3btXt99+e9UGDNgEb4IDDAoJCdGy\nZcu0c+dO14+627Vrp3379mnVqlX67rvv9Oqrr+r9998vd7Wle/fu2rlzpz777DM5nc4yL3oVadeu\nnTZu3Kj169fr0KFDeuGFF7R58+YrrupUx6rP6dOn5XQ6XdWKU6dOyel06vz58277NWzYUC1atNAr\nr7yio0eP6tSpU2WO1aZNG3322Wc6duyYcnNzXW+yio2N1eOPP66pU6fqzTff1JEjR7RlyxY999xz\nevfdd40+HxMZTZ06VS+//LLmz5+vgwcP6p///Kf+/Oc/u94UdvPNN6tFixZ69NFHtW/fPr3zzjv6\n7//+b7dj/Pzzz643PUnS2bNn5XQ69cMPP7j2GT9+vHJycjRixAj985//1IEDB/Tqq6+WuZJD27Zt\ntXv3bu3atUs5OTluVzw4d+6c23FLJ+al/5916tTRyJEj9eyzz2r9+vXas2ePxo4dq9atW2vo0KEV\n5lCZLHv16qU6deroscce07fffqsdO3Zo0qRJatmyZZk3MT799NPavXu31qxZo5dfflnjxo1zjXXE\niBGaNm2atm3bps2bN5e5Aoinz53ytGnTRh999JF+/PFH5ebmqri42LX9nnvu0bhx4/TBBx/ou+++\n04YNG/TEE09ow4YNXj/nX//611q8eLF27dqlI0eO6JVXXtEnn3yi2267zW2/tm3b6sSJE/r888+V\nnZ3tVv156qmntHPnTo0fP167du3Svn37tGzZMj322GNuxzh8+LBmzJihgwcP6sUXX9SRI0c0ZswY\nr8cK2FrtVI8B/1Hem2Jmz55thYaGWps2bbIsy7KeffZZq0mTJlZ0dLQ1fPhwa968eVZQUFC5x5s6\ndarVsGFDy+FwWE888YRlWZa1dOlSq3///hX+u6CgwBo3bpzVoEEDq06dOtaYMWOsqVOnWi1btnQd\ne9q0aa79S3l6k1lln/Ol+vXrZzkcDsvhcFhBQUGuf48ePbrMvhs2bLBuuOEGKygoyKpXr16Z+3fv\n3m316tXLio6OthwOh9tYi4uLrTlz5lht2rSxwsLCrPj4eOvXv/61tXPnzkqN90q8yej777+3goKC\nKnxj1dKlS60OHTpY4eHhVoMGDazBgwdbn3/+uev+nTt3Wt26dbPCw8OtHj16WFOnTnU7T55//vly\nc730/9iyLGvv3r3WbbfdZsXFxVmxsbHWoEGDrCNHjrjtc/78eevOO++06tevbzkcDrfz4je/+U25\nj3PpPmfPnrUeeughq27dulZkZKQ1cOBAtze8ffHFF2XO8VGjRpU5/67k66+/toYMGWLVrVvXatiw\noTV8+HC351L6JrhFixZZjRs3tmJjY60xY8a4vQnw9OnT1p133mlFRkZaLVu2tP7yl7+4/V9587lz\n6fPq2LGjFRERUea8ysvLs6ZMmWI1b97cCgsLs6699lprxIgRVlpamtfP99/+7d+sLl26WHXq1LFi\nYmKsjh07WgsWLCizX1FRkfXb3/7WatSoUbnnwJdffmkNHDjQio6OtmJiYqyuXbu6Heemm26y7r77\nbmv48OGuXN5++22vxwnYncOyPH87fuzYMd177706e/aswsPDNXv2bA0aNMjjZDo4ONj15oJ+/fpp\n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\njCAtXhyuzz47r48/ztKsWRH66aeSsWdnS8OH5+vLL8/r889DXBNpwFshFd0ZGhqqBQsWqH379srI\nyFDv3r119OjRcvfNz8/X5MmTtXXrVuXm5qp///667bbbqmXQNSE5Obm2h+A3yNIs8jSLPM0hS7NM\n5ZmYWKzWrYslST16FGrXrhDVrWupY8dCtWtXsj0uTvrkkxClpwdp6NBYSVJ2tkPp6UE6d86hHj0K\nFR4utWtXrMTEYrfjl/dOoi+/DNHrr/8sSYqNlWJjr/x2o8uPs3t3sHr2LFRUlCRZ6tKlSN98E6y+\nfQsVFiZ161YkSWrevFinTgWpceOiCo/P+WmW3fOscAIcHx+v+Ph4SVKzZs2Un5+vgoIChYaGltl3\n69atuvHGG9WoUSNJUmJionbt2qWOHTtWw7ABAPBPeXnSt98GKzdXatOmSA0amD1+aYc3Ls4qs33A\ngAItXJjttv0f/yj7ml/e8S5X2bfYX34cT8eVpEunIQ6HVFzseV+gPF53gD/99FMlJSWVO/mVpJMn\nT6pp06ZauHCh3n33XTVp0kQnTpwwNtCaZvduiy8hS7PI0yzyNIcszVi1qqSHe+utcfrTnyJ17lzV\njpeZGaTDh4OUmyt99VWIOnQoLHdympRUqM2bQ3T8uMP1cadOOdSxY6G2bQtRXp60f3+QMjPdpw7l\nHSs5uVBvvVXS2f35Z7mqC1LJavDp02Vnt5cfp0OHIm3dGqLsbOncOYd27AjWjTdWvMpbEc5Ps+ye\nZ4UrwKWcTqcmTpyojz766Ir7jhs3TpK0YsUKOSr69g0AALi5cEGaNy9CllXy+rl0aYT+7//NU506\nV7/E2bx5sV54IVKHDgXrwQfzlJBgKT297Apro0aW5s7N1siRMSoslKKjpUWLflbz5sW6//489esX\np7Zti9SiRclYMjKC9OCD0TpzxqHcXIe2bAnRM8/kaPDgQs2ala0nnojSX/8artBQafHin9WgQckM\nd+zYPD3wQIzq1y/WkiU/KzfXUeY4zz6bo0GDCjV2bJ4GD46TJE2alOs6BlBVV5wA5+bm6u6779bc\nuXPVsmVLj/s1bdrUbcXX6XSqadOm5e77+9//Xs2aNZMk1alTR+3bt3d1SUq/o+C2f90u5Svjsfvt\nUr4yHrvfLuUr47Hr7dJtvjIeX7595EiQ/vnPf6pOnTwNGdJTDkfJ/dHRcercuYe++abk5fmaa4oU\n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\ngg==\n",
       "text": [
        "<matplotlib.figure.Figure at 0x2896ad0>"
       ]
      }
     ],
     "prompt_number": 3
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "The blue prediction line is the output of $\\mathbf{Hx}$, and the dot labelled \"measurement\" is $\\mathbf{z}$. Therefore, $\\gamma = \\mathbf{z} - \\mathbf{Hx}$ is how we compute the residual, drawn in red. So $\\gamma$ is the residual.\n",
      "\n",
      "The next line is the formidable:\n",
      "\n",
      "$$\\mathbf{K}= \\mathbf{PH}^T (\\mathbf{HPH}^T + \\mathbf{R})^{-1}\\tag{4}$$\n",
      "\n",
      "Unfortunately it is a fair amount of linear algebra to derive this. The derivation can be quite elegant, and I urge you to look it up if you have the mathematical education to follow it. But $\\mathbf{K}$ is just the *Kalman gain* - the ratio of how much measurement vs prediction we should use to create the new estimate. $\\mathbf{R}$ is the *measurement noise*, and $\\mathbf{P}$ is our *uncertainty covariance matrix*.\n",
      "\n",
      "So let's work through this expression by expression. Start with $\\mathbf{HPH}^T$. The linear equation $\\mathbf{ABA}^T$ can be thought of as changing the basis of $\\mathbf{B}$ to $\\mathbf{A}$. So $\\mathbf{HPH}^T$ is taking the covariance $\\mathbf{P}$ and putting it in measurement ($\\mathbf{H}$) space. Then, once in measurement space, we can add the measurement noise $\\mathbf{R}$ to it. Hence, the expression for the uncertainty in the measurement is:\n",
      "\n",
      "$$(\\mathbf{HPH}^T + \\mathbf{R})^{-1}$$\n",
      "\n",
      "Taking the inverse is linear algebra's way of doing $\\frac{1}{x}$. So if you accept my admittedly hand wavely explanation it can be seen to be computing:\n",
      "\n",
      "$$ \n",
      "gain_{measurement\\,space} = \\frac{uncertainty_{prediction}}{uncertainty_{measurement}}\n",
      "$$\n",
      "\n",
      "\n",
      "In other words, the *Kalman gain* equation is doing nothing more than computing a ratio based on how much we trust the prediction vs the measurement. If we are confident in our measurements and unconfident in our predictions $\\mathbf{K}$ will favor the measurement, and vice versa. The equation is complicated because we are doing this in multiple dimensions via matrices, but the concept is simple - scale by a ratio.\n",
      "\n",
      "Without going into the derivation of $\\mathbf{K}$, I'll say that this equation is the result of finding a value of $\\mathbf{K}$ that optimizes the *mean-square estimation error*. It does this by finding the minimal values for $\\mathbf{P}$ along it's diagonal. Recall that the diagonal of $P$ is just the variance for each state variable. So, this equation for $\\mathbf{K}$ ensures that the Kalman filter output is optimal. To put this in concrete terms, for our dog tracking problem this means that the estimates for both position and velocity will be optimal - a value of $\\mathbf{K}$ that made the position extremely accurate but the velocity very inaccurate would be rejected in favor of a $\\mathbf{K}$ that made both position and velocity just somewhat accurate."
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Our next line is:\n",
      " $$\\mathbf{x}=\\mathbf{x}' +\\mathbf{K\\gamma}\\tag{5}$$\n",
      "\n",
      "This just multiplies the residual by the Kalman gain, and adds it to the state variable. In other words, this is the computation of our new estimate.\n",
      "\n",
      "Finally, we have:\n",
      "\n",
      "$$\\mathbf{P}=(\\mathbf{I}-\\mathbf{KH})\\mathbf{P}\\tag{6}$$\n",
      "\n",
      "$I$ is the identity matrix, and is the way we represent $1$ in multiple dimensions. $H$ is our measurement function, and is a constant.  So, simplified, this is simply $P = (1-cK)P$. $K$ is our ratio of how much prediction vs measurement we use. So, if $K$ is large then $(1-cK)$ is small, and P will be made smaller than it was. If $K$ is small, then $(1-cK)$ is large, and P will be made larger than it was. So we adjust the size of our uncertainty by some factor of the *Kalman gain*. I would like to draw your attention back to the g-h filter, which included this Python code:\n",
      "\n",
      "    # update filter \n",
      "    w = w * (1-scale_factor) + z * scale_factor\n",
      "\n",
      "This multidimensional Kalman filter equation is partially implementing this calculation for the variance instead of the state variable."
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Now we have the measurement steps. The first equation is\n",
      "\n",
      "$$\\mathbf{x}' = \\mathbf{Fx} + \\mathbf{Bu}\\tag{1}$$\n",
      "\n",
      "This is just our state transition equation which we have already discussed. $\\mathbf{Fx}$  multiplies $\\mathbf{x}$ with the state transition matrix to compute the next state. $B$ and $u$ add in the contribution of the control input $\\mathbf{u}$, if any.\n",
      "\n",
      "The final equation is:\n",
      "$$\\mathbf{P} = \\mathbf{FPF}^T + \\mathbf{Q}\\tag{2}$$\n",
      "\n",
      "$\\mathbf{FPF}^T$ is the way we put $\\mathbf{P}$ into the process space using linear algebra so that we can add in the process noise $\\mathbf{Q}$ to it."
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": []
    }
   ],
   "metadata": {}
  }
 ]
}