Updated animations

I haven't run them in a long time, and the notebooks no longer
work with the new structure or changes to matplotlib.
This commit is contained in:
Roger Labbe committed 2020-10-13 17:59:48 -07:00
1 parent 61db99a379
commit 089c93d5cb
13 files changed
+363 -267

No files matched your search

Binary file not shown.

Before

Width:  |  Height:  |  Size: 363 KiB

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 502 KiB

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 430 KiB

After

Width:  |  Height:  |  Size: 54 KiB

+37 -38
View File
@@ -3,58 +3,66 @@
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"metadata": {},
"outputs": [
{
"ename": "AttributeError",
"evalue": "module 'book_format' has no attribute 'load_style'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-1-088e253ce17b>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;31m# consistant with that look and feel.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mbook_format\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 9\u001b[1;33m \u001b[0mbook_format\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload_style\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdirectory\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'..'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m: module 'book_format' has no attribute 'load_style'"
]
"data": {
"text/html": [
"\n",
" <style>\n",
" .output_wrapper, .output {\n",
" height:auto !important;\n",
" max-height:100000px;\n",
" }\n",
" .output_scroll {\n",
" box-shadow:none !important;\n",
" webkit-box-shadow:none !important;\n",
" }\n",
" </style>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from __future__ import division, print_function\n",
"%matplotlib inline\n",
"import sys\n",
"sys.path.insert(0,'..') # allow us to format the book\n",
"sys.path.insert(0,'../code') \n",
"\n",
"# use same formatting as rest of book so that the plots are\n",
"# consistant with that look and feel.\n",
"import book_format\n",
"book_format.load_style(directory='..')"
"book_format.set_style()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 3,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"ename": "ModuleNotFoundError",
"evalue": "No module named 'gif_animate'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-2-5ca8afccfac5>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mgif_animate\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0manimate\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mstats\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mgaussian\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpylab\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mpylab\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'gif_animate'"
]
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from gif_animate import animate\n",
"from kf_book.gif_animate import animate\n",
"from stats import gaussian\n",
"import matplotlib.pylab as pylab\n",
"from matplotlib import animation\n",
@@ -87,15 +95,6 @@
" frames=80, interval=50, figsize=(6,4))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
@@ -120,9 +119,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 0
"nbformat_minor": 1
}
+163 -85
View File
@@ -2,37 +2,51 @@
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"execution_count": 2,
"metadata": {},
"outputs": [
{
"ename": "AttributeError",
"evalue": "module 'book_format' has no attribute 'load_style'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-1-ec44a09e3350>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[1;31m# consistant with that look and feel.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mbook_format\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 10\u001b[1;33m \u001b[0mbook_format\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload_style\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdirectory\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'..'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 11\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 12\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mAttributeError\u001b[0m: module 'book_format' has no attribute 'load_style'"
]
"data": {
"text/html": [
"\n",
" <style>\n",
" .output_wrapper, .output {\n",
" height:auto !important;\n",
" max-height:100000px;\n",
" }\n",
" .output_scroll {\n",
" box-shadow:none !important;\n",
" webkit-box-shadow:none !important;\n",
" }\n",
" </style>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from __future__ import division, print_function\n",
"%matplotlib inline\n",
"import sys\n",
"sys.path.insert(0,'..') # allow us to format the book\n",
"sys.path.insert(0,'../code') \n",
"\n",
"# use same formatting as rest of book so that the plots are\n",
"# consistant with that look and feel.\n",
"import book_format\n",
"book_format.load_style(directory='..')\n",
"\n",
"\n",
"\n",
"book_format.set_style()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def update(mu1, var1, mu2, var2):\n",
" mean = (var1*mu2 + var2*mu1) / (var1+var2)\n",
" variance = 1 / (1/var1 + 1/var2)\n",
@@ -51,10 +65,8 @@
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def plot_3d_covariance(ax, mean, cov):\n",
@@ -111,37 +123,97 @@
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"execution_count": 10,
"metadata": {},
"outputs": [
{
"ename": "ModuleNotFoundError",
"evalue": "No module named 'gif_animate'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-3-42bb287cbba9>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmath\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mstats\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 6\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mgif_animate\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0manimate\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 7\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'gif_animate'"
]
"data": {
"text/plain": [
"(25, 20.4)"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"voltage"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 648x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"stats.plot_gaussian_pdf(25, 20.4);"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x1fea90c9248>]"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ax1.plot([3,2,4])\n"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 648x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from __future__ import print_function, division\n",
"import matplotlib.pyplot as plt\n",
"import numpy.random as random\n",
"import math\n",
"import stats\n",
"from gif_animate import animate\n",
"\n",
"\n",
"from kf_book.gif_animate import animate\n",
"\n",
"sensor_error = 1.2**2\n",
"movement_error = .2\n",
"movement = 0\n",
"voltage = (25,20) #who knows what the first value is?\n",
"voltage = (25, 20) #who knows what the first value is?\n",
"\n",
"volts = [14.44, 18.74, 17.21, 15.98, 16.76, 14.8, 16.01, 16.90, 15.41, 17.31,\n",
" 16.39, 17.96]\n",
@@ -151,40 +223,42 @@
"i = 0\n",
"pred = 0\n",
"def volt_animate(frame):\n",
" global i, ps, voltage, Z, x, pred\n",
" global i, ps, voltage, Z, x, pred, ax1, ax2\n",
" \n",
" step = frame % 4\n",
" plt.subplot(211)\n",
" plt.ylim([14,26])\n",
" ax1.set_ylim([14, 26])\n",
" ax1.set_xlim([0, 10])\n",
"\n",
" if step == 0:\n",
" prev = voltage[0]\n",
" voltage = predict(voltage[0], voltage[1], movement, movement_error)\n",
" pred = voltage[0]\n",
" plt.plot ([i, i+1], [prev, pred], c='g') \n",
" ax1.plot([i, i+1], [prev, pred], c='g') \n",
" \n",
" elif step == 1:\n",
" Z = volts[i]\n",
" i += 1\n",
" \n",
" plt.scatter(i, Z, marker='+', s=64, color='r')\n",
" i += 1 \n",
" ax1.scatter(i, Z, marker='+', s=64, color='r')\n",
"\n",
" elif step == 2:\n",
" plt.plot ([i,i], [pred, Z], c='r', alpha=0.3)\n",
" ax1.plot([i,i], [pred, Z], c='r', alpha=0.3)\n",
"\n",
" else:\n",
" voltage = update(voltage[0], voltage[1], Z, sensor_error)\n",
" ps.append(voltage[0])\n",
" plt.plot(ps, c='b')\n",
" ax1.plot(ps, c='b')\n",
" \n",
" plt.subplot(212)\n",
" plt.cla()\n",
" stats.plot_gaussian(voltage[0], voltage[1], xlim=[0,32])\n",
" plt.ylim([0,1])\n",
" plt.tight_layout()\n",
" ax2.cla()\n",
" stats.plot_gaussian_pdf(voltage[0], voltage[1], xlim=[0,32], ax=ax2)\n",
" ax2.set_xlim([10, 25])\n",
" ax2.set_ylim([0, 1])\n",
" #plt.tight_layout()\n",
" \n",
"N=12\n",
"animate('05_volt_animate.gif', volt_animate, N*3, 350)"
"fig = plt.figure()\n",
"ax1 = fig.add_subplot(211)\n",
"ax2 = fig.add_subplot(212)\n",
"animate('05_volt_animate.gif', volt_animate, N*3, 350, fig);"
]
},
{
@@ -196,21 +270,20 @@
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"execution_count": 59,
"metadata": {},
"outputs": [
{
"ename": "ModuleNotFoundError",
"evalue": "No module named 'gif_animate'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-4-0138411cd6ba>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmath\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mstats\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 6\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mgif_animate\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0manimate\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 7\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[1;31m# assume dog is always moving 1m to the right\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'gif_animate'"
]
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 648x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
@@ -219,12 +292,12 @@
"import numpy.random as random\n",
"import math\n",
"import stats\n",
"from gif_animate import animate\n",
"from kf_book.gif_animate import animate\n",
"\n",
"# assume dog is always moving 1m to the right\n",
"movement = 1\n",
"movement_error = .05\n",
"sensor_error = 4.5\n",
"sensor_error = 2.5\n",
"pos = (0, 100) # gaussian N(0,100)\n",
"\n",
"# this is the recorded output of a run of the dog sensor with an initial\n",
@@ -238,7 +311,7 @@
"N=20\n",
"\n",
"def dog_animate(frame):\n",
" global pos, zs, ps, N, ZS\n",
" global pos, zs, ps, N, ZS, ax1, ax2, fig\n",
" pos = predict(pos[0], pos[1], movement, movement_error) \n",
" Z = ZS[frame]\n",
" zs.append(Z)\n",
@@ -247,23 +320,23 @@
" ps.append(pos[0])\n",
"\n",
"\n",
" plt.subplot(211)\n",
" plt.plot(zs,c='r', linestyle='dashed')\n",
"\n",
" plt.xlim([0,N*1.2])\n",
" plt.ylim([0,N*1.2])\n",
" ax1.plot(zs,c='r', linestyle='dashed')\n",
" ax1.set_xlim([0, N*1.2])\n",
" ax1.set_ylim([0, N*1.2])\n",
"\n",
" if len(ps) > 1:\n",
" plt.plot(ps, c='#8EBA42')\n",
" ax1.plot(ps, c='#8EBA42')\n",
" \n",
" plt.subplot(212)\n",
" plt.cla()\n",
" stats.plot_gaussian(pos[0], pos[1], xlim=[0,N*1.2])\n",
" plt.ylim(0, 1)\n",
" plt.tight_layout()\n",
" ax2.cla()\n",
" stats.plot_gaussian_pdf(pos[0], pos[1], xlim=[0,N*1.2], ax=ax2)\n",
" ax2.set_ylim(0, 1)\n",
" fig.tight_layout()\n",
"\n",
"\n",
"animate('05_dog_track.gif', dog_animate, N, 200)"
"fig = plt.figure()\n",
"ax1 = fig.add_subplot(211)\n",
"ax2 = fig.add_subplot(212)\n",
"animate('05_dog_track.gif', dog_animate, N, 200, fig=fig)"
]
},
{
@@ -275,6 +348,11 @@
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
@@ -285,7 +363,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
"version": "3.7.4"
}
},
"nbformat": 4,
+68 -68
View File
@@ -10,63 +10,64 @@
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"metadata": {},
"outputs": [
{
"ename": "AttributeError",
"evalue": "module 'book_format' has no attribute 'load_style'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-1-730769ca9272>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0msys\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minsert\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m'../code'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mbook_format\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 7\u001b[1;33m \u001b[0mbook_format\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload_style\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdirectory\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'..'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m: module 'book_format' has no attribute 'load_style'"
]
"data": {
"text/html": [
"\n",
" <style>\n",
" .output_wrapper, .output {\n",
" height:auto !important;\n",
" max-height:100000px;\n",
" }\n",
" .output_scroll {\n",
" box-shadow:none !important;\n",
" webkit-box-shadow:none !important;\n",
" }\n",
" </style>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"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') \n",
"import book_format\n",
"book_format.load_style(directory='..')"
"book_format.set_style()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook creates the animations for the Discrete Bayesian filters chapter. It is not really intended to be a readable part of the book, but of course you are free to look at the source code, and even modify it. However, if you are interested in running your own animations, I'll point you to the examples subdirectory of the book, which contains a number of python scripts that you can run and modify from an IDE or the command line. This module saves the animations to GIF files, which is quite slow and not very interactive. "
"This notebook creates the animations for the Discrete Bayesian filters chapter. It is not really intended to be a readable part of the book, but of course you are free to look at the source code, and even modify it. However, if you are interested in running your own animations, I'll point you to the examples subdirectory of the book, which contains a number of python scripts that you can run and modify from an IDE or the command line. This module saves the animations to GIF files, which is quite slow and not very interactive. \n",
"\n",
"On Windows you need to install ffmpeg with\n",
"\n",
" $ conda install -c conda-forge ffmpeg\n",
" \n",
"I don't know what to do for linux or MaxOS."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "ModuleNotFoundError",
"evalue": "No module named 'book_plots'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-2-1d7fb353c3e8>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mbook_plots\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mbar_plot\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[0mget_ipython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'matplotlib'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'inline'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'book_plots'"
]
}
],
"metadata": {},
"outputs": [],
"source": [
"from matplotlib import animation\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from book_plots import bar_plot\n",
"from kf_book.book_plots import bar_plot\n",
"%matplotlib inline\n",
"\n",
"# the predict algorithm of the discrete bayesian filter\n",
@@ -101,9 +102,7 @@
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"metadata": {},
"outputs": [
{
"name": "stdout",
@@ -133,24 +132,35 @@
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"metadata": {},
"outputs": [
{
"ename": "ModuleNotFoundError",
"evalue": "No module named 'gif_animate'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-4-c8909b74d11e>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mgif_animate\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0manimate\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mpos\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mbar_animate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnframe\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mglobal\u001b[0m \u001b[0mpos\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'gif_animate'"
]
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 468x180 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from gif_animate import animate\n",
"from kf_book.gif_animate import animate\n",
"\n",
"pos = [1.0,0,0,0,0,0,0,0,0,0]\n",
"def bar_animate(nframe):\n",
@@ -177,28 +187,18 @@
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'animate' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-5-0c3b6443d1db>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 18\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 19\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m6.5\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m2.5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 20\u001b[1;33m \u001b[0manimate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'02_simulate.gif'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbar_animate\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfig\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mfig\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mframes\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m40\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minterval\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m85\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m;\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mNameError\u001b[0m: name 'animate' is not defined"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAC3CAYAAAA8YQj2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAQL0lEQVR4nO3df5BddX3G8ffjRqoEMCirhSRUOo1gdBBxDVqVUqmaqGO002lBK9XWpnTAX3WmUmfUcZzpDKNtKRXNpIBgtWRUsKY2inYsWmuhSQCREMEUFdaAhIL8dIyBT/+4B+d63WRvDnfvvWTfr5md7Dnnu/c8uyz77PmeH5uqQpKkffW4UQeQJD02WSCSpFYsEElSKxaIJKkVC0SS1IoFIklqxQKRJLVigWjeSfLiJN9Mck+Su5L8V5LnN9velOQbQ8jw5CQ7e/eV5LgkW5I82Px73FxnkdqyQDSvJDkE+ALwD8CTgcXAB4CfDjnK2cC2nmwHAJ8HPgkcClwMfL5ZL40dC0TzzTMAquqSqnqoqn5SVV+uquuSPBNYC7wwyf1JfgyQ5FeSfDjJLUl+lGRtkic2205KMp3kPUnuTPL9JG/YW4AkLwSeDXy8Z9NJwALgnKr6aVWdCwR46QA/f2lgLBDNNzcBDyW5OMmqJIc+sqGqtgGnA/9dVQdV1aJm09l0iuc44DfoHLW8r+s1fxU4rFn/R8C6JEfPtPMkE8B5wJlA73OEngVcV7/4fKHrmvXS2LFANK9U1b3Ai+n88P5HYGeSDUmeNtP4JAH+FHhnVd1VVfcBfw2c0jP0vc1Rw9eAfwN+fw8R3gZcVVVbZth2EHBPz7p7gIP7+NSkoVsw6gDSsDVHGm8CSHIMnXMO5wCnzjB8EjgQ2NLpEqAzrTTRNebuqnqga/kHwBG9L5TkCDoF8rw9RLsfOKRn3SHAfXv8ZKQR8ghE81pVfQe4iM45CfjlaaU7gZ8Az6qqRc3bk6rqoK4xhyZZ2LV8JLBjht2tAA4HbkhyO/D3wIoktzdTW1uBY9PVVMCxzXpp7FggmleSHJPkXUmWNMtL6Rx5XNkM+RGw5JErn6rqYTpTXX+X5KnNxyxO8oqel/5AkgOSvAR4NfCZGXb/ReDpdM6lHEfnPMo1wHFV9RBwBfAQ8LbmxP2Zzcd99dF+3tJcsEA039wHnABcleQBOsVxPfCuZvtX6fzGf3uSO5t17wa2A1cmuRf4d6D7JPntwN10jjo+BZzeHNn8guYcye2PvNE5v/Gz5n2qahfwWuA04MfAHwOvbdZLYyf+QSmpvSQnAZ+sqiUjjiINnUcgkqRWZi2QJBcmuSPJ9XvYniTnJtme5Lokxw8+piRp3PRzBHIRsHIv21cBy5q3NcDHHn0s6bGhqq5w+krz1awFUlVfB+7ay5DVwCeq40pgUZLDBxVQkjSeBnEOZDFwa9fydLNOkrQfG8Sd6Jlh3YyXdiVZQ2eai4ULFz7vmGOOGcDuJUlzZcuWLXdW1eRM2wZRINPA0q7lJcx8Fy5VtQ5YBzA1NVWbN28ewO4lSXMlyQ/2tG0QU1gbgNOaq7FeANxTVbcN4HUlSWNs1iOQJJfQ+TsFhyWZBt4PPB6gqtYCG4FX0rlT90HgzXMVVpI0PmYtkKqa6Qml3dsLOGNgiSRJjwneiS5JasUCkSS1YoFIklqxQCRJrVggkqRWLBBJUisWiCSpFQtEktTKIJ6FJUnq03P/6btD29c1b1w2p69vgTxK+9M3gyTtCwtkP2GRSRq2x3SB+ENTkkbnMV0gkrQv/KVzsLwKS5LUigUiSWrFApEktWKBSJJasUAkSa30VSBJVia5Mcn2JGfNsP1JSf41ybeSbE3i30WXpP3crAWSZAI4D1gFLAdOTbK8Z9gZwA1V9RzgJOBvkhww4KySpDHSzxHICmB7Vd1cVbuA9cDqnjEFHJwkwEHAXcDugSaVJI2Vfm4kXAzc2rU8DZzQM+YjwAZgB3Aw8AdV9fBAEuoxxRu1pPmjnyOQzLCuepZfAVwLHAEcB3wkySG/9ELJmiSbk2zeuXPnPkaVJI2TfgpkGljatbyEzpFGtzcDl1XHduB7wDG9L1RV66pqqqqmJicn22aWJI2BfgpkE7AsyVHNifFT6ExXdbsFOBkgydOAo4GbBxlUkjReZj0HUlW7k5wJXA5MABdW1dYkpzfb1wIfBC5K8m06U17vrqo75zC3JGnE+noab1VtBDb2rFvb9f4O4OWDjSZJGmfeiS5JasUCkSS1YoFIklrxLxJqv+PNjNJweAQiSWrFApEktWKBSJJasUAkSa1YIJKkVrwKS9Kc88q4/ZNHIJKkViwQSVIrTmFJc8RpG+3vPAKRJLVigUiSWrFAJEmtWCCSpFY8iS7t54Z1Mt8T+fOPRyCSpFb6KpAkK5PcmGR7krP2MOakJNcm2Zrka4ONKUkaN7NOYSWZAM4DXgZMA5uSbKiqG7rGLAI+CqysqluSPHWO8kqSxkQ/RyArgO1VdXNV7QLWA6t7xrweuKyqbgGoqjsGG1OSNG76KZDFwK1dy9PNum7PAA5NckWSLUlOm+mFkqxJsjnJ5p07d7ZLLEkaC/0USGZYVz3LC4DnAa8CXgG8N8kzfumDqtZV1VRVTU1OTu5zWEnS+OjnMt5pYGnX8hJgxwxj7qyqB4AHknwdeA5w00BSSpLGTj9HIJuAZUmOSnIAcAqwoWfM54GXJFmQ5EDgBGDbYKNKksbJrEcgVbU7yZnA5cAEcGFVbU1yerN9bVVtS/Il4DrgYeD8qrp+LoNLkkarrzvRq2ojsLFn3dqe5Q8BHxpcNEnSOPNOdElSKxaIJKkVC0SS1IoFIklqxQKRJLVigUiSWrFAJEmtWCCSpFYsEElSKxaIJKkVC0SS1IoFIklqxQKRJLVigUiSWrFAJEmtWCCSpFYsEElSKxaIJKmVvgokycokNybZnuSsvYx7fpKHkvze4CJKksbRrAWSZAI4D1gFLAdOTbJ8D+POBi4fdEhJ0vjp5whkBbC9qm6uql3AemD1DOPeClwK3DHAfJKkMdVPgSwGbu1anm7W/VySxcDrgLV7e6Eka5JsTrJ5586d+5pVkjRG+imQzLCuepbPAd5dVQ/t7YWqal1VTVXV1OTkZJ8RJUnjaEEfY6aBpV3LS4AdPWOmgPVJAA4DXplkd1X9yyBCSpLGTz8FsglYluQo4IfAKcDruwdU1VGPvJ/kIuALlock7d9mLZCq2p3kTDpXV00AF1bV1iSnN9v3et5DkrR/6ucIhKraCGzsWTdjcVTVmx59LEnSuPNOdElSKxaIJKkVC0SS1IoFIklqxQKRJLVigUiSWrFAJEmtWCCSpFYsEElSKxaIJKkVC0SS1IoFIklqxQKRJLVigUiSWrFAJEmtWCCSpFYsEElSKxaIJKmVvgokycokNybZnuSsGba/Icl1zds3kzxn8FElSeNk1gJJMgGcB6wClgOnJlneM+x7wG9V1bHAB4F1gw4qSRov/RyBrAC2V9XNVbULWA+s7h5QVd+sqrubxSuBJYONKUkaN/0UyGLg1q7l6WbdnvwJ8MVHE0qSNP4W9DEmM6yrGQcmv02nQF68h+1rgDUARx55ZJ8RJUnjqJ8jkGlgadfyEmBH76AkxwLnA6ur6v9meqGqWldVU1U1NTk52SavJGlM9FMgm4BlSY5KcgBwCrChe0CSI4HLgDdW1U2DjylJGjezTmFV1e4kZwKXAxPAhVW1Ncnpzfa1wPuApwAfTQKwu6qm5i62JGnU+jkHQlVtBDb2rFvb9f5bgLcMNpokaZx5J7okqRULRJLUigUiSWrFApEktWKBSJJasUAkSa1YIJKkViwQSVIrFogkqRULRJLUigUiSWrFApEktWKBSJJasUAkSa1YIJKkViwQSVIrFogkqRULRJLUSl8FkmRlkhuTbE9y1gzbk+TcZvt1SY4ffFRJ0jiZtUCSTADnAauA5cCpSZb3DFsFLGve1gAfG3BOSdKY6ecIZAWwvapurqpdwHpgdc+Y1cAnquNKYFGSwwecVZI0RvopkMXArV3L0826fR0jSdqPLOhjTGZYVy3GkGQNnSkugPuT3NjH/gftMODOff2gnDb6HOOQwRzjl2FccsxBhnHJMd//m/zanjb0UyDTwNKu5SXAjhZjqKp1wLo+9jlnkmyuqqlRZhiXHOOQwRzjl8Ec45dhnHJ062cKaxOwLMlRSQ4ATgE29IzZAJzWXI31AuCeqrptwFklSWNk1iOQqtqd5EzgcmACuLCqtiY5vdm+FtgIvBLYDjwIvHnuIkuSxkE/U1hU1UY6JdG9bm3X+wWcMdhoc2akU2hdxiHHOGQAc3Qbhwxgjm7jkAHGJ8fPpfOzX5KkfeOjTCRJrcyrApntkSxDynBhkjuSXD+K/TcZlib5jyTbkmxN8vYR5XhCkv9J8q0mxwdGkaPJMpHkmiRfGGGG7yf5dpJrk2weYY5FST6b5DvN98gLh7z/o5uvwSNv9yZ5xzAzdGV5Z/O9eX2SS5I8YQQZ3t7sf+uovg57Mm+msJpHstwEvIzOZcebgFOr6oYh5zgRuJ/OnfvPHua+uzIcDhxeVVcnORjYArx2BF+LAAur6v4kjwe+Aby9eZrBUCX5C2AKOKSqXj3s/TcZvg9MVdU+33Mw4BwXA/9ZVec3V14eWFU/HlGWCeCHwAlV9YMh73sxne/J5VX1kySfBjZW1UVDzPBsOk//WAHsAr4E/HlVfXdYGfZmPh2B9PNIljlXVV8H7hr2fnsy3FZVVzfv3wdsYwRPDmgefXN/s/j45m3ov9EkWQK8Cjh/2PseN0kOAU4ELgCoql2jKo/GycD/Drs8uiwAnphkAXAgM9zfNseeCVxZVQ9W1W7ga8Drhpxhj+ZTgfi4lRkkeTrwXOCqEe1/Ism1wB3AV6pqFDnOAf4SeHgE++5WwJeTbGme2jAKvw7sBD7eTOmdn2ThiLJA576zS0ax46r6IfBh4BbgNjr3t31Line truncated
"text/plain": [
"<Figure size 650x250 with 0 Axes>"
"<Figure size 468x180 with 1 Axes>"
]
},
"metadata": {},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
@@ -236,7 +236,7 @@
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [default]",
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -250,9 +250,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 0
"nbformat_minor": 1
}
+62 -67
View File
@@ -3,22 +3,42 @@
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <style>\n",
" .output_wrapper, .output {\n",
" height:auto !important;\n",
" max-height:100000px;\n",
" }\n",
" .output_scroll {\n",
" box-shadow:none !important;\n",
" webkit-box-shadow:none !important;\n",
" }\n",
" </style>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from __future__ import division, print_function\n",
"%matplotlib inline\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",
"sys.path.insert(0,'./code') # allow us to format the book\n",
"\n",
"# use same formatting as rest of book so that the plots are\n",
"# consistant with that look and feel.\n",
"#import book_format\n",
"#book_format.load_style('..')"
"import book_format\n",
"book_format.set_style()"
]
},
{
@@ -31,9 +51,7 @@
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"metadata": {},
"outputs": [],
"source": [
"import filterpy.stats as stats\n",
@@ -47,27 +65,32 @@
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"metadata": {},
"outputs": [
{
"ename": "ModuleNotFoundError",
"evalue": "No module named 'gif_animate'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-3-c00fcbdb2b07>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;31m#import mkf_internal\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mgif_animate\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0manimate\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mellipse_animate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'gif_animate'"
]
"data": {
"text/plain": [
"<Figure size 900x400 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 400x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"#import mkf_internal\n",
"import matplotlib.pyplot as plt\n",
"from gif_animate import animate\n",
"from kf_book.gif_animate import animate\n",
"\n",
"def ellipse_animate(frame):\n",
" \n",
@@ -90,43 +113,17 @@
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'f' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-4-a2279ef61a95>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mQ\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mNameError\u001b[0m: name 'f' is not defined"
]
}
],
"source": [
"f.Q"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "ModuleNotFoundError",
"evalue": "No module named 'gif_animate'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-5-518c7c0f45f6>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mmatplotlib\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mcm\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mmpl_toolkits\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmplot3d\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mAxes3D\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 6\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mgif_animate\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0manimate\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 7\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrandom\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mrandom\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mDogSimulation\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mDogSimulation\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'gif_animate'"
]
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 550x550 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
@@ -135,14 +132,12 @@
"import matplotlib.pyplot as plt\n",
"from matplotlib import cm\n",
"from mpl_toolkits.mplot3d import Axes3D\n",
"from gif_animate import animate\n",
"from kf_book.gif_animate import animate\n",
"import numpy.random as random\n",
"from DogSimulation import DogSimulation\n",
"from kf_book.DogSimulation import DogSimulation\n",
"import filterpy.stats\n",
"from filterpy.common import Q_discrete_white_noise\n",
"from filterpy.kalman import KalmanFilter\n",
"import book_format\n",
"book_format.load_style('..')\n",
"\n",
"def dog_tracking_filter(R, Q=0, cov=1.):\n",
" dog_filter = KalmanFilter(dim_x=2, dim_z=1)\n",
@@ -223,9 +218,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 0
"nbformat_minor": 1
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 440 KiB

After

Width:  |  Height:  |  Size: 61 KiB

+33 -9
View File
@@ -4,17 +4,41 @@
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"outputs": [
{
"data": {
"text/html": [
"\n",
" <style>\n",
" .output_wrapper, .output {\n",
" height:auto !important;\n",
" max-height:100000px;\n",
" }\n",
" .output_scroll {\n",
" box-shadow:none !important;\n",
" webkit-box-shadow:none !important;\n",
" }\n",
" </style>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from __future__ import division, print_function\n",
"%matplotlib inline\n",
"import sys\n",
"sys.path.insert(0,'..') # allow us to format the book\n",
"sys.path.insert(0,'../kf_book') \n",
"# use same formattibng as rest of book so that the plots are\n",
"\n",
"# use same formatting as rest of book so that the plots are\n",
"# consistant with that look and feel.\n",
"import book_format\n",
"#book_format.load_style(directory='..')"
"book_format.set_style()"
]
},
{
@@ -109,7 +133,7 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAGGCAYAAAB/gCblAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzde1xUdf4/8NeZ+8AwDAyODo06ChVUg+WYhV0cu3iNSnK3Vlit/QbkamVMS/eElrL6Sdu2ZBb7yC47pltWu3TBalfd3VorMbOLtV28BdrFG4iKIO/fH/o5nTPMwACD3N7P74PHxsyZcw7Tt8/7fD7vz+f9kYiIwBhjjB2n6ekbYIwx1rtwYGCMMabCgYExxpgKBwbGGGMqHBgYY4ypcGBgjDGmwoGBMcaYCgcGxhhjKhwYGGOMqXBgYLL3338f06dPx7Bhw2A0GjF48GBkZmbC7/erjlu8eDGeeeaZnrnJ45577jlcc801OPXUU6HRaOB2u0Met3HjRkybNg3Dhg2D2WxGYmIiMjMz8Ze//KVL1/f5fJAkKeRPuHsJ54033kBxcXHI99xuN6699tou3WtnLVu2DI8++miPXJv1LIlLYjAAeP3113H55ZfD5/MhLy8PTqcTO3fuxPr167F8+XJ899138rFnnHEGkpKSsGbNmh6730svvRS7du3CmWeeiXXr1qGpqQlbt25tddyaNWuwfPlynH/++TjppJPQ0NCAQCCA5cuX4/e//z3uvvvuTl3f5/Nhx44dCAQCrd4zGo0466yzIj7XvHnz8PjjjyPUf4offfQRrFYrUlJSOnWfXXHZZZfh008/Dfm9sv6NAwMDAIwfPx41NTX44osvoNPpVO+1tLRAo/m5c9kbAoPynjrTgJ177rmora3F9u3bO3V9n8+Hn376CZ9++mmnPq/UVmDoSRwYBi4eSmIAgN27dyMpKalVUACgCgputxufffYZ1q5dG3LopK6uDrfeeitGjBgBg8GAk046CfPnz0dDQ4PqnJIkYd68eXjyySdxyimnwGg04rTTTsPy5csjul/lPXVGuL812g4ePCh/HyaTCYmJiRgzZgxeeOEFAMC1116Lxx9/HABUw1GiMQ4eSlqzZg0kScKyZctw2223wel0wmKxICsrC99//z3q6+uRn5+PpKQkJCUl4brrrsOBAwdU9/T444/jwgsvhMPhQGxsLDweDx5++GE0NTXJx/h8Prz++uvYtm2b6r6EI0eOoLS0FGlpaTAajRg0aBCuu+46/Pjjj930TbITqfv/y2B9QmZmJv785z/jpptuQk5ODkaPHg29Xt/quFdeeQUzZsxAfHw8Fi9eDODY0AlwrBEcP348vvvuO9x5553IyMjAZ599hnvvvReffPIJ3nnnHVXj8ve//x2rV6/Gfffdh9jYWCxevBi/+tWvoNPpMGPGjKj+fS0tLWhpacHevXvx4osvYtWqVSgvL1cd88wzz+C6667D0qVLIx7Xb25ubvWaRqORA1dhYSGef/55lJaW4qyzzkJDQwM+/fRT7N69GwBwzz33oKGhAS+99BL++9//yudwOp1tXvfOO+/EhAkT8Mwzz2Dr1q249dZb5e9u1KhReOGFF/DRRx/hzjvvRFxcHB577DH5s9988w1mzpwpB++PP/4Y999/P7744gs8/fTTAI7lkfLz8/HNN9/glVdeafVdXnHFFfj3v/+NoqIijBs3Dtu2bcOCBQvg8/mwfv16mM3miL4/1ksRY0T0008/0fnnn08ACADp9XoaN24cLVy4kOrr61XHnn766TR+/PhW51i4cCFpNBr68MMPVa+/9NJLBIDeeOMN+TUAZDabadeuXfJrzc3NlJaWRqmpqR2692nTptHw4cPbPKagoED+2wwGAy1evLjVMc8++yxptVp69tln273m+PHj5fMF//zf//2ffNwZZ5xBV155ZZvnmjt3LoX7T3H48OE0e/Zs+ffVq1cTAMrKylIdN3/+fAJAN910k+r1K6+8khITE8Ne++jRo9TU1ETPPfccabVa2rNnj/xeuO/1hRdeIAC0cuVK1esffvghAQj53bK+hYeSGADAbrfj3//+Nz788EM8+OCDuOKKK/C///0Pd9xxBzweD3766ad2z/Haa6/hjDPOwJlnnonm5mb5Z9KkSZAkqVVO4uKLL8bgwYPl37VaLa6++mp8/fXXqmR3NNx555348MMP8frrr+M3v/kN5s2bh0WLFqmOmTVrFpqbmzFr1qyIzpmSkoIPP/yw1c8999wjHzN27Fi8+eabuP3227FmzRocOnQoKn/PZZddpvo9PT0dADBt2rRWr+/Zs0c1nPTRRx/h8ssvh91uh1arhV6vx6xZs3D06FH873//a/far732Gmw2G7Ky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 truncated
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAGGCAYAAAB/gCblAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAABVMElEQVR4nO3de3xT9f0/8FfuaZumaVNCUwMUirNVUpVUNOhG8AIi46ugm0o70X1tCwMVU1e8TYqron6p29dVZbLvcGoRfhvqRLci2wDnHBMKKCreEbEFUW7lWmj7/v0B55CTJr2R0tvr+X30MXNycs4n8evnfT6f9+eiExEBERHRCfquLgAREXUvDAxERKTBwEBERBoMDEREpMHAQEREGgwMRESkwcBAREQaDAxERKTBwEBERBoMDKT6z3/+g4kTJ2LgwIGwWCzo378//H4/iouLNec99dRTePbZZ7umkCc899xzuOGGG3DWWWdBr9cjIyMj4nkbN27E+PHjMXDgQMTFxSElJQV+vx8vvPDCKd0/EAhAp9NF/ItWlmj+8pe/oLS0NOJ7GRkZuPnmm0+prB21aNEi/PrXv+6Se1PX0nFJDAKA119/Hf/1X/+FQCCAgoICuN1ubN++HevWrcPixYvx9ddfq+cOGzYMqampWLVqVZeV94orrsCOHTtw3nnnYc2aNTh27Bi+/PLLZuetWrUKixcvxiWXXIIzzjgDBw8eRGVlJRYvXoxf/vKXuP/++zt0/0AggG3btqGysrLZexaLBeeff36brzVjxgw8+eSTiPSf4oYNG2C325GZmdmhcp6KH/7wh3j//fcj/q7UuzEwEABg1KhRqKmpwUcffQSj0ah5r6mpCXr9ycZldwgMoWXqSAV20UUXoba2Fl999VWH7h8IBPDdd9/h/fff79DnQ7UUGLoSA0Pfxa4kAgDs2rULqampzYICAE1QyMjIwAcffIDVq1dH7Dqpq6vDXXfdhcGDB8NsNuOMM87AzJkzcfDgQc01dTodZsyYgd/+9rf43ve+B4vFgrPPPhuLFy9uU3lDy9QR0b5rrB06dEj9PaxWK1JSUpCbm4sXX3wRAHDzzTfjySefBABNd5RSGYd3Ja1atQo6nQ6LFi3CrFmz4Ha7YbPZMGHCBHzzzTfYv38/CgsLkZqaitTUVNxyyy04cOCApkxPPvkkfvCDH8DlciEhIQFerxePPfYYjh07pp4TCATw+uuvY+vWrZpyKY4ePYqysjJkZWXBYrGgX79+uOWWW/Dtt9920i9Jp1Pn/5dBPYLf78fvfvc73H777cjLy8Pw4cNhMpmanffyyy/juuuuQ1JSEp566ikAx7tOgOOV4KhRo/D111/j3nvvRU5ODj744AM88MAD2LRpE/72t79pKpdXX30VK1euxIMPPoiEhAQ89dRTuPHGG2E0GnHdddfF9Ps1NTWhqakJe/bswR//+EcsX74cFRUVmnOeffZZ3HLLLVi4cGGb+/UbGhqaHdPr9WrgCgaDeP7551FWVobzzz8fBw8exPvvv49du3YBAH7xi1/g4MGD+NOf/oR///vf6jXcbneL97333nsxevRoPPvss/jyyy9x1113qb/dueeeixdffBEbNmzAvffei8TERDzxxBPqZz///HNMnjxZDd7vvvsuHnroIXz00Uf4/e9/D+B4HqmwsBCff/45Xn755Wa/5dVXX41//vOfKCkpwciRI7F161bMnj0bgUAA69atQ1xcXJt+P+qmhEhEvvvuO7nkkksEgAAQk8kkI0eOlLlz58r+/fs1555zzjkyatSoZteYO3eu6PV6Wbt2reb4n/70JwEgf/nLX9RjACQuLk527NihHmtoaJCsrCwZOnRou8o+fvx4GTRoUIvnFBUVqd/NbDbLU0891eycP/zhD2IwGOQPf/hDq/ccNWqUer3wv//+7/9Wzxs2bJhcc801LV5r+vTpEu0/xUGDBsmUKVPU1ytXrhQAMmHCBM15M2fOFABy++23a45fc801kpKSEvXejY2NcuzYMXnuuefEYDDI7t271fei/a4vvviiAJClS5dqjq9du1YARPxtqWdhVxIBAJxOJ/75z39i7dq1eOSRR3D11Vfjk08+wT333AOv14vvvvuu1Wu89tprGDZsGM477zw0NDSof2PHjoVOp2uWk7jsssvQv39/9bXBYMD111+Pzz77TJPsjoV7770Xa9euxeuvv46f/vSnmDFjBubNm6c556abbkJDQwNuuummNl0zMzMTa9eubfb3i1/8Qj1nxIgR+Otf/4q7774bq1atwuHDh2PyfX74wx9qXmdnZwMAxo8f3+z47t27Nd1JGzZswH/913/B6XTCYDDAZDLhpptuQmNjIz755JNW7/3aa6/B4XBgwoQJmn/P5513HtLS0ro0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 truncated
"text/plain": [
"<Figure size 400x400 with 1 Axes>"
]
@@ -119,7 +143,8 @@
}
],
"source": [
"from pf_internal import plot_pf\n",
"from kf_book.pf_internal import plot_pf\n",
"from kf_book.gif_animate import animate\n",
"\n",
"seed(1234)\n",
"N = 3000\n",
@@ -159,7 +184,6 @@
" plt.legend(scatterpoints=1, loc=2)\n",
" plt.tight_layout()\n",
"\n",
"from gif_animate import animate\n",
"animate('particle_filter_anim.gif', animatepf, \n",
" frames=40, interval=800, figsize=(4, 4))"
]
@@ -188,7 +212,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
"version": "3.7.4"
}
},
"nbformat": 4,
Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 KiB

After

Width:  |  Height:  |  Size: 299 KiB