{
 "metadata": {
  "name": "",
  "signature": "sha256:6e6749d931110e1edad026d2237ed80b25dbe6f60372d36194549b6f735220f0"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "Designing Nonlinear Kalman Filters"
     ]
    },
    {
     "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: transparent;\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": 4,
       "text": [
        "<IPython.core.display.HTML at 0x14a4490>"
       ]
      }
     ],
     "prompt_number": 4
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Introduction"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "blah blah"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "We see that the Kalman filter reasonably tracks the ball. However, as already explained, this is a silly example; we can predict trajectories in a vacuum with arbitrary precision; using a Kalman filter in this example is a needless complication."
     ]
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "Kalman Filter with Air Drag"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "I will dispense with the step 1, step 2, type approach and proceed in a more natural style that you would use in a non-toy engineering problem. We have already developed a Kalman filter that does excellently at tracking a ball in a vacuum, but that does not incorporate the effects of air drag into the model. We know that the process model is implemented with $\\textbf{F}$, so we will turn our attention to that immediately.\n",
      "\n",
      "Notionally, the computation that $\\textbf{F}$ computes is\n",
      "\n",
      "$$x' = Fx$$\n",
      "\n",
      "With no air drag, we had\n",
      "\n",
      "$$\n",
      "\\mathbf{F} = \\begin{bmatrix}\n",
      "1 & \\Delta t & 0 & 0 & 0 \\\\\n",
      "0 & 1 & 0 & 0 & 0 \\\\\n",
      "0 & 0 & 1 & \\Delta t & \\frac{1}{2}{\\Delta t}^2 \\\\\n",
      "0 & 0 & 0 & 1 & \\Delta t \\\\\n",
      "0 & 0 & 0 & 0 & 1\n",
      "\\end{bmatrix}\n",
      "$$"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "which corresponds to the equations\n",
      "\n",
      "$$ \n",
      "\\begin{aligned}\n",
      "x &= x + v_x \\Delta t \\\\\n",
      "v_x &= v_x \\\\\n",
      "\\\\\n",
      "y &= y + v_y \\Delta t + \\frac{a_y}{2} {\\Delta t}^2 \\\\\n",
      "v_y &= v_y + a_y \\Delta t \\\\\n",
      "a_y &= a_y\n",
      "\\end{aligned}\n",
      "$$"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "From the section above we know that our new Euler equations must be\n",
      "\n",
      "$$ \n",
      "\\begin{aligned}\n",
      "x &= x + v_x \\Delta t \\\\\n",
      "v_x &= v_x \\\\\n",
      "\\\\\n",
      "y &= y + v_y \\Delta t + \\frac{a_y}{2} {\\Delta t}^2 \\\\\n",
      "v_y &= v_y + a_y \\Delta t \\\\\n",
      "a_y &= a_y\n",
      "\\end{aligned}\n",
      "$$"
     ]
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Realistic 2D Position Sensors"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "The position sensor in the last example are not very realistic. In general there is no 'raw' sensor that provides (x,y) coordinates. We have GPS, but GPS already uses a Kalman filter to create a filtered output; we should not be able to improve the signal by passing it through another Kalman filter unless we incorporate additional sensors to provide additional information. We will tackle that problem later. \n",
      "\n",
      "Consider the following set up. In an open field we put two transmitters at a known location, each transmitting a signal that we can detect. We process the signal and determine  how far we are from that signal, with some noise. First, let's look at a visual depiction of that."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "\n",
      "circle1=plt.Circle((-4,0),5,color='r',fill=False,linewidth=10, alpha=.7)\n",
      "circle2=plt.Circle((4,0),5,color='b', fill=False, linewidth=5, alpha=.7)\n",
      "\n",
      "fig = plt.gcf()\n",
      "ax = fig.gca()\n",
      "\n",
      "plt.axis('equal')\n",
      "plt.xlim((-10,10))\n",
      "plt.ylim((-10,10))\n",
      "\n",
      "plt.plot ([-4,0], [0,3], 'r')\n",
      "plt.plot ([4,0], [0,3], 'b')\n",
      "plt.text(-4, -.5, \"A\", fontsize=16, horizontalalignment='center')\n",
      "plt.text(4, -.5, \"B\", fontsize=16, horizontalalignment='center')\n",
      "#plt.scatter ([-4],[0], 'r')\n",
      "\n",
      "ax.add_artist(circle1)\n",
      "ax.add_artist(circle2)\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\nc0Az2wAAAABJRU5ErkJggg==\n",
       "text": [
        "<matplotlib.figure.Figure at 0x2793590>"
       ]
      }
     ],
     "prompt_number": 5
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Here I have attempted to show transmitter A, drawn in red, at (-4,0) and a second one B, drawn in blue, at (4,0). The red and blue circles show the range from the transmitters to the robot, with the width illustrating the effect of the $1\\sigma$ angular error for each transmitter. Here I have given the red transmitter more error than the blue one. The most probable position for the robot is where the two circles intersect, which I have depicted with the red and blue lines. You will object that we have two intersections, not one, but we will see how we deal with that when we design the measurement function.\n",
      "\n",
      "This is a very common sensor set up. Aircraft still use this system to navigate, where it is called DME (Distance Measuring Equipment). Today GPS is a much more common navigation sytem, but I have worked on an aircraft where we integrated sensors like this into our filter along with the GPS, INS, altimeters, etc. We will tackle what is called *multi-sensor fusion* later; for now we will just address this simple configuration.\n",
      "\n",
      "The first step is to design our state variables. We will assume that the robot is travelling in a straight direction with constant velocity. This is unlikely to be true for a long period of time, but is acceptable for short periods of time. This does not differ from the previous problem - we will want to track the values for the robot's position and velocity. Hence,\n",
      "\n",
      "$$\\mathbf{x} = \n",
      "\\begin{bmatrix}x\\\\v_x\\\\y\\\\v_y\\end{bmatrix}$$"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "The next step is to design the state transistion function. This also will be the same as the previous problem, so without further ado,\n",
      "\n",
      "$$\n",
      "\\mathbf{x}' = \\begin{bmatrix}1& \\Delta t& 0& 0\\\\0& 1& 0& 0\\\\0& 0& 1& \\Delta t\\\\ 0& 0& 0& 1\\end{bmatrix}\\mathbf{x}$$\n",
      "\n",
      "The next step is to design the control inputs. We have none, so we set ${\\mathbf{B}}=0$.\n",
      "\n",
      "The next step is to design the measurement function $\\mathbf{z} = \\mathbf{Hx}$. We can model the measurement using the Pythagorean theorem.\n",
      "\n",
      "$$\n",
      "z_a = \\sqrt{(x-x_A)^2 + (y-y_A)^2} + v_a\\\\[1em]\n",
      "z_b = \\sqrt{(x-x_B])^2 + (y-y_B)^2} + v_b\n",
      "$$\n",
      "\n",
      "where $v_a$ and $v_b$ are white noise.\n",
      "\n",
      "We see an immediate problem. The Kalman filter is designed for linear equations, and this is obviously nonlinear. In the next chapters we will look at several ways to handle nonlinear problems in a robust way, but for now we will do something simpler. If we know the approximate position of the robot than we can linearize these equations around that point. I could develop the generalized mathematics for this technique now, but instead let me just present the worked example to give context to that development."
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Instead of computing $\\mathbf{H}$ we will compute the partial derivative of $\\mathbf{H}$ with respect to the robot's position $\\mathbf{x}$. You are probably familiar with the concept of partial derivative, but if not, it just means how $\\mathbf{H}$ changes with respect to the robot's position.\n",
      "\n",
      "$$\\frac{\\partial\\mathbf{h}}{\\partial\\mathbf{x}}=\n",
      "\\small\\begin{bmatrix}\n",
      "\\frac{(x_r - x_A)}{\\sqrt{(x_r-x_A)^2 + (y_r-y_A)^2}} & 0 & \n",
      "\\frac{(y_r - y_A)}{\\sqrt{(x_r-x_A)^2 + (y_r-y_A)^2}} & 0 \\\\\n",
      "\\frac{(x_r - x_B)}{\\sqrt{(x_r-x_B)^2 + (y_r-y_B)^2}} & 0 &\n",
      "\\frac{(y_r - y_B)}{\\sqrt{(x_r-x_B)^2 + (y_r-y_B)^2}} & 0 \\\\\n",
      "\\end{bmatrix}\n",
      "$$"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "In a nutshell, the entry (0,0) contains the difference between the x coordinate of the robot and transmitter A's x coordinate divided by the distance between the robot and A. (2,0) contains the same, except for the y coordintates of the robot and transmitters. The bottom row contains the same computations, except for transmitter B. The 0 entries account for the velocity components of the state variables; naturally the range does notvide us with velocity.\n",
      "\n",
      "The values in this matrix change as the robot's position changes, so this is no longer a constant; we will have to recompute it for every time step of the filter.\n",
      "\n",
      "If you look at this you may realize that this is just a computation of x/dist and y/dist, so we can switch this to a trigometic form with no loss of generality:\n",
      "\n",
      "$$\\frac{\\partial\\mathbf{h}}{\\partial\\mathbf{x}}=\n",
      "\\begin{bmatrix}\n",
      "-\\cos{\\theta_A} & 0 & -\\sin{\\theta_A} & 0 \\\\\n",
      "-\\cos{\\theta_B} & 0 & -\\sin{\\theta_B} & 0\n",
      "\\end{bmatrix}\n",
      "$$\n",
      "\n",
      "However, this raises a huge problem. We are no longer computing $\\mathbf{H}$, but $\\Delta\\mathbf{H}$, the change of $\\mathbf{H}$. If we passed this into our Kalman filter without altering the rest of the design the output would be nonsense. Recall, for example, that we multiply $\\mathbf{Hx}$ to generate the measurements that would result from the given estimate of $\\mathbf{x}$ But now that $\\mathbf{H}$ is linearized around our position it contains the *change* in the measurement function. \n",
      "\n",
      "We are forced, therefore, to use the *change* in $\\mathbf{x}$ for our state variables. So we have to go back and redesign our state variables. \n",
      "\n",
      ">Please note this is a completely normal occurance in designing Kalman filters. The textbooks present examples like this as *fait accompli*, as if it is trivially obvious that the state variables needed to be velocities, not positions. Perhaps once you do enough of these problems it would be trivially obvious, but at that point why are you reading a textbook? I find myself reading through a presentation multiple times, trying to figure out why they made a choice, finally to realize that it is because of the consequences of something on the next page. My presentation is longer, but it reflects what actually happens when you design a filter. You make what seem reasonable design choices, and as you move forward you discover properties that require you to recast your earlier steps. As a result, I am going to somewhat abandon my **step 1**, **step 2**, etc.,  approach, since so many real problems are not quite that straightforward."
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "If our state variables contain the velocities of the robot and not the position then how do we track where the robot is? We can't. Kalman filters that are linearized in this fashion use what is called a *nominal trajectory* - i.e. you assume a position and track direction, and then apply the changes in velocity and acceleration to compute the changes in that trajectory. How could it be otherwise? Recall the graphic showing the intersection of the two range circles - there are two areas of intersection. Think of what this would look like if the two transmitters were very close to each other - the intersections would be two very long cresent shapes. This Kalman filter, as designed, has no way of knowing your true position from only distance measurements to the transmitters. Perhaps your mind is already leaping to ways of working around this problem. If so, stay engaged, as later sections and chapters will provide you with these techniques. Presenting the full solution all at once leads to more confusion than insight, in my opinion. \n",
      "\n",
      "So let's redesign our *state transition function*. We are assuming constant velocity and no acceleration, giving state equations of\n",
      "$$\n",
      "\\dot{x}' = \\dot{x} \\\\\n",
      "\\ddot{x}' = 0 \\\\\n",
      "\\dot{y}' = \\dot{y} \\\\\n",
      "\\dot{y}' = 0$$\n",
      "\n",
      "This gives us the the *state transition function* of\n",
      "\n",
      "$$\n",
      "\\mathbf{F} = \\begin{bmatrix}0 &1 & 0& 0\\\\0& 0& 0& 0\\\\0& 0& 0& 1\\\\ 0& 0& 0& 0\\end{bmatrix}$$\n",
      "\n",
      "A final complication comes from the measurements that we pass in. $\\mathbf{Hx}$ is now computing the *change* in the measurement from our nominal position, so the measurement that we pass in needs to be not the range to A and B, but the *change* in range from our measured range to our nomimal position. \n",
      "\n",
      "There is a lot here to take in, so let's work through the code bit by bit. First we will define a function to compute $\\frac{\\partial\\mathbf{h}}{\\partial\\mathbf{x}}$ for each time step."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from math import sin, cos, atan2\n",
      "\n",
      "def H_of (pos, pos_A, pos_B):\n",
      "    \"\"\" Given the position of our object at 'pos' in 2D, and two transmitters\n",
      "    A and B at positions 'pos_A' and 'pos_B', return the partial derivative\n",
      "    of H\n",
      "    \"\"\"\n",
      "\n",
      "    theta_a = atan2(pos_a[1]-pos[1], pos_a[0] - pos[0])\n",
      "    theta_b = atan2(pos_b[1]-pos[1], pos_b[0] - pos[0])\n",
      "\n",
      "    return np.mat([[0, -cos(theta_a), 0, -sin(theta_a)],\n",
      "                   [0, -cos(theta_b), 0, -sin(theta_b)]])"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 6
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Now we need to create our simulated sensor. "
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from numpy.random import randn\n",
      "\n",
      "class DMESensor(object):\n",
      "    def __init__(self, pos_a, pos_b, noise_factor=1.0):\n",
      "        self.A = pos_a\n",
      "        self.B = pos_b\n",
      "        self.noise_factor = noise_factor\n",
      "        \n",
      "    def range_of (self, pos):\n",
      "        \"\"\" returns tuple containing noisy range data to A and B\n",
      "        given a position 'pos'\n",
      "        \"\"\"\n",
      "        \n",
      "        ra = math.sqrt((self.A[0] - pos[0])**2 + (self.A[1] - pos[1])**2)\n",
      "        rb = math.sqrt((self.B[0] - pos[0])**2 + (self.B[1] - pos[1])**2)\n",
      "        \n",
      "        return (ra + randn()*self.noise_factor, \n",
      "                rb + randn()*self.noise_factor)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 10
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Finally, we are ready for the Kalman filter code. I will position the transmitters at x=-100 and 100, both with y=-20. This gives me enough space to get good triangulation from both as the robot moves. I will start the robot at (0,0) and move by (1,1) each time step. \n",
      "\n"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import math\n",
      "from KalmanFilter import KalmanFilter\n",
      "import numpy as np\n",
      "\n",
      "pos_a = (100,-20)\n",
      "pos_b = (-100, -20)\n",
      "\n",
      "f1 = KalmanFilter(dim_x=4, dim_z=2)\n",
      "\n",
      "f1.F = np.mat ([[0, 1, 0, 0],\n",
      "                [0, 0, 0, 0],\n",
      "                [0, 0, 0, 1],\n",
      "                [0, 0, 0, 0]])\n",
      "\n",
      "f1.B = 0.\n",
      "\n",
      "f1.R *= 1.\n",
      "f1.Q *= .1\n",
      "\n",
      "f1.x = np.mat([1,0,1,0]).T\n",
      "f1.P = np.eye(4) * 5.\n",
      "\n",
      "# initialize storage and other variables for the run\n",
      "count = 30\n",
      "xs, ys = [],[]\n",
      "pxs, pys = [],[]\n",
      "\n",
      "# create the simulated sensor\n",
      "d = DMESensor (pos_a, pos_b, noise_factor=3.)\n",
      "\n",
      "# pos will contain our nominal position since the filter does not\n",
      "# maintain position.\n",
      "pos = [0,0]\n",
      "\n",
      "for i in range(count):\n",
      "    # move (1,1) each step, so just use i\n",
      "    pos = [i,i]\n",
      "    \n",
      "    # compute the difference in range between the nominal track and measured \n",
      "    # ranges\n",
      "    ra,rb = d.range_of(pos)\n",
      "    rx,ry = d.range_of((pos[0]+f1.x[0,0], pos[1]+f1.x[2,0]))\n",
      "    z = np.mat([[ra-rx],[rb-ry]])\n",
      "\n",
      "    # compute linearized H for this time step\n",
      "    f1.H = H_of (pos, pos_a, pos_b)\n",
      "\n",
      "    # store stuff so we can plot it later\n",
      "    xs.append (f1.x[0,0]+i)\n",
      "    ys.append (f1.x[2,0]+i)\n",
      "    pxs.append (pos[0])\n",
      "    pys.append(pos[1])\n",
      "    \n",
      "    # perform the Kalman filter steps\n",
      "    f1.predict ()\n",
      "    f1.update(z)\n",
      "\n",
      "\n",
      "p1, = plt.plot (xs, ys, 'r--')\n",
      "p2, = plt.plot (pxs, pys)\n",
      "plt.legend([p1,p2], ['filter', 'ideal'], 2)\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAAr8AAAFyCAYAAAD8h7IZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4VOXB/vF7JjOTDUgkJAKBFBd2w6IsCioiLWERUAQL\nVFELWtlEjUsFfdUqbbVq3bUK7lgWi1YqIkFBBPSnAgoVwQ0MEUzCmo1kJsn8/lBSwmTPTGaeOd/P\ndb3X9Z7MOZMHbk598uSe59h27tzpFQAAAGAB9mAPAAAAAGgqTH4BAABgGUx+AQAAYBlMfgEAAGAZ\nTH4BAABgGUx+AQAAYBk1Tn4PHTqkSy+9VGPGjNHo0aO1YsUKSdKKFSuUlpamtLQ0rVmzpkkGCgAA\nADSWraZ9fktLS+XxeBQdHa1Dhw5pxIgRWrdunYYNG6alS5eqpKREkydPVkZGRlOOGQAAAGiQGld+\nHQ6HoqOjJUn5+flyuVz64osv1LFjR7Vs2VJt2rRR69attWPHjiYZLAAAANAYjtpOKCws1IQJE5SZ\nmakHH3xQ+/fvV2JiohYtWqS4uDglJiYqJydHXbp0aYrxAgAAAA1W6wfeYmNjtXz5ci1btkwPPPCA\nSkpKJEkTJkzQ8OHDJUk2my2wowQAAAD8oNaV32NOO+00tW3bVsnJyXrnnXcqvp6bm6vExESf87ds\n2aJWrVr5Z5QAAABAFfLz89WtW7c6n1/j5Dc7O1sul0snnXSScnNztWvXLp1yyin65ptvdPDgQZWU\nlCg7O7vKykOrVq105pln1v9PgKBbvny5Ro0aFexhoIHIz2zkZy6yMxv5mWvz5s31Or/Gye++fft0\n5513Vhz/8Y9/VEJCgtLT0zVx4kRJ0pw5cxowTISyzMzMYA8BjUB+ZiM/c5Gd2cjPOmqc/Pbq1UvL\nly/3+fqIESM0YsSIgA0KAAAACASe8AYfv/71r4M9BDQC+ZmN/MxFdmYjP+tg8gsfnTt3DvYQ0Ajk\nZzbyMxfZmY38rKPOuz34i9frVU5OjsrKypr6W4eliIgIJSUl+XW7ufXr1+vcc8/12/uhaZGf2cjP\nXGRnNvKzjiaf/Obk5Kh58+aKiYlp6m8dloqKipSTk6OTTz452EMBAAAIebadO3d6A/HGe/bsqXKr\ns71796pt27aB+JaWxd8pAACwqs2bN6t9+/Z1Pp/OLwAAACyDyS98rF+/PthDQCOQn9nIz1xkZzby\nC6ycAre+yikM9jAkMfn1MX/+fHXs2FEpKSlat25dxdfT09P14IMPVjr31ltvVUpKilq1aqUPPvig\nqYcKAAAQ0nIK3Hp8wx5Ne2NHyEx+6fwex+PxqEOHDsrIyKjXM6J79eqlxx57TOeff77Pa6NGjdJl\nl12mK664wp9DrSSU/04BAID15BS4tfiLbK39/pCGd07QuNQkxUc7A/K96tv5bfLdHkJZdna2iouL\n/brXnz+3IAMAAAhlJ056F4zrWnnSW14u2/798iYlBW2M1B5+cc455+icc86RJJ1yyikVtYdVq1Yp\nJSVFJ598subNm1fn93v44YeVkpKijz76SLfddptSUlI0ZMiQitcPHTqkP/zhD+rSpYt69+6tl19+\nudL1M2bM0O23367JkycrJSVFPXv2VEFBgX/+sLWg92Q28jMb+ZmL7MxGfo1zfL0h2mnXgnFdNbVv\nW5284B+KvuUWNRs/Xi3691d8u3ZqccEFUhCf98DK7y8++ugj7dmzR7169dLu3btlt//v54LMzEzN\nmDGjXqu4N910k2666SaNHj1al112mS6//PJKr1933XVKSkrSF198oX379mnkyJHq0aOHevXqVXHO\nkiVL9PTTT+ull17Sl19+KYeDuAAAQJAdPSp7ZqbsmZk68MNevZYfq9UJHTW8SyuflV7b4cMq79hR\npb/+tcpSUlSekiLFxgZx8Ex+K/F6a64/1/Z6Xa/76aef9N577+m7775TZGSkOnTooFGjRuntt9+u\nNPk977zzNHToUEnSGWec0aDv3RA84cZs5Gc28jMX2ZmN/I5zbFU2IsLnpeZDhihi+3bt65yql84b\nr9XJqRoZmaMFw1IUn3SSz/nFd9wR6NHWW8hNfqP++ldFP/CAz9eP3nqriv/4xzqdX925wXLiivGP\nP/4oSZUmumVlZRo7dmyl80477bTADw4AAFiWIyNDjm3bZP/hh59Xc3/4Qfa9e5W/erXKqlh4+/7F\n17TohxKt3XVYwzsnaH4AP8gWKCE3+S3+4x/rNXGt7/mNUV3tweVyqaya7srx9YljkpOTFRUVpe+/\n/77GKkVV1zYFnm9uNvIzG/mZi+zMZtX8HFu3ypafr9JevVQ+erTKf/UrlbdvL0VGVjqv1g+yGSTk\nJr+hrLraw+mnn66NGzdq8ODBPq8lJSVp+/btlb7WunVrDRgwQHfffbduvfVWuVwubd68Wc2aNVP3\n7t0DMnYAAGBhhYVVdm2L09NrvCycJr3HsNvDCU5ciR07dqxSUlL0+uuv6/HHH1dKSopmzpxZ6Zy5\nc+dq+fLlat++vf7v//6v0mszZszQ2rVr1b17d40ZM6bi6//4xz+0f/9+9e3bV506ddK9997rs3oc\nrG3SrPiTbzghP7ORn7nIzmzhmp/9m28Ue9VVanbllfW6rsrdG/olGz/xlXjIRVjg7xQAABzPtnev\noh94QM6331bxzJkqueYaKSam1uua8uEU/lLfh1yw8gsf7HVoNvIzG/mZi+zMFk75RT75pFqcd568\n8fHK++QTlcyeXevEN5xXek9E5xcAACCMlJ51lvLWrZM3ObnWc8Ox01sbag9hgL9TAABQHybWG6pT\n39oDK78AAACm8XrlfOcdeYYM8dmWrCZWXOk9EZ1f+Ain3pMVkZ/ZyM9cZGc2k/JzrFun5r/5jaLu\nv1/2n36q0zVW6vTWhpVfAAAAA0Rs3aroe+6RfdcuHZ07V55LLpFqeSAWK72+6PyGAf5OAQAIbxGf\nf65mkyapOD1dJVdcIblcNZ4fTp3e2tD5BQAACDNlPXvqyGef1WnLMlZ6a0bntwoDBgzQxo0bq319\n1KhReuWVVxr1Pfbt26eUlBS1bdtWI0aMaNR7+ZtJvSf4Ij+zkZ+5yM5sIZNfcbGUn+/7dZutxokv\nnd66Y/JbhY0bN2rAgAHVvm6z2Rr96OE2bdooMzNTDz30UKPeBwAAGK60VI7331fMjBmK69ZNrv/8\np86XMumtP2oPQeb1BqRy3Sjh+nxzqyA/s5GfucjObMHIz757tyKffFKut95Sefv2co8dq6Nz58pb\nh8/xUG9oOFZ+j3P33XcrJSVFrVq10gcffFDx9UOHDmnixIn61a9+pcmTJ8vtdleatC5fvlwDBgzQ\nqaeeqt/+9rfKzs6ueG3KlCnq0qWL2rdvr7S0NG3fvr1J/0wAACBEud3ytm6t/JUrlb96tUqmT691\n4stKb+Mx+T3O3XffrczMTLVr165SreHee+9VdHS0vv32W1122WX69NNPK17ftGmTZs+erSeffFLf\nfvutevTooRtvvLHi2p49e2rDhg3KzMzUgAEDNH369Cb/c9VXyPSe0CDkZzbyMxfZmS2Q+dl3767y\n6+WdOqk4PV3lp5xS63sw6fUfag91kJGRoWeffVZOp1MXXXSROnToUPHaq6++qokTJ6p3796SpBkz\nZuj000+Xx+OR0+nU9ddfX3HuhAkT9MQTTzT18AEAQBOzZWXJtWyZXMuWyZ6drbwPP5S3Vat6vw/1\nBv8Lucnv0Plb/PI+q6b29sv7SNKBAwfU6rh/sImJiRX//48//qiNGzfqtddeq/haZGSksrOz1aZN\nG82bN0///ve/dfDgQZWXl8vr9crr9Tb6A3OBRG/NbORnNvIzF9mZzV/5Od94Q1HPPiv7N9/Ic9FF\nOvqnP6l04EApIqJe78OkN3BCbvLrz0mrv7Rq1Uq5ubnq2LGjJCk3N7fitXbt2unmm2/WDTfc4HPd\n4sWL9fbbb+utt95ScnKyvvzyS51//vmVJr8ul0tlZWVN8wcBAACB5XKp+IYb5Bk8uNYHUVSFSW/g\n0fmtxvEfaEtLS9Nzzz0nt9ut5cuXa/dx3Z2JEyfqhRde0NatW+X1epWbm6s33nhDklRYWKjo6GjF\nxcUpPz9fDz/8sM/3Of300/X111/rwIEDAf8z1RW9NbORn9nIz1xkZ7Z65VdUJPtXX1X5kmfkSHnS\n0uo98aXT23SY/P6irKxM7du3V0pKin788UdNmjRJKSkpWrhwoe644w6VlJSoY8eOev3119WvX7+K\n6/r27av77rtPM2fOVIcOHTRkyBBt3bpVkvTb3/5W7dq1U7du3XTBBReob9++PnWHXr16acKECTrr\nrLOUkpKiw4cPN+mfGwAA1IHbLee77yrmD39QXLduivrHP/zytkx6m55t586dAdlods+ePTrzzDN9\nvr537161rcP+dag7/k4BAAgQj0cxt9wi53/+o/KOHeW+9FK5R4+WNympUW97Yr1hXGoSE94G2rx5\ns9q3b1/n80Ou8wsAABAynE6VnnXWz1uS1WOCVR06vcFH7QE+6K2ZjfzMRn7mIjuzfbFwoWxZWVW+\n5r7iikZPfKk3hA5WfgEAgCXZsrIUuWSJXP/6l/rn5qrs8cfladfOr9+Dld7Qw+QXPtir0mzkZzby\nMxfZmSdmzhw5331XhU89Jc8ll0h2//1CnElv6GLyCwAALKnwuecU9cgjP29L5qeJL5Pe0Nfknd9j\nTziDfwTi75PemtnIz2zkZy6yM1BkpIpvu02eUaManR+dXnM0+cpvXFycDh48qISEhKb+1mHp4MGD\niouLC/YwAACwJFZ6zdPk+/xK0oEDB1RSUhKIb2s5kZGR/CABAICfuRYtUlnXrirr2bPK19mnN3QY\nsc8vkzUAABDSIiLU7LLL5J44UUdvvVWKiZHESm84YJ9f+KC3ZjbyMxv5mYvszHZifu7x45X34Yey\n79mjFuefr4NrNtDpDRM1rvxmZ2frhhtuUH5+vlwul26++WYNGDBAXbt2VefOnSVJffv21dy5c5tk\nsAAAAE3Fm5SkXY8+rX898bre+7Jcw/raWekNAzV2fg8cOKD9+/erc+fO2rt3ryZMmKB169apd+/e\n2rJlS41vXFPnFwAAIJRVqje0i9K4M5IUnxgf7GGhCn7t/CYkJFT0c9u2bSuPxyO32924EQIAAIQo\nOr3hr86d3w8//FDdu3eXy+WS2+3W2LFjNXHiRH322WeBHB+CgN6a2cjPbORnLrIz29trNujxVTs0\n7V/b6fSGuTrt9pCbm6sHHnhATz31lCRp3bp1SkhI0LZt2zRz5kxlZGTI5XIFdKAAAAD+llPg1uIt\ne/X+zgiN/eyfenloT8X26xXsYSGAat3nt6SkRFdffbWmT59e5XPLx48fr/vvv1+nnnpqpa/v2bNH\n8+fPV0pKiqSfH26Rmppa8R7HfkLmmGOOOeaYY445burjTr36afEX2Xpv+z6N3vSurij4TpF/+j+t\n27s3JMbHcfXH27Zt05EjRyRJmZmZmjp1ar06vzVOfr1er9LT09WnTx9NmjRJknTkyBFFRkYqKipK\nWVlZmjRpklatWqWoqKhK1/KBNwAAEGqO7/SO2v2ZrljxoqLumiNPWppkswV7eGiA+n7grcbO76ZN\nm7Rq1SotWbJEF198sS655BJ9//33uvjiizV69GjNmjVL8+bN85n4wmzHfsqCmcjPbORnLrILbTkF\nbt99egd3UsT778ozbJjWb9gQ7CGiiThqerFPnz7673//6/P1lStXBmxAAAAA/lLT7g2lv/wqHdZS\na+e3oag9AACAYPHZp7f/KYqPYeeGcOTX2gMAAIBJKtUbbOVauDdD6VOHq2V2VrCHhhDB5Bc+6K2Z\njfzMRn7mIrvgqjTpddj1cvxe3TR9jBK+2qa8Dz5Q+Smn1Hg9+VlHjZ1fAACAUHZip/f5CxKVfNP1\nsmdmquiRR1R6wQXBHiJCDJ1fAABgnBMnveNSk37+INvRo4p87TWVXHGFxAO4LKG+nV9WfgEAgDFq\n2r1BkhQdrZIpU4I3QIQ8Or/wQe/JbORnNvIzF9kFVkWn91/bFfvDLi38frmmf72m8sS3EcjPOlj5\nBQAAISunwK0la77Smqwijd76npauX6bm3TuprE8fec44I9jDg4Ho/AIAgODzemU7dEjeli0lVa43\njGjj1MTcL9WsX2+Vn3oqjyFGJXR+AQBA6CsslOPzzxXx2Wdy/PJ/5W3a6Lu3VlbT6e2q8mCPGWGB\nzi980HsyG/mZjfzMRXb1UFSk+K5dFX3PPbJnZ8t9ySX67t/v6M/3vvTzPr1OuxaM66qp/ZL91umt\nDflZByu/AADAv/Ly5Ni8WY5PP1XxdddJzZtXfj0mRoe/+05yOv9Xb/h/1ezeAPgZnV8AANBozjff\nlHPNGjk+/VT2PXtU2qOHyvr0UfH118ubkOBzfrX79AL1ROcXAAAEjtdb5QfO7Dk5KktNVcnVV6us\ne3fJWfVEttZ9eoEAo/MLH/SezEZ+ZiM/c4VldqWliti6Va7nn1fMtGlq0bevXC++WOWpJddeq5Kp\nU1XWq1eVE9+KfXqD1OmtTVjmhyqx8gsAAKoUfccdcq5YodJBg1R69tkqnjVL5Z071+s9WOlFqKHz\nCwAAqhT5+OPynnyy3JddVu9r6fSiqdD5BQAAflEya1a9r2GlF6GOzi980HsyG/mZjfzMZfXsju/0\nRjlCr9NbG6vnZyWs/AIAgAZjpRemofMLAADqjU4vQgWdXwAAEDCs9MJ0dH7hg96T2cjPbORnrnDN\nLmLrVqmwMOT36W2scM0Pvlj5BQAAVYr4+GMVXne95s+brzUHxUovwgKdXwAAUIktK0v5f3lIC+1t\ntarXYA0/o43G9aDTi9BE5xcAADTYkUef1qIdh7Wq9wQN736yFpwZPtUGQKLziyrQezIb+ZmN/Mxl\nenbHOr2/b9ZXjksv1oIrztTUgR0sM/E1PT/UHSu/AABYmM/uDZN6WmbCC2ui8wsAgAXl/HRQi78r\nZJ9eGI/OLwAAqFbOoUK9vmSd3nc307DOLdm9AZZD5xc+6D2ZjfzMRn7mCvXscgrcenLRRk1fuEWx\nP3yv5y9I1NSh3Zn4/iLU84P/sPILAEAYyylwa/FHu7T22wMa8+UHenFkHzWbMV2y2YI9NCAo6PwC\nABCGKn2Q7dQW+t2X7yv6qssllyvYQwP8is4vAAAW5rN7w7FO78DfB3toQEig8wsf9J7MRn5mIz9z\nBTu7Y/v0Tlv2laKddi0Y11VT+/GAiroKdn5oOqz8AgBgsIqV3m8PaPTuz7Ro+xo5Jy8M9rCAkEXn\nFwAAA1VMer87qIuOfKcrn71PMb+7TMXXXy/FxAR7eECTofMLAEAYO77TO9KVryVP3qoWZ3RR0Ttv\nqbhdu2APDwh5dH7hg96T2cjPbORnrkBnV9HpfWNHRaf32pM9inzkQRUuWCAvE99G4d6zDlZ+AQAI\nYdXu3iCp9IILgjs4wEB0fgEACEGVJr2nx2tctwTFx8UGe1hAyKlv55faAwAAIeTEesNLrbJ10/WX\nKjHjnWAPDQgLTH7hg96T2cjPbORnrsZmd+Kk94XekbrhwRvV9q65Kvrzn+UZN85PI0VVuPesg84v\nAABB5NPpvbij2vz1PrmWLFHxDTeo5NVXeSQx4Ed0fgEACIITJ73jUpN+/iCb16vIZ56Re9w4eRMT\ngz1MIOSxzy8AACGspt0bJEk2m0qmTQveAIEwR+cXPug9mY38zEZ+5qotu6r26Z3atUXliS+ChnvP\nOmqc/GZnZ2vixIm66KKLNHbsWG3cuFGStGLFCqWlpSktLU1r1qxpkoECAGCiSpNeT7FejtmlWUsf\nUcqQQYrr108qLAz2EAFLqbHze+DAAe3fv1+dO3fW3r17NWHCBL333nsaNmyYli5dqpKSEk2ePFkZ\nGRk+19L5BQBY2Yn1hiv/coNafbFJpWefrdIBA1Q6cKDKUlMlBw1EoDH82vlNSEhQQkKCJKlt27by\neDz6/PPP1bFjR7Vs2VKS1Lp1a+3YsUNdunRpxLABADCfLStLOfYoLdp11KfTa3/sYR1p21aKiAj2\nMAFLq3Pn98MPP1T37t114MABJSYmatGiRXrnnXeUmJionJycQI4RTYzek9nIz2zkZxCvV/bdu+Va\nuFAxM2boSN8BeubPr+q6lT/8r9PbL7mi01vevj0T3xDGvWcddfpdS25urh544AE99dRT+vLLLyVJ\nEyZMkCRlZGTIZrMFboQAAISgqAceUOSLL+rHC4bq5bPG6N3eV2tUahst6JHEh9iAEFbr5LekpESz\nZ8/Wbbfdpvbt2ysnJ0e5ubkVr+fm5iqxmn0Ip0+frpSUFElSXFycUlNTde6550r6309YHIfe8bnn\nnhtS4+GY/Kx0TH7mHHeaOl2Lz52kjJ25OjPeo5eG91R8tDNkxscxx+F6vG3bNh05ckSSlJmZqalT\np6o+avzAm9frVXp6uvr06aNJkyZJktxut4YPH17xgbcrr7xSq1at8rmWD7wBAMJRtQ+nABAU9f3A\nW42d302bNmnVqlVasmSJLr74Yl1yySU6fPiw0tPTNXHiRF111VWaM2dOoweN0HLspyyYifzMRn6h\nybF2rXLyin336T2u00t2ZiM/63DU9GKfPn303//+1+frI0aM0IgRIwI2KAAAQsWht97Rkve2a1Xm\nSRrepZXvE9kAGKXG2kNjUHsAAJgsp8CtxRu/0wc792t4SowuHdqDSS8Qgvy6zy8AAFZT0en97pBG\n/3etXm1rV9SYmcEeFgA/qfM+v7AOek9mIz+zkV/wVHoMsdOuhTnva8bX7ytq1rQ6XU92ZiM/62Dl\nFwBgaSfu3rBgXFfFO22KfXyTCp9+mgdTAGGGzi8AwJLYsgwID3R+AQCoQZUrvUx6Acug8wsf9J7M\nRn5mI7/AObHTe2yf3pPyDyni888b/f5kZzbysw5WfgEAYe3Eld7547rqJKdNjvffV+Srr8qxbp1K\npk9XWa9ewR4qgCZA5xcAEJaq7PTayxX1t78p8p//VHnbtiq5/HK5L7lEatEi2MMF0EB0fgEAllZj\np9frlaKilL90qcq7dQvuQAEEBZ1f+KD3ZDbyMxv5NZxPp/eSTpraL7nyh9lsNhXffHNAJr5kZzby\nsw4mvwAAo1Wa9JZ59GrJZt146+908oJ/BHtoAEIQnV8AgJGOfwzxyGZH9bv3XlPS2/9W6ZAhKrn8\ncpUOGiTZWeMBwh2dXwBAWDux0/vCWVFK/sN0uS+/XHn33iVvy5bBHiKAEMaPxPBB78ls5Gc28qte\ndfv0tujeSfnr16vkuuuCOvElO7ORn3Ww8gsACGk5BW4t+WCn1mQVaUT7aJ7IBqBR6PwCAEJSTs5h\nvf72Jr13NEoXf75a49s5FT3lSnmTk4M9NAAhhM4vAMBoOQVuLf3PZ1qTW6pR2d/o5f4dFHvNHMnp\nVEBWawBYCp1f+KD3ZDbyM5uV8zu+0xvZ9mQtuOhUXXnfdYodNUxyhn7NwcrZhQPysw5WfgEAwVFe\nLsdHH2lv6llavC236ieyAYCf0fkFADQp2969ivznP3Xozbf1Uv+LlZF6voZ3TdS41CQmvQDqjc4v\nACAkOTZsUOTjj+vA9m/11OU3a/XvH9Lwbkla0INJL4CmQ+cXPug9mY38zBbO+eUeLNDfhl2j3928\nQM4LztOCCWdoav/ksJn4hnN2VkB+1sHKLwDAv8rLKz1WuOKJbIfbaHi3BC2g3gAgiOj8AgD8ImLr\nVrleeUXOdeuUt3Gjco6WVXoMMZ1eAIFA5xcA0GRsR47I9frrcr36qmwHDsh9+eX67tUlWvTxXnZv\nABCS6PzCB70ns5Gf2UzLL2bWLDnWr9fRO+/Utx/+P/1t4ERd9/ERRTvtWjCuq6b2C59Ob21Myw6V\nkZ91sPILAGiwwhdfVE5R6c/1hre+YaUXQMij8wsAqF5pqRzvv6+IPXtUMmVKpZcqPshGpxdAENH5\nBQA0XmmpIp9/XlGPPqrytm1VMnVqxUvHT3qHdWKlF4BZ6PzCB70ns5Gf2UIhv4hPPlHzIUPk/M9/\nVLBokfIzMuT+7W+VU+DW4xv2aNobOyo6vdeE0T69jRUK2aHhyM86WPkFAFTizMhQ8axZ8lx6qWSz\n+dQbWOkFYDI6vwCAKtHpBWACOr8AgEZhpRdAOKPzCx/0nsxGfmZrqvxsBw8q5sYbFfHppxVfq6rT\na6V9ehuLe89s5GcdTH4BwErKy+V6+WW1OOcceV0ulXfqxKQXgKXQ+QUAi4j44gvF3HyzZLOp6MEH\nte/ULnR6ARiPzi8AwFdxsWKnTVPx9OnKGj1Oi7flau0bO+j0ArAcag/wQe/JbORnNr/k563iF3pR\nUfp25ft66JRBmvbvr6k3BAD3ntnIzzpY+QUA0xUVyfHRR3KuWSPnmjUqnjJF7t//vuLl3EK3Fn3O\n7g0AINH5BQBjOTZuVNTf/ibHpk0qPeMMlQ4eLM/gwSrr3VuKiPB5DPH4HnR6AYQfOr8AYBHlrVqp\n5NprVTBwoNSiRcXXf5707mWlFwCqQOcXPug9mY38zFaRX1GRHKtXK3ruXMVOmVLlueWdOskzfHjF\nxJcty4KLe89s5GcdrPwCQKjweHTav/6lZg8+KMfmzSrt0UOlF1yg4rFja7yMJ7IBQN3R+QWAUOH1\nKmrePJX16SPPwIFS8+Y1nn7ipJd9egFYEZ1fAAhVhYVybNwo55o1KrnySpV37lz5dZtNxXfcUevb\nsNILAA1H5xc+6D2ZjfxCi33nTkU+8oiajRmj+K5dFfXYY/K2aiVvNau6NeVHpze0ce+Zjfyso9aV\n3/vvv19vvfWWWrZsqeXLl0uSunbtqs6/rFj07dtXc+fODewoAcBQjo8+kv2nn1Q8Y4ZKBwyQmjWr\n93uw0gsA/lNr53fLli1yOp26/fbbKya/vXv31pYtW2p8Yzq/ANA4dHoBoHZ+7/z27t1bWVlZjRoU\nAIS9wkIpOlqyN75NxkovAAROg/5X2u12a+zYsZo4caI+++wzf48JQUbvyWzk18TKy+X65z8V16+f\nHB991Ki0+EQNAAAb6klEQVS3yilwa87rn9DpNRT3ntnIzzoatNvDunXrlJCQoG3btmnmzJnKyMiQ\ny+XyOW/69OlKSUmRJMXFxSk1NVXnnnuupP/9I+OYY445NvV4kMOhmLlzlV9YqM033qgzBg5s0Pu9\nvWaDNhxwaufRKKXGenVt+zzFuvMUH50cUn9ejms+PiZUxsMx+YXr8bZt23TkyBFJUmZmpqZOnar6\nqNM+v1lZWZo2bVpF5/d448eP1/33369TTz210tfp/AIIW3l5ir3hBjk+/VRFd90lz9ixDao70OkF\ngMYL+D6/hw8fVlRUlKKiopSVlaXs7Gy1bdu2vm8DAOaKjVXpOeeo8IknpJiYel9OpxcAgqfWye89\n99yjjIwMHT58WIMGDdJll12m5cuXy+VyKSIiQvPmzVNUVFRTjBVNZP369RW/XoB5yK8JRESo5Jpr\n6n1ZXSa95GcusjMb+VlHrZPfu+66S3fddVelr82YMSNgAwKAUGLbv1/eVq0a9R6s9AJA6KhT57ch\n6PwCMJn9hx8UfdddsmdmKv+99ySbrd7vQacXAAIv4J1fAAhreXmK/vvf5Xr5ZZVMn67Cp5+u98SX\nlV4ACF2N340dYefEbV9gFvJrOOfKlYrr31+2nBzlrV+v4vT0nx9cUUc5BW49vmFPo/bpJT9zkZ3Z\nyM86WPkFgF+UJyer4LXXVNa7d72uY6UXAMxB5xcAGohOLwAEH51fAKhNXp5s5eXyxsc36HJWegHA\nXHR+4YPek9nIrwYej1wvvqi4fv3kXLWq3pf7o9NbG/IzF9mZjfysg5VfAOHv6FFFLlyoyMceU/lp\np6lgyRKV9ehR58tZ6QWA8EHnF0B4KyhQXP/+Ku3ZU8U33qiyvn3rfCmdXgAIfXR+AeB4zZop7913\n5W3Xrs6XsNILAOGLzi980Hsym6Xz81b9i6y6TnybotNbG0vnZziyMxv5WQcrvwCMZ8/MVORjj8lW\nVqaiv/+93tez0gsA1kHnF4Cx7F9/rahHHpHz3XdVcuWVKpk2Td7ExDpfT6cXAMxH5xdA+PN6FTNj\nhpyrV6vk2muVt3mzvHFxdb6clV4AsC46v/BB78lslsjPZpN74kQd2bJFxTffXOeJbyh0emtjifzC\nFNmZjfysg5VfAEYqPe+8Op/LSi8A4Bg6vwBCU3m5nG+/LceGDTr617826C3o9AJA+KPzC8BspaVy\nLVumqL//Xd6YGBXfdNPPW5jZbHV+C1Z6AQDVofMLH/SezGZyfq6lS9Wib1+5XnlFRX/+s/JXr5Zn\n5Mg6T3xP7PTOD8FOb21Mzs/qyM5s5GcdrPwCCBlep1OFTz+tsrPPrtd1rPQCAOqKzi8AY9HpBQDQ\n+QUQ9ljpBQA0FJ1f+KD3ZDYj8vN61fz886WysnpdZsI+vY1lRH6oEtmZjfysg5VfAE2vsFAR338v\nRUTU6XRWegEA/kLnF0CTs/34o1r85jc6sn17jefR6QUA1IbOL4CQZ8vLk7d582pfZ6UXABAodH7h\ng96T2UzIz5aXJ2+LFj5ft0KntzYm5IeqkZ3ZyM86WPkF0ORseXnyxsVVHLPSCwBoKnR+ATS9/HzZ\nDx3STy1b0+kFADQKnV8AIS/HFqnFe2xa+8EODevESi8AoOnQ+YUPek9mC+X8qur0XtPfWp3e2oRy\nfqgZ2ZmN/KyDlV8AAUenFwAQKuj8AggY9ukFAARafTu/1B4A+F1V9YYZn7yhxHffDvbQAAAWx+QX\nPug9mS2Y+VW3T2/L7B8V9cgjKuO3QbXi/jMX2ZmN/KyDzi+ARqux0+v1Kua221Q8c6bKU1KCO1AA\ngOXR+QXQYHXp9DqXL1f0vHnKW7dOcrmCNFIAQLhin18AAVfn3RsKChQzZ44Kn36aiS8AICTQ+YUP\nek9mC2R+1XV6q9vBwVZQoOLp01V67rkBG1O44f4zF9mZjfysg5VfALVq6D693tatVTJtWhOMEACA\nuqHzC6Bax096h3VK0Pge7NMLAAgtdH4BNNqJk97547rqpDpMem0HDsibkNAEIwQAoGHo/MIHvSez\nNSa/4zu9UQ675o/rqmv6J1c78bVlZcm1eLFiZs9Wi7591aJ/f6moqMHfH9x/JiM7s5GfdbDyC6BB\nK73NLrpIEV9/rdJzzlHpwIEqueYalXXrJtn5mRoAELro/AIWduKkd1yPpP9Ner1e2XfulLdlS3mT\nknyuteXkyJuYKNlsTTxqAAD+h84vgFpVudIbGaGI7dvl2LBBjo0b5fjoI3ljYlT04IMq/fWvfd6j\nqgkxAAChrtbfT95///0aOHCgRo0aVfG1FStWKC0tTWlpaVqzZk1AB4imR+/JbDXlV1OnN+rRRxU7\nZYoivvpKnosuUt777yvv88+rnPgicLj/zEV2ZiM/66h15Xfo0KEaOXKkbr/9dkmS2+3WQw89pKVL\nl6qkpESTJ0/W4MGDAz5QAA2XU+DW4s17tfa7gxrRrFjzx/X16fQWz56t4htvDNIIAQBoGrVOfnv3\n7q2srKyK461bt6pjx45q2bKlJKl169basWOHunTpErhRokmdy9O4jFaRX0mJDm74VIu2H9B79kSN\n+ewdLdr7uZqNGqaS6AG+F/JBtZDA/WcusjMb+VlHvTu/ubm5SkxM1KJFixQXF6fExETl5OQw+QVC\nSE6BW4s3fq+139h0kcetF7sWqfnlt0gtWqgk2IMDACCIGrzUM2HCBA0fPlySZOPT3mGF3pMZbIcP\ny7lypaLvuUcqLZUk5Ra6Nef1T37u9Ma10Pzf99PVN45X82G/llq0CPKIURfcf+YiO7ORn3XUe+U3\nKSlJubm5FcfHVoKrMn36dKWkpEiS4uLilJqaWvFrhWP/yDjmmON6HPfvr8hnnpHnxRcV+9NP8vbr\np9IBA7Ry9TqtK2imnUejdEasV9e2z1OsJ08nRSeH1vg55jiMj48JlfFwTH7herxt2zYdOXJEkpSZ\nmampU6eqPuq0z29WVpamTZum5cuXy+12a/jw4RUfeLvyyiu1atUqn2vY5xfwv5gbb5R9zx4dveUW\nlfXurRy3qt+nFwAAC/D7Pr/33HOPMjIydPjwYQ0aNEh33XWX0tPTNXHiREnSnDlzGj5aAPVSdM89\nUvPmyin0aPGn9XsiGwAA4AlvqML69esrfr2A0FLjE9l+QX5mIz9zkZ3ZyM9cPOENCAP23bvljYyU\nt00bSdU8kY2VXgAA6o2VXyCUeDyKfPJJRT3xhIoee0w/nv9rOr0AANSAlV/AUBEff6zYm25Sebt2\n+u7tVfrnfqfWvrGDlV4AAPyIRzrBx4nbviDAvF5F33qrmk2Zoh/Sb9dfZj+kP3xSoCiHXfPHddU1\n/ZPrNfElP7ORn7nIzmzkZx2s/ALBZrNp73lD9OrwP2htVqGG/TLpZaUXAAD/o/MLBFFddm8AAADV\no/MLhLKyMikigt0bAAAIEjq/8EHvKTAiPv5YR9NG6Yk3N2vaGzsa3OmtDfmZjfzMRXZmIz/rYOUX\nCDDboUPKm/eAXis+Sasm/knD2pys+WnUGwAACAY6v0CgeL06vPgNLf7wG63qMUjDup2scX3aMekF\nAMCP6PwCISCnwK3Fm37U2kOtNTytg+b/JpVJLwAAIYDOL3zQe2q4nAK3Ht+w5+dOb5RL86/qq6mj\nz2zSiS/5mY38zEV2ZiM/62DlF/ADdm8AAMAMdH6BRsgpcGvxJz9o7bcHNeyM1hrXuy2TXgAAmhCd\nX6AJVKz0fpWtMZ+s0MKkckX97haJiS8AACGNzi980HuqXkWn9/Uv1WL5m1r0+j26evpoRd13txQb\nG+zhSSI/05GfucjObORnHaz8AnVwfKd3eKJdSx6eopjp16rkvjdU5uA2AgDAFHR+gRqc+EG2cT2S\ndFKUQ7b9++VNTAz28AAAsDw6v4Af1LZ7AxNfAADMROcXPqzce6ro9P7rK8X88L1etn+la/onG7WD\ng5XzCwfkZy6yMxv5WQcrv4CknAP5WvruF3o/36HRX32opStfVoseXeUeOVLuYA8OAAD4DZ1fWFpF\nveG7gxq9Y70uS/Kq2cD+KuvVS3Kas9oLAIBV0fkFqlJQIMfHH8u5YYOOpqcrR67Knd7x3XRSdE9J\nUlmQhwoAAAKHzi98hEvvKeLjjxU1b56aDxum+K5dFfX3v+un6Dg9/ulPmvbGDkU57Jo/rqtxnd7a\nhEt+VkV+5iI7s5GfdbDyi7DlXLtW8np19I9/1N7uvbX467yfV3pjojV/3K/CasILAADqhs4vzOR2\nK2LzZjnXr1dZaqo8aWlVnlblPr1MegEACBt0fhG27D/8INeyZXJ8+KEcn32mstNOU+nAgSo/+WSf\nc2vbpxcAAFgTnV/4CNXek+2nn2TLzlbJ1Kk6snWr8tes0dH77vt5Z4ZfVOzTG8ad3tqEan6oG/Iz\nF9mZjfysg5VfhAavVxH//a8cH34o+759OnrvvT6nlPXvr6P9+1d5OSu9AACgLuj8IiREfPyxWowY\nIc+gQSq5+mp5Ro+u03V0egEAsDY6vzBS2dlnq/CJJxR99911Op+VXgAA0BB0fuEjWL0n96RJKliy\nRPbMzGrPodNbO3prZiM/c5Gd2cjPOlj5RUgp69Wr0gfYjmGlFwAA+AOdX4Q0Or0AAKAmdH4RFk6c\n9C4Y0lrxbZOCPSwAAGA4Or/wEczeU3Wd3nbTrlH0LbdIbnfQxmYKemtmIz9zkZ3ZyM86mPwiJNT2\nQbaCV16Rfe9eNR89WrZ9+4I8WgAAYCo6vwiqenV6y8sV9fDDinzhBRUsWKCys89u2sECAICQQ+cX\nRmjQ7g12u4pvvlmlPXuq2VVXKW/1annbtWuaAQMAgLBA7QE+Atl78sc+vaW/+Y2OfPIJE99q0Fsz\nG/mZi+zMRn7WwcovmkSD9+nNz5dz/Xo51q3T0XvvlRy//JNt0SKwAwYAAGGJzi8CqiH79EZs3Spn\nRoYca9bIsXWrSs86S57Bg1UyZYoUG9tEIwcAACag84uQcPykd3jnBC0Y11Xxdaw2uF5+WXK5VDx7\ntkoHDpRiYgI8WgAAYBV0fuGjMb2n4zu90U67Fozrqqn9kitPfIuK5Fi9WhFbt1b5HkcffFBH//xn\nlf7mN0x8G4DemtnIz1xkZzbysw5WfuEXNa70er2K+PJLOd5/X841a+TYtEmlqakqnj1b6tEjuAMH\nAACWQucXjXLipHdcapJPvcH5738r+t575Rk8WKUXXijPwIF8YA0AAPgFnV80CZ+V3tGnKWHPLpVF\nJ/uc6xk1Sp4xY4IwSgAAgMoa3Pnt2rWrLr74Yl188cWaN2+eP8eEIKup93R8pzcm/4heLfpUNzx0\nkzqkdlX0HXdI3ip+kWCnWt6U6K2ZjfzMRXZmIz/raPDKb1RUlN58801/jgUhrNJKb6cELXnhFrXM\n3SvPhReqZNIkFT7zjLwnnRTsYQIAANSowZ3f3r17a8uWLdW+Tuc3DHg8yskv0eKvDvl0em379snb\nurVkswV7lAAAwMKarPPrdrs1duxYRUZGKj09XX369GnoWyHE2L/+WnkPP6GFaq2MvmkaltraZ59e\nb5s2QRwhAABAwzR48rtu3TolJCRo27ZtmjlzpjIyMuRyufw5NjQx25EjOvLQ41qYY9d7Z12uYR1P\n0vz+Her8cAqEhvXr1+vcc88N9jDQQORnLrIzG/lZR4MnvwkJCZKk1NRUJSUlKSsrS6eeemqlc6ZP\nn66UlBRJUlxcnFJTUyv+YR0rlnMcGscZy/6jbzO26r2eQ9Szq0fXtHEr1pGt+OiOITE+jjnmmONQ\nPz4mVMbDMfmF6/G2bdt05MgRSVJmZqamTp2q+mhQ5/fIkSOKjIxUVFSUsrKyNGnSJK1atUpRUVEV\n59D5NcPxH2QbkRShS8/vxEovAAAwRpN0fr///nvdfvvtcrlcioiI0Lx58ypNfBH6anwiGwAAQJhq\n0OS3d+/eWrlypb/HgiaQcyBfS9d+pfeLoqqd9K5fT+/JZORnNvIzF9mZjfyso0GTX5gnJ79ES5d/\nojUHpVEHv9aCmycrPoaVXgAAYC0N3ue3NnR+Q0NOgVtL1u7Q2sx8jd6xXmPHnK1mQwYFe1gAAAB+\n0WT7/CK0Hev0fvDVTxrz8dt6pU87RT90k+RktRcAAFiXPdgDgH/lFLj1+IY9mvbGDkU77VowpI0m\n/3Wmoq+bWueJ74nbvsAs5Gc28jMX2ZmN/KyDld8wUdPuDQHptQAAABiIzq/hKia93x7QiOQoXTrw\nNLYsAwAAlkHn1yIqJr3fHdJFed9p6TN/UuQ9d8gT3SXYQwMAAAhZdH4Nc2Knd2HWu5q1+iU5Vvxb\nnksv9cv3oPdkNvIzG/mZi+zMRn7WwcqvIarr9La44Q0VPvqoylNSgj1EAACAkEfnN8SdOOkdl5pU\n0em179ql5sOH68j27ZKdRXwAAGA9dH7DRE27N1TwenX0rruY+AIAANQRs6YQ47NP77iumtovucod\nHMpPPVXuiRP9PgZ6T2YjP7ORn7nIzmzkZx2s/IaIOq30AgAAoFHo/AZZTZ1eAAAA1IzOryFY6QUA\nAGh6dH6bWH06vcFC78ls5Gc28jMX2ZmN/KyDld8m4s+VXseaNXKuXq2j8+b5eZQAAADhjc5vgAWi\n0xuTnq6yX/1KJddf76dRAgAAmInOb4gIWKfX65Vz5UoVv/lm498LAADAYuj8+lmgO70Rn30mb2ys\nyjt29Mv7VYXek9nIz2zkZy6yMxv5WQcrv37it5Ver1fyeCSXy+el6DvvVOTzz+vo3Ll+GDEAAID1\n0PltpMZ0eu07d8q5fr3su3bJvnu3Inbtkv2HH3T0lltUMnu27wVFRVJUFI8zBgAA+AWd3yZS60pv\nfr4idu+WffdulScmquzss33eI+KbbxSxbZvKTjlFpX37qvyUU1TWoYPUokXV3zQmJjB/GAAAAItg\nCbGeaur0Oj74QM2HDlVcp06K79pVsdddJ9fixYrIzKzyvTwXXaSiRx5RyezZ8owZo7IePaqf+DYh\nek9mIz+zkZ+5yM5s5GcdrPzWxOORPTNT9l27dGD3j3otL0bvRSfroqJMLZh+qU+9oaxjRxX96U8q\n79BB3pNPlmy2IA0cAAAAVaHzm5cn+8GDKu/QweeliI8/VsEtc/TSoAla3a6HRnpzdFkbu5p366Ty\nTp2afqwAAACohM5vDWwHDijyH//434fLdu+WrbhYnkGDVPjqq5XOzSlwa3FZstZe+4iGd07Q/OM+\nyFYejMEDAACg0cKj8+t2y/7tt3JkZCjyuecU9be/VX1eRIRks6n0wgtVdO+9ylu/XoczMytNfAO9\nT68J6D2ZjfzMRn7mIjuzkZ91GL/yG/WXvyjq0UdV3qaNyjt0+HnHhNNPr/Jcb3y8im+/vcrXAvZE\nNgAAAIQM4zu/rhdfVOmQISqvR9fjeI3ZpxcAAADBZbnOr/uqqxp0HSu9AAAA1hMend96oNNbO3pP\nZiM/s5GfucjObORnHcav/NYVK70AAAAwvvNbGzq9AAAA4csand/S0p+fnhYRUe0prPQCAADgREZ2\nfp1vvaXYa6+t8jU6vY1H78ls5Gc28jMX2ZmN/KzDyJXfyFdeUcnll1f6Giu9AAAAqI1xnV/7rl1q\nPnSojmzbJkVF0ekFAACwsLDv/LpefVXu8eOVU2rX4g17WOkFAABAnZnV+S0t1eHl7+pvAyfQ6Q0g\nek9mIz+zkZ+5yM5s5Gcdxqz85hS4tXjj9/pgyoMalpigBRdSbwAAAED9hHznl04vAAAAqhM2nV92\nbwAAAIC/hVznl316g4/ek9nIz2zkZy6yMxv5WUfIrPyy0gsAAIBAC3rnl04vAAAAGsqYzi8rvQAA\nAGhqDe78rlixQmlpaUpLS9OaNWvqfB2d3tBH78ls5Gc28jMX2ZmN/KyjQSu/brdbDz30kJYuXaqS\nkhJNnjxZgwcPrvEaVnrN8dNPPwV7CGgE8jMb+ZmL7MxGftbRoMnv1q1b1bFjR7Vs2VKS1Lp1a+3Y\nsUNdunTxOZdJr3kiIyODPQQ0AvmZjfzMRXZmIz/raNDkd//+/UpMTNSiRYsUFxenxMRE5eTk+Ex+\nH9+wh0kvAAAAQkajPvA2YcIESVJGRoZsNpvP68c6vUx6zZKZmRnsIaARyM9s5GcusjMb+VlHg7Y6\n27Rpk5577jk988wzkqQrrrhCc+fOrbTyu337djVv3tx/IwUAAABOkJ+fr27dutX5/Aat/Kampuqb\nb77RwYMHVVJSouzsbJ/KQ30GAQAAADSFBk1+XS6X0tPTNXHiREnSnDlz/DooAAAAIBAC9oQ3AAAA\nINQ0+CEXAAAAgGmY/AIAAMAyGrXVWXW2bdum1atXy2azadiwYVU+/AKh6c4771Tr1q0lSR06dNDI\nkSODPCLU5J133tEXX3yh2NhYzZo1SxL3n0mqyo970Ax5eXlatGiRiouL5XA4NHToUJ1++uncf4ao\nLj/uv9BXVFSkl156SWVlZZKkQYMGKTU1tV73nt8nv6WlpVq1apWuu+46eTwePf/889z8BnE6nZox\nY0awh4E66t69u3r06KFly5ZJ4v4zzYn5SdyDprDb7Ro9erRat26tw4cP69lnn1V6ejr3nyGqyu/W\nW2/l/jNAZGSkpkyZIpfLpaKiIj366KPq1q1bve49v9cesrKylJSUpNjYWMXHxysuLk779u3z97cB\nICklJUUxMTEVx9x/ZjkxP5ijWbNmFSuE8fHxKisrU2ZmJvefIarKr7S0NMijQl1ERETI5XJJko4e\nPaqIiAjt2bOnXvee31d+CwoK1Lx5c33yySeKiYlRs2bNlJ+frzZt2vj7WyEASktL9dRTT1X8GqhD\nhw7BHhLqgfvPfNyD5vnmm2/Utm1bFRYWcv8Z6Fh+DoeD+88QJSUlevbZZ3Xw4EGNHz++3v/tC0jn\nV5L69esnSfryyy+rfPQxQtOtt96qZs2a6ccff9TChQt10003yeEI2D8TBAj3n7m4B82Sn5+vlStX\n6ne/+5327t0rifvPJMfnJ3H/mSIyMlKzZs1Sbm6uXnnlFV144YWS6n7v+b320Lx5c+Xn51ccH5uN\nwwzNmjWTJCUnJ6tFixY6dOhQkEeE+uD+Mx/3oDk8Ho8WLVqkYcOGqWXLltx/hjkxP4n7zzSJiYmK\nj49XfHx8ve49v/84k5ycrJycHBUWFsrj8SgvL6+iV4PQdvToUTkcDjmdTh06dEh5eXmKj48P9rBQ\nD9x/ZisqKpLT6eQeNIDX69WyZcvUo0cPdezYURL3n0mqyo//BpohLy9PDodDMTExys/P1/79+9Wq\nVat63XsBecLbse0mJGnEiBHq3Lmzv78FAiAzM1PLli2Tw+GQzWbT0KFDK/5HAaFp+fLl2r59u4qK\nihQbG6vRo0fL4/Fw/xnixPz69u2rL774gnvQALt379YLL7ygpKSkiq9NnjxZu3fv5v4zQFX5jRo1\niv8GGmDPnj168803K44vuOCCSludSbXfezzeGAAAAJbBE94AAABgGUx+AQAAYBlMfgEAAGAZTH4B\nAABgGUx+AQAAYBlMfgEAAGAZTH4BAABgGUx+AQAAYBn/H1TsCnT3mJtQAAAAAElFTkSuQmCC\n",
       "text": [
        "<matplotlib.figure.Figure at 0x2a57d10>"
       ]
      }
     ],
     "prompt_number": 14
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Linearizing the Kalman Filter"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Now that we have seen an example of linearizing the Kalman filter we are in a position to better understand the math. \n",
      "\n",
      "We start by assuming some function $\\mathbf f$"
     ]
    }
   ],
   "metadata": {}
  }
 ]
}