Cleanup of Q material, and rename of FilterPy.

I renamed the functions that compute Q in FilterPy and had
not propogated that through the book.

I have renamed FilterPy from filterpy, and propogated that
change through the book.

Moved the material on SymPy from the short lived Appendix C
to Appendix A
This commit is contained in:
Roger Labbe committed 2014-11-16 09:41:41 -08:00
1 parent 9c0729d837
commit c1281bc47c
9 files changed
+582 -725

No files matched your search

@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:f358f0c9f6a227b3d0277e5be5d0a9a1dd6cd4b2acf4cfb48fa4f661a0e1add0"
"signature": "sha256:fed7ba512164fc952a0f0fbfb2a3ecd19c0cd7a80c987230271039a7ae2a51a6"
},
"nbformat": 3,
"nbformat_minor": 0,
@@ -261,7 +261,7 @@
"output_type": "pyout",
"prompt_number": 1,
"text": [
"<IPython.core.display.HTML at 0x7f90b149ad68>"
"<IPython.core.display.HTML at 0x7f0c1f6225f8>"
]
}
],
@@ -279,6 +279,8 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"**author's note**: In this chapter there is some duplication in my discussion of the Kalman filter code, and information about Q is strewn in a few different places. If it seems like I am repeating what I said, I am; this requires a copy edit.\n",
"\n",
"The techniques in the last chapter are very powerful, but they only work in one dimension. The gaussians represent a mean and variance that are scalars - real numbers. They provide no way to represent multidimensional data, such as the position of a dog in a field. You may retort that you could use two Kalman filters for that case, one tracks the x coordinate and the other tracks the y coordinate. That does work in some cases, but put that thought aside, because soon you will see some enormous benefits to implementing the multidimensional case.\n",
"\n",
"In this chapter I am purposefully glossing over many aspects of the mathematics behind Kalman filters. If you are familiar with the topic you will read statements that you disagree with because they contain simplifications that do not necessarily hold in more general cases. If you are not familiar with the topic, expect some paragraphs to be somewhat 'magical' - it will not be clear how I derived a certain result. I prefer that you develop an intuition for how these filters work through several worked examples. If I started by presenting a rigorous mathematical formulation you would be left scratching your head about what all these terms mean and how you might apply them to your problem. In later chapters I will provide a more rigorous mathematical foundation, and at that time I will have to either correct approximations that I made in this chapter or provide additional information that I did not cover here. \n",
@@ -393,7 +395,7 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90cd8cbef0>"
"<matplotlib.figure.Figure at 0x7f0c1f611d68>"
]
}
],
@@ -561,7 +563,7 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a973acc0>"
"<matplotlib.figure.Figure at 0x7f0bfb44d550>"
]
}
],
@@ -615,7 +617,7 @@
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAA1QAAAG3CAYAAACzLhRYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmwZGV5P/Dv2Xvvu987d2bYFBhIJQaxiFLKAG6IGIGS\nlCmLWDFkRCMRIwIhQZMfClS0gihSFlSCZSooLixWkiIBrYJCUFECpkBGmfXO3K3X06fPvv3+6JmB\nYdZ7b3efXr6fKurO3DtzznOY7qfPc973fV5h69atMYiIiIiIiGjFxKQDICIiIiIi6lcsqIiIiIiI\niFaJBRUREREREdEqsaAiIiIiIiJaJRZUREREREREq8SCioiIiIiIaJVYUA2pr3/969i0aVPSYRzT\npk2bcNdddyUdBhGtEnMNEa1Vv+SRdvv5z3+OTZs24dlnn006FDoGOekAKDmCIBz2+7qu4zvf+Q5+\n/OMfY/fu3QCAN77xjdiyZQs2b9686vP5vo+77roLDz30EHRdx2mnnYbPfOYzOPfcc1d9TCLqfcw1\nRLRW3c4jDz/8MJ544gk899xzWFpawgc+8AF8+ctfXvXxnnnmGfzgBz/A888/j3K5jJmZGbzjHe/A\nNddcg2KxuOrjUm/gCNUQi+PD7+n8wgsv4Bvf+AbWr1+Pv/7rv8anPvUpOI6Dj3/847j//vtXfb4v\nfvGLuOeee/Ce97wHf/d3fwcA2LJlC1544YVVH5OIeh9zDRGtVbfzyLe+9S08/fTTOPPMMwEcuaA7\nXnfccQdefPFFfOADH8DNN9+M888/Hw888ACuuOIKNJvNNR2bkscRKjrEG9/4Rjz22GOYmZk58L0r\nrrgC733ve3HnnXfiwx/+MERxZbX43Nwcvve97+EjH/kI/v7v/x4AcPHFF+M973kPvvrVr+K+++5r\n6zUQUe9jriGitepEHgGAu+++G7OzswDQlumGN954I9785jcf9L3169fj1ltvxQ9/+EN89KMfXfM5\nKDkcoaJDzM7OHpSYACCVSuFNb3oTdF1HtVpd8TF/8pOfII5jXH755Qe+l8vlcNFFF+EXv/gFDMNY\nc9xE1F+Ya4horTqRR/Yft51eX0wBwNve9jYAwPbt29t6Luo+FlR03CqVCjRNW9Vc361bt0KSJJx+\n+ukHff+MM85AGIb43e9+164wiajPMdcQ0VqtJY90S7lcBgBMTU0lHAmtFQsqOi6/+c1v8Nxzz+Hi\niy+Goigr/vulUgnFYhGSJOGb3/wm3vKWt+AXv/gFxsfHAbyaVIhouDHXENFarTWPdMv9998PWZZx\nySWXJB0KrRELKjom27Zx/fXXY2xsDJ/97GdXdQzP8w4ktfn5eZimiUqlAlVVAQCO47QtXiLqT8w1\nRLRW7cgj3fDwww/jsccew5YtW3DiiScmHQ6tEQsqOqooinDDDTdg165duPPOOzExMbGq46iqCs/z\nAAD/8A//gCeffBLve9/7DnwvlUq1LWYi6j/MNUS0Vu3KI532wgsv4POf/zw2b96Ma665JulwqA3Y\n5Y+O6vbbb8djjz2GL3/5y3jLW96y6uNMTk5C13WEYQhJkjA5OQmgNccZQM8mPSLqDuYaIlqrduWR\nTtq1axeuvvpqnHrqqfjqV7+65nbs1Bs4QkVH9K//+q/49re/jRtvvHHN83tPP/10RFGEl19++aDv\nv/TSSxBFEaeeeuqajk9E/Yu5hojWqp15pFMqlQquuuoqFAoF3HvvvUin00mHRG3CgooO6z/+4z/w\n5S9/GVdffXVb9ka48MILIYoiHnzwwQPfazabePTRR3HOOecgn8+v+RxE1H+Ya4hordqdR1bjscce\nw0UXXYQbbrjhsD83TRNbtmyB53m47777MDY21uUIqZM45Y8O8etf/xo33ngjTjrpJJxyyil45JFH\nDvr529/+9gMds47Xxo0b8aEPfQj3338/BEHAqaeeih/84AcwDAPXXnttO8Mnoj7BXENEa9WJPAK0\n9rR77Uj3b3/7W9x9990AgHe+852HbM1gGAZ27tx5xBbon/vc5/Diiy9iy5YtePbZZw/62eTkJM49\n99wVx0i9gwUVHWLbtm0IggA7d+7E9ddff9DPBEHAt7/97VUlp5tvvhmjo6N46KGH8L3vfQ+nn346\n7rnnHvzhH/5hu0Inoj7CXENEa9WpPPLYY4/hoYceOnCcrVu34uWXX4YgCJidnT2koDrWWqj9f/ee\ne+455GfnnHMOC6o+x4KKDnHZZZfhsssua/txFUXBZz7zGXzmM59p+7GJqP8w1xDRWnUqj9x22224\n7bbb2hbHT37yk3aERT2Ka6iIiIiIiIhWiQUVERERERHRKrGgGlKCIHDvAyLqOOYaIlqrYc4jw3rd\n/UbYunVrnHQQRERERERE/YgjVERERERERKvEgoqIiIiIiGiVWFANqa9//evYtGlT0mEc06ZNm3DX\nXXclHQYRrRJzDRGtVb/kkXb7+c9/jk2bNh2yETD1Hu5DNcSOtdDxkUcewb333ovdu3djZmYGV155\nJa688spVnWvbtm347ne/i6effhrz8/MoFAr4gz/4A1x77bV4wxvesKpjElF/6GauAYBXXnkFX/nK\nV/CrX/0Kvu/jtNNOw1/91V9h8+bNqz4mESXraHnkl7/8JX70ox/hueeewyuvvILp6Wk88cQTqz5X\nJ+5ZnnnmGfzgBz/A888/j3K5jJmZGbzjHe/ANddcg2KxuOpYqTdwhGqIxfGR+5H813/9F2644Qas\nW7cON998M37/938fX/rSl3Dfffet6lwPPfQQfvSjH+GP/uiPcNNNN+FP//RP8b//+7+4/PLL8eKL\nL672EoioD3Qz1ywtLeEjH/kIfv3rX+Oqq67CddddB8/z8IlPfAJPP/30ai+BiBJ2tDzy3//933jk\nkUcwOjqKiYmJNXfG68Q9yx133IEXX3wRH/jAB3DzzTfj/PPPxwMPPIArrrgCzWZzTfFS8jhCRYeI\n4xhf+cpXsGnTJtxzzz0QBAFXXHEFdF3HN77xDXz4wx9GOp1e0TEvvvhifOpTn0IqlTrwvfPPPx+X\nXnop7r77bnzjG99o92UQUY/rRK757ne/C13X8e///u84++yzAQCXX3453vWud+HOO+/Eueee24lL\nIaIE/eVf/iWuv/56KIqCK6+8EnNzc2s6XifuWW688Ua8+c1vPuh769evx6233oof/vCH+OhHP7qm\nmClZHKGiQ2zduhXz8/O49NJLD3rK86EPfQjNZhM/+9nPVnzMM88886DEBLTWLIyMjGD79u1rjpmI\n+k8ncs1LL72EdDp9oJgCgEwmg7e97W349a9/jWq12pbYiah3TE1NQVGUth2vE/csry+mAOBtb3sb\nAPA+aACwoKJDvPzyywCAM84446Dv7//91q1b23Iex3Fgmiampqbacjwi6i+dyDWCIEBV1UO+n0ql\nEMcxb1yIaFU6cc9SLpcBgPdBA4AFFR2iVCoBACYmJvDMM8/gLW95C+69915MTEwAeDUBrNX3v/99\n+L6PSy+9tC3HI6L+0olcc/LJJ0PXdczPzx/4XhzHeOGFFwCAI1REtCqduGe5//77IcsyLrnkkrYd\nk5LBgooO4XkeAEBRFFQqFTSbTczPzx946us4zprPsW3bNvzzP/8zzjnnHFx22WVrPh4R9Z9O5JoP\nfehDkCQJN954I1566SXs2LEDt9xyC5aXlwEAruu27wKIaCh04p7l4YcfxmOPPYYtW7bgxBNPbMsx\nKTlsSkGH2H8z4/s+LrnkEpxzzjmYmpo60IXm9fOKV6pWq+ETn/gERkdHcccdd6w5XiLqT53INW94\nwxvwhS98Abfffjsuv/xyAMApp5yCT37yk7j99ttX3OSCiIZbJ+5ZXnjhBXz+85/H5s2bcc0117Tl\nmJQsjlDRISYnJwEcOre3UqkAwIHpOKvhOA4+8YlPQNd13HvvvRgfH19jtETUrzqVa/7kT/4EP/3p\nT/HAAw/gwQcfxH/+538e+Nm6devWEjIRDZFO3LPs2rULV199NU499VR89atfXXOLd+oNLKjoEKef\nfjqAVres19r/+/0/X6koivDZz34WW7duxTe/+U1u6Es05DqVawAgnU7jTW96E84880wIgoCf/vSn\nyGQyOPXUU1cfMBENjU7cs1QqFVx11VUoFAq49957OWI+QFhQ0SHOOOMMzM7O4uGHH0YURQe+/8Mf\n/hD5fB5vfetbV3Xcf/zHf8QTTzyBO++8E2eddVa7wiWiPtWpXPN6zz77LJ566ilccsklh+0ASETD\nZWlpCRdddBHe9773HfHPtPuexTRNbNmyBZ7n4b777sPY2Niaj0m9g2uo6LD+5m/+Btdddx22bNmC\n9773vfjZz36Gp556Ctdff/2qnqh861vfwgMPPIB3vvOdqNVqeOSRRw76+Qc/+MF2hU5EfaTduQYA\n/uIv/gJvetObsG7dOmzfvh3f+c53sG7dOlx77bVtjp6IesHLL7+Mn/zkJwCAvXv3otls4u677wbQ\nenBzwQUXHPTnfd/Hzp07jzjdrhP3LJ/73Ofw4osvYsuWLXj22WcP+tnk5CQ3He9zRy2oHn/8cdx7\n77146aWXcMkll+C2224D0HohfuELX8Cjjz6KYrGI66+//qhVPvWfSy65BEEQ4N5778X/+3//D+vW\nrcNNN92EP/uzP1vV8bZu3QpBEPDjH/8YP/7xjw/6mSAILKiI+WZItTvXAK0NOB9++GGUSiWMjIzg\nkksuwac//Wk+EaYDmG8Gy29+8xt87WtfA4ADRdLXvvY1CIKASy+99JCC6lg6cc/y8ssvQxAE3HPP\nPYf87JxzzmFB1eeOWlAVCgVcddVVePrppw9qX/utb30Lr7zyCp588km89NJL+PjHP46zzjLine truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a93e9278>"
"<matplotlib.figure.Figure at 0x7f0bfb4962b0>"
]
}
],
@@ -713,7 +715,7 @@
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAsgAAAGDCAYAAAA23OZEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGNxJREFUeJzt3X+s1nX9//HH+cHhnNPhl4hKDgWhTDqKLvJTKyWkEhFs\n08olTZ225Wzr12i1yuZi69esP9PWtNSs+bM0JXBSg9YPiITUQKYB/ijxByIhcI6Hc53vH83zfR0B\nuRTOdR3wdtvcuK7rxXU9OXtz7e6b94+G9evX9wUAAEiSNNZ7AAAAGEoEMgAAFAQyAAAUBDIAABQE\nMgAAFAQyAAAUmus9wGs99dRT9R4BAIC3gAkTJuz1+SEXyEly0kkn1XsEGGDs2LG56667MmPGjHqP\nAnuwfTJU2TYZytatW7fP1xxiAQAABYEMAAAFgQxVcugPQ5ntk6HKtsmhSCBDlXzJM5TZPhmqbJsc\nigQyAAAUBDIAABQEMgAAFAQyAAAUBDIAABQEMgAAFAQyAAAUBDIAABQEMgAAFAQyAAAUBDIAABQE\nMgAAFAQyAAAUBDIAABQEMgAAFAQyAAAUBDIAABQEMgAAFAQyAAAUBDIAABQEMgAAFAQyAAAUBDIA\nABQEMgAAFAQyAAAUBDIAABQEMgAAFAQyAAAUBDIAABQEMgAAFAQyAAAUBDIAABQEMgAAFAQyAAAU\nBDIAABQEMgAAFAQyAAAUBDIAABQEMgAAFAQyAAAUBDIAABQEMgAAFAQyAAAUBDIAABQEMgAAFAQy\nAAAUBDIAABQEMgAAFAQyAAAUBDIAABQEMgAAFAQyAAAUBDIAABQEMgAAFAQyAAAUBDIAABQEMgAA\nFAQyAAAUBDIAABQEMgAAFAQyAAAUBDIAABQEMgAAFAQyAAAUBDIAABQEMgAAFAQyAAAUBDIAABQE\nMgAAFAQyAAAUBDIAABQEMgAAFJpr+WELFizIX//61+zatSvHHntsvvCFL2TWrFm1HAEAGESVSl9+\n97eNufn367Jt5+4kyaj25lw8a2pmT5+YxsaGOk8I+1fTQP7MZz6T73znO2lpacmf/vSnfPazn83f\n/va3tLW11XIMAGAQ/HfnK7n0miVZs+G5dPdUBry2cv3mTDthXG5cMDsj21vqNCFUp6aHWLzrXe9K\nS0tL+vr60tPTk7e97W1paPB/kgBwqKtU+nLpNUuyYv3mPeI4Sbp7Klm5/tlces2SVCp9dZgQqlfT\n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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a947f8d0>"
"<matplotlib.figure.Figure at 0x7f0bfb1aa1d0>"
]
}
],
@@ -740,7 +742,7 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a93ecac8>"
"<matplotlib.figure.Figure at 0x7f0bfb1a78d0>"
]
}
],
@@ -767,7 +769,7 @@
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAs8AAAGDCAYAAADUAP09AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8XOV9L/7PmX3TMhrJkizJK7ZlLMxizGosTEIIISQt\nkJKlSctte0Mht80vJSnwuiVJnXKT26S0/fW2uW0T0pJmaYAAaRICJmCzOKy2wbbkfdFqSaPRMvt2\n7h/nPGeZGUlH8qKR5/N+vXhhjWaOjl/W9zzf53m+z/NIBw4ckEFERERERDOyzfcNEBEREREtFEye\niYiIiIgsYvJMRERERGQRk2ciIiIiIouYPBMRERERWcTkmYiIiIjIIsd834BVPT09830LRERERFQh\n2traSr6+YJJnAFi7du183wLNQSgUwpNPPonOzs75vhWiisLYI5ofjL2Fr6ura8rvsWyDiIiIiMgi\nJs9ERERERBYxeaZzgiU3RPODsUc0Pxh75y8mz3RO8CFCND8Ye0Tzg7F3/mLyTERERERkEZNnIiIi\nIiKLmDwTEREREVnE5JmIiIiIyCImz0REREREFjF5JiIiIiKyiMkzEREREZFFTJ6JiIiIiCxi8kxE\nREREZBGTZyIiIiIii5g8ExERERFZxOSZiIiIiMgiJs9ERERERBYxeSYiIiIisojJMxERERGRRUye\niYiIiIgsYvJMRERERGQRk2ciIiIiIouYPBMRERERWXTOkudt27bhzjvvxEUXXYQHHnhAez2TyeDB\nBx/EZZddhi1btuCXv/zlubolIiIiIqJZcZyrH1RdXY0//MM/xGuvvYZkMqm9/r3vfQ+HDx/Gjh07\nsH//fnz2s5/FpZdeiqampnN1a0RERERElpyzkecrrrgCN954I2pqakyvP/vss/j0pz+NQCCAK664\nApdeeimef/75c3VbRERERESWnbORZ0GWZdPXx48fx/Lly3HffffhhhtuwMqVK3Hs2LFzfVtERERE\nRDM658mzJEmmrxOJBHw+Hw4dOoSOjg74/X4MDg6W/GwoFDoXt0hnmNPpBMB/P6JzjbFHND8Ye+e3\neR959nq9SCQSePrppwEAX/va1+D3+0t+duvWrdqfN2/ejM7OzrN3o0RERERUEbZv344dO3ZoX2/Z\nsmXK9877yPOyZctw5MgRrFu3DgBw5MgRvO997yv52Xvuucf0dTgcPjs3SWeU6Hnz34vo3GLsEc0P\nxt7C09HRgY6ODu3rrq6uKd97zhYM5vN5pFIp5HI55HI5pNNpZLNZ3HzzzXjssccwOTmJ119/Hbt3\n78aNN954rm6LiIiIiMiyczby/NRTT+HBBx/Uvn7mmWfwuc99DnfffTeOHj2Kzs5O1NTU4OGHH0Zj\nY+O5ui0iIiIiIsukAwcOyDO/bf719PRg7dq1830bNAecviKaH4w9ovnB2Fv4urq60NbWVvJ7PJ6b\niIiIiMgiJs9ERERERBYxeSYiIiIisojJMxERERGRRUyeiYiIiIgsYvJMRERERGQRk2ciIiIiIouY\nPBMRERERWcTkmYiIiIjIIibPREREREQWMXkmIiIiIrKIyTMRERERkUVMnomIiIiILGLyTERERERk\nEZNnIiIiIiKLmDwTEREREVnE5JmIiIiIyCImz0REREREFjF5JiIiIiKyiMkzEREREZFFTJ6JiIiI\niCxi8kxEREREZBGTZyIiIiIii5g8ExERERFZxOSZiIiIiMgiJs9ERERERBYxeSYiIiIisojJMxER\nERGRRUyeiYiIiIgsYvJMRERERGQRk2ciIiIiIouYPBMRERERWcTkmYiIiIjIIibPREREREQWMXkm\nIiIiIrKIyTMRERERkUVMnomIiIiILGLyTERERERkEZNnIiIiIiKLmDwTEREREVnE5JmIiIiIyCIm\nz0REREREFjF5JiIiIiKyiMkzEREREZFFTJ6JiIiIiCxi8kxEREREZBGTZyIiIiIii5g8ExERERFZ\nxOSZiIiIiMgiJs9ERERERBYxeSYiIiIisqhskucDBw7g4x//ODZs2IAPfvCD2LZt23zfEhERERGR\nSdkkz1/60pdw/fXX4+2338ZDDz2E++67D2NjY/N9W0REREREmrJJno8ePYqbbroJAHDNNdfA7Xaj\nt7d3nu+KiIiIiEhXNsnzddddh2effRa5XA6vvPIKAoEAVq9ePd+3RURERESkccz3DQj3338/7rrr\nLvzDP/wDXC6X9n+jUCg0T3dHp8PpdALgvx/RucbYI5ofjL3zW1kkz8lkEr//+7+PBx54AO9///vx\nzjvv4J577sFPf/pTLF68WHvf1q1btT9v3rwZnZ2d83G7RERERHQe2b59O3bs2KF9vWXLlinfWxbJ\n88GDBxGLxXDjjTcCADZs2IC2tjbs3r3blDzfc889ps+Fw+Fzep80N6LnzX8vonOLsUc0Pxh7C09H\nRwc6Ojq0r7u6uqZ8b1nUPLe2tiKZTGLbtm2QZRnvvfcejhw5ghUrVsz3rRERERERacpi5Lmurg6P\nPPIIHnnkEXzpS19CKBTCgw8+iPb29vm+NSIiIiIiTVkkzwBwww034IYbbpjv2yAiIiIimlJZlG0Q\nERERES0ETJ6JiIiIiCxi8kxEREREZBGTZyIiIiIii5g8ExERERFZxOSZiIiIiMgiJs9ERERERBYx\neSYiIiIisojJMxERERGRRUyeiYiIiIgsYvJMRERERGQRk2ciIiIiIouYPBMRERERWcTkmYiIiIjI\nIibPREREREQWMXkmIiIiIrKIyTMRERERkUVMnomIiIiILGLyTERERERkEZNnIiIiIiKLmDwTERER\nEVnE5JmIiIiIyCImz0REREREFjF5JiIiIiKyiMkzEREREZFFTJ6JiIiIiCxi8kxEREREZBGTZyIi\nIiIii5g8ExERERFZxOSZiIiIiMgiJs9ERERERBYxeSYiIiIisojJMxERERGRRUyeiYiIiIgsYvJM\nRERERGQRk2ciIiIiIouYPBMRERERWcTkmYiIiIjIIibPREREREQWMXkmIiIiIrKIyTMRERERkUVM\nnomIiIiILGLyTERERERkEZNnIiIiIiKLmDwTEREREVnE5JmIiIiIyCImz0REREREFjF5JiIiIiKy\niMkzEREREZFFTJ6JiIiIiCxi8kxEREREZFHZJM/JZBIPPfQQrrzySmzcuBFf/epX5/uWiIiIiIhM\nHPN9A8LDDz+Mnp4e/PznP0coFMLhw4fn+5aIiIiIiEzKInlOJpN4+umn8eSTT6K+vh4AsGrVqnm+\nKyIiIiIis7Io2zh+/DgkScK2bdtw7bXX4pZbbsG2bdvm+7aIiIiIiEzKYuQ5Go0ik8mgt7cXL774\nInbt2oW7774bzz33HBoaGrT3hUKhebxLmiun0wmA/35E5xpjj2h+MPbOb5aT5/7+frz11luIRCK4\n7bbbUFVVhb179yIUCqG5ufm0bsLj8SCXy+Guu+6Cy+XClVdeieXLl2PPnj14//vfr71v69at2p83\nb96Mzs7O0/q5RERERETbt2/Hjh07tK+3bNky5XstJc/d3d344Q9/iBUrVuDo0aPIZDIAgMHBQezZ\nswef+tSnTuuG29raIEnSjO+75557TF+Hw+HT+rl0boieN/+9iM4txh7R/GDsLTwdHR3o6OjQvu7q\n6pryvZaS5xdeeAG33norLr/8cvzlX/6l9vqaNWvw5ptvnsatKmpqarBx40Z873vfw0MPPYTdu3fj\n2LFjuPjii0/72jS/fvBiN7bvHYDdZsPNl7fh1itXzPctEVWEHe/14vFXX0Y8lcGGlSF89kPrYbPN\nPEhBRKfncP8Yvvjd1zA8FseKxgDuu30DfB7nfN8WnUGWkueRkRGsXLmy6HWfz4dkMnlGbuThhx/G\nAw88gI0bN6KxsRF//dd/bap3poUlm8vjK9/fiUef26+99vRrB3Hotgj+v9suszTTQERz8+/b9uN/\n/ttryOVlAMAv3ziC3UeH8bd3Xw+vqyyWuhCdl17d148/+tvnMR5Pa6/t7BrAo3/2ATQF/fN4Z3Qm\nWXqKBgIBDA0NIRgMml4/ceJE0Wtz1draiscee+yMXIvm39d++DoefW4/XA4bvvJ7nYgm0/j6D17D\nt558B26XHffeesl83yLReemJVw7hgUdfBQD88Ucuw9ol9XjwX1/Ef71+DLIM/POfvn+GKxDRXOw/\nGcanvvFLZHJ5fHDjSnz8hgvx5UdfwrvHRvA7f/VzbPv67XA57PN9m3QGWEqeN27ciGeeeQY333wz\nZFnGyMgIDh8+jOeff56L9qjIwd4IvvurfbBJEv7jz2/GrdddBABYGvLgs3//Av72p7tw+6ZV7IUT\nnWHRRBp/9cM3AABf/t2r8MDvXg8AuLClCrd+5Wn8/I1jeGVfHzata5nHuyQ6/8iyjC8/thOZXB53\nXLcK/3b/b8Nut+GyZTX4rb/8GY4MjOO7v9qHu29ZP9+3SmeApX2eN2/ejIsvvhiPP/44stksHnvs\nMfziF7/A5ZdfjmuvvfZs3yMtIOIBksvL+N33teOaCxdr3/vwlStw8+XLEE9l8fCP3pjHuyQ6P/3/\nz+zBqbE4Ll3ZgD+8SV/4snZJHf7HR5TZnq889htkc/n5ukWi89Iv3jyO1/YPIBhw46ufvhp2u5Je\nhaq92PqZqwEAjzz5DobH4/N5m3SGWC5++8AHPoDOzk4MDw8DABoaGuB2u8/ajdHCtLNrADv29qHG\n58IX77i86Pt/8akr8cLuk3jilcO499aLsaa1bh7ukuj8E55I4J9/8S4A4KufvrpoceB//9BF+OFL\n3ejqGcXTO4/g9k08xZXoTJBlGV//T2XzhC9+7HLU+s250fXr2/D+S5dg266T+Idn9uCrn7Line truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a93b2940>"
"<matplotlib.figure.Figure at 0x7f0bfaf8deb8>"
]
}
],
@@ -798,7 +800,7 @@
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAs8AAAGDCAYAAADUAP09AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8XOV9L/7PmX0fSaORZFmbLRu8CGxjtrDYmC0kJCEh\nkIQsJdybtClN7m170zTQNrn90dJXmqZpmrS/JPdmaaHJJVAIcAlgzGKzg/dN3iRrX2aRNItmnzn3\nj3OeMzOyJB/bWgb8eb9evOzRnBkf4PE5n/M83+d5pKNHj8ogIiIiIqLTMiz2CRARERERvVcwPBMR\nERER6cTwTERERESkE8MzEREREZFODM9ERERERDoxPBMRERER6WRa7BPQq7+/f7FPgYiIiIjOE83N\nzdP+/D0TngFg9erVi30KRKfw+Xx4/PHHsXnz5sU+FaIybJtUydg+qZJ1dnbO+B7LNoiIiIiIdGJ4\nJiIiIiLSieGZaA6wpIgqFdsmVTK2T3ovYngmmgO8AVClYtukSsb2Se9FDM9ERERERDoxPBMRERER\n6cTwTERERESkE8MzEREREZFODM9ERERERDoxPBMRERER6cTwTERERESkE8MzEREREZFODM9ERERE\nRDoxPBMRERER6cTwTERERESkE8MzEREREZFODM9ERERERDoxPBMRERER6cTwTERERESkE8MzERER\nEZFODM9ERERERDoxPBMRERER6cTwTERERESk04KF523btuHTn/40LrroItx3333az7PZLO6//35c\ncskl2LJlC5599tmFOiUiIiIiojNiWqg/yOPx4Etf+hLeeOMNpFIp7ee//OUvceLECezYsQOHDx/G\nH/zBH2DDhg1oaGhYqFMjIiIiItJlwXqeL7/8ctx0003wer1lP3/uuefwhS98AS6XC5dffjk2bNiA\nF154YaFOi4iIiIhItwXreRZkWS573dPTg2XLluHrX/86rr/+erS3t+PkyZMLfVpERERERKe14OFZ\nkqSy18lkEg6HA8ePH0dHRwecTidGRkam/azP51uIUyQ6I2azGQDbJ1Uetk2qZGyf9F616D3Pdrsd\nyWQSTz75JADgb/7mb+B0Oqf97AMPPKD9ftOmTdi8efP8nSgRERERnRe2b9+OHTt2aK+3bNky47GL\n3vPc1taGrq4urF27FgDQ1dWFG264YdrP3nvvvWWvw+Hw/Jwk0RkQvSZsj1Rp2DapkrF9UiXp6OhA\nR0eH9rqzs3PGYxdswmChUEA6nUY+n0c+n0cmk0Eul8OHPvQhPPTQQ4jFYnj77bexd+9e3HTTTQt1\nWkREREREui1Yz/Nvf/tb3H///drrp556Cl/96lfxla98Bd3d3di8eTO8Xi8efPBB1NfXL9RpERER\nERHpJh09elQ+/WGLr7+/H6tXr17s0yA6BYceqVKxbVIlY/ukStbZ2Ynm5uZp3+P23EREREREOjE8\nExERERHpxPBMRERERKQTwzMRERERkU4Mz0REREREOjE8ExERERHpxPBMRERERKQTwzMRERERkU4M\nz0REREREOjE8ExERERHpxPBMRERERKQTwzMRERERkU4Mz0REREREOjE8ExERERHpxPBMRERERKQT\nwzMRERERkU4Mz0REREREOjE8ExERERHpxPBMRERERKQTwzMRERERkU4Mz0REREREOjE8ExERERHp\nxPBMRERERKQTwzMRERERkU4Mz0REREREOjE8ExERERHpxPBMRERERKQTwzMRERERkU4Mz0RERERE\nOjE8ExERERHpxPBMRERERKQTwzMRERERkU4Mz0REREREOjE8ExERERHpxPBMRERERKQTwzMRERER\nkU4Mz0REREREOjE8ExERERHpxPBMRERERKQTwzMRERERkU4Mz0REREREOjE8ExERERHpxPBMRERE\nRKQTwzMRERERkU4Mz0REREREOjE8ExERERHpxPBMRERERKQTwzMRERERkU4Mz0REREREOjE8ExER\nERHpxPBMRERERKRTxYTno0eP4jOf+Qw2btyIW265Bdu2bVvsUyIiIiIiKlMx4fkb3/gGrrvuOuza\ntQvf+ta38PWvfx0TExOLfVpERERERJqKCc/d3d344Ac/CAC46qqrYLVaMTAwsMhnRURERERUVDHh\n+dprr8Vzzz2HfD6P1157DS6XCxdccMFinxYRERERkca02CcgfPOb38Q999yDH/3oR7BYLNqvpXw+\n3yKdHdHMzGYzALZPqjxsm1TJ2D7pvaoiwnMqlcIXv/hF3Hfffbjxxhuxe/du3HvvvXjiiSfQ2Nio\nHffAAw9ov9+0aRM2b968GKdLRERERO8j27dvx44dO7TXW7ZsmfHYigjPx44dw+TkJG666SYAwMaN\nG9Hc3Iy9e/eWhed777237HPhcHhBz5NoOqLXhO2RKg3bJlUytk+qJB0dHejo6NBed3Z2znhsRdQ8\nNzU1IZVKYdu2bZBlGQcOHEBXVxeWL1++2KdGRERERKSpiJ7nmpoafP/738f3v/99fOMb34DP58P9\n99+PVatWLfapERERERFpKiI8A8D111+P66+/frFPg4iIiIhoRhVRtkFERERE9F7A8ExEREREpBPD\nMxERERGRTgzPREREREQ6MTwTEREREenE8ExEREREpBPDMxERERGRTgzPREREREQ6MTwTEREREenE\n8ExEREREpBPDMxERERGRTgzPREREREQ6MTwTEREREenE8ExEREREpBPDMxERERGRTgzPREREREQ6\nMTwTEREREenE8ExEREREpBPDMxERERGRTgzPREREREQ6MTwTEREREenE8ExEREREpBPDMxERERGR\nTgzPREREREQ6MTwTEREREenE8ExEREREpBPDMxERERGRTgzPREREREQ6MTwTEREREenE8ExERERE\npBPDMxERERGRTgzPREREREQ6MTwTEREREenE8ExEREREpBPDMxERERGRTgzPREREREQ6MTwTERER\nEenE8ExEREREpBPDMxERERGRTgzPREREREQ6MTwTEREREenE8ExEREREpBPDMxERERGRTgzPRERE\nREQ6MTwTEREREenE8ExEREREpBPDMxERERGRTgzPREREREQ6MTwTEREREenE8ExEREREpBPDMxER\nERGRThUTnlOpFL71rW/hiiuuwGWXXYa//uu/XuxTIiIiIiIqY1rsExAefPBB9Pf345lnnoHP58OJ\nEycW+5SIiIiIiMpURHhOpVJ48skn8fjjj6O2thYAsHLlykU+KyIiIiKichVRttHT0wNJkrBt2zZc\nffXVuPXWW7Ft27bFPi0iIiIiojIV0fMcj8eRzWYxMDCAl19+GXv27MFXvvIVbN26FX6/XzvO5/Mt\n4lkSTc9sNgNg+6TKw7ZJlYztk96rdIfnoaEh7Ny5E+Pj47j99tvhdrtx8OBB+Hw+LFmy5JxOwmaz\nIZ/P45577oHFYsEVV1yBZcuWYd++fbjxxhu14x544AHt95s2bcLmzZvP6c8lIiIiItq+fTt27Nih\nvd6yZcuMx+oKz0eOHMGvf/1rLF++HN3d3chmswCAkZER7Nu3D5/73OfO6YSbm5shSdJpj7v33nvL\nXofD4XP6c4nmgug1YXukSsO2SZWM7ZMqSUdHBzo6OrTXnZ2dMx6rq+b5xRdfxEc/+lHcfffdMBqN\n2s8vvPBC9PX1ncOpKrxeLy677DL88pe/RC6Xw86dO3Hy5EmsW7funL+baD79ZscxfPyvHsWXv/cM\nAhOJxT4dIk3PaBRf/M7T+OS3H8NzO3sW+3SINIWCjO8/vhsf+8vf4M9/+iIyufxinxLRGdHV8xwK\nhdDe3n7Kzx0OB1Kp1JycyIMPPoj77rsPl112Gerr6/Hd7363rN6ZqNI89VYX/uQn27XX+7uG8dhf\nfAQOm3kRz4oIGIul8Pm/fxYnR6IAgK07u/Hwn9+Ca9YuXeQzIwK+85t38aOn9wFQ2uZAYBw/+Mp1\nukagiSqBrp5nl8uFQCBwys97e3tRXV09JyfS1NSEhx56CHv27MFzzz1XVutMVGkGgjH88Y+V4HzP\nLevQUufBvu4Q/ufDby3ymREB/+OnO3ByJIo1rbW4c/NqZPMFfPmftmFiMr3Yp0bnuW17+vCjp/fB\naJDwJ5+8HE6bGf/52gk8/NKRxT41It10hefLLrsMTz31FA4ePAhZlhEKhfDOO+/g2WefxaWXXjrf\n50hUcX7xwmGks3l8+LJl+Nf/fgue+P/uhCQBj756DKFIcrFPj85jJ4YmsHV3L2xmI576m0/h3/78\nY7hyVQOiiQz+zytHF/v06Dz342f2AwD+7I5L8Xdfvh7//NUPAgB++uwBFAryYp4akW66wvOmTZuw\nbt06PPbYY8jlcnjooYfwu9/9Dpdeeimuvvrq+T5HoooymcriVy8rvSR/9NF1kCQJa9v8uHFDCzK5\nAh56aeZJBkTz7RdbDwEAbr96BZr8HhgMEr5y68Xae7l8YTFPj85jh/vCeLNzGE6bGXfftAYA8Okt\na9Doc6J7OIKX9/cv8hkS6aN7qbqbb74ZmzdvRjAYBAD4/X5YrdZ5OzGiSvX0W92IJjK4dGU91rcX\n6/K/dEsHXtjdh4dfPII//vgG1u/Rgktlcnj01eMAgP96S3HW+A3rW9BW70HPaBSv7B/AjRtaFusU\n6Tz28ItKp8NnNl8Aj8MCADAZDbjnprX42//zDh5+8QhuWM+2SZXvjHYYzOVycLlccLlcSCaTmJiY\nwMTExHydG1FFenGvssLMJ69ZUfbzq9c0oqHaiZHxSRzqHVuMU6Pz3FtHhjGZyqKjzYdVzTXazw0G\nCZ+8Wmmvov0SLSRZlrFtj7h2rix773b1WvrqoUGkMrkFPzeiM6Wr53n79u3Yvn27tr7zVKLine truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a94aa5c0>"
"<matplotlib.figure.Figure at 0x7f0bfb41c390>"
]
}
],
@@ -863,7 +865,7 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a96dc748>"
"<matplotlib.figure.Figure at 0x7f0bfb3689e8>"
]
}
],
@@ -965,7 +967,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Before we go any further let's gain some familiarity with the equations by programming them in Python. I have written a production quality implementation of the Kalman filter equations in my `filterpy` library, and we will be using that later in the chapter and the remainder of the book. We could just look at that code, but it contains a significant amount of code to ensure that the computations are numerically stable, that you do not pass in bad data, and so on. Let's just try to program this.\n",
"Before we go any further let's gain some familiarity with the equations by programming them in Python. I have written a production quality implementation of the Kalman filter equations in my `FilterPy` library, and we will be using that later in the chapter and the remainder of the book. We could just look at that code, but it contains a significant amount of code to ensure that the computations are numerically stable, that you do not pass in bad data, and so on. Let's just try to program this.\n",
"\n",
"The filter equations are *linear algebra* equations, so we will use the Python library that implements linear algebra - numpy. In the filter equations a **bold** variable denotes a matrix. Numpy provides two types to implement matrices: `numpy.array` and `numpy.matrix`. You might suspect that the latter is the one we want to use. As it turns out `numpy.matrix` does support linear algebra well, except for one problem - most of the rest of `numpy` uses `numpy.array`, not `numpy.matrix`. You can pass a `numpy.matrix` into a function, and get a `numpy.array` back as a result. Hence, the standard advice is that `numpy.matrix` is deprecated, and you should always use `numpy.array` even when `numpy.matrix` is more convienient. I ignored this advice in a early version of this code and ended up regretting that choice, and so now I use 'numpy.array' only.\n",
"\n",
@@ -1208,7 +1210,7 @@
" \n",
"And that is it, we have implemented a Kalman filter!\n",
"\n",
"Well, you probably do not want to cut and paste that code into every project that uses a Kalman filter. So let's put this into a class. I don't intend to teach you how to program here, so I will instead point you to my `KalmanFilter` class from my filterpy module, available on github [4]. However, I have written a simplified version of that class below for your inspection."
"Well, you probably do not want to cut and paste that code into every project that uses a Kalman filter. So let's put this into a class. I don't intend to teach you how to program here, so I will instead point you to my `KalmanFilter` class from my FilterPy module, available on github [4]. However, I have written a simplified version of that class below for your inspection."
]
},
{
@@ -1322,13 +1324,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"We will see how to use this class in the rest of the chapter, so I will not belabor its use here. There are several additions to the version in filterpy that make it more usable. For example, instead of using variables for the $R$, $P$, and so on, the `filterpy` version uses properties. This allows you to write something like:\n",
"We will see how to use this class in the rest of the chapter, so I will not belabor its use here. There are several additions to the version in `FilterPy` that make it more usable. For example, instead of using variables for the $R$, $P$, and so on, the `FilterPy` version uses properties. This allows you to write something like:\n",
"\n",
" dog_filter.R = 3\n",
" \n",
"and the class will recognize that $R$ is actually supposed to be a matrix and convert the $3$ into an appropriate matrix (we don't yet know what an 'appropriate' matrix for $R=3$ would be, but we will learn that soon).\n",
"\n",
"You can import the class from `filterpy` using the following import statement, and that is what we will do in the rest of this chapter and book:"
"You can import the class from `FilterPy` using the following import statement, and that is what we will do in the rest of this chapter and book:"
]
},
{
@@ -1598,6 +1600,13 @@
"\n",
"Designing the process noise matrix can be quite demanding, and we will put it off until the Kalman math chapter. In this chapter we will focus on building an intuitive understanding on how modifying this matrix alters the behavior of the filter. \n",
"\n",
"We think of the the underlying system as behaving as\n",
"\n",
"$$f(x) = \\mathbf{F}x + w$$\n",
"\n",
"where $\\mathbf{F}x$ is the state transition and $w$ is the process noise. In other words $\\mathbf{F}x$ is the 'true' behavior of the process as we understand it, and $w$ is things like winds, control surface fluctuations, maybe circuit noise - whatever affects our process that is not modelled.\n",
"\n",
"\n",
"As you might expect, the Kalman filter uses the process noise matrix during the prediction step because the prediction step is the step that uses the process model to predict the next state. It is used in equation (2) from the Kalman filter equations:\n",
"\n",
"$$\\mathbf{P} = \\mathbf{FP{F}}^\\mathsf{T} + \\mathbf{Q}$$\n",
@@ -1612,7 +1621,9 @@
"\n",
" sigma = sigma + movement_sigma\n",
" \n",
"$\\mathbf{P}$ is dimensioned $n\\times n$, so $\\mathbf{Q}$ must have the same dimensions. We are just adding matrices, so hopefully it is clear that each element in $\\mathbf{Q}$ specifies how much uncertainty is added to the system due to the process noise. We have not given the math for this yet, but if you suspect the math is simetimes difficult you would be correct. "
"$\\mathbf{P}$ is dimensioned $n\\times n$, so $\\mathbf{Q}$ must have the same dimensions. We are just adding matrices, so hopefully it is clear that each element in $\\mathbf{Q}$ specifies how much uncertainty is added to the system due to the process noise. \n",
"\n",
"We have not given the math for this yet, but if you suspect the math is simetimes difficult you would be correct. One of the problems is that we are usually modelling a *continuous* system - the behavior of the system is changing at every instant, but the Kalman filter is *discrete*. That means that we have to somehow convert the continuous noise of the system into a discrete value, which usually involves calculus. There are other difficulties I will not mention now."
]
},
{
@@ -1621,12 +1632,12 @@
"source": [
"However, for the class of problems we are solving in this chapter (*discretized continuous-time kinematic filters*), where we can directly compute the state equations for moving objects by using Newton's equations.\n",
"\n",
"For these kinds of problems we can rely on precomputed forms for $\\mathbf{Q}$. We will learn how to perform the computation in the next chapter. For now I present them without proof. If we assume that for each time period the acceleration due to process noise is constant and uncorrelated, we get the following.\n",
"For these kinds of problems we can rely on precomputed forms for $\\mathbf{Q}$. We will learn how to derive these matrices in the next chapter. For now I present them without proof. If we assume that for each time period the acceleration due to process noise is constant and uncorrelated, we get the following.\n",
"\n",
"For constant velocity the form is\n",
" $$\\begin{bmatrix}\n",
" \\frac{1}{4}{\\Delta t}^4 & \\frac{1}{2}{\\Delta t}^3 \\\\\n",
" \\frac{1}{2}{\\Delta t}^3 & \\Delta t\n",
" \\frac{1}{2}{\\Delta t}^3 & \\Delta t^2\n",
" \\end{bmatrix}\\sigma^2\n",
" $$\n",
"\n",
@@ -1637,21 +1648,26 @@
" \\frac{1}{2}{\\Delta t}^3 & {\\Delta t}^2 & \\Delta t \\\\\n",
" \\frac{1}{2}{\\Delta t}^2 & \\Delta t & 1\n",
" \\end{bmatrix} \\sigma^2\n",
" $$\n",
"\n",
"It is in general not true that acceleration will be constant and uncorrelated, but this is still a useful approximation for moderate time period, and will suffice for this chapter. Fortunately you can get a long way with approximations and simulation. Let's think about what these matrices are implying. We are trying to model the effects of *process noise*, such as the wind buffeting the flight of a thrown ball. Variations in wind will cause changes in acceleration, and so the effect on the acceleration is large. However, the effects on velocity and position are proportionally smaller. In the matrices, the acceleration term is in the lower right, and this is the largest value. A good rule of thumb is to set $\\sigma$ somewhere from $\\frac{1}{2}\\Delta a$ to $\\Delta a$, where $\\Delta a$ is the maximum amount that the acceleration will change between sample periods. In practice we pick a number, run simulations on data, and choose a value that works well. \n",
" $$\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It general it is not true that acceleration will be constant and uncorrelated, but this is still a useful approximation for moderate time period, and will suffice for this chapter. Fortunately you can get a long way with approximations and simulation. Let's think about what these matrices are implying. We are trying to model the effects of *process noise*, such as the wind buffeting the flight of a thrown ball. Variations in wind will cause changes in acceleration, and so the effect on the acceleration is large. However, the effects on velocity and position are proportionally smaller. In the matrices, the acceleration term is in the lower right, and this is the largest value. A good rule of thumb is to set $\\sigma$ somewhere from $\\frac{1}{2}\\Delta a$ to $\\Delta a$, where $\\Delta a$ is the maximum amount that the acceleration will change between sample periods. In practice we pick a number, run simulations on data, and choose a value that works well. \n",
"\n",
"The filtered result will not be optimal, but in my opinion the promise of optimal results from Kalman filters is mostly wishful thinking. Consider, for example, tracking a car. In that problem the process noise would include things like potholes, wind gusts, changing drag due to turning, rolling down windows, and many more factors. We cannot realistically model that analytically, and so in practice we work out a simplified model, compute $\\mathbf{Q}$ based on that simplified model, and then add *a bit* to $\\small\\mathbf{Q}$ in hopes of taking the uncalculable factors into account. Then we use a lot of simulations and trial runs to see if the filter behaves well; if it doesn't we adjust $\\small\\mathbf{Q}$ until the filter performs well. In this chapter we will focus on forming an intuitive understanding on how adjusting $\\small\\mathbf{Q}$ affects the output of the filter. In the Kalman Filter Math chapter we will discuss the analytic computation of $\\small\\mathbf{Q}$, and also provide code that will compute it automatically for you.\n",
"\n",
"For now we will just import it from the filterpy module, where it is already implemented. I will import it and call help on it so you can see the documentation for it."
"For now we will just import it from the `FilterPy` module, where it is already implemented. I will import it and call help on it so you can see the documentation for it."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from filterpy.common import Q_DWPA\n",
"help(Q_DWPA)"
"from filterpy.common import Q_discrete_white_noise\n",
"help(Q_discrete_white_noise)"
],
"language": "python",
"metadata": {},
@@ -1660,10 +1676,10 @@
"output_type": "stream",
"stream": "stdout",
"text": [
"Help on function Q_DWPA in module filterpy.common.discretization:\n",
"Help on function Q_discrete_white_noise in module filterpy.common.discretization:\n",
"\n",
"Q_DWPA(dim, dt=1.0, var=1.0)\n",
" Returns the Q matrix for the Discrete Wiener Process Acceleration\n",
"Q_discrete_white_noise(dim, dt=1.0, var=1.0)\n",
" Returns the Q matrix for the Discrete Constant White Noise\n",
" Model. dim may be either 2 or 3, dt is the time step, and sigma is the\n",
" variance in the noise.\n",
" \n",
@@ -1684,6 +1700,28 @@
],
"prompt_number": 23
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"Q = Q_discrete_white_noise(dim=2, dt=0.1, var=2.35)\n",
"Q"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 24,
"text": [
"array([[ 5.87500000e-05, 1.17500000e-03],\n",
" [ 1.17500000e-03, 2.35000000e-02]])"
]
}
],
"prompt_number": 24
},
{
"cell_type": "heading",
"level": 2,
@@ -1696,7 +1734,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"As we already explained, the Kalman filter equations are already implemented for you in the `filterpy` library, so let's start by importing it and creating a filter."
"As we already explained, the Kalman filter equations are already implemented for you in the `FilterPy` library, so let's start by importing it and creating a filter."
]
},
{
@@ -1771,7 +1809,7 @@
]
}
],
"prompt_number": 24
"prompt_number": 25
},
{
"cell_type": "markdown",
@@ -1786,17 +1824,17 @@
"cell_type": "code",
"collapsed": false,
"input": [
"dog_filter.x = np.array([[0], [0]]) # initial state (location and velocity)\n",
"dog_filter.F = np.array([[1,1], [0,1]]) # state transition matrix\n",
"dog_filter.H = np.array([[1,0]]) # Measurement function\n",
"dog_filter.R *= 5 # measurement noise\n",
"dog_filter.Q = Q_DWPA(2, var=0.) # process noise\n",
"dog_filter.P *= 500. # covariance matrix "
"dog_filter.x = np.array([[0], [0]]) # state (location and velocity)\n",
"dog_filter.F = np.array([[1,1], [0,1]]) # state transition matrix\n",
"dog_filter.H = np.array([[1,0]]) # Measurement function\n",
"dog_filter.R *= 5 # measurement noise\n",
"dog_filter.Q = Q_discrete_white_noise(dim=2) # process noise\n",
"dog_filter.P *= 500. # covariance matrix "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 25
"prompt_number": 26
},
{
"cell_type": "markdown",
@@ -1850,7 +1888,7 @@
" dog_filter.R *= R # measurement uncertainty\n",
" dog_filter.P *= cov # covariance matrix \n",
" if np.isscalar(Q):\n",
" dog_filter.Q = Q_DWPA(2, var=Q)\n",
" dog_filter.Q = Q_discrete_white_noise(dim=2, var=Q)\n",
" else:\n",
" dog_filter.Q = Q\n",
" return dog_filter\n",
@@ -1891,7 +1929,7 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 26
"prompt_number": 27
},
{
"cell_type": "markdown",
@@ -1958,19 +1996,18 @@
" ps = []\n",
" for p in P:\n",
" ps.append(p[index[0],index[1]])\n",
" plt.plot(ps)\n",
" "
" plt.plot(ps)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 27
"prompt_number": 28
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, call it. We will start by filtering 100 measurements with a noise factor of 30, $\\mathbf{R}=5$ and $\\mathbf{Q}=0$."
"Finally, call it. We will start by filtering 100 measurements with a noise factor of 30, $\\mathbf{R}=5$ and $\\mathbf{Q}=0.01$."
]
},
{
@@ -1985,9 +2022,9 @@
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a96e46d8>"
"<matplotlib.figure.Figure at 0x7f0bfb1c7ac8>"
]
},
{
@@ -1995,11 +2032,11 @@
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAs4AAAGHCAYAAACgU9QVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X101NW97/HPzCQhTxAggVAtmhCqRgI1ILEebCJSaONj\njxXlokT0ehYe6PGe46X1lFLrKay03FZWl6vY01pXeVC0alQsBNpglRxE8QGDIqBMQjSICY9CIAnJ\nTOb+ATMQzcMIycz+zX6/1mIRZpLJ/jbjt5/s39775/rwww8DAgAAANAtd7QHAAAAADgBwRkAAAAI\nA8EZAAAACAPBGQAAAAgDwRkAAAAIA8EZAAAACAPBGQAAAAgDwRkAAAAIQ1y0BwBEytq1a1VfX6+d\nO3dqzJgxuv3226M9JAAA4CAEZ1jhk08+UVNTk+666y61trbqe9/7nnJzczV27NhoDw0A0AkmO2Ai\nlmrACh999JEeeeQRSVJCQoJGjx6tLVu2RHlUAIDOnDnZsWDBAj3++OP0bBiB4AwrFBUV6bHHHgv9\nu6GhQTk5OVEcEQCgK0x2wFQs1YAV4uPjddFFF0mSduzYIUmaOHFiNIcEAOhCUVGRLrjggtC/Gxoa\n9P3vfz+KIwJOYsYZVmlpadFjjz2mRx99NNpDAQB0gckOmIrgDKs89thj+ulPf6rBgwdrz5490R4O\nAKAbTHbANARnWOOpp55SUVGR2tvbtWfPHlVVVUV7SACAbjDZAdOwxhmO19TUpEceeUQvvfSSDh06\n1OG5b33rW1q6dKnefvttLViwQO3t7ZIkl8ulJ554IhrDBQCEobPJjq9//evRHhYs5/rwww8D0R4E\ncLaam5s1c+ZMjRgxQnfccYeOHj2quXPn6r777tO3v/1tDRo0SElJSdEeJgDglHAnO0pKSr402TFu\n3LhoDBkIITjD0X75y1/qs88+Cx1bJEmLFi2S3+/XvHnzojgyAMAXMdkBp2OpBhzryJEjeuqpp/T8\n8893eLy1tVUulytKowIAdOW3v/2tMjMz9ctf/jL02I033qjq6mrddtttURwZEB42B8Kx3nnnHQ0e\nPFgjR47s8HhVVZW++c1vRmlUAIDOBCc77rvvvg6Pt7a2hpZkAKYjOMOxWltbNWzYsA6Pbd++XQcO\nHNB3v/vdKI0KANAZJjsQCwjOcKyCggIdPHhQPp9PknTs2DH94he/0K9//WslJCREeXQAgDMx2YFY\nwOZAONqrr76qiooKZWZmqqGhQdOmTdPo0aM7fM4//vEPtba2atu2bbr44ou1adMmzZgxQ5deemmU\nRg0A9jl06JBuu+02rV27VnFxcTp27Jjuuece3X///SooKIj28ICw9BicW1paVFpaqr/97W9qb2/X\n9ddfr5///Odqa2vTz3/+c61bt05paWn68Y9/rOLi4tDXLV++XH/4wx/U1tamadOm6f777+/zYoAv\n2rt3r06cOKHs7Gzdcsst+uMf/6ht27Zp7NixSk1NjfbwgD5B34apeprsqK+v15YtW/Tyyy/r4Ycf\nViAQ0O23366VK1dGcdTAaT2eqlFaWqq6ujqtWbNG6enpqq6uliQtXbpUXq9XlZWV2r59u2bNmqX8\n/HwNGzZMW7du1ZIlS7Ry5UqlpqZq+vTpys3N7dCggUg477zzJJ2c6fB4PBo8eLAKCwujPCqgb9G3\nYaqrr75aV199dZfP7969W2PHjtWTTz4p6eRSjszMzAiNDuhZt2ucW1patGrVKs2fP18ZGRlyuVyh\nRf3r1q3TjBkzlJqaqoKCAuXn56uioiL03JQpU5STk6PMzExNnTpV5eXlfV8N8AXV1dXauXOnKisr\nQwfnb9iwIcqjAvoOfRtOduWVV+r555/XDTfcIEl6/fXXddVVV0V5VMBp3Qbn2tpauVwurV+/XhMm\nTNB1112n9evXh57Lzs7W3LlzVV5erpycHO3evbvDc8uWLdOiRYs0cuTI0HNAJL3++ut65ZVX5Pf7\nJUnr169X//79ozwqoO/Qt+F07733Xmiig+AM03S7VOPYsWNqa2vTnj179Morr+jdd9/Vvffeq7//\n/e9qbm5WcnKydu3apby8PKWkpKi+vl6SQs95vV7t3btXhYWFampqikhBwJnuuOOOaA8BiCj6Npzu\nO9/5jl555RW9+eabamhoYKkGjNJtcE5MTJTf79ddd92lhIQEXXHFFcrOztbWrVuVlJSk5uZmrVq1\nSpK0cOFCpaSkSJKSkpLU1NSk+fPnS5IqKiqUnJzc6feoq6vrzXoAIKKGDx8e7SF00Nd9m56NvrRl\nyxa99957+pd/+RctX75cN910E+859Kpz7dndBufhw4d3euviQCCgrKwsVVdXa9SoUZJOriWdNGmS\nJCkrK0s1NTWhz/d6vRoxYkSX3yc3N/esBu806enpev7551VUVBTtoUQMNdvB1po3btwY7WF8SST6\n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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a9588ef0>"
"<matplotlib.figure.Figure at 0x7f0bfbc61b00>"
]
}
],
"prompt_number": 28
"prompt_number": 29
},
{
"cell_type": "markdown",
@@ -2075,7 +2112,7 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 29
"prompt_number": 30
},
{
"cell_type": "markdown",
@@ -2104,7 +2141,7 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 30
"prompt_number": 31
},
{
"cell_type": "markdown",
@@ -2162,9 +2199,9 @@
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"png": "iVBORw0KGgoAAAANSUhEUgAAAsoAAAGDCAYAAAAyKTZ5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlcVPX+x/HXzDDDMiwKKiouKFqWpGJqlgUuYVGW5m03\ny8rC1HbT8nazrv64dW+7aVHWtcxut9ui3nLJnesuFWa5I5q4w7iwDMzAzO8Pk6tXLJGBw/J+Ph4+\nGM58zzkfPqK+OX7P95i2bt3qRURERERETmM2ugARERERkZpIQVlEREREpBwKyiIiIiIi5VBQFhER\nEREph4KyiIiIiEg5FJRFRERERMqhoCwiIiIiUg4FZRGRKrBlyxZGjRrFZZddRufOnenfvz9jx45l\nw4YNZ4ydPHky69at89m5s7OzmTx5Mnv37vXZMUVE6iM/owsQEalrtmzZwh133EHDhg0ZNmwYkZGR\n7Nu3jwULFrBs2TI6d+582vgpU6ZgMpno0aOHT86/d+9epkyZQs+ePYmKivLJMUVE6iMFZRERH5s6\ndSomk4nPPvuMRo0alW0fPXo0Bw8erLY6vF49eFVEpDJMeoS1iIhvXXvttQQFBfHll1+edczkyZOZ\nMmXKWd9fsmQJzZs3B2Dr1q189NFHpKenc/DgQaxWK507d2b06NF06dKlbJ+hQ4eyfv36co/XvHlz\nlixZctq2tLQ03nnnHTZv3ozZbKZHjx6MGzeO6OjoCny1IiJ1l64oi4j4WGRkJBkZGWzbto0LLrig\n3DH9+/cnOjoar9fL2LFj6d+/P4mJiWXvN2zYsOz1ihUrWLNmDQMGDKB169Y4HA4+++wz7r77bj77\n7DM6dOgAwEMPPcStt97Kjh07SE1NZcSIEcTExAAQFBR02vlnzZrF008/Tffu3RkzZgxOp5NPPvmE\nO++8kzlz5px2JVxEpL7SFWURER9btmwZDz30EBaLhSuuuIIrrriCfv360bJly3LHd+jQgdGjRzN6\n9Ohy38/JySEiIgKTyVS2LTs7m6uvvpo77riDCRMmnDZ+7dq13HPPPcyYMYPu3bufcbz8/Hx69+5N\nly5dmDZt2mnHvPbaaxk2bBhjxow5ny9dRKRO0aoXIiI+1rt3b2bMmMHll1/O6tWrefHFF0lMTOT+\n++/n0KFDFT5eo0aNykKy2+3myJEjBAUF0bBhQ3755ZcKH2/lypXk5+czYMAAHA5H2a+goCBatmx5\n1ukbIiL1jaZeiIhUgW7dutGtWzcKCwtZv349c+bM4ZtvvuHRRx/lH//4R4WOlZ+fz7vvvsusWbM4\nfPjwaTfpFRcXV7i23bt3A/D000+X+36rVq0qfEwRkbpIQVlEpAoFBQWRkJBAQkICNpuNr776in37\n9pXdqHcunnzySVatWsU999xD586dCQ4OBuCJJ56o1MoWEydOpEWLFmdsDwgIOO9jiojUJQrKIiLV\n5ORNdzk5OecclI8fP05aWhojR47k4YcfLtvucrk4duxYufucOpe5PK1btwagQYMGXH755edUh4hI\nfaQ5yiIiPrZu3TpKS0vP2L5y5UrMZvMZV3HtdvtZ5y6bzebTPp40c+ZMPB5PufvY7XaAsx6zV69e\n2O123n//fUpKSk57z+PxVOtazyIiNZmuKIuI+FhqaiqZmZkkJSXRtm1bCgoKWLJkCevWreO2224j\nPDz8tPFdu3bl66+/pl27drRu3RqTycRll12Gv78/wcHB9OzZk2nTpuF2u2natCkZGRmsWLGChg0b\nljv1on379oSGhjJ58mRKSkpo2LAhAQEBZU/+Cw4O5tlnn2X8+PHcdNNNDBgwgNDQULKysli6dCkD\nBw486wocIiL1iZaHExHxsTVr1jBr1ix++OEHDh06hNfrpW3btgwcOJC77777jKkR2dnZPP/883z/\n/fcUFhZiMplYvHhx2fSM3NxcXnzxRVasWEFRURFdu3blmWeeYeTIkTRu3JiZM2eeUcOqVat4+eWX\n2b59O263m6ioKBYvXnzamJUrVzJt2jQ2btxIaWkpzZs35/LLL+eOO+4oW39ZRKQ+q3RQLioqIiUl\nhQULFuDxeBgwYAATJkzA7XYzYcIE5s+fT1hYGGPHjiUpKclXdYuIiIiIVKlKT71ISUlhz549fPPN\nN0RERJCZmQnA9OnT2bFjB2lpaWzatInk5GTi4uJo2rRppYsWEREREalqlbqZr6ioiNmzZ/Pss8+W\nLYjfrl07AObPn8/QoUMJDg6mR48exMXFsXDhQp8ULSIiIiJS1SoVlHft2oXJZGLRokX06tWL66+/\nnkWLFpW916ZNG8aMGcPcuXOJiYkhKyvLJ0WLiIiIiFS1Sk29yM/Px+12k52dzdKlS/nhhx8YMWIE\n3377LU6nk6CgILZv305sbCx2u50DBw74qm4RERERkSpVqaAcEBBAaWkp9957Lzabjcsuu4w2bdqw\n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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a96e3860>"
"<matplotlib.figure.Figure at 0x7f0bfb236080>"
]
},
{
@@ -2172,11 +2209,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a92a3898>"
"<matplotlib.figure.Figure at 0x7f0bfb1659b0>"
]
}
],
"prompt_number": 31
"prompt_number": 32
},
{
"cell_type": "markdown",
@@ -2338,7 +2375,7 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 32
"prompt_number": 33
},
{
"cell_type": "markdown",
@@ -2356,7 +2393,7 @@
"def pos_vel_filter(R,Q):\n",
" f = KalmanFilter(dim_x=2, dim_z=1)\n",
" f.R = R\n",
" f.Q = Q_DWPA(2, var=Q)\n",
" f.Q = Q_discrete_white_noise(dim=2, var=Q)\n",
" \n",
" f.F = np.array([[1,1],\n",
" [0,1]]) # state transition matrix\n",
@@ -2404,13 +2441,13 @@
{
"metadata": {},
"output_type": "display_data",
"png": "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\n/fQTfn5+2Gw25s+fD8DUqVOr1vY80d69e2tTgoiIiIhItbRr165G59cqKLdr187lDlBOp5OoqCgy\nMzPp0aMHAJmZmQwdOtRlO927d69NGfI7hIWFMWfOHBISEjxdSrOk/vcs9b/nqO89S/3vWep/zwkL\nC2PlypU1fl2t5igHBQXRp08fZs6cSXl5OevWrWPnzp306tWLESNGMGvWLAoLC1mzZg0bNmwgMTGx\nNpcTEREREak3blke7oknnqBPnz6Eh4fzt7/9jZYtWzJq1Ch27NhBQkICQUFBJCcnEx4e7o6aRURE\nRETqXK2Dctu2bZk1a9bpDXt5kZycTHJycm0vIXVEU148S/3vWep/z1Hfe5b637PU/41LraZeSOOm\n/1k9S/3vWep/z1Hfe5b637PU/42LgrKIiIiIiAsKyiIiIiIiLigoi4iIiIi4oKAsIiIiIuKCgrKI\niIiIiAsKyiIiIiIiLigoi4iIiIi4oKAsIiIiIuKCgrKIiIiIiAsKyiIiIiIiLigoi4iIiIi4oKAs\nIiIiIuKCgrKIiIiIiAsKyiIiIiIiLigoi4iIiIi4oKAsIiIiIuKCgrKIiIiIiAsKyiIiIiIiLigo\ni4iIiIi4oKAsIiIiIuKCgrKIiIiIiAsKyiIiIiIiLigoi4iIiIi4oKAsIiIiIuKCgrKIiIiIiAsK\nyiIiIiIiLigoi4iIiIi4oKAsIiIiIuKCgrKIiIiIiAsKyiIiIiIiLigoi4iIiIi4oKAsIiIiIuKC\ngrKIiIiIiAsKyiIiIiIiLigoi4iIiIi4oKAsIiIiIuKCgrKIiIiIiAu1DsojR47kwgsvJDY2ltjY\nWB577DEA7HY7kyZNonfv3gwZMoSFCxfWulgRERERkfri5Y5Gnn76aW688caTjs2cOZOMjAzS0tLY\nvHkzSUlJxMbGEhER4Y5LioiIiIjUKbdMvXA6nacdW7RoESNHjsTf35++ffsSGxtLamqqOy4nIiIi\nIlLn3BKU//73v3PxxRdz9913k5mZCcCuXbvo2LEjEyZMYMGCBURHR7Nz5053XE5EREREpM7VeurF\nY489RpcuXaioqGD69OmMGTOGr7/+GpvNhsViYfv27cTExGC1WsnOznbZRlhYWG3LkBry9vYG1Pee\nov73LPW/56jvPUv971nqf8+p7PuaqnVQjomJqXo8fvx4Zs+eTWZmJn5+fthsNubPnw/A1KlTsVqt\nLtuYMmVK1eP4+HgSEhJqW5aIiIiINGMrVqwgLS0NAJPJRHx8fI3bcMvNfCcyGAw4nU6ioqLIzMyk\nR48eAGRmZjJ06FCXrxkzZsxJP+fm5rq7LDlF5W+z6mvPUP97lvrfc9T3nqX+9yz1f/2KiYmpGtAN\nCwtj5cqVNW6jVnOUCwsLWbFiBWVlZZSVlfHPf/6TFi1a0KlTJ0aMGMGsWbMoLCxkzZo1bNiwgcTE\nxNpcTkRERESk3tRqRNlut/P666/z8MMP4+3tzQUXXMBbb72Fl5cXo0aNYseOHSQkJBAUFERycjLh\n4eHuqltEREREpE7VKiiHhoYyd+5c1w17eZGcnExycnJtLiEiIiIi4hHawlpERERExAUFZRERERER\nFxSURURERGrJ1S7F0vgpKIuIiIi4YM7Lw5yXd9ZzHA4nL7y/glf+/X/1VJXUJ7evoywiIiLS2FnT\n0wlISgKgMCWFori4084pKStnwgtzmbvtMF7OCka2MRKROKi+S5U6pBFlERERkROY8/IISErCmJ2N\nMTubgKSk00aW8wpLuG3KF8zddpiA8lIWbJxNr8cfOucItDQuGlEWERERqYHdBwv408uL2PHbESLt\nR1mwYRYXFh3AERHh6dLEzTSiLCIiInKCstBQClNScERE4IiIoDAlhbLQUADWZx7k6snz2fHbEbq3\nD+Wb+/sRE2A47TxpGjSiLCIiIs1O5RSJMwXborg47KmpJ52zOH0XY95cSklZBfExkbzz0DACLGby\nTjlPmg6NKIuIiEizYk1PJzQxkdDERKzp6Wc8ryw0tCr8/uubTdzzeiolZRXcktCFfz96OQEW82nn\nSdOiEWURERFpNk68UQ8gICkJe2rqGYOuw+FkykdreGfhzwBMuPEiHr4uFoPBUG81i+coKIuIiIi4\nYCsr58Hpy1mwbideJgOv/Dmemy7p4umypB4pKIuIiEizUXmj3olrJJ86mlzhcDBnVQYv/zed/blF\nBPh58+7DiVwSE+mJksWDFJRFRESkyTjXTXrg+kY9OLYN9bKfskj+ZC2/7jnWTvd2ofxz7BC6tdMc\n5OZIQVlERESahOrsplfp1CD9044cpn68htWbfwOgTZiViTfFccPATpiMWvuguVJQFhERkUavpjfp\nVdp1oICX/5vO/O8yAQiymHnwulhGJZ6Pr1kxqbnTJ0BERESandwCG6/PXc+sJb9ir3Dg42Line truncated
"png": "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\nry9lZWUsWrQIgBkzZlSv7Xm8Xbt21acEEREREZFa6dy5c52Or1dQ7ty5s9MdoBwOB+Hh4eTm5tKn\nTx8AcnNzGTlypNN2evfuXZ8y5AyEhISwYMEC4uLi3F1Ki6T+dy/1v/uo791L/e9e6n/3CQkJIT09\nvc7n1WuOcmBgIIMHD2bevHlUVVWxbt068vLyGDBgAAkJCcyfP5+ioiLWrFlDZmYm8fHx9bmciIiI\niMhZ45Ll4R577DEGDx5MaGgoL7zwAm3btmX8+PFs27aNuLg4AgMDSUpKIjQ01BU1i4iIiIg0uHoH\n5U6dOjF//vwTG/b0JCkpiaSkpPpeQhqIpry4l/rfvdT/7qO+dy/1v3up/5uWek29kKZN/7O6l/rf\nvdT/7qO+dy/1v3up/5sWBWUREREREScUlEVEREREnFBQFhERERFxQkFZRERERMQJBWUREREREScU\nlEVEREREnFBQFhERERFxQkFZRERERMQJBWUREREREScUlEVEREREnFBQFhERERFxQkFZRERERMQJ\nBWUREREREScUlEVEREREnFBQFhERERFxQkFZRERERMQJBWUREREREScUlEVEREREnFBQFhERERFx\nQkFZRERERMQJBWUREREREScUlEVEREREnFBQFhERERFxQkFZRERERMQJBWUREREREScUlEVERERE\nnFBQFhERERFxQkFZRERERMQJBWUREREREScUlEVEREREnFBQFhERERFxQkFZRERERMQJBWURERER\nEScUlEVEREREnFBQFhERERFxQkFZRERERMQJBWURERERESfqHZTHjRtHv379iIqKIioqikceeQQA\nq9XK448/zsCBAxk+fDiLFy+ud7EiIiIiImeLpysaeeqpp7j22mtrPDZv3jxycnJIS0sjKyuLxMRE\noqKiCAsLc8UlRUREREQalEumXjgcjhMeS0lJYdy4cfj7+xMTE0NUVBSpqamuuJyIiIiISINzSVB+\n6aWXGDp0KLfddhu5ubkAbN++nYiICKZMmcLXX39Nt27dyMvLc8XlREREREQaXL2nXjzyyCP06NED\nm83GG2+8wcSJE/nqq68oKyvDz8+P7OxsIiMjMZvNFBQUOG0jJCSkvmVIHXl5eQHqe3dR/7uX+t99\n1Pfupf53L/W/+xzr+7qqd1COjIys/vzBBx/k/fffJzc3F19fX8rKyli0aBEAM2bMwGw2O21j+vTp\n1Z/HxsYSFxdX37JEREREpAVbsWIFaWlpAHh4eBAbG1vnNlxyM9/xDAYDDoeD8PBwcnNz6dOnDwC5\nubmMHDnS6TkTJ06s8fXBgwddXZb8wbHfZtXX7qH+dy/1v/uo791L/e9e6v+zKzIysnpANyQkhPT0\n9Dq3Ua85ykVFRaxYsYLKykoqKyt57bXXaNOmDd27dychIYH58+dTVFTEmjVryMzMJD4+vj6XExER\nERE5a+o1omy1Wnn55Ze5//778fLyom/fvvzzn//E09OT8ePHs23bNuLi4ggMDCQpKYnQ0FBX1S0i\nIiLSKJgsFgAqg4PdXIm4Wr2CcnBwMJ999pnzhj09SUpKIikpqT6XEBEREWm0zBkZBCQmAlCUnExJ\ndLSbKxJX0hbWIiIiImfAZLEQkJiIsaAAY0EBAYmJ1aPL0jwoKIuIiIiIOKGgLCIiInIGKoODKUpO\nxh4Whj0sjKLkZM1TbmZcvjyciIiISEtREh2NNTUV0M18zZGCsoiIiIgTtV3NQgG5+dLUCxEREZE/\nMGdkEBwfj3nUpfitW+fucsRNNKIsIiIiLZ61yk7OnkNs3mXh1193s3XhEjZGjOU37wAM/7cBX++N\nmH1NmH288PX2xOzthZ+3J2YfL/x8jn5MGn8BBoPB3S9FXEhBWURERFqcjXkHWJm1h827LGTtOEj2\n7kNYbfb/HeB/DgAeDjs2g5HSShullWXsP1zmtD0fLw9m3nrh2ShdziIFZREREWlRPlyxlQffTDvh\n8fDQVvTuHMx55wQzwFrIkJefJcJ6hCP/nMOBvv0pKa+ipMJKaXkVpRVWSsqtlFZUUVJuper4kC3N\nhoKyiIiItBgLV+Xw0O8h+abDWxl09SV0vSiKXp2C8Pc11TjWNGoghzh6s54/nPC8NH8KyiIiItJs\nnGqlisXr8rj3n9/hAGZsW8rfdn6P/bflWP6cSqWTEKzVLESrXoiIiEizcGyliuD4eMwZGTWeW5q5\nk7tnL8Nmd/D4gfX8bef3bqpSmhIFZREREWnyTBYLAYmJGAsKMBYUEJCYWD26/P0vu7nz5SVYbXbu\nTIjk4Rm3azc9qRVNvRAREZFma+3WAm596VsqrDbGjezNtLFDKTUYqNJuelILGlEWERGRJsFksVSP\nEv9RZXAwRcnJNUaK1xRWMe75FMoqqrgutkeNdY4rg4MVkuW0NKIsIiIijZ45I4OAxEQAipLine truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a9576be0>"
"<matplotlib.figure.Figure at 0x7f0bfb3f8978>"
]
}
],
"prompt_number": 33
"prompt_number": 34
},
{
"cell_type": "markdown",
@@ -2464,21 +2501,21 @@
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"png": "iVBORw0KGgoAAAANSUhEUgAAAsoAAAGDCAYAAAAyKTZ5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XecVOX1+PHPnZntle1sb3QUFpAqoBAiFhSsMWoUo4Gf\nsaCxRLGgGNRYsCQ2QtRgF40kRoxg/AqodJAmZQtbYNnO9jI78/z+uLsDy9ZpW+C8Xy9fy86997nP\n7sB45pnznKMdOHBAIYQQQgghhGjB0NMTEEIIIYQQojeSQFkIIYQQQog2SKAshBBCCCFEGyRQFkII\nIYQQog0SKAshhBBCCNEGCZSFEEIIIYRogwTKQgghhBBCtEECZSGEEEIIIdpg6ukJCCGEPW644Qa2\nbNkCgKZphIWFkZqayq233srEiRN7eHYnnDzPk82aNYtnn33W7ff/4YcfeOmllzhw4ADe3t6cd955\n3H///YSEhLj93l31+eef891337F9+3YKCgo6/N2sX7+eF198kfT0dPr168cVV1zBbbfdhtFo7OZZ\nCyHOJBIoCyH6nKCgIB5++GGUUhw7doyPPvqIm2++mWeeeYbLLrusp6dnk5KSwvz581s8FhcX5/b7\nbt26lVtvvZVBgwbx4IMPUlRUxPLly/n5559ZuXIlHh4ebp9DV7z99tvk5+czatQoCgoK0DStzfO2\nbdvG/PnzGT58OAsXLmT//v389a9/pby8nIcffribZy2EOJNIoCyE6HN8fHyYNWuW7fvZs2dzwQUX\nsGzZsl4VKIeGhraYZ3d58cUX8ff35x//+Af+/v4A9O/fn4ULF/LFF18wZ86cbp9TW1599VWio6MB\nGDx4cLvnvfjii4SEhPD222/j4+MDgMVi4YMPPmDu3LnExMR0y3yFEGceyVEWQvR5ERERJCcnk5ub\n29NTaUEpRWNjI9XV1d12z7KyMrZt28bUqVNtQTLARRddhNFoZO3atd02l840B8kdOX78ONu2beOC\nCy6wBckAV155JRaLhW+//dadUxRCnOFkRVkI0edZLBYKCwuJiIiw+9q6ujpqamo6PMff3x9PT0+7\nx961axcjR46ksbGR8PBwrrvuOubNm9duioErpKeno5QiNTW1xeM+Pj5ER0eTnp5u95jl5eVYLJYO\nz3FX7nN6ejpWq5WhQ4e2eHzQoEFomsaBAwfccl8hhAAJlIUQfZDFYqGsrAylFMXFxbz99tsUFxfz\n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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a9731ef0>"
"<matplotlib.figure.Figure at 0x7f0bfb22ae48>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAsoAAAGDCAYAAAAyKTZ5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8VNW2wPHfmUx6r5QkBJJACCCQAKEKCqIgIKLYLqLo\nQ+FxBdFreVcEUbzYwV4oomIXQa4KSBEFpAtIhySUFAIJ6SGTZJLZ74+RkUCQTDKTmcD6fj5+JKfs\nvc6cgazZs87e2qFDhxRCCCGEEEKIanSODkAIIYQQQghnJImyEEIIIYQQNZBEWQghhBBCiBpIoiyE\nEEIIIUQNJFEWQgghhBCiBpIoCyGEEEIIUQNJlIUQQgghhKiBJMpCCCGEEELUQO/oAIQQYvTo0Wzb\ntg0ATdMICQkhNjaWBx54gF69ejk4ur+cG+e5hg0bxiuvvGL3/jdu3Mgbb7zBoUOH8PDw4JprruGJ\nJ54gKCjI7n3XltFo5O2332bJkiUUFhbSpk0bHnnkkXrdx9OnT/PCCy+wbt06qqqqSEpKYsqUKURG\nRlqOOXnyJF988QW//PILmZmZuLu707ZtWyZNmkSnTp1scWlCiCuQJivzCSEcbfTo0Rw+fJinn34a\npRQnT57kq6++IjMzk5deeonhw4c7OkTAHGdeXh7jx4+vtj0yMpLOnTvbte/t27dz7733EhcXxx13\n3EFOTg7z58+nRYsWLFq0CFdXV7v2X1vPPPMMX3/9NaNGjaJNmzZ88803HDhwgM8++6xOCWtFRQUj\nR44kKyuLsWPH4u7uzvz583F1deW7777Dz88PgC+++IKXX36ZQYMGkZCQwJkzZ/jyyy9JT0/n3Xff\n5ZprrrHxlQohrgSSKAshHG706NGkp6fzyy+/WLZlZ2dzww03EB4ezg8//OC44M4xevRoNE3jk08+\nafC+7777bpKTk1mzZg0+Pj4AfPvtt0yZMoUXXniBESNGNHhM50tPT+f6669n1KhRPP300wCUlJRw\n/fXXExcXx4IFC6xuc/HixTz11FO8+eabXH/99QD88ccf3HHHHTz88MP87//+LwCpqamEhITg7+9v\nOTcnJ4frr7+eqKgovvvuOxtcoRDiSiM1ykIIpxQWFkZ0dDTp6emODqUapRSVlZWcOXOmwfrMz8/n\n999/p1+/fpYkGeDGG2/ExcWF1atXN1gsf+fnn39GKcUtt9xi2ebj48OgQYPYunUrxcXFVre5Zs0a\n/P39GThwoGVbp06diI2NZdWqVZZtMTEx1ZJkgNDQUKKjozly5EgdrkYIIaRGWQjhpKqqqsjOziYs\nLMzqc8vKyigtLf3bY3x8fHBzc7O67d27d9O5c2cqKysJDQ1l1KhRjBs3Dk3TrG6rtlJSUlBKERsb\nW227p6cnzZs3JyUlxeo2CwsLqaqq+ttjrK19PnToEC4uLsTFxVXbHh8fT1VVFcnJySQmJlrdZps2\nbS54fdu2bctPP/10yfPz8vLq9B4SQgiQRFkI4SSqqqrIz89HKcXp06f56KOPOH36NM8884zVbc2d\nO5d33nnnb4958cUXufnmm61qNyoqil69etG6dWtKSkpYunQpr7/+OllZWTz77LNWx1lbOTk5AAQE\nBFywLzAwsE6J8ogRIzhx4sRF92uaxoEDB6xqMycnB39/f1xcXHj//feZN28e7777LsHBwYD5oTxr\n5eTk0KFDBwDGjh3LsWPH+PrrrwkJCcFoNFJQUFDj6wLmEe6srCweeughq/sVQgiQRFkI4SRycnLo\n2bOn5efmzZvz/vvv069fP6vbuvnmm+natevfHnP+6GxtPP/88xf0M27cOL7++mvGjBlDq1atrG6z\nNioqKgBqfGDP1dXVst8ar776KuXl5fWO7VwVFRWWGE+cOMGZM2fIzc3F19cXMI/016fN9PR0cnNz\nMRgMlm8DLnYNubm5TJs2jejoaMaOHVuXyxFCCEmUhRDOITAwkFmzZmEymdi5cyfvv/8+K1eurFOi\nHBkZWW3qMHsaNWoUv/76K1u3brVbonw2KTQajRfsMxqNeHt7W92mtSUQteHm5mZJ2qdPn87EiRMJ\nDQ3l559/BsDDw8PqNt3d3S3XvXTpUioqKvDz87P04+7ufsE55eXl/POf/7RMVVeXfoUQAiRRFkI4\nCXd3d8uIcu/evdHpdLz55psMGTLE6jl4S0tLL/mwnZ+fX41JlrWaNGkCmGt+7SU0NBSAgoKCC/bl\n5+df8BBbbeTl5V2yRvlsv7UVGhpqqX12cXGxnJ+bmwtASEiI1XGGhoZazvfw8LAkvadPn8bNze2C\nazeZTDz22GMcOHCAefPmER0dbXWfQghxliTKQginNGbMGD7++GPeeustqxPl+fPn26VGuSZn63zt\nuehHbGwsmqaRnJxcbbvBYCAzM5MbbrjB6jZHjhxp8xrluLg4TCYTBw8epH379pbt+/fvR6fT0bp1\n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 truncated
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a952d9e8>"
"<matplotlib.figure.Figure at 0x7f0bfb3f34e0>"
]
}
],
"prompt_number": 34
"prompt_number": 35
},
{
"cell_type": "markdown",
@@ -2509,7 +2546,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"**author's note: text needs to move to kalman math chapter. leaving here for now. Do not read **\n",
"**author's note: text needs to move to kalman math chapter. leaving here for now.**\n",
"\n",
"But what does \"quite large\" and \"quite small\" mean, and what should $\\textbf{Q}$ contain? The numbers in the $\\textbf{Q}$ matrix are not arbitrary, but the variances of the process noise. This means that they have the same units as the rest of the system. So, suppose the noise of our sensor has a standard deviation of $0.5m$, and the rest of our system is specified in meters as well. Variance is the standard deviation squared, so if $\\sigma=0.5$, then $\\sigma^2 = 0.25$.\n",
"\n",
@@ -2525,7 +2562,7 @@
"\n",
"But again, what does this *mean*? This is a one dimensional problem, where our variables are $x$ and $\\dot{x}$. Assume we are tracking a person walking in 1D, so $x$ is their position, and $\\dot{x}$ is their velocity. We have no state variable for $\\ddot{x}$, so we are assuming acelleration is zero, and thus their velocity is constant. No one walks with constant velocity, even if they are trying to do so. The *process noise* specifies how much variance there is in each state variable due to the changes in velocity that inevitably happen.\n",
"\n",
"You will very typically see Q expressed in this form (indeed, this is what the code immediately above does):\n",
"You will very typically see Q expressed in this form in introductory materials (and even in some published papers):\n",
"\n",
"$$\\begin{bmatrix}\n",
"0&0 \\\\\n",
@@ -2587,13 +2624,13 @@
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a9483780>"
"<matplotlib.figure.Figure at 0x7f0bfb0fa828>"
]
}
],
"prompt_number": 35
"prompt_number": 36
},
{
"cell_type": "markdown",
@@ -2659,11 +2696,11 @@
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAGXCAYAAAC9TOY9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmQ5HV9//HX9+z7mHt2l0UkILsJKi6EitHsquCBQkVR\nK5aWR6JClKBgDBqjliX+jFVGjWExBozxiMagiKhYlkcSEJAQFbVKdFUQWPaYnbPv7m9/j98fw66u\nuLtzdPe3e/r5+EN3eqa737sf5vt9zWfen8/H2LNnTyQAAABgSJhxFwAAAAD0EgEYAAAAQ4UADAAA\ngKFCAAYAAMBQIQADAABgqBCAAQAAMFQIwADQIddcc422bdsWdxkntG3bNu3evTvuMgAgNnbcBQDA\nRmIYxu98vFQq6T/+4z/07W9/Ww899JAk6bTTTtMll1yiXbt2rfn92u22du/erZtuukmlUkmPe9zj\ndOWVV+qP//iP1/yaALDRMQMMAB0URb/7bKEf/ehHuvbaa7Vlyxa94Q1v0F/91V+p2Wzq0ksv1Wc/\n+9k1v9973vMeXXfddXrWs56lv/u7v5MkXXLJJfrRj3605tcEgI2OGWAA6IHTTjtN3/zmNzU9PX3k\nsRe/+MV69rOfrQ9/+MN6yUteItNc3ZzE3r17dcMNN+hlL3uZ3v72t0uSnvvc5+pZz3qW/vEf/1H/\n9m//1tG/AwBsFMwAA0APbN68+ajwK0nJZFJPfOITVSqVtLCwsOrX/K//+i9FUaSLL774yGPZbFbP\nec5zdPfdd6tSqay7bgDYiAjAABCj+fl5JRIJFQqFVT93z549sixLZ5xxxlGPb9++XUEQ6Be/+EWn\nygSADYUADAAx+elPf6of/OAHeu5znyvHcVb9/NnZWRUKBVmWpY9+9KM655xzdPfdd2tsbEySNDc3\n1+mSAWBDIAADQAwajYauuuoqjY6O6q//+q/X9Bqe5x0Jzvv371etVtP8/Lxc15UkNZvNjtULABsJ\nARgAeiwMQ73lLW/Rgw8+qA9/+MMaHx9f0+u4rivP8yRJ73rXu3TbbbfpggsuOPJYMpnsWM0AsJGw\nCwQA9Nj73vc+ffOb39T73/9+nXPOOWt+nYmJCZVKJQVBIMuyNDExIWm5r1jSmoM1AGx0zAADQA99\n/OMf16c+9Sm99a1v1YUXXriu1zrjjDMUhqF+9rOfHfX4vffeK9M0dfrpp6/r9QFgoyIAA0CPfPWr\nX9X73/9+/eVf/qVe+cpXrvv1nvGMZ8g0TX3xi1888li1WtXXv/51nXvuucrlcut+DwDYiGiBAIAe\n+PGPf6y3vvWtOuWUU3Tqqafq5ptvPurzT33qU4/s3rBSW7du1Yte9CJ99rOflWEYOv300/WFL3xB\nlUpFV1xxRSfLB4ANhQAMAD1w3333yfd9PfDAA7rqqquO+pxhGPrUpz616gAsSe94xzs0MjKim266\nSTfccIPOOOMMXXfddTrrrLM6VToAbDgEYADogRe84AV6wQte0PHXdRxHV155pa688sqOvzYAbFT0\nAAMAAGCoEIABAAAwVAjAANAhhmHIMIy4ywAAnICxZ8+eKO4iAAAAgF5hBhgAAABDhQAMAACAoUIA\nBoAOueaaa7Rt27a4yzihbdu2affu3XGXAQCxIQADQAedaBHczTffrAsvvFBPeMIT9KxnPUuf/vSn\n1/2e3/nOd/Tyl79cZ599tnbs2KEXvehFuuOOO9b9ugCwUXEQBgB0UBQde13x1772Nb3lLW/Rn/zJ\nn+iVr3yl7rrrLv2///f/5Pu+/vzP/3xN7/flL39ZV111lc466yxdccUVSiQSuu+++3To0KG1/hUA\nYMMjAANAD0RRpH/4h3/Qtm3bdN1118kwDL34xS9WqVTStddeq5e85CVKpVKres1qtar3vOc92rlz\np6677rouVQ4AGw8tEADQA3v27NH+/fv1/Oc//6g2iRe96EWqVqu66667Vv2a3/rWt1Qul3X55ZdL\nkur1usIw7FjNALBREYABoAd+9rOfSZK2b99+1OOHP96zZ8+qX/OHP/yhXNdVGIZ63vOepx07dujs\ns8/WO9/5TrVarfUXDQAbFAEYAHpgdnZWkjQ+Pq7vfve7Ouecc3T99ddrfHxckjQ3N7fq1zx48KBc\n19Vll12mJz/5ydq9e7de+MIX6oYbbtD73ve+jtYPABsJPcAA0AOe50mSHMfR/Py8qtWq9u/fL9d1\nJUnNZnPVr9loNFStVvXMZz5Tb3/72yVJ559/vhYXF/X5z39el19+uUZHRzv3lwCADYIADAA9cDjo\nttttXXjhhTr33HM1OTmparUqSUomk2t+zec85zlHPf4nf/InuuWWW3T//fcTgAHgd6AFAgB6YGJi\nQtKvWx0mJyclSfPz85J0pBViNcbGxiRJIyMjRz1eLBYlia3QAOAYCMAA0ANnnHGGJOnee+896vHD\n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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a9678630>"
"<matplotlib.figure.Figure at 0x7f0bfb500470>"
]
}
],
"prompt_number": 36
"prompt_number": 37
},
{
"cell_type": "markdown",
@@ -2688,11 +2725,11 @@
"output_type": "display_data",
"png": "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\nfZjvDwoA0C0EYACQ9LWvfU1bt27Vxz/+cb35zW+e93Wazaamp6d133336b777jvo4xs2bNAll1yi\nj3/84wsp92Ude+yxkg4OulNTU5KkdDp9xNd85Stfqccff1zT09PK5XKzjz/zzDPKZrMaGRlZQMUA\nsPhogQDQ9x566CHdfPPNuvzyy3XJJZcc9vPHxsZ0/vnn64ILLjjoY4lEQlu2bNGdd945+9+WLVt0\n3HHHKZvN6s4779Tb3/72TnwZkqTXve51CofDeuihhw44/ONf//VfJUmvec1rDnrO008/rfPPP1/v\nfe97X/KaGzdulKQDjjXes2ePHnvsMZ1zzjltrB4AFgcrwAD62tNPP63rrrtORx99tNauXavvf//7\nB3z8zDPPnG0r2M80Te3YseMl9/UNBAI666yzDnr8q1/9qsrlcsePQ85ms3rf+96nO++8U+9///t1\nzjnnaPv27br//vt13nnn6bjjjjvoOY1GQzt27Jjt8/1DZ5xxht7whjfo1ltvValU0vDwsLZu3apo\nNKrLL7+8o18PAHTCggPwNddco3//939Xo9HQypUr9ZGPfIQVAQCe8dxzz8myLO3YseOgbcJ8Pp+2\nbt16UACer8U6Cvnqq69WKpXS/fffr7/9279VPp/X+973Pl199dXzruu2227TF77wBX3rW99So9HQ\nq171Kt1yyy1avXp1u8sHgI7zbd++3T38p728Z599VmvXrlU4HNYvfvELXXbZZfqP//gPxWKxdtUI\nAAuyefNm3XHHHfPaAQHzs2vXLm3cuFE33XST3vrWt3a7HAA4wIJXgPfvJ+m6rkzTVCKRWLRVDgAA\nAOBItaUH+IYbbtB3vvMdRaNR3XnnnewJCQAAgJ7Vll0gbrjhBj311FO6+uqr9bGPfUytVqsdlwWA\ntvD5fPxmCgAwa8E9wH/oggsu0LXXXjt7F/TOnTvbeXkAAADgZc3l5ty2b4P2+/tO7nfCCSe0+2Ww\nCPL5vL773e92fNsmdAbj512Mnbcxft7F2HlbPp/Xtm3b5vS5C2qBmJyc1P33369qtSrLsnTfffep\nUCjo5JNPXshlAQAAgI5Z0Aqw3+/XQw89pC9+8YsyTVPHHnusvvzlLyubzbarPgAAAKCtFhSABwYG\n9A//8A/tqgU9iPYVb2P8vIux8zbGz7sYu/7Qll0gsHQxEXgb4+ddjJ23MX7exdj1BwIwAALine truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a93fc780>"
"<matplotlib.figure.Figure at 0x7f0bfb25de48>"
]
}
],
"prompt_number": 37
"prompt_number": 38
},
{
"cell_type": "markdown",
@@ -2758,11 +2795,11 @@
"output_type": "display_data",
"png": "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\n37Nqs/9DsmLJsaRRrs8hIqhzjdtr6M71fXXVSqJcWFjI2rVrWbJkiXtby5YtOXToEO3btwfg0KFD\nDBw4sNLzZ82a5f6+b9++9OvXr8rXrunIb1254447aNGiBXPnziUsLAybzUZycrI7Ya4Nv5928fu2\n//e///H000/z9NNPk5SUhI+PD2+88Qbr16+vUntCCCGEuDo1CWhPjiWNE4U/EymJcqXWr1/Phg0b\nANcn9H379q12G7WSKH/zzTe0bt2a2NhY97ahQ4cyf/58BgwYQEpKCnv27KkwDeB8U6dOrfA4Ly8P\ngPLy8toIr97l5+eTlpbGm2++SZs2bQD48ccfKxzTvn17fvjhB/785z9fsi29Xu++we/3AgICKCoq\ncj/OysqqsH/btm3069ePsWPHurdlZmZWmhAbjUZyc3Mv/cSuMeXl5e7X0tXm3GjC1RpfQyf97znS\n954l/e9Ztdn/fprmAGTm7SXWb2iN22uIEhISSEhIAFx9v2nTpmq3UStVLxYvXszIkSMrbJs0aRKt\nWrWiX79+PPLII8yePZvw8PDauNxVLzAwELPZzPz588nIyGDLli089dRTFRLU++67j++++46XXnqJ\ntLQ0fv75Z2bNmoXFYqnQVkxMDBs2bODkyZOUlpbicDjc+zp16sTq1as5e/YsVquVN998s8K5cXFx\n7Nixg61bt3L48GHmzp3Lzp07K425U6dObNq0iT179nD69GmsVmst9ogQQgghasPGY3PZceI9/Lya\nAJBnTcepXpsDi9eCWkmUFy1axPjx4yts0+l0zJ49m127drFu3TqGDm0873Y0Gg1vvfUW27ZtIzk5\nmccff5wZM2ag0fzW3YMGDeLdd99l3bp1DBkyhLFjx5KTk4O3t3eFth555BE0Gg19+/YlLi6Of//7\n3+59kyZNIiYmhl69enHLLbcwaNCgCsn4+PHjGTx4MHfddRc33XQTJ06c4M4776w05tGjRzN06FDG\njh1LUlISn3zySS33ihBCCCFqorS8kBNFu8g4sxmTVxjxITeT1OQOVLX2pnWKipTU1FSPrjKRmZlJ\nfHx8pftycnIIDQ2t54hEQ3E1v37k40/Pkv73HOl7z5L+96ya9n9G4Q9szXqDCGMH+rWcUZuhNXjn\npl5ERUVV67xaXXBECCGEEELUjVOWnwEIN7X3cCSNhyTKQgghhBBXOVVVOVX8CwDhRkmU64Line truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a97a4e80>"
"<matplotlib.figure.Figure at 0x7f0bfb15f198>"
]
}
],
"prompt_number": 38
"prompt_number": 39
},
{
"cell_type": "markdown",
@@ -2787,11 +2824,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a974e208>"
"<matplotlib.figure.Figure at 0x7f0bfb148160>"
]
}
],
"prompt_number": 39
"prompt_number": 40
},
{
"cell_type": "markdown",
@@ -2821,11 +2858,11 @@
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAsoAAAGDCAYAAAAyKTZ5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8VFX6+PHPnZKZzEzqpEESIIUSCCUgTZSmKCgIqOuK\nimL3y6qL5YeurhXlq19XWHdd144KuLpSxEKRpjRFpGMghBYSIJBG6iSZcn9/DIxEEpKQSSbleb9e\nvEjmnnvuMycDeebMuc9R0tLSVIQQQgghhBBVaHwdgBBCCCGEEM2RJMpCCCGEEEJUQxJlIYQQQggh\nqiGJshBCCCGEENWQRFkIIYQQQohqSKIshBBCCCFENSRRFkIIIYQQoho6XwcghBBt1aJFi3jqqac8\n32u1WqxWKwMHDuThhx8mNja2Xv0VFhYyZ84ctm3bxq5duygvL2fOnDkMHjzY26ELIUSbIImyEEL4\n2P33309iYiIVFRXs2rWLRYsWsXHjRr7++musVmud+zl+/Dhvv/02cXFxdO3alZ07dzZi1EII0fpJ\noiyEED42aNAgz6zvjTfeSFxcHK+++ioLFy7kvvvuq3M/cXFxbNq0idDQUBYtWiSJshBCNJAkykII\n0cwMGTIEgKysrHqdZzQaMRqNjRGSEEK0SZIoCyFEM5ORkQFASEgIRUVFOByOC7YPDQ1tirCEEKLN\nkURZCCF8rKSkhPz8fCorK9m1axcvv/wyWq2WMWPGMGHCBI4fP17juYqisHfv3iaMVggh2g5JlIUQ\nwsceeuihKt9HRkYya9YsunXrxt/+9jcqKip8FJkQQrRtkigLIYSPTZ8+naSkJHQ6HVarlfj4eM+x\nvn37+jAyIYRo2yRRFkIIH0tKSqqx1nF+fj5Op/OC54eHhzdGWEII0eZJoiyEEM3YjTfeKGuUhRDC\nRyRRFkKIZkzWKAshhO9IoiyEEM1Yfdcov/XWWwCeWeavvvqK7du3AzB16lTvBieEEK2cJMpCCOFD\niqJ4tb9//OMfKIqCqqooisLixYs915FEWQgh6kdJS0tTfR2EEEIIIYQQzY3G1wEIIYQQQgjRHEmi\nLIQQQgghRDUkURZCCCGEEKIakigLIYQQQghRDZ9XvcjMzPR1CEIIIYQQog2IjY2tV3ufJ8rg3r7V\nW5wvPQoZB9D85TWU+K5e67e1sVqtLFq0iGHDhvk6lDZJxt+3ZPx9R8bet2T8fUvG33esVisbNmyo\n93mtb+lFQJD77+Ii38YhhBBCCCFatFaXKCsBgQCoxad9HIkQQgghhGjJWl2iTECw+2+ZUa6VN5e8\niPqT8fctGX/fkbH3LRl/35Lxb1laYaLsnlFGZpRrJf9YfUvG37dk/H1Hxt63ZPx9S8a/ZWmFibKs\nURZCCCGEEA3XLKpeXIjdbqegoABFUerUXm0fB3c8AmYLSk5OI0fXchUUFADgcDh8HEnj0Ov1BAcH\n+zoMIYQQQrRgzTpRttvt5OXlERERgUZTx8nv8HCIS2jcwESzd/r0acrKyjCZTL4ORQghhBAtVLNe\nelFQUFC/JFmIM4KCgigpKfF1GEIIIYRowZp1BqooiiTJ4qIoilLn5TpCCCGEENWRLFQIIYQQQohq\nSKIshBBCCCFENSRRbuPuuusuYmJiiImJ4ZFHHvF1OEIIIYQQzUaDEuXjx4+TkpJS5U+3bt1YuXIl\nDoeDp556ir59+zJixAiWLVvmrZjblIEDBzJr1qxG6/+NN95g+/btjBs3Ttb0CiGEEEKco0Hl4dq3\nb8/27ds932dkZDBx4kQuv/xy5syZw4EDB1i3bh2pqancf//9pKSkEBUV1eCg25LGTl4DAgIICAjA\nYDCgqmqjXksIIYQQoiXx6tKLhQsXctVVV2E0Glm+fDmTJ0/GYrEwYMAAUlJSWLlypTcv16x99913\nTJw4kR49epCQkMDEiRPZsmVLlTYrVqzg2muvJSEhgZSUFB599FHsdjvgnkmOiYkhKyuLWbNmeZZH\nzJ4923P+jTfeWGW2OTMzk5iYGH766ScAKisrefTRR7n00kuJj4+nX79+vPjii1RWVp4Xr8wmCyGE\nEEJU5bUNR1wuF0uWLOGVV14B4MiRI8TFxfH4448zcuRIEhISOHz4sLcu1+zl5OTwxz/+kZSUFAwG\nA++88w633normzdvJiQkhO+++4577rmHhx9+mDfeeIOysjK++uorKioq0Ov1LFu2DKfTyTXXXMP4\n8eN54IEHAM7bQONCCa7dbsfPz49Zs2YRGxvLwYMH+fOf/4xer+cvf/lLoz5/IYQQQjQOp6uS4yU7\nKa08Rbewa30dTqvmtUR5w4YNKIrC4MGDAbDZbJhMJtLT00lOTsZsNpOdne2ty3lE3/qe1/sEODb/\n3gadf+utt1b5/umnn2bu3Lls3ryZ0aNH8+abbzJ69Gj+3//7f542vXr18nwdGhoKgFarxWw2ExYW\nVu8YzGaz540LQHR0NBMmTGD16tWSKAshhBAtlEt18WPmmwAkhFyBXmv0cUStl9cS5UWLFnHdddd5\nvvf398dms7FkyRIAXnrpJcxmc7XnWq3Wah8vKCjwVnhN7ujRo7z22mts27aNvLw8XC4XAKWlpQCk\npqYyfvz4Ro9j/vz5fPrpp2RlZWGz2bDb7bRv377Rr9sc6HS6Gl9bvqbX64GaX/uiccn4+46MvW/J\n+PuWN8c/LCuBnJJ0HPocokL6NLi/1u7s2NeXVxLlwsJC1qxZw+LFiz2PderUiYMHD9KjRw8ADh48\nyBVXXFHt+TNmzPB8PXToUIYNG1bnazd05rex3HHHHXTs2JHZs2cTERFBZWUlI0eO9CTM3vD7ZRe/\n7/vrr7/mhRde4IUXXqBv374YjUbeeustfvjhhzr1J4QQQojmqV1QD3JK0jleuIcYSZSr9cMPP7Bu\n3TrA/Qn90KFD692HVxLlb775hi5dupCQkOB5bMyYMcydO5cRI0aQmprKjh07qiwDONfUqVOrfJ+X\nlweAw+HwRnhNLj8/n/T0dN5++226du0KwC+//FKlTY8ePfjxxx+5++67L9iXXq/33OD3e0FBQRQX\nF3u+z8rKqnJ88+bNDBs2jEmTJnkey8zMrDYhNpvN5ObmXviJtTAOh8PzWmpuzs4mNNf4WjsZf9+R\nsfctGX/f8ub4B2g6AJCZt5OEgDEN7q81Sk5OJjk5GXCP/YYNG+rdh1eqXixatIgJEyZUeWzKlCl0\n7tyZYcOG8eSTTzJz5kwiIyO9cblmLzg4GKvVyty5c8nIyGDTpk08//zzVRLUBx98kBUrVvC3v/2N\n9PR09uzZw4wZMygpKanSV3x8POvWrePEiROUl5fjdDo9x3r37s2qVasoKirCZrPx9ttvVzk3MTGR\nLVu28NNPP3Ho0CFmz57N1q1bq425d+/ebNiwgR07dnDq1ClsNpsXR0QIIYQQ3rD+6Gy2HP+QAL92\nAOTZDuBSW+bEYkvglUR54cKF3HbbbVUe0+l0zJw5k23btrF27VrGjGk773Y0Gg3vvPMOmzdvZuTI\nkTzzzDNMnz4djea34R41ahQffPABa9euZfTo0UyaNImcnBwMBkOVvp588kk0Gg1Dhw4lMTGRf/zj\nH55jU6ZMIT4+nsGDBzNu3DhGjRpVJRm/7bbbuPrqq7nnnnu49tprOX78OHfddVe1MV9//fWMGTOG\nSZMm0bdvXz799FMvj4oQQgghGqLcUcjx4m1knN6IxS+CpLCx9G13B6rqvWWdoiolLS3Np7tMZGZm\nkpSUVO2xnJwcwsPDmzgi0Vo059ePfPzpWzL+viNj71sy/r7V0PHPKPyRn7LeIsrck2GdpnsztFbv\n7NKL2NjYep3n1Q1HhBBCCCFE4zhZsgeASEsPH0fSdkiiLIQQQgjRzKmqysnSXwGINEui3FQkURZC\nCCGEaObK7LmU2fPw01oINnbwdThthtc2HBFCCCGEEI3D7BfO+K5vUlyRjaLIPGdTkURZCCGEEKIF\nMOqCMOqCqjyWbzvEr6cWY/GLJKXdbTWcKS6WvCURQgghhGjBjpfs4HjJTl+H0SpJoiyEEEII0UIF\nGzui0xgoqczGZj/t63BaHUmUhRBCCCFaKI2ixeqfCECuLd3H0bQ+kigLIYQQQjRjBbYMnK6at6kO\nM3UBILc0ralCajMkURZCCCGEaKYcrgpWHX6eL9P+B4ervNo24aauAOTZDjZlaG2CJMqixRk4cCCz\nZs3ydRhCCCFEo8st249LdRDg1w6dxlhtG6upM1fEPcOITk81cXStn5SHEy2Ooii+DkEIIYRoEnXZ\ntlqn8fMsvxDeJTPKjWDTpk307duXu+66i6SkJD766CNGjRpFr169WL9+PQBFRUVMnz6d3r17k5SU\nxKRJk0hP/20R/oEDB7jzzjtJSUkhPj6eYcOG8emnn1a5jt1u59lnn6Vfv34kJCRw2WWX8e6773qO\nZ2ZmEhMTw7FjxzyPvf766wwaNKhKP59//jkxMTHs2bOHsWPHkpCQwIABA/j1V/dWmZWVlbz00kv0\n69ePzp07c9111/HLL794zh84cCAPPfQQPXr04L777mPGjBl06dKFp5566rzrDBs2jISEBIYPH85/\n/vOfKsdjYmKYP38+EyZMIDExkbFjx3LgwIEq14mJiSErK4tZs2YRExNDTEwMs2fPrtfPRwghhGgp\nsmXbap+SGeVGkpOTwwMPPEDHjh155pln+OKLL1i1ahXvvvsul19+OZMnT0av1/Pxxx8TFBTEe++9\nx80338z69esxmUzk5+eTkpLCtGnTsFqtrFu3jieeeILo6GiGDRsGwJw5c1iwYAHvvvsucXFxHDly\nhMzMzFpjq2lG9umnn+ahhx4iKSmJ3bt3o9frAXjkkUdIS0vjX//6F+3bt2fRokVMmjSJ9eLine truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a95e02b0>"
"<matplotlib.figure.Figure at 0x7f0bfb2e5668>"
]
}
],
"prompt_number": 40
"prompt_number": 41
},
{
"cell_type": "markdown",
@@ -2852,11 +2889,11 @@
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAsoAAAGDCAYAAAAyKTZ5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8VFX6+PHPnZIyM6mTBiRACoFAKAkdlSpSVJq4K0sR\nXNuXtYD6A1fXirK6KuhaVrGLWCliAZQmvUlVAyG0kACBNEImmWQmM/f3x8BIJISElCHheb9eeZG5\n5dxnTibhmTPnPkdJTU1VEUIIIYQQQpSj8XQAQgghhBBCXIkkURZCCCGEEKICkigLIYQQQghRAUmU\nhRBCCCGEqIAkykIIIYQQQlRAEmUhhBBCCCEqIImyEEIIIYQQFdB5OgAhhGhsFi5cyGOPPeZ+rNVq\nMZvNdO/enQceeICoqKhqtff666/z5ptvXrA9PDycNWvWlNtmt9t54403WLRoEQUFBcTHxzN16lR6\n9ep1wfnr1q3j1Vdf5cCBAwQFBXHLLbcwefJktFptteITQojGShJlIYSoI/fccw9xcXGUlpayZ88e\nFi5cyIYNG/juu+8wm83Vbu+ll14q99jX1/eCY5577jm++uorxo4dS3x8PF9//TV333038+bNo2PH\nju7jtm/fzr333ktiYiKPP/44+/bt480336SgoIB//etf1X+yQgjRCEmiLIQQdaRHjx707NkTgNGj\nRxMdHc2LL77IggULuPvuu6vd3s0331zp/oyMDHeSfC7ZHTp0KDfccAOvvvoqH374ofvYV199leDg\nYD766CN3wu1wOPj888+ZNGkSzZo1q3Z8QgjR2MgcZSGEqCfXXHMNAJmZmZfdhsViQVXVCvetWrUK\nVVUZNWqUe5vJZGLw4MFs3bqVwsJCAE6fPs327dsZNGhQuVHp0aNH43A4WL169WXHJ4QQjYmMKAsh\nRD1JT08HICgoiDNnzlBWVlbp8cHBweUed+nSBYvFgsFgYNCgQTz66KMEBAS496empqLVamndunW5\n8xISEnA4HKSlpZGcnMyBAwdwOp20bdu23HGtW7dGURRSU1Nr8jSFEKLRkERZCCHqiMViIS8vD5vN\nxp49e3j++efRarUMGTKEESNGcPz48UrP37dvHwABAQFMmDCBjh07otPp2LBhA19//TV79+7lq6++\nwsvLC4Ds7GwCAgLQarW8/fbbvPfee7z11lvu+dA5OTkAnDp1CgCz2cyBAwcYP348Q4YM4cknn8Tf\n35/s7Oy66hIhhGhQJFEWQog6cv/995d7HB4ezqxZs2jTpg0vv/wypaWlVWpnwoQJ5R4PGjSI5s2b\n8/LLL7N48WJuvfVWAGw2G3q9HoDjx49TVFREbm4ufn5+AJSUlLiPA/Dy8qKgoICCggL3dBC9Xl/l\nuIQQorGTRFkIIerItGnTSEhIQKfTYTabiYmJce9LTk6uUdvjxo3jlVdeYfPmze5E2cvLy50EP/30\n09x///2EhoayatUqAHx8fNzHgSth7tmzJ+vWrSMwMBBwlZfz9vauUWxCCNFYSKIshBB1JCEhwV31\n4s/y8vJwOByVnh8aGnrRfT4+Pvj7+3P69OlyxxcUFOBwONBqte7zc3NzAQgJCQEgLCys3PZzUzNs\nNhtnzpyp9LpCCHE1kURZCCE8YPTo0ZXOUVYUhb179150v8VioaCgoFw95tatW+N0Otm3bx/t2rVz\nb09JSUGj0dCqVSsA4uLi0Gg0pKSklKuQsW/fPlRVveBmQCGEuFpJoiyEEB5Q1TnKDoeDoqIi/P39\ny23/4IMPAOjdu7d7W//+/XnxxRdZuHChO1G2WCwsW7aMbt26uecqBwYG0rlzZ5YtW8ZDDz2EwWAA\nYP78+eh0Ovr161crz1EIIRo6SZSFEMIDqjpHuaioiAEDBjBo0CDi4uLQ6/Vs2bKFn376iZ49e3Lj\njTe6j42KimL06NF89tlnKIpCq1atmD9/PoWFhUyZMqVcuw8++CC33347EydO5JZbbiE1NdW9WIks\nNiKEEC6SKAshRB1QFKVW2vHx8aF///5s2bKFJUuWYLPZiIyM5L777uPuu+++4DpPPPEEQUFBLFq0\niK+++orWrVszZ84cOnXqVO64Ll268L///Y/XXnuN559/nuDgYCZPnsw//vGPWolbCCEaAyU1NbXi\nJZ6EEEIIIYS4iskS1kIIIYQQQlRAEmUhhBBCCCEqIImyEEIIIYQQFZBEWQghhBBCiAp4vOpFRkaG\np0MQQgghhBBXgaioqGod7/FEGVzLvF6K88v3UVcsRrn1DjQ3jKiHqBo3s9nMwoUL6dOnj6dDuSpJ\n/3uW9L/nSN97lvS/Z0n/e47ZbGb9+vXVPq/hTL3Qnc3pHWWejUMIIYQQQlwVGl6iXCaJshBCCCGE\nqHsNJ1HWSqJc26oy5UXUHel/z5L+9xzpe8+S/vcs6f+GpeEkyu6pF3bPxtGIyC+rZ0n/e5b0v+dI\n33uW9L9nSf83LA0vUZYRZSGEEEIIUQ+uiKoXlbHb7eTn50PzeLh9KgQGo2RnezqsBi8/Px+Askb6\nxkOv1xMYGOjpMIQQQgjRgF3RibLdbic3N5ewsDA0YWEQLx9XiKo5ffo0xcXFGAwGT4cihBBCiAbq\nip56kZ+f70qSNVd0mOIKFBAQgMVi8XQYQgghhGjArugMVFEUSZLFZVEUBUVRPB2GEEIIIRowyUKF\nEEIIIYSogCTKQgghhBBCVEAS5avcHXfcQWRkJJGRkUydOtXT4QghhBBCXDFqlCgfP36cpKSkcl9t\n2rRh+fLllJWV8dhjj5GcnEy/fv1YunRpbcV8VenevTuzZs2qs/Zfe+01du7cyc033yxzeoUQQggh\nzlOj8nBNmzZl586d7sfp6emMHDmS6667jg8//JADBw6wdu1aUlJSuOeee0hKSiIiIqLGQV9N6jp5\n9fPzw8/PD29vb1RVrdNrCSGEEEI0JLU69WLBggXccMMN+Pj4sGzZMsaPH4/JZKJbt24kJSWxfPny\n2rzcFe2nn35i5MiRtGvXjtjYWEaOHMm2bdvKHfPjjz9y4403EhsbS1JSEg899BB2u2uJ7u7duxMZ\nGUlmZiazZs1yT4+YPXu2+/zRo0eXG23OyMggMjKSzZs3A2Cz2XjooYfo1asXMTExdO7cmWeffRab\nzXZBvDKaLIQQQghRXq0tOOJ0Olm8eDEvvPACAEeOHCE6OppHHnmE/v37Exsby+HDh2vrcle87Oxs\n/vrXv5KUlIS3tzfvvPMOY8eOZcuWLQQFBfHTTz9x55138sADD/Daa69RXFzMt99+S2lpKXq9nqVL\nl+JwOBg6dCjDhw/n3nvvBbhgAY3KEly73Y6XlxezZs0iKiqKgwcP8uCDD6LX6/nnP/9Zp89fCCGE\nEHXD4bRx3LKbItsp2oTc6OlwGrVaS5TXr1+Poij07NkTAKvVisFgIC0tjcTERIxGI1lZWbV1Obdm\nY9+t9TYBjs27q0bnjx07ttzjxx9/nLlz57JlyxYGDx7MG2+8weDBg/l//+//uY/p0KGD+/vg4GAA\ntFotRqORkJCQasdgNBrdb1wAmjVrxogRI1i5cqUkykIIIUQD5VSdbMp4A4DYoAHotT4ejqjxqrVE\neeHChQwbNsz92NfXF6vVyuLFiwF47rnnMBqNFZ5rNpsr3J6fn19b4dW7o0eP8tJLL7Fjxw5yc3Nx\nOp0AFBUVAZCSksLw4cPrPI558+bx2WefkZmZidVqxW6307Rp0zq/7pVAp9Nd9LXlaXq9Hrj4a1/U\nLel/z5G+9yzpf8+qzf4PyYwl25JGmT6biKBONW6vsTvX99VVK4lyQUEBq1atYtGiRe5tLVu25ODB\ng7Rr1w6AgwcPMmDAgArPnzFjhvv73r1706dPnypfu6Yjv3Xl9ttvp0WLFsyePZuwsDBsNhv9+/d3\nJ8y14c/TLv7c9nfffcczzzzDM888Q3JyMj4+Prz11lusWbOmSu0JIYQQ4srUJKAd2ZY0jhf8RqQk\nyhVas2YNa9euBVyf0Pfu3bvabdRKovz9998THx9PbGyse9uQIUOYO3cu/fr1IyUlhV27dpWbBnC+\nyZMnl3ucm5sLQFlZWW2EV+/y8vJIS0vj7bffpnXr1gD88ssv5Y5p164dmzZt4u9//3ulben1evcN\nfn8WEBBAYWGh+3FmZma5/Vu2bKFPnz6MGTPGvS0jI6PChNhoNJKTk1P5E2tgysrK3K+lK8250YQr\nNb7GTvrfc6TvPUv637Nqs//9NM0ByMjdTazfkBq31xglJiaSmJgIuPp+/fr11W6jVqpeLFy4kBEj\nRpTbNnHiRFq1akWfPn149NFHmTlzJuHh4bVxuSteYGAgZrOZuXPnkp6ezsaNG3n66afLJaj33Xcf\nP/74Iy+//DJpaWn89ttvzJgxA4vFUq6tmJgY1q5dy4kTJygpKcHhcLj3dezYkRUrVnDmzBmsVitv\nv/12uXPj4uLYtm0bmzdv5tChQ8yePZvt27dXGHPHjh1Zv349u3bt4tSpU1it1lrsESGEEELUhnVH\nZ7Pt+Af4eTUBINd6AKfaMAcWG4JaSZQXLFjAuHHjym3T6XTMnDmTHTt2sHr1aoYMuXre7Wg0Gt55\n5x22bNlC//79eeKJJ5g2bRoazR/dPXDgQN5//31Wr17N4MGDGTNmDNnZ2Xh7e5dr69FHH0Wj0dC7\nd2/i4uL473//6943ceJEYmJi6NmzJzfffDMDBw4sl4yPGzeOQYMGceedd3LjjTdy/Phx7rjjjgpj\nHjVqFEOGDGHMmDEkJyfz2Wef1XKvCCGEEKImSsoKOF64g/TTGzB5hZEQchPJTW5HVWtvWqcoT0lN\nTfXoKhMZGRkkJCRUuC87O5vQ0NB6jkg0Flfy60c+/vQs6X/Pkb73LOl/z6pp/6cXbGJz5lLine truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90ac362da0>"
"<matplotlib.figure.Figure at 0x7f0bfb1ee080>"
]
}
],
"prompt_number": 41
"prompt_number": 42
},
{
"cell_type": "markdown",
@@ -2922,21 +2959,21 @@
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"png": "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\nhty/+k3uX/0l965+S01NZc2aNTRv3rxCx0lnWAghhBBCNFgShoUQQgghRIMlYVgIIYQQQjRYEoaF\nEEIIIUSDJWFYCCGEEEI0WBKGhRBCCCFEgyVhWAghhBBCNFgShoUQQgghRIMlYVgIIYQQQjRYEoaF\nEEIIIUSDJWFY1Dl9+vRh3rx5tV2GEEIIIRoACcOizlEUpbZLEEIIIUQDIWG4EtauXUuPHj0YN24c\nnTp14uWXX2bw4MGcc845fPbZZwDk5+dz11130bVrVzp16sSYMWPYtm1b9Bzbt2/nuuuuo3v37rRp\n04YBAwawePHiYtcJhULMnDmTnj170rZtWy644AKee+656PY9e/bQrFkz9u7dG33tr3/9K3379i12\nnrfeeotmzZrx3XffMXz4cNq2bUvv3r3ZvHkzAMFgkAceeICePXvSvn17LrvsMr744ovo8X369OHW\nW2+lc+fO3HTTTcyZM4cOHTowffr0EtcZMGAAbdu25aKLLuKNN94otr1Zs2a8/vrrjBw5knbt2jF8\n+HC2b99e7DrNmjUjKyuLefPm0axZM5o1a8b8+fMrdH+EEEIIIcpLr+0C6quDBw8yfvx4WrZsyYwZ\nM3jnnXdYtWoVzz33HBdeeCFXX301DoeDV155hcTERBYtWsQVV1zBZ599htvtJjs7m+7duzN58mRS\nU1PJzMzk7rvvJiMjgwEDBgDw0ksvsWTJEp577jlat27Nrl272LNnz0lrK6uzeu+993LrrbfSqVMn\nvv32WxwOBwC33347W7du5amnnqJp06YsW7aMMWPG8Nlnn3HGGWegKArJycm88sorjBo1iuuuu443\n33yTkSNHMnXqVFJTU3nttdeYO3cuDz30ED179uTrr7/m9ttvJzk5mSFDhkRreP7553n44YdJSEhg\nwoQJzJ49m1dffRWAlStXYpomv/vd7xgxYgTjx48HwO12n9K9EkIIIYQoS70Iw00zMkp9/ZdjOqKn\nsn9lpKam0rt3bwoLC3n33Xfp27cvPp+P1atX89lnn/HVV1/x1VdfkZaWBsCcOXNYsmQJq1at4rLL\nLqN379707t07er4rr7ySV199ldWrV0fD8J49e2jcuDEXXHABABllvK/j2bZd6uu33HILgwcPBqBF\nixYA7Ny5k+XLl/P+++/TtWtXACZPnsy7777LsmXLmDBhAgCDBg2iV69epKamMmjQIHr06ELine truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a93e3cc0>"
"<matplotlib.figure.Figure at 0x7f0bfb411898>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a952d860>"
"<matplotlib.figure.Figure at 0x7f0bfb4114a8>"
]
}
],
"prompt_number": 42
"prompt_number": 43
},
{
"cell_type": "markdown",
@@ -3007,11 +3044,11 @@
"output_type": "display_data",
"png": "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\nrYebEZs2bcKMGTNQUFCATZs2YezYsTjrrLMAAPv27cPKlStx8skn46WXXkJVVRU2btyIESNGYOLE\nic0el1+1She5lmWhtrYW27ZtQ+/evbP6WEgMEwRB7IdJkybhueeew+OPP56xGH7mmWdy4hlujG3b\ntgEAysrKxLaBAwfis88+g+u6KYvovv76awwYMEBs+973vgcAWLVqVcoHzapVq1J+TxBEyzAMA9df\nfz1UVcWsWbPAGMOUKVMwYsQITJ48GcFgUOR8H3vsseK91lFYt24d5syZA8YYIpEITj/9dGiahnHj\nxmHLli1wXRfvvfcennnmGZSVlcFxHJx99tkwDANXXHFFk8cdNGgQevbsKdYxcNauXQvAE9okhgmC\nINqYUCiESy+9FHPnzsVnn32W0YrlXHiGa2trEQqFIMuy2GbbNp599lkoioKRI0eK7ePGjcO7776L\nhQsX4owzzgAArFixAuvXr8dPf/pTsd+JJ56IUCiE+fPni0xh27bx2muv4ZBDDqEkCYLIkNmzZyMW\ni+EPf/iDeK9eccUVmD9/Pnr16pXT+/7lL38prursj7KyMjz44IMZHf+II47AjBkzxMl0OBzGiBEj\n8Oijj2LcuHGiqtuvXz9xci5JEk466SQ8/vjjmDhxYpMJOowx3HPPPbj33nuxb98+lJaW4osvvhB2\nL//fvWxBYpggCCKNxjxoV155JZ599lk8/fTTGYnhXHiGP/30UzzwwAMYP348+vTpg2g0in/84x/4\n6quvcPPNN+Oggw4S+5577rl49tlncdddd2HTpk3QdR1PP/00DjroIFx11VViv4KCAtx444145JFH\ncPvtt4sOdOvXr8cjjzyS1fETRGentrYWzz//PGbPnp0i3gzDEKIul8yYMSOnxw+Hww22BYNBrFu3\nDjU1NSgtLQXQsCNmYWEhqqqqsHbtWhx55JFNHn/MmDGoqKjAM888g6KiIgwaNAjDhg3Dl19+mfWq\nMEBimCAIogHpmbyA58edMGEC/v73v2PdunUHlACRLfr164cBAwbgrbfeQnV1NRhjGDRoEB588EGc\nd955Kfuqqopnn30W999/P55++mnYto3jjjsOd911FwoLC1P2vfHGG6HrOl544QW88847OPTQQ/HQ\nQw9hwoQJbfnwCKLD89lnn8G27ZRUGgD44osvRBpCRyUSieC8887D+PHjMWXKlJTtPJGmZ8+eCAQC\nsCyr0WO0pLp71FFH4aijjhI/L1iwAEcddVRKC/lssV8xvGjRIsydOxerVq3COeecI7LiTNPEPffc\ng7fffhvFxcW44447cOaZZ2Z9gARBEG3J888/3+TvZs6cKVoV55P+/fvjySefbPH+FRUVePjhh1u0\n76RJkzBp0qQDHBlBEIAXRVhaWppiBdi5cyc+/PBDvPrqqzm//1zaJCRJgmEYDTKFN23ahKOPPlrE\noY0cOVKsY+Ds3r0bJSUlIr+8KaZNm4ZPP/0Ub775JgCvor5s2TLceeedLR5nJuxXDBcVFeG6667D\nRx99lJIzOW/ePKxbtw5Lly7FqlWrcOONN2LYsGHo2bNnTgZKEARBEATRETjuuOOQSCREUxvDMHDn\nnXfi9ttvb5M2y9mwSXC7mG3bKdtDoRAuuuginHDCCWLbf/7zH2zevBkvvvii2HbTTTfh+uuvF77f\n6upqLF26FD/72c9EZXjJkiX45S9/iVmzZqUsTq6rq8PRRx8tfp49ezaGDx+Oc845p8XjzAS2evXq\nFgW0Pfroo9i5c6eoDF988cWYNGkSzj33XADANddcgzFjxqR40AiCIAiCILoiH3zwARYsWIC+ffti\n586dGDduHMaMGZOyz65du/CPf/wDW7duxZFHHgnTNLFt2zb89Kc/FbFsBx10EHbu3InjjjsOxx57\nLBzHwUsvvYTS0lJs3boVl19+eaMe3gPl888/x/PPP4+vv/4a3333HXr06IGhQ4fivPPOE+2QDcPA\n//3f/4mIxr179+L6669PacUMAEuXLsUrr7wiHsPYsWNTknOWLFmC22+/HQ8//DBGjRoltu/cuRNz\n5syBruuora1Fr169cNNNN4kGQi0dZ0tpsRh+5JFHsGvXLiGGhw8fjueeew7z5s3D2LFjsXz5cti2\njd/85jcZDYAgCIIgCKIr8vrrr+PMM8/E+PHj8dZbbyEcDuOyyy7DE088gfvuuw8//OEPceKJJyIW\ni+HSSy/Fm2++iaVLl2L16tW4/vrrMW3aNFx++eVtUm3uzEj738UjfUFJLBZDKBTC2rVrsWvXLhQU\nFCAajWZ9gARBEARBEJ2RcePG4auvvsJxxx0nqru7du3Cd999h61bt4oFeNXV1di1axcAz+M7d+5c\nTJ48GaeddhoJ4SzQ4jSJ9KihYDCIWCyG119/HYBndi4oKGj0tps3b27FEAmCIAiCIDon77Line truncated
"text": [
"<matplotlib.figure.Figure at 0x7f90a936de48>"
"<matplotlib.figure.Figure at 0x7f0bfb3a2278>"
]
}
],
"prompt_number": 43
"prompt_number": 44
},
{
"cell_type": "markdown",
@@ -3043,7 +3080,7 @@
"source": [
"** author's note: this code is somewhat old. This section needs to be edited; I would not pay a lot of attention to it right now. **\n",
"\n",
"The kalman filter code that we are using is implemented in my Python library `filterpy`. If you are interested in the full implementation of the filter you should look in `filterpy\\kalman\\kalman_filter.py`. In the following I will present a simplified implementation of the same code. The code in the library handles issues that are beyond the scope of this chapter, such as numerical stability and support for the extended Kalman filter, subject of a later chapter. \n",
"The kalman filter code that we are using is implemented in my Python library `FilterPy`. If you are interested in the full implementation of the filter you should look in `filterpy\\kalman\\kalman_filter.py`. In the following I will present a simplified implementation of the same code. The code in the library handles issues that are beyond the scope of this chapter, such as numerical stability and support for the extended Kalman filter, subject of a later chapter. \n",
"\n",
"The code is implemented as the class `KalmanFilter`. Some Python programmers are not a fan of object oriented (OO) Python, and eschew classes. I do not intend to enter into that battle other than to say that I have often seen OO abused. Here I use the class to encapsulate the data that is pertinent to the filter so that you do not have to store and pass around a half dozen variables everywhere.\n",
"\n",
@@ -3219,7 +3256,7 @@
"\n",
"- [3] Brown, Robert Grover. *Introduction to Random Signals and Applied Kalman Filtering* John Wiley & Sons, Inc. 2012\n",
"\n",
"- [4] `filterpy` library. Roger Labbe.\n",
"- [4] `FilterPy` library. Roger Labbe.\n",
"https://github.com/rlabbe/filterpy"
]
}
+129 -32
View File
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:055b90da7ef328423abb1781625b97673afca40aad9be9012d9e79e2f3aa4c65"
"signature": "sha256:a223b7e436fc202bc6f77b7834cdaa6338449361293f2c25146fc75469ca4718"
},
"nbformat": 3,
"nbformat_minor": 0,
@@ -261,7 +261,7 @@
"output_type": "pyout",
"prompt_number": 1,
"text": [
"<IPython.core.display.HTML at 0x7f306bfdb5f8>"
"<IPython.core.display.HTML at 0x7fb742f517b8>"
]
}
],
@@ -344,7 +344,7 @@
"\n",
"And that's it. That is the equation that Kalman set out to solve, and he found a way to compute an optimal solution if we assume certain properties of $w$.\n",
"\n",
"However, we took advantage of something I left mostly unstated in the last chapter. We were able to provide a definition for $\\mathbf{F}$ because we were able to take advantage of the exact solution that Newtonian equations provide us. However, if you have an engineering background you will realize what a small class of problems that covers.If you don't, I will explain it next, and provide you with several ways to compute $\\mathbf{F} for arbitrary systems$."
"However, we took advantage of something I left mostly unstated in the last chapter. We were able to provide a definition for $\\mathbf{F}$ because we were able to take advantage of the exact solution that Newtonian equations provide us. However, if you have an engineering background you will realize what a small class of problems that covers.If you don't, I will explain it next, and provide you with several ways to compute $\\mathbf{F}$ for arbitrary systems."
]
},
{
@@ -447,7 +447,7 @@
"\n",
"Finally, there are numerical techniques to find $\\Phi$. As filters get larger finding analytical solutions becomes very tedious (though packages like Sympy make it easier). C. F. van Loan [3] has developed a technique that finds both $\\Phi$ and $Q$ numerically.\n",
"\n",
"I have implemented van Loan's method in `filterpy`. You may use it as follows:\n",
"I have implemented van Loan's method in `FilterPy`. You may use it as follows:\n",
"\n",
" from filterpy.common import van_loan_discretization\n",
" \n",
@@ -455,9 +455,75 @@
" G = np.array([[0.],[2.]]) # white noise scaling\n",
" phi, Q = van_loan_discretization(F, G, dt=0.1)\n",
" \n",
"See the docstring documentation for van_loan_discretization for more information. In IPython, or in this notebook, just type `van_loan_discretization??` and press return."
"See the docstring documentation for van_loan_discretization for more information, which I have embedded below."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from filterpy.common import van_loan_discretization\n",
"help(van_loan_discretization)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Help on function van_loan_discretization in module filterpy.common.discretization:\n",
"\n",
"van_loan_discretization(F, G, dt)\n",
" Discretizes a linear differential equation which includes white noise\n",
" according to the method of C. F. van Loan [1]. Given the continuous\n",
" model\n",
" \n",
" x' = Fx + Gu\n",
" \n",
" where u is the unity white noise, we compute and return the sigma and Q_k\n",
" that discretizes that equation.\n",
" \n",
" \n",
" Example:\n",
" -------\n",
" \n",
" Given y'' + y = 2u(t), we create the continuous state model of\n",
" \n",
" x' = | 0 1| * x + |0|*u(t)\n",
" |-1 0| |2|\n",
" \n",
" and a time step of 0.1:\n",
" \n",
" \n",
" >>> F = np.array([[0,1],[-1,0]], dtype=float)\n",
" >>> G = np.array([[0.],[2.]])\n",
" >>> phi, Q = van_loan_discretization(F, G, 0.1)\n",
" \n",
" >>> phi\n",
" array([[ 0.99500417, 0.09983342],\n",
" [-0.09983342, 0.99500417]])\n",
" \n",
" >>> Q\n",
" array([[ 0.00133067, 0.01993342],\n",
" [ 0.01993342, 0.39866933]])\n",
" \n",
" (example taken from Brown[2])\n",
" \n",
" \n",
" References\n",
" ----------\n",
" [1] C. F. van Loan. \"Computing Integrals Involving the Matrix Exponential.\"\n",
" IEEE Trans. Automomatic Control, AC-23 (3): 395-404 (June 1978)\n",
" \n",
" [2] Robert Grover Brown. \"Introduction to Random Signals and Applied\n",
" Kalman Fitlering.\" Forth edition. John Wiley & Sons. p. 126-7. (2012)\n",
"\n"
]
}
],
"prompt_number": 12
},
{
"cell_type": "heading",
"level": 2,
@@ -510,9 +576,9 @@
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7ff2cda130f0>"
"<matplotlib.figure.Figure at 0x7fb742f55dd8>"
]
}
],
@@ -706,7 +772,7 @@
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 40,
"prompt_number": 3,
"text": [
"\u23a1 5 4 3\u23a4 \n",
"\u23a2\\Delta{t} \\Delta{t} \\Delta{t} \u23a5 \n",
@@ -725,7 +791,7 @@
]
}
],
"prompt_number": 40
"prompt_number": 3
},
{
"cell_type": "markdown",
@@ -760,18 +826,18 @@
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 38,
"prompt_number": 4,
"text": [
"[\\Delta{t}\u22c5\\Phi_s]"
]
}
],
"prompt_number": 38
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"cell_type": "code",
"collapsed": false,
"input": [
"F_k = sympy.Matrix([[1, dt],\n",
" [0, 1]])\n",
"Q_c = sympy.Matrix([[0,0],\n",
@@ -783,7 +849,38 @@
"# factor phi out of the matrix to make it more readable\n",
"Q = Q/phi\n",
"sympy.MatMul(Q, phi)"
]
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1st order discrete process noise\n"
]
},
{
"latex": [
"$$\\left[\\begin{matrix}\\frac{\\Delta{t}^{3}}{3} & \\frac{\\Delta{t}^{2}}{2}\\\\\\frac{\\Delta{t}^{2}}{2} & \\Delta{t}\\end{matrix}\\right] \\Phi_{s}$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 13,
"text": [
"\u23a1 3 2\u23a4 \n",
"\u23a2\\Delta{t} \\Delta{t} \u23a5 \n",
"\u23a2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u23a5\u22c5\\Phi_s\n",
"\u23a2 3 2 \u23a5 \n",
"\u23a2 \u23a5 \n",
"\u23a2 2 \u23a5 \n",
"\u23a2\\Delta{t} \u23a5 \n",
"\u23a2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \\Delta{t} \u23a5 \n",
"\u23a3 2 \u23a6 "
]
}
],
"prompt_number": 13
},
{
"cell_type": "markdown",
@@ -810,7 +907,7 @@
"\n",
"The covariance of the process noise is then\n",
"\n",
"$$Q = E[\\Gamma w(t) w(t) \\Gamma^T] = \\Gamma\\sigma^2_v\\Gamma^T$$.\n",
"$$Q = E[\\Gamma w(t) w(t) \\Gamma^\\mathsf{T}] = \\Gamma\\sigma^2_v\\Gamma^\\mathsf{T}$$.\n",
"\n",
"We can compute that with SymPy as follows"
]
@@ -838,7 +935,7 @@
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 53,
"prompt_number": 5,
"text": [
"\u23a1 4 3\u23a4 \n",
"\u23a2\\Delta{t} \\Delta{t} \u23a5 \n",
@@ -852,7 +949,7 @@
]
}
],
"prompt_number": 53
"prompt_number": 5
},
{
"cell_type": "markdown",
@@ -871,7 +968,7 @@
"\n",
"The covariance of the process noise is then\n",
"\n",
"$$Q = E[\\Gamma w(t) w(t) \\Gamma^T] = \\Gamma\\sigma^2_v\\Gamma^T$$.\n",
"$$Q = E[\\Gamma w(t) w(t) \\Gamma^\\mathsf{T}] = \\Gamma\\sigma^2_v\\Gamma^\\mathsf{T}$$.\n",
"\n",
"We can compute that with SymPy as follows"
]
@@ -899,7 +996,7 @@
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 55,
"prompt_number": 6,
"text": [
"\u23a1 4 3 2\u23a4 \n",
"\u23a2\\Delta{t} \\Delta{t} \\Delta{t} \u23a5 \n",
@@ -918,7 +1015,7 @@
]
}
],
"prompt_number": 55
"prompt_number": 6
},
{
"cell_type": "markdown",
@@ -952,14 +1049,14 @@
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 2,
"prompt_number": 7,
"text": [
"array([[ 0.33333333, 0.5 ],\n",
" [ 0.5 , 1. ]])"
]
}
],
"prompt_number": 2
"prompt_number": 7
},
{
"cell_type": "code",
@@ -973,7 +1070,7 @@
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 10,
"prompt_number": 8,
"text": [
"array([[ 0.05 , 0.125 , 0.16666667],\n",
" [ 0.125 , 0.33333333, 0.5 ],\n",
@@ -981,7 +1078,7 @@
]
}
],
"prompt_number": 10
"prompt_number": 8
},
{
"cell_type": "markdown",
@@ -1002,14 +1099,14 @@
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"prompt_number": 9,
"text": [
"array([[ 0.25, 0.5 ],\n",
" [ 0.5 , 1. ]])"
]
}
],
"prompt_number": 8
"prompt_number": 9
},
{
"cell_type": "code",
@@ -1023,7 +1120,7 @@
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"prompt_number": 10,
"text": [
"array([[ 0.25, 0.5 , 0.5 ],\n",
" [ 0.5 , 1. , 1. ],\n",
@@ -1031,7 +1128,7 @@
]
}
],
"prompt_number": 7
"prompt_number": 10
},
{
"cell_type": "markdown",
@@ -1054,7 +1151,7 @@
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"prompt_number": 11,
"text": [
"array([[ 1.56250000e-08, 7.81250000e-07, 2.08333333e-05],\n",
" [ 7.81250000e-07, 4.16666667e-05, 1.25000000e-03],\n",
@@ -1062,7 +1159,7 @@
]
}
],
"prompt_number": 3
"prompt_number": 11
},
{
"cell_type": "markdown",
@@ -1070,7 +1167,7 @@
"source": [
"We can see that most of the terms are very small. Recall that the only Kalman filter using this matrix is\n",
"\n",
"$$ \\mathbf{P}=\\mathbf{FPF}^T + \\mathbf{Q}$$\n",
"$$ \\mathbf{P}=\\mathbf{FPF}^\\mathsf{T} + \\mathbf{Q}$$\n",
"\n",
"If the values for $\\mathbf{Q}$ are small relative to $\\mathbf{P}$\n",
"than it will be contributing almost nothing to the computation of $\\mathbf{P}$. Setting $\\mathbf{Q}$ to \n",
@@ -261,7 +261,7 @@
"output_type": "pyout",
"prompt_number": 1,
"text": [
"<IPython.core.display.HTML at 0x7fe0265715c0>"
"<IPython.core.display.HTML at 0x7f4ddac347b8>"
]
}
],
@@ -1033,7 +1033,7 @@
"source": [
"Now we can implement our filter. I have not yet designed $\\mathbf{R}$ and $\\mathbf{Q}$ which is required to get optimal performance. However, we have already covered a lot of confusing material and I want you to see concrete examples as soon as possible. Therefore I will use 'reasonable' values for $\\mathbf{R}$ and $\\mathbf{Q}$.\n",
"\n",
"The `filterpy` library provides the class `ExtendedKalmanFilter`. It works very similar to the `KalmanFilter` class we have been using, except that it allows you to provide functions that compute the Jacobian of $\\mathbf{H}$ and the function $h(\\mathbf{x})$. We have already written the code for these two functions, so let's just get going.\n",
"The `FilterPy` library provides the class `ExtendedKalmanFilter`. It works very similar to the `KalmanFilter` class we have been using, except that it allows you to provide functions that compute the Jacobian of $\\mathbf{H}$ and the function $h(\\mathbf{x})$. We have already written the code for these two functions, so let's just get going.\n",
"\n",
"We start by importing the filter and creating it. There are 3 variables in `x` and only 1 measurement. At the same time we will create our radar simulator.\n",
"\n",
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:d0f56611de4c723c8e7b5143ed3ccef719165500f23856ea8aeaaf28fcab3664"
"signature": "sha256:ac5d16f13341646cfbb0fb366e162a56628ec5cb0c19001da7a7fb23105214b0"
},
"nbformat": 3,
"nbformat_minor": 0,
@@ -615,7 +615,9 @@
" Xi[k+1] = X + U[k]\n",
" Xi[n+k+1] = X - U[k]\n",
"\n",
"The full listing from the `filterpy.kalman` library follows."
"The full listing from the `filterpy.kalman` library follows.\n",
"\n",
"(**author's note: FilterPy has been updated since this was written; it now uses an class to implement the Unscented Kalman filter, not standalone classes. Until I update this, refer to the test_ukf.py file in that library to see how to use the class**)"
]
},
{
+2 -2
View File
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:c5c10c287a1d7f362dbed42c41eebc10b9bae86b387a0b10952a0824fcb7e359"
"signature": "sha256:5c842924509a6cfd6bb712a9a7e984f9b068e34de67e1bb6c963cb48309b6e72"
},
"nbformat": 3,
"nbformat_minor": 0,
@@ -277,7 +277,7 @@
"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."
"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."
]
},
{
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:50cd0bf7b737693755e8062af84247f67e5b07744fa97aee1a0dc08618dec3f8"
"signature": "sha256:aa9b4df3b3595ff9a790185720fa062f01b70b83d6266449e2fba5baecb5af02"
},
"nbformat": 3,
"nbformat_minor": 0,
@@ -32,7 +32,7 @@
"from __future__ import division, print_function\n",
"import matplotlib.pyplot as plt\n",
"import sys\n",
"sys.path.insert(0,'../') # allow us to format the book\n",
"sys.path.insert(0,'../code') # allow us to format the book\n",
"import book_format\n",
"book_format.load_style()"
],
@@ -43,6 +43,8 @@
"html": [
"<style>\n",
"@import url('http://fonts.googleapis.com/css?family=Source+Code+Pro');\n",
"@import url('http://fonts.googleapis.com/css?family=Vollkorn');\n",
"@import url('http://fonts.googleapis.com/css?family=Arimo');\n",
"\n",
" div.cell{\n",
" width: 850px;\n",
@@ -129,9 +131,9 @@
" white-space: nowrap;\n",
" }\n",
" div.text_cell_render{\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" font-family: 'Arimo',verdana,arial,sans-serif;\n",
" line-height: 135%;\n",
" font-size: 110%;\n",
" font-size: 125%;\n",
" width:750px;\n",
" margin-left:auto;\n",
" margin-right:auto;\n",
@@ -141,12 +143,12 @@
" div.output_subarea.output_text.output_pyout {\n",
" overflow-x: auto;\n",
" overflow-y: scroll;\n",
" max-height: 300px;\n",
" max-height: 50000px;\n",
" }\n",
" div.output_subarea.output_stream.output_stdout.output_text {\n",
" overflow-x: auto;\n",
" overflow-y: scroll;\n",
" max-height: 300px;\n",
" max-height: 50000px;\n",
" }\n",
" code{\n",
" font-size: 70%;\n",
@@ -257,13 +259,13 @@
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 1,
"prompt_number": 10,
"text": [
"<IPython.core.display.HTML at 0x7f5e0d759a20>"
"<IPython.core.display.HTML at 0x7f51f8293748>"
]
}
],
"prompt_number": 1
"prompt_number": 10
},
{
"cell_type": "markdown",
@@ -278,6 +280,310 @@
"Still, I know I have not downloaded some IPython Notebooks that are of interest to me. There is the free nbviewer.org site which will statically render a notebook that is hosted elsewhere. My book is hosted on github, so you can always read my book for free by going to \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## SymPy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SymPy is a Python package for performing symbolic mathematics. The full scope of its abilities are beyond this book, but it can perform algebra, integrate and differentiate equations, find solutions to differential equations, and much more. For example, we use use to to compute the Jacobian of matrices and the expected value integral computations.\n",
"\n",
"First, a simple example. We will import SymPy, initialize its pretty print functionality (which will print equations using LaTeX). We will then declare a symbol for Numpy to use."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import sympy\n",
"from sympy import init_printing\n",
"#from sympy.interactive import printing\n",
"init_printing(use_latex='mathjax')\n",
"\n",
"phi, x = sympy.symbols('\\phi, x')\n",
"phi"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\phi$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 2,
"text": [
"\\phi"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice how we use a latex expression for the symbol `phi`. This is not necessary, but if you do it will render as LaTeX when output. Now let's do some math. What is the derivative of $\\sqrt{\\phi}$?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sympy.diff('sqrt(phi)')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\frac{1}{2 \\sqrt{\\phi}}$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"text": [
" 1 \n",
"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
" ___\n",
"2\u22c5\u2572\u2571 \u03c6 "
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can factor equations"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sympy.factor(phi**3 -phi**2 + phi - 1)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left(\\phi - 1\\right) \\left(\\phi^{2} + 1\\right)$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": [
" \u239b 2 \u239e\n",
"(\\phi - 1)\u22c5\u239d\\phi + 1\u23a0"
]
}
],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and we can expand them."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"((phi+1)*(phi-4)).expand()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\phi^{2} - 3 \\phi - 4$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 5,
"text": [
" 2 \n",
"\\phi - 3\u22c5\\phi - 4"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can find the value of an equation by substituting in a value for a variable"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"w =x**2 -3*x +4\n",
"w.subs(x,4)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$8$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 6,
"text": [
"8"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can also use strings for equations that use symbols that you have not defined"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = sympy.expand('(t+1)*2')\n",
"x"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$2 t + 2$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": [
"2\u22c5t + 2"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's use SymPy to compute the Jacobian of a matrix. Let us have a function\n",
"\n",
"$$h=\\sqrt{(x^2 + z^2)}$$\n",
"\n",
"for which we want to find the Jacobian with respect to x, y, and z."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x, y, z = sympy.symbols('x y z')\n",
"\n",
"H = sympy.Matrix([sympy.sqrt(x**2 + z**2)])\n",
"\n",
"state = sympy.Matrix([x, y, z])\n",
"H.jacobian(state)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left[\\begin{matrix}\\frac{x}{\\sqrt{x^{2} + z^{2}}} & 0 & \\frac{z}{\\sqrt{x^{2} + z^{2}}}\\end{matrix}\\right]$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": [
"\u23a1 x z \u23a4\n",
"\u23a2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u23a5\n",
"\u23a2 _________ _________\u23a5\n",
"\u23a2 \u2571 2 2 \u2571 2 2 \u23a5\n",
"\u23a3\u2572\u2571 x + z \u2572\u2571 x + z \u23a6"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's compute the discrete process noise matrix $\\mathbf{Q}_k$ given the continuous process noise matrix \n",
"$$\\mathbf{Q} = \\Phi_s \\begin{bmatrix}0&0&0\\\\0&0&0\\\\0&0&1\\end{bmatrix}$$\n",
"\n",
"and the equation\n",
"\n",
"$$\\mathbf{Q} = \\int_0^{\\Delta t} \\Phi(t)\\mathbf{Q}\\Phi^T(t) dt$$\n",
"\n",
"where \n",
"$$\\Phi(t) = \\begin{bmatrix}1 & \\Delta t & {\\Delta t}^2/2 \\\\ 0 & 1 & \\Delta t\\\\ 0& 0& 1\\end{bmatrix}$$"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"dt = sympy.symbols('\\Delta{t}')\n",
"F_k = sympy.Matrix([[1, dt, dt**2/2],\n",
" [0, 1, dt],\n",
" [0, 0, 1]])\n",
"Q = sympy.Matrix([[0,0,0],\n",
" [0,0,0],\n",
" [0,0,1]])\n",
"\n",
"sympy.integrate(F_k*Q*F_k.T,(dt, 0, dt))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left[\\begin{matrix}\\frac{\\Delta{t}^{5}}{20} & \\frac{\\Delta{t}^{4}}{8} & \\frac{\\Delta{t}^{3}}{6}\\\\\\frac{\\Delta{t}^{4}}{8} & \\frac{\\Delta{t}^{3}}{3} & \\frac{\\Delta{t}^{2}}{2}\\\\\\frac{\\Delta{t}^{3}}{6} & \\frac{\\Delta{t}^{2}}{2} & \\Delta{t}\\end{matrix}\\right]$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": [
"\u23a1 5 4 3\u23a4\n",
"\u23a2\\Delta{t} \\Delta{t} \\Delta{t} \u23a5\n",
"\u23a2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u23a5\n",
"\u23a2 20 8 6 \u23a5\n",
"\u23a2 \u23a5\n",
"\u23a2 4 3 2\u23a5\n",
"\u23a2\\Delta{t} \\Delta{t} \\Delta{t} \u23a5\n",
"\u23a2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u23a5\n",
"\u23a2 8 3 2 \u23a5\n",
"\u23a2 \u23a5\n",
"\u23a2 3 2 \u23a5\n",
"\u23a2\\Delta{t} \\Delta{t} \u23a5\n",
"\u23a2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \\Delta{t} \u23a5\n",
"\u23a3 6 2 \u23a6"
]
}
],
"prompt_number": 9
}
],
"metadata": {}
@@ -1,584 +0,0 @@
{
"metadata": {
"name": "",
"signature": "sha256:08d8da9b9be60564b5f4478ec019d413427884ab1107ce154b37e5411794ccd3"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Appendix A: Using NumPy, SciPy, and SymPy"
]
},
{
"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 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": [
"<style>\n",
"@import url('http://fonts.googleapis.com/css?family=Source+Code+Pro');\n",
"@import url('http://fonts.googleapis.com/css?family=Vollkorn');\n",
"@import url('http://fonts.googleapis.com/css?family=Arimo');\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: 11pt;\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: 'Arimo',verdana,arial,sans-serif;\n",
" line-height: 135%;\n",
" font-size: 125%;\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: 50000px;\n",
" }\n",
" div.output_subarea.output_stream.output_stdout.output_text {\n",
" overflow-x: auto;\n",
" overflow-y: scroll;\n",
" max-height: 50000px;\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 0x7fe692038b00>"
]
}
],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Installation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## NumPy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## SymPy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"SymPy is a Python package for performing symbolic mathematics. The full scope of its abilities are beyond this book, but it can perform algebra, integrate and differentiate equations, find solutions to differential equations, and much more. For example, we use use to to compute the Jacobian of matrices and the expected value integral computations.\n",
"\n",
"First, a simple example. We will import SymPy, initialize its pretty print functionality (which will print equations using LaTeX). We will then declare a symbol for Numpy to use."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import sympy\n",
"from sympy import init_printing\n",
"#from sympy.interactive import printing\n",
"init_printing(use_latex='mathjax')\n",
"\n",
"phi, x = sympy.symbols('\\phi, x')\n",
"phi"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\phi$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 2,
"text": [
"\\phi"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice how we use a latex expression for the symbol `phi`. This is not necessary, but if you do it will render as LaTeX when output. Now let's do some math. What is the derivative of $\\sqrt{\\phi}$?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sympy.diff('sqrt(phi)')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\frac{1}{2 \\sqrt{\\phi}}$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"text": [
" 1 \n",
"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
" ___\n",
"2\u22c5\u2572\u2571 \u03c6 "
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can factor equations"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sympy.factor(phi**3 -phi**2 + phi - 1)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left(\\phi - 1\\right) \\left(\\phi^{2} + 1\\right)$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": [
" \u239b 2 \u239e\n",
"(\\phi - 1)\u22c5\u239d\\phi + 1\u23a0"
]
}
],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and we can expand them."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"((phi+1)*(phi-4)).expand()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\phi^{2} - 3 \\phi - 4$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": [
" 2 \n",
"\\phi - 3\u22c5\\phi - 4"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can find the value of an equation by substituting in a value for a variable"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"w =x**2 -3*x +4\n",
"w.subs(x,4)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$8$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": [
"8"
]
}
],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can also use strings for equations that use symbols that you have not defined"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = sympy.expand('(t+1)*2')\n",
"x"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$2 t + 2$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 14,
"text": [
"2\u22c5t + 2"
]
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's use SymPy to compute the Jacobian of a matrix. Let us have a function\n",
"\n",
"$$h=\\sqrt{(x^2 + z^2)}$$\n",
"\n",
"for which we want to find the Jacobian with respect to x, y, and z."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x, y, z = sympy.symbols('x y z')\n",
"\n",
"H = sympy.Matrix([sympy.sqrt(x**2 + z**2)])\n",
"\n",
"state = sympy.Matrix([x, y, z])\n",
"H.jacobian(state)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left[\\begin{matrix}\\frac{x}{\\sqrt{x^{2} + z^{2}}} & 0 & \\frac{z}{\\sqrt{x^{2} + z^{2}}}\\end{matrix}\\right]$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 11,
"text": [
"\u23a1 x z \u23a4\n",
"\u23a2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u23a5\n",
"\u23a2 _________ _________\u23a5\n",
"\u23a2 \u2571 2 2 \u2571 2 2 \u23a5\n",
"\u23a3\u2572\u2571 x + z \u2572\u2571 x + z \u23a6"
]
}
],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's compute the discrete process noise matrix $\\mathbf{Q}_k$ given the continuous process noise matrix \n",
"$$\\mathbf{Q} = \\Phi_s \\begin{bmatrix}0&0&0\\\\0&0&0\\\\0&0&1\\end{bmatrix}$$\n",
"\n",
"and the equation\n",
"\n",
"$$\\mathbf{Q} = \\int_0^{\\Delta t} \\Phi(t)\\mathbf{Q}\\Phi^T(t) dt$$\n",
"\n",
"where \n",
"$$\\Phi(t) = \\begin{bmatrix}1 & \\Delta t & {\\Delta t}^2/2 \\\\ 0 & 1 & \\Delta t\\\\ 0& 0& 1\\end{bmatrix}$$"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"dt = sympy.symbols('\\Delta{t}')\n",
"F_k = sympy.Matrix([[1, dt, dt**2/2],\n",
" [0, 1, dt],\n",
" [0, 0, 1]])\n",
"Q = sympy.Matrix([[0,0,0],\n",
" [0,0,0],\n",
" [0,0,1]])\n",
"\n",
"sympy.integrate(F_k*Q*F_k.T,(dt, 0, dt))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"latex": [
"$$\\left[\\begin{matrix}\\frac{\\Delta{t}^{5}}{20} & \\frac{\\Delta{t}^{4}}{8} & \\frac{\\Delta{t}^{3}}{6}\\\\\\frac{\\Delta{t}^{4}}{8} & \\frac{\\Delta{t}^{3}}{3} & \\frac{\\Delta{t}^{2}}{2}\\\\\\frac{\\Delta{t}^{3}}{6} & \\frac{\\Delta{t}^{2}}{2} & \\Delta{t}\\end{matrix}\\right]$$"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 12,
"text": [
"\u23a1 5 4 3\u23a4\n",
"\u23a2\\Delta{t} \\Delta{t} \\Delta{t} \u23a5\n",
"\u23a2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u23a5\n",
"\u23a2 20 8 6 \u23a5\n",
"\u23a2 \u23a5\n",
"\u23a2 4 3 2\u23a5\n",
"\u23a2\\Delta{t} \\Delta{t} \\Delta{t} \u23a5\n",
"\u23a2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u23a5\n",
"\u23a2 8 3 2 \u23a5\n",
"\u23a2 \u23a5\n",
"\u23a2 3 2 \u23a5\n",
"\u23a2\\Delta{t} \\Delta{t} \u23a5\n",
"\u23a2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \\Delta{t} \u23a5\n",
"\u23a3 6 2 \u23a6"
]
}
],
"prompt_number": 12
}
],
"metadata": {}
}
]
}
+2 -2
View File
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:39a1ae1c95d6ab87f2ac5d1b9bfa0a792d9077395fe5e39001f75bec21829a35"
"signature": "sha256:755bf581b54e38bcd9c1302e2d8fe89ef4f40acadf56df2f4f5157688eded1c0"
},
"nbformat": 3,
"nbformat_minor": 0,
@@ -401,7 +401,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"I am writing an open source bayesian filtering Python library called **filterpy**. It is available on github at (https://github.com/rlabbe/filterpy). To ensure that you have the latest release you will want to grab a copy from github, and follow your Python installation's instructions for adding it to the Python search path.\n",
"I am writing an open source bayesian filtering Python library called **FilterPy**. It is available on github at (https://github.com/rlabbe/filterpy). To ensure that you have the latest release you will want to grab a copy from github, and follow your Python installation's instructions for adding it to the Python search path.\n",
"\n",
"I have also made the project available on PyPi, the Python Package Index. I will be honest, I am not updating this as fast as I am changing the code in the library. That will change as the library and this book mature. To install from PyPi, at the command line issue the command\n",
"\n",
+4 -5
View File
@@ -20,7 +20,7 @@ I periodically generate a PDF of the book from the Notebooks. I do not do this f
Companion Software
-----
All of the filters used in this book as well as others not in this book are implemented in my Python library filterpy, available [here](https://github/com/rlabbe/filterpy). You do not need to download or install this to read the book, but you will likely want to use this library to write your own filters. It includes Kalman filters, Fading Memory filters, H infinity filters, Extended and Unscented filters, least square filters, and many more. It also includes helper routines that simplify the designing the matrices used by some of the filters, and other code such as Kalman based smoothers.
All of the filters used in this book as well as others not in this book are implemented in my Python library FilterPy, available [here](https://github/com/rlabbe/filterpy). You do not need to download or install this to read the book, but you will likely want to use this library to write your own filters. It includes Kalman filters, Fading Memory filters, H infinity filters, Extended and Unscented filters, least square filters, and many more. It also includes helper routines that simplify the designing the matrices used by some of the filters, and other code such as Kalman based smoothers.
Downloading the book
@@ -161,11 +161,11 @@ Particle filters uses a Monte Carlo technique to
description
* [**Appendix: Installation, Python, NumPy, and filterpy**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Appendix_A_Installation/Appendix_Installation.ipynb)
* [**Appendix: Installation, Python, NumPy, and FilterPy**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Appendix_A_Installation/Appendix_Installation.ipynb)
Brief introduction of Python and how it is used in this book. Description of the companion
library filterpy.
library FilterPy.
* [**Appendix: Symbols and Notations**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Appendix_B_Symbols_and_Notations/Appendix_Symbols_and_Notations.ipynb)
@@ -173,7 +173,6 @@ library filterpy.
Symbols and notations used in this book. Comparison with notations used in the literature.
Installation and Software Requirements
-----
@@ -193,7 +192,7 @@ Personally, I use the Anaconda Python distribution in all of my work, [available
Provided Libraries and Modules
-----
I am writing an open source bayesian filtering Python library called **filterpy**. It is available on github at (https://github.com/rlabbe/filterpy). To ensure that you have the latest release you will want to grab a copy from github, and follow your Python installation's instructions for adding it to the Python search path.
I am writing an open source bayesian filtering Python library called **FilterPy**. It is available on github at (https://github.com/rlabbe/filterpy). To ensure that you have the latest release you will want to grab a copy from github, and follow your Python installation's instructions for adding it to the Python search path.
I have also made the project available on PyPi, the Python Package Index. I will be honest, I am not updating this as fast as I am changing the code in the library. That will change as the library and this book mature. To install from PyPi, at the command line issue the command