Edits for reorg

I moved book_format.py to the root directory so that all of the
notebooks do not need to modify the system path to import it. It
modifies the path on import so that all of the code in ./code can
then be accessed.

Altered links to nbviewer to account for no longer using subdirectories.
This commit is contained in:
Roger Labbe 2015-01-27 15:14:06 -08:00
parent 892d1c04ac
commit 33c745d997
30 changed files with 569 additions and 721 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:982ce55fb5f6907f7fa52cec3da6cfc83f03f40888d7527a039bcd600fc9e95e"
"signature": "sha256:0daafb03588df165f6ab3a24032dff6c9dd058dadf3e9c412f54c22856ae3d6c"
},
"nbformat": 3,
"nbformat_minor": 0,
@ -31,8 +31,6 @@
"%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 import book_format\n",
"import book_format\n",
"book_format.load_style()"
],
@ -261,7 +259,7 @@
"output_type": "pyout",
"prompt_number": 1,
"text": [
"<IPython.core.display.HTML at 0x7fecdc400400>"
"<IPython.core.display.HTML at 0x7f5ffa3589e8>"
]
}
],

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:57dbf656364273c92d44507fa244b442d18883c499a9648624b3a44b5047cdd4"
"signature": "sha256:4bdc568be195aa4a12705bb1ecde8c5a68b6eab796138620bf9ad7e459a003d8"
},
"nbformat": 3,
"nbformat_minor": 0,
@ -31,8 +31,6 @@
"%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()"
],
@ -261,7 +259,7 @@
"output_type": "pyout",
"prompt_number": 1,
"text": [
"<IPython.core.display.HTML at 0x7f997b223438>"
"<IPython.core.display.HTML at 0x7f098c8276a0>"
]
}
],

View File

@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:88870ba7ba4c3aad2c18e5701a8625b32b4d4f124879f4f9d66c4474bc2f93be"
"signature": "sha256:50f42ee2e006c1e6799c0cb38dfead8dba5bfdb7035dedbdd6496865de36531e"
},
"nbformat": 3,
"nbformat_minor": 0,
@ -23,8 +23,6 @@
"%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()"
],
@ -251,13 +249,13 @@
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 2,
"prompt_number": 1,
"text": [
"<IPython.core.display.HTML at 0x7f2372fae7f0>"
"<IPython.core.display.HTML at 0x7f1f6b0279e8>"
]
}
],
"prompt_number": 2
"prompt_number": 1
},
{
"cell_type": "heading",

View File

@ -30,6 +30,9 @@
"#Introduction\n",
"##### Version 0.0\n",
"\n",
"**Author's note - this is obsolete, read the preface instead.**\n",
"\n",
"\n",
"The Kalman filter was introduced to the world via papers published in 1958 and 1960 by Rudolph E Kalman. This work built on work by Nobert Wiener. Kalman's early papers were extremely abstract, but researchers quickly realized that the papers described a very practical technique to filter noisy data. From then until now it has been an ongoing topic of research, and there are many books and papers devoted not only to the basics, but many specializations and extensions to the technique. If you are reading this, you have likely come across some of them.\n",
"\n",
"If you are like me, you probably find them nearly impenetrable. I find that almost all start with very abstract math, assume familiarity with notation and naming conventions that I haven't seen before, and focus heavily on proof rather than exposition and teaching. This is perhaps understandable, but it is a regrettable situation and not necessary. \n",

View File

@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:3fdf88b217a0cfa4dc5fc3503e5a7ae1d67eecb3dd2463a7004fb5b9bebbadd7"
"signature": "sha256:7715a628d7d3a81a6ebba0dab92cbcdf90be862af19aeacf9530984b10c651ab"
},
"nbformat": 3,
"nbformat_minor": 0,
@ -28,13 +28,8 @@
"collapsed": false,
"input": [
"#format the book\n",
"%matplotlib inline\n",
"from __future__ import division, print_function\n",
"import sys\n",
"sys.path.insert(0,'./code') # allow us to import book_format\n",
"import matplotlib.pyplot as plt\n",
"import book_format\n",
"book_format.load_style('./styles/custom2.css')"
"book_format.load_style()"
],
"language": "python",
"metadata": {},
@ -43,6 +38,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 +126,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 +138,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 +254,13 @@
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 1,
"prompt_number": 3,
"text": [
"<IPython.core.display.HTML at 0x7f9ee410c2e8>"
"<IPython.core.display.HTML at 0x7f7e2e35f588>"
]
}
],
"prompt_number": 1
"prompt_number": 3
},
{
"cell_type": "markdown",

View File

@ -89,78 +89,78 @@ Contents
Motivation for the book. Where to download, how to use.
* [**Chapter 1: The g-h Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/01_gh_filter/g-h_filter.ipynb)
* [**Chapter 1: The g-h Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/01_g-h_filter.ipynb)
Intuitive introduction to the g-h filter, which is a family of filters that includes the Kalman filter. Not filler - once you understand this chapter you will understand the concepts behind the Kalman filter.
* [**Chapter 2: The Discrete Bayes Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/02_Discrete_Bayes/discrete_bayes.ipynb)
* [**Chapter 2: The Discrete Bayes Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/02_Discrete_Bayes.ipynb)
Introduces the Discrete Bayes Filter. From this you will learn the probabilistic reasoning that underpins the Kalman filter in an easy to digest form.
* [**Chapter 3: Least Squares Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/03_Least_Squares/Least_Squares_Filters.ipynb)
* [**Chapter 3: Least Squares Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/03_Least_Squares_Filters.ipynb)
Introduces the least squares filter in batch and recursive forms.
* [**Chapter 4: Gaussian Probabilities**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/04_Gaussians/Gaussians.ipynb)
* [**Chapter 4: Gaussian Probabilities**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/04_Gaussians.ipynb)
Introduces using Gaussians to represent beliefs. Gaussians allow us to implement the algorithms used in the Discrete Bayes Filter to work in continuous domains.
* [**Chapter 5: One Dimensional Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/05_Kalman_Filters/Kalman_Filters.ipynb)
* [**Chapter 5: One Dimensional Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/05_Kalman_Filters.ipynb)
Implements a Kalman filter by modifying the Discrete Bayesian Filter to use Gaussians. This is a full featured Kalman filter, albeit only useful for 1D problems.
* [**Chapter 6: Multivariate Kalman Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/06_Multivariate_Kalman_filter/Multivariate_Kalman_Filters.ipynb)
* [**Chapter 6: Multivariate Kalman Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/06_Multivariate_Kalman_Filters.ipynb)
We extend the Kalman filter developed in the previous chapter to the full, generalized filter.
* [**Chapter 7: Kalman Filter Math**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/07_Kalman_Filter_Math/Kalman_Filter_Math.ipynb)
* [**Chapter 7: Kalman Filter Math**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/07_Kalman_Filter_Math.ipynb)
We gotten about as far as we can without forming a strong mathematical foundation. This chapter is optional, especially the first time, but if you intend to write robust, numerically stable filters, or to read the literature, you will need to know this.
* [**Chapter 8: Designing Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/08_Designing_Kalman_Filters/Designing_Kalman_Filters.ipynb)
* [**Chapter 8: Designing Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/08_Designing_Kalman_Filters.ipynb)
Building on material in Chapter 6, walks you through the design of several Kalman filters. Discusses, but does not solve issues like numerical stability.
* [**Chapter 9: Extended Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/09_Extended_Kalman_Filters/Extended_Kalman_Filters.ipynb)
* [**Chapter 9: Extended Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/09_Extended_Kalman_Filters.ipynb)
Kalman filter as covered only work for linear problems. Extended Kalman filters (EKF) are the most common approach to linearizing non-linear problems.
* [**Chapter 10: Unscented Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/10_Unscented_Kalman_Filters/Unscented_Kalman_Filter.ipynb)
* [**Chapter 10: Unscented Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/10_Unscented_Kalman_Filter.ipynb)
Unscented Kalman filters (UKF) are a recent development in Kalman filter theory. They allow you to filter nonlinear problems without requiring a closed form solution like the Extended Kalman filter requires.
[**Chapter 11: Ensemble Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/11_Ensemble_Kalman_Filter/Ensemble_Kalman_Filters.ipynb)
[**Chapter 11: Ensemble Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/11_Ensemble_Kalman_Filters.ipynb)
Discusses the ensemble Kalman Filter, which uses a Monte Carlo approach to deal with very large Kalman filter states in nonlinear systems.
* [**Chapter 12: Designing Nonlinear Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/12_Designing_Nonlinear_Kalman_Filters/Designing_Nonlinear_Kalman_Filters.ipynb)
* [**Chapter 12: Designing Nonlinear Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/12_Designing_Nonlinear_Kalman_Filters.ipynb)
EKF and UKF are linear approximations of nonlinear problems. Unless programmed carefully, they are not numerically stable. We discuss some common approaches to this problem.
* [**Chapter 13: H-Infinity Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/13_HInfinity_Filters/HInfinity_Filters.ipynb)
* [**Chapter 13: H-Infinity Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/13_HInfinity_Filters.ipynb)
H-inifinity filters are a form of filter that is very robust in the presence of non-Gaussian noise. They do not perform as well as Kalman filters, but are less likely to diverge.
* [**Chapter 14: Smoothing**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/14_Smoothing/Smoothing.ipynb)
* [**Chapter 14: Smoothing**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/14_Smoothing.ipynb)
Kalman filters are recursive, and thus very suitable for real time filtering. However, they work well for post-processing data. We discuss some common approaches.
* [**Chapter 15: Adaptive Filtering**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/15_Adaptive_Filtering/Adaptive_Filtering.ipynb)
* [**Chapter 15: Adaptive Filtering**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/15_Adaptive_Filtering.ipynb)
Kalman filters assume a single process model, but manuevering targets typically need to be described by several different process models. Adaptive filtering uses several techniques to allow the Kalman filter to adapt to the changing behavior of the target.
@ -179,14 +179,14 @@ Not written yet
Not written yet.
* [**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.ipynb)
Brief introduction of Python and how it is used in this book. Description of the companion
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)
* [**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.ipynb)
Symbols and notations used in this book. Comparison with notations used in the literature.

View File

@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:aada3223e5395f37eadc453245d1072d753bcb8ccf236d890bad5a586a4ed406"
"signature": "sha256:456e95ad9d347f3ae0b9b1ebfb1a51829b89dcde3421170630fc3387515bda9c"
},
"nbformat": 3,
"nbformat_minor": 0,
@ -15,7 +15,7 @@
"from __future__ import division, print_function\n",
"%matplotlib inline\n",
"import sys\n",
"sys.path.insert(0,'../code') # allow us to format the book\n",
"sys.path.insert(0,'..') # 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",

View File

@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:42fcc233db58d607109d988acbd2c05f37460792df171ef7155393554328c969"
"signature": "sha256:8dfeca3728647e0419c6f2c7f141dc89f294f6d749e8e29d6baf3d93643fb2a2"
},
"nbformat": 3,
"nbformat_minor": 0,
@ -12,11 +12,10 @@
"cell_type": "code",
"collapsed": false,
"input": [
"\n",
"from __future__ import division, print_function\n",
"%matplotlib inline\n",
"import sys\n",
"sys.path.insert(0,'../code') # allow us to format the book\n",
"sys.path.insert(0,'..') # 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",

View File

@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:8ca39e02795ea489851809c56e3e92eaf9d7fe6e5fb1b83cde4ac7605fcdccb0"
"signature": "sha256:433f3b1a6dada8b107fd2ee6433183f04ca080c6c5ef055d0f83e14f9c714fb3"
},
"nbformat": 3,
"nbformat_minor": 0,
@ -23,7 +23,7 @@
"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",
"sys.path.insert(0,'..') # allow us to format the book\n",
"import book_format\n",
"book_format.load_style(directory='..')"
],
@ -250,13 +250,13 @@
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 1,
"prompt_number": 2,
"text": [
"<IPython.core.display.HTML at 0x7eff87e216d8>"
"<IPython.core.display.HTML at 0x7ff8d0752630>"
]
}
],
"prompt_number": 1
"prompt_number": 2
},
{
"cell_type": "markdown",
@ -290,7 +290,7 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
"prompt_number": 3
},
{
"cell_type": "code",
@ -327,7 +327,7 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
"prompt_number": 4
},
{
"cell_type": "code",
@ -353,17 +353,17 @@
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAbgAAACsCAYAAAAJ+rmKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADWBJREFUeJzt3X3MnXddx/H3Zy0TCuNMWBzS3aQolW1RZDyUBeRBrdJN\n3ZQYZwWNaGBGixijDvgD/zCR8AeRkOEy5rYMhdUwQEscHcFNBMFJYQ+MtaYdNLYFJk87hIeZ1n39\n41xrDnfb+5z77rl7nf58v5Km18Mv5/rk7n3O5/yu6zqnqSokSWrNGX0HkCRpNVhwkqQmWXCSpCZZ\ncJKkJllwkqQmWXCSpCZNLLgkNyR5MMnnlhjzjiR7k9yT5KLZRpQkafmmmcHdCGw50c4klwLPqKqN\nwGuBa2aUTZKkFZtYcFX1ceCbSwy5DLipG3sncHaSc2cTT5KklVk7g8dYDxwYWz8InAc8+OiG4XDo\n16VIklbNYDDI4m2zuslk8QNbaJKkXs2i4A4BC2Pr53XbJEnqzSxOUe4AtgHbk1wMPFRVD55o8GAw\nmMEhJUn/3w2HwyX3Tyy4JDcDLwXOSXIA+HPgMQBVdW1V3Zrk0iT7gO8Arz7p1JIknaSciv8uZ/wm\nE2dwkqRZGJ/BreZNJpIkzRULTpLUJAtOktQkC06S1CQLTpLUJAtOktQkC06S1CQLTpLUJAtOktQk\nC06S1CQLTpLUJAtOktQkC06S1CQLTpLUJAtOktQkC06S1CQLTpLUJAtOktQkC06S1KSJBZdkS5I9\nSfYmueo4+89JsjPJ3UnuS/Lbq5JUkqRlWLLgkqwBrga2ABcCW5NcsGjYNuCuqno28DLgbUnWrkJW\nSZKmNmkGtwnYV1X7q+owsB24fNGYLwNP7JafCHy9qo7MNqYkScszaaa1Hjgwtn4QeMGiMdcBtyf5\nEnAW8GuziydJ0spMmsHVFI/xJuDuqnoq8GzgnUnOOulkkiSdhEkFdwhYGFtfYDSLG/dC4H0AVfUA\n8EXgmbMKKEnSSkwquF3AxiQbkpwJXAHsWDRmD7AZIMm5jMrtC7MOKknScix5Da6qjiTZBtwGrAGu\nr6rdSa7s9l8L/CVwY5J7GBXmn1XVN1Y5tyRJS0rVNJfZTs5wODx6kMFgsOrHkyS1bzgcHl0eDAZZ\nvN9vMpEkNcmCkyQ1yYKTJDXJgpMkNcmCkyQ1yYKTJDXJgpMkNcmCkyQ1yYKTJDXJgpMkNcmCkyQ1\nyYKTJDXJgpMkNcmCkyQ1yYKTJDXJgpMkNcmCkyQ1yYKTJDXJgpMkNWliwSXZkmRPkr1JrjrBmJcl\nuSvJfUn+ZeYpJUlaprVL7UyyBrga2AwcAj6dZEdV7R4bczbwTuDlVXUwyTmrGViSpGlMmsFtAvZV\n1f6qOgxsBy5fNOY3gPdX1UGAqvra7GNKkrQ8kwpuPXBgbP1gt23cRuBJSe5IsivJb84yoCRJK7Hk\nKUqgpniMxwDPAX4WWAd8Ksm/V9Xekw0nSdJKTSq4Q8DC2PoCo1ncuAPA16rqe8D3kvwr8JOABSdJ\n6s2kU5S7gI1JNiQ5E7gC2LFozD8CP5VkTZJ1wAuA+2cfVZKk6S05g6uqI0m2AbcBa4Drq2p3kiu7\n/ddW1Z4kO4F7gUeA66rKgpMk9SpV01xmOznD4fDoQQaDwaofT5LUvuFweHR5MBhk8X6/yUSS1CQL\nTpLUJAtOktQkC06S1CQLTpLUJAtOktQkC06S1CQLTpLUJAtOktQkC06S1CQLTpLUJAtOktQkC06S\n1CQLTpLUJAtOktQkC06S1CQLTpLUJAtOktQkC06S1KSJBZdkS5I9SfYmuWqJcc9PciTJK2YbUZKk\n5Vuy4JKsAa4GtgAXAluTXHCCcW8FdgJZhZySJC3LpBncJmBfVe2vqsPAduDy44x7HXAL8NUZ55Mk\naUUmFdx64MDY+sFu21FJ1jMqvWu6TTWzdJIkrdCkgpumrN4OvKGqitHpSU9RSpJ6t3bC/kPAwtj6\nAqNZ3LjnAtuTAJwDXJLkcFXtmFlKSZKWaVLB7QI2JtkAfAm4Atg6PqCqfuTR5SQ3Ah+y3CRJfVuy\n4KrqSJJtwG3AGuD6qtqd5Mpu/7WnIKMkScuW0aWz1TUcDo8eZDAYrPrxJEntGw6HR5cHg8Ex93/4\nTSaSpCZZcJKkJllwkqQmWXCSpCZZcJKkJllwkqQmWXCSpCZZcJKkJllwkqQmWXCSpCZZcJKkJllw\nkqQmWXCSpCZZcJKkJllwkqQmWXCSpCZZcJKkJllwkqQmWXCSpCZNVXBJtiTZk2RvkquOs/+VSe5J\ncm+Sf0vyrNlHlSRpehMLLska4GpgC3AhsDXJBYuGfQF4SVU9C/gL4F2zDipJ0nJMM4PbBOyrqv1V\ndRjYDlw+PqCqPlVVw271TuC82caUJGl5pim49cCBsfWD3bYT+V3g1pMJJUnSyVo7xZia9sGS/DTw\n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\n",
"text": [
"<matplotlib.figure.Figure at 0x7eff87e21780>"
"<matplotlib.figure.Figure at 0x7ff8d0768198>"
]
}
],
"prompt_number": 4
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"./animations/no_info.gif\">"
"<img src=\"02_no_info.gif\">"
]
},
{
@ -400,17 +400,17 @@
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAbgAAACsCAYAAAAJ+rmKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADXJJREFUeJzt3X2QXXddx/H3pwm1BMpW6FgkXSYokZRRbHlIOyAPSpSk\naquMY41UxypYR4M4jlrgD/zDGRn+YGSYYifUtlMUGocCGsYmZRBEEKwN9IHSrJMUdkwCVJ66DA91\nEvn6xz2Nl+1m7+7mbs7Nr+/XTCb3nPPL3s/sZvdzf79zzt1UFZIkteaMvgNIkrQaLDhJUpMsOElS\nkyw4SVKTLDhJUpMsOElSk0YWXJIbkzyY5LOLjHl7kgNJ7kly0XgjSpK0fEuZwd0EbD3RwSSXAs+s\nqo3A7wLXjSmbJEkrNrLgqurjwDcWGXIZcHM39g7gnCTnjSeeJEkrs3YMH2M9cGho+zBwPvDgIzvm\n5uZ8uxRJ0qqZmprK/H3jushk/ge20CRJvRpHwR0Bpoe2z+/2SZLUm3EsUe4GdgC7klwCPFRVD55o\n8NTU1BieUpL0WDc3N7fo8ZEFl+QW4KXAuUkOAX8OPA6gqnZW1W1JLk1yEPg2cNVJp5Yk6STlVPy6\nnOGLTJzBSZLGYXgGt5oXmUiSNFEsOElSkyw4SVKTLDhJUpMsOElSkyw4SVKTLDhJUpMsOElSkyw4\nSVKTLDhJUpMsOElSkyw4SVKTLDhJUpMsOElSkyw4SVKTLDhJUpMsOElSkyw4SVKTLDhJUpNGFlyS\nrUlmkhxIcs0Cx89NsjfJ3UnuS/Jbq5JUkqRlWLTgkqwBrgW2As8Gtie5YN6wHcBdVXUh8DLgrUnW\nrkJWSZKWbNQMbjNwsKpmq+oosAu4fN6YLwFP6h4/CfhaVR0bb0xJkpZn1ExrPXBoaPswcPG8MdcD\nH0nyReBs4FfHF0+SpJUZNYOrJXyMNwJ3V9XTgAuBdyQ5+6STSZJ0EkYV3BFgemh7msEsbtgLgfcC\nVNUDwBeAZ40roCRJKzGq4PYBG5NsSHImcAWwe96YGWALQJLzGJTb58cdVJKk5Vj0HFxVHUuyA7gd\nWAPcUFX7k1zdHd8J/CVwU5J7GBTmn1XV11c5tyRJi0rVUk6znZy5ubnjTzI1NbXqzydJat/c3Nzx\nx1NTU5l/3HcykSQ1yYKTJDXJgpMkNcmCkyQ1yYKTJDXJgpMkNcmCkyQ1yYKTJDXJgpMkNcmCkyQ1\nyYKTJDXJgpMkNcmCkyQ1yYKTJDXJgpMkNcmCkyQ1yYKTJDXJgpMkNcmCkyQ1aWTBJdmaZCbJgSTX\nnGDMy5LcleS+JP8y9pSSJC3T2sUOJlkDXAtsAY4AdybZXVX7h8acA7wDeEVVHU5y7moGliRpKUbN\n4DYDB6tqtqqOAruAy+eN+XXgfVV1GKCqvjr+mJIkLc+oglsPHBraPtztG7YReHKSjybZl+Q3xhlQ\nkqSVWHSJEqglfIzHAc8FXg6sAz6V5N+r6sDJhpMkaaVGFdwRYHpoe5rBLG7YIeCrVfVd4LtJ/hX4\nScCCkyT1ZtQS5T5gY5INSc4ErgB2zxvzj8BPJVmTZB1wMXD/+KNKkrR0i87gqupYkh3A7cAa4Iaq\n2p/k6u74zqqaSbIXuBf4HnB9VVlwkqRepWopp9lOztzc3PEnmZqaWvXnkyS1b25u7vjjqampzD/u\nO5lIkppkwUmSmmTBSZKaZMFJkppkwUmSmjTqRm9J0mPUzMzDzM72m2HDBti06awV/VsLTpK0oNlZ\n2LZtZeUyLnv2PMymTSv7ty5RSpKaZMFJkppkwUmSmmTBSZKaZMFJkppkwUmSmmTBSZKaZMFJkppk\nwUmSmmTBSZKaZMFJkppkwUmSmjSy4JJsTTKT5ECSaxYZ94Ikx5K8crwRJUlavkULLska4FpgK/Bs\nYHuSC04w7i3AXiCrkFOSpGUZNYPbDBysqtmqOgrsAi5fYNxrgVuBr4w5nyRJKzKq4NYDh4a2D3f7\njkuynkHpXdftqrGlkyRphUYV3FLK6m3A66uqGCxPukQpSerdqN/ofQSYHtqeZjCLG/Y8YFcSgHOB\nbUmOVtXusaWUJGmZRhXcPmBjkg3AF4ErgO3DA6rqRx55nOQm4IOWmySpb4sWXFUdS7IDuB1YA9xQ\nVfuTXN0d33kKMkqStGyjZnBU1R5gz7x9CxZbVV01plySJJ0U38lEktQkC06S1CQLTpLUJAtOktQk\nC06S1CQLTpLUJAtOktQkC06S1CQLTpLUJAtOktQkC06S1CQLTpLUJAtOktQkC06S1CQLTpLUJAtO\nktQkC06S1CQLTpLUJAtOktSkJRVckq1JZpIcSHLNAsdfleSeJPcm+bckzxl/VEmSlm5kwSVZA1wL\nbAWeDWxPcsG8YZ8HXlJVzwH+AnjnuINKkrQcS5nBbQYOVtVsVR0FdgGXDw+oqk9V1Vy3eQdw/nhj\nSpK0PEspuPXAoaHtw92+E/kd4LaTCSVJ0slau4QxtdQPluSngd8GXrTiRJIkjcFSCu4IMD20Pc1g\nFvd9ugtLrge2VtU3xhNPkqSVWcoS5T5gY5INSc4ErgB2Dw9I8nTg/cCVVXVw/DElSVqekTO4qjqW\nZAdwO7AGuKGq9ie5uju+E3gT8IPAdUkAjlbV5tWLLUmnv5mZh5md7e/5N2yATZvO6i/AKlvKEiVV\ntQfYM2/fzqHHrwZePd5oktS22VnYtq2/gtmz52E2bert6Ved72QiSWqSBSdJapIFJ0lqkgUnSWqS\nBSdJatKSrqIcp717Hz7VT3lc65fESpL+3ykvOC+JlSSdCi5RSpKaZMFJkppkwUmSmmTBSZKaZMFJ\nkpp0yq+inGS+s7cktcOCG+I7e0tSO1yilCQ1yYKTJDXJJUpJTer7nDp4Xr1vFpykJvV9Th08r943\nlyglSU0aWXBJtiaZSXIgyTUnGPP27vg9SS4af0xJkpZn0SXKJGuAa4EtwBHgziS7q2r/0JhLgWdW\n1cYkFwPXAZesYubHLM8pSNLSjToHtxk4WFWzAEl2AZcD+4fGXAbcDFBVdyQ5J8l5VfXgKuR9TPOc\ngiaFL7Z0OkhVnfhg8ivAK6rqNd32lcDFVfXaoTEfBN5cVZ/stj8MXFNVn35kzNzc3ImfRJKkkzQ1\nNZX5+0adg1tqMc3/wBaaJKlXowruCDA9tD0NHB4x5vxunyRJvRl1Dm4fsDHJBuCLwBXA9nljdgM7\ngF1JLgEemn/+baGpoyRJq2nRgquqY0l2ALcDa4Abqmp/kqu74zur6rYklyY5CHwbuGrVU0uSNMKi\nF5lIknS6Oi3eyWQpN5v3KcmNSR5M8tm+sywkyXSSjyb5XJL7kvxh35nmS3JWkjuS3J3k/iRv7jvT\nQpKsSXJXd/XwxEkym+TeLuN/9J1nId2tRLcm2d99rSfqvtkkz+o+f4/8mZu075kkb+i+nz+b5D1J\nfqDvTPMleV2X774kr+slw6TP4Lqbzf+ToZvNge3DN5v3LcmLgW8B76qqn+g7z3xJngo8taruTvJE\n4NPAL03S5xAgybqq+k6StcAngD+pqk/0nWtYkj8GngecXVWX9Z1nviRfAJ5XVV/vO8uJJLkZ+FhV\n3dh9rZ9QVXN951pIkjMY/NzZXFWH+s4D0F0T8RHggqr6nyR/D9xWVTf3GmxIkh8HbgFeABwF9gK/\nV1UPnMocp8MM7vjN5lV1FHjkZvOJUVUfB77Rd44TqaovV9Xd3eNvMbhR/2n9pnq0qvpO9/BMBud8\nJ+qHdJLzgUuBv+HRt8ZMkonNlmQKeHFV3QiD8/yTWm6dLcADk1JunW8yKI113QuEdUzeleubgDuq\n6uGq+l/gY8ArT3WI06Hg1gPD/7kOd/u0At2rv4uAO/pN8mhJzkhyN/Ag8NGqur/vTPP8FfCnwPf6\nDrKIAj6cZF+S1/QdZgHPAL6S5KYkn0lyfZJ1fYdaxK8B7+k7xLBudv5W4L8YXN3+UFV9uN9Uj3If\n8OIkT+6+vj/P4BayU+p0KLjJXkM9jXTLk7cCr+tmchOlqr5XVRcy+EZ4SZKX9RzpuCS/APx3Vd3F\nBM+QgBdV1UXANuAPuuXzSbIWeC7w11X1XAZXXr++30gLS3Im8IvAe/vOMizJjwJ/BGxgsBLzxCSv\n6jXUPFU1A7wF+BCwB7iLHl4Yng4Ft5SbzTVCkscB7wP+rqr+oe88i+mWrP4JeH7fWYa8ELisO8d1\nC/AzSd7Vc6ZHqaovdX9/BfgAgyX+SXIYOFxVd3bbtzIovEm0Dfh097mcJM8HPllVX6uqY8D7Gfz/\nnChVdWNVPb+qXgo8xOBailPqdCi44zebd6+ormBwc7mWKEmAG4D7q+ptfedZSJJzk5zTPX488LMM\nXvVNhKp6Y1VNV9UzGCxbfaSqfrPvXMOSrEtydvf4CcDPARN1ZW9VfRk4lOTHul1bgM/1GGkx2xm8\nmJk0M8AlSR7ffW9vASZtOZ8kP9T9/XTgl+lhqXfif6P3iW427znW90lyC/BS4ClJDgFvqqqbeo41\n7EXAlcC9SR4pjTdU1d4eM833w8DN3VVrZwB/W1X/3HOmxUzi0vl5wAcGP/NYC7y7qj7Ub6QFvRZ4\nd/eC9QEm8M0huhcIW4CJO49ZVfd0qwf7GCz7fQZ4Z7+pFnRrkqcwuCDm96vqm6c6wMTfJiBJ0kqc\nDkuUkiQtmwUnSWqSBSdJapIFJ0lqkgUnSWqSBSdJapIFJ0lq0v8ByVyjNXG2/lYAAAAASUVORK5C\nYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x7eff66cffac8>"
"<matplotlib.figure.Figure at 0x7ff8d065cfd0>"
]
}
],
"prompt_number": 5
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" <img src=\"simulate.gif\">"
" <img src=\"02_simulate.gif\">"
]
}
],

View File

@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:c82e943808236de492b791895b0610ea0864057ea274158ee910a721ed9ce67c"
"signature": "sha256:305dfb2c678185fb26ee4d55068703451293f5ef20a3de5c28eccffec4e02261"
},
"nbformat": 3,
"nbformat_minor": 0,
@ -15,7 +15,7 @@
"from __future__ import division, print_function\n",
"%matplotlib inline\n",
"import sys\n",
"sys.path.insert(0,'../code') # allow us to format the book\n",
"sys.path.insert(0,'..') # 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",

View File

@ -6,6 +6,8 @@ import json
import numpy as np
import sys
sys.path.insert(0,'./code') # allow us to import book_format
def test_filterpy_version():
import filterpy
min_version = [0,0,10]

View File

@ -7,6 +7,6 @@ python merge_book.py > Kalman_and_Bayesian_Filters_in_Python.ipynb
echo "creating pdf..."
ipython nbconvert --to latex --template book --post PDF Kalman_and_Bayesian_Filters_in_Python.ipynb
mv Kalman_and_Bayesian_Filters_in_Python ..
mv Kalman_and_Bayesian_Filters_in_Python.pdf ..
echo "done."

View File

@ -62,20 +62,20 @@ if __name__ == '__main__':
#merge_notebooks(sys.argv[1:])
merge_notebooks(
['../Preface.ipynb',
'../01_gh_filter/g-h_filter.ipynb',
'../02_Discrete_Bayes/discrete_bayes.ipynb',
'../03_Least_Squares/Least_Squares_Filters.ipynb',
'../04_Gaussians/Gaussians.ipynb',
'../05_Kalman_Filters/Kalman_Filters.ipynb',
'../06_Multivariate_Kalman_filter/Multivariate_Kalman_Filters.ipynb',
'../07_Kalman_Filter_Math/Kalman_Filter_Math.ipynb',
'../08_Designing_Kalman_Filters/Designing_Kalman_Filters.ipynb',
'../09_Extended_Kalman_Filters/Extended_Kalman_Filters.ipynb',
'../10_Unscented_Kalman_Filters/Unscented_Kalman_Filter.ipynb',
'../11_Ensemble_Kalman_Filter/Ensemble_Kalman_Filters.ipynb',
'../12_Designing_Nonlinear_Kalman_Filters/Designing_Nonlinear_Kalman_Filters.ipynb',
'../13_HInfinity_Filters/HInfinity_Filters.ipynb',
'../14_Smoothing/Smoothing.ipynb',
'../15_Adaptive_Filtering/Adaptive_Filtering.ipynb',
'../Appendix_A_Installation/Appendix_Installation.ipynb',
'../Appendix_B_Symbols_and_Notations/Appendix_Symbols_and_Notations.ipynb'])
'../01_g-h_filter.ipynb',
'../02_Discrete_Bayes.ipynb',
'../03_Least_Squares_Filters.ipynb',
'../04_Gaussians.ipynb',
'../05_Kalman_Filters.ipynb',
'../06_Multivariate_Kalman_Filters.ipynb',
'../07_Kalman_Filter_Math.ipynb',
'../08_Designing_Kalman_Filters.ipynb',
'../09_Extended_Kalman_Filters.ipynb',
'../10_Unscented_Kalman_Filter.ipynb',
'../11_Ensemble_Kalman_Filters.ipynb',
'../12_Designing_Nonlinear_Kalman_Filters.ipynb',
'../13_HInfinity_Filters.ipynb',
'../14_Smoothing.ipynb',
'../15_Adaptive_Filtering.ipynb',
'../Appendix_A_Installation.ipynb',
'../Appendix_B_Symbols_and_Notations.ipynb'])

View File

@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:4c4932e71490dba5f12600c755687afb0d5cc008f65b6151423877e812adbbdb"
"signature": "sha256:a407320cc113b4c7364a292108cd117dd3dcef0349cd2cd466f2b18fedbfe7fc"
},
"nbformat": 3,
"nbformat_minor": 0,
@ -23,80 +23,80 @@
"Motivation behind writing the book. How to download and read the book. Requirements for IPython Notebook and Python. github links.\n",
"\n",
"\n",
"[**Chapter 1: The g-h Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/01_gh_filter/g-h_filter.ipynb)\n",
"[**Chapter 1: The g-h Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/01_g-h_filter.ipynb)\n",
"\n",
"Intuitive introduction to the g-h filter, which is a family of filters that includes the Kalman filter. Not filler - once you understand this chapter you will understand the concepts behind the Kalman filter. \n",
"\n",
"\n",
"[**Chapter 2: The Discrete Bayes Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/02_Discrete_Bayes/discrete_bayes.ipynb)\n",
"[**Chapter 2: The Discrete Bayes Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/02_Discrete_Bayes.ipynb)\n",
"\n",
"Introduces the Discrete Bayes Filter. From this you will learn the probabilistic reasoning that underpins the Kalman filter in an easy to digest form.\n",
"\n",
"\n",
"[**Chapter 3: Least Squares Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/03_Least_Squares/Least_Squares_Filters.ipynb)\n",
"[**Chapter 3: Least Squares Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/03_Least_Squares_Filters.ipynb)\n",
"\n",
"Introduces the least squares filter in batch and recursive forms. I've not made a start on authoring this yet.\n",
"\n",
"\n",
"[**Chapter 4: Gaussian Probabilities**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/04_Gaussians/Gaussians.ipynb)\n",
"[**Chapter 4: Gaussian Probabilities**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/04_Gaussians.ipynb)\n",
"\n",
"Introduces using Gaussians to represent beliefs in the Bayesian sense. Gaussians allow us to implement the algorithms used in the Discrete Bayes Filter to work in continuous domains.\n",
"\n",
"\n",
"[**Chapter 5: One Dimensional Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/05_Kalman_Filters/Kalman_Filters.ipynb)\n",
"[**Chapter 5: One Dimensional Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/05_Kalman_Filters.ipynb)\n",
"\n",
"Implements a Kalman filter by modifying the Discrete Bayesian Filter to use Gaussians. This is a full featured Kalman filter, albeit only useful for 1D problems. \n",
"\n",
"\n",
"[**Chapter 6: Multivariate Kalman Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/06_Multivariate_Kalman_filter/Multivariate_Kalman_Filters.ipynb)\n",
"[**Chapter 6: Multivariate Kalman Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/06_Multivariate_Kalman_Filters.ipynb)\n",
"\n",
"We extend the Kalman filter developed in the previous chapter to the full, generalized filter. \n",
"\n",
"\n",
"[**Chapter 7: Kalman Filter Math**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/07_Kalman_Filter_Math/Kalman_Filter_Math.ipynb)\n",
"[**Chapter 7: Kalman Filter Math**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/07_Kalman_Filter_Math.ipynb)\n",
"\n",
"We gotten about as far as we can without forming a strong mathematical foundation. This chapter is optional, especially the first time, but if you intend to write robust, numerically stable filters, or to read the literature, you will need to know this. \n",
"\n",
"*This still needs a lot of work. *\n",
"\n",
"\n",
"[**Chapter 8: Designing Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/08_Designing_Kalman_Filters/Designing_Kalman_Filters.ipynb)\n",
"[**Chapter 8: Designing Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/08_Designing_Kalman_Filters.ipynb)\n",
"\n",
"Building on material in Chapter 6, walks you through the design of several Kalman filters. Discusses, but does not solve issues like numerical stability.\n",
"\n",
"\n",
"[**Chapter 9: Extended Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/09_Extended_Kalman_Filters/Extended_Kalman_Filters.ipynb)\n",
"[**Chapter 9: Extended Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/09_Extended_Kalman_Filters.ipynb)\n",
"\n",
"Kalman filter as covered only work for linear problems. Extended Kalman filters (EKF) are the most common approach to linearizing non-linear problems.\n",
"\n",
"*Still very early going on this chapter.*\n",
"\n",
"[**Chapter 10: Unscented Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/10_Unscented_Kalman_Filters/Unscented_Kalman_Filter.ipynb)\n",
"[**Chapter 10: Unscented Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/10_Unscented_Kalman_Filter.ipynb)\n",
"\n",
"Unscented Kalman filters (UKF) are a recent development in Kalman filter theory. They allow you to filter nonlinear problems without requiring a closed form solution like the Extended Kalman filter requires.\n",
"\n",
"[**Chapter 11: Ensemble Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/11_Ensemble_Kalman_Filter/Ensemble_Kalman_Filters.ipynb)\n",
"[**Chapter 11: Ensemble Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/11_Ensemble_Kalman_Filters.ipynb)\n",
"\n",
"Discusses the ensemble Kalman Filter, which uses a Monte Carlo approach to deal with very large Kalman filter states in nonlinear systems.\n",
"\n",
"[**Chapter 12: Designing Nonlinear Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/12_Designing_Nonlinear_Kalman_Filters/Designing_Nonlinear_Kalman_Filters.ipynb)\n",
"[**Chapter 12: Designing Nonlinear Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/12_Designing_Nonlinear_Kalman_Filters.ipynb)\n",
"\n",
"Works through some examples of the design of Kalman filters for nonlinear problems. *This is still very much a work in progress.*\n",
"\n",
"\n",
"[**Chapter 13: H-Infinity Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/13_HInfinity_Filters/HInfinity_Filters.ipynb)\n",
"[**Chapter 13: H-Infinity Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/13_HInfinity_Filters.ipynb)\n",
" \n",
"Describes the $H_\\infty$ filter. \n",
"\n",
"*I have code that implements the filter, but no supporting text yet.*\n",
"\n",
"\n",
"[**Chapter 14: Smoothing**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/14_Smoothing/Smoothing.ipynb)\n",
"[**Chapter 14: Smoothing**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/14_Smoothing.ipynb)\n",
"\n",
"Kalman filters are recursive, and thus very suitable for real time filtering. However, they work well for post-processing data. We discuss some common approaches.\n",
"\n",
"\n",
"[**Chapter 15: Adaptive Filtering**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/15_Adaptive_Filtering/Adaptive_Filtering.ipynb)\n",
"[**Chapter 15: Adaptive Filtering**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/15_Adaptive_Filtering.ipynb)\n",
" \n",
"Kalman filters assume a single process model, but manuevering targets typically need to be described by several different process models. Adaptive filtering uses several techniques to allow the Kalman filter to adapt to the changing behavior of the target.\n",
"\n",
@ -116,13 +116,13 @@
"\n",
"\n",
"\n",
"[**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)\n",
"[**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.ipynb)\n",
"\n",
"Brief introduction of Python and how it is used in this book. Description of the companion\n",
"library filterpy. \n",
" \n",
"\n",
"[**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)\n",
"[**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.ipynb)\n",
"\n",
"Symbols and notations used in this book. Comparison with notations used in the literature.\n",
"\n",
@ -132,234 +132,6 @@
"### Github repository\n",
"http://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#format the book\n",
"import book_format\n",
"book_format.load_style()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<style>\n",
" div.cell{\n",
" width: 850px;\n",
" margin-left: 0% !important;\n",
" margin-right: auto;\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: 36pt;\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",
" text-indent:1em;\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: 1.5em;\n",
" margin-top: 0.5em;\n",
" display: block;\n",
" white-space: nowrap;\n",
" } \n",
" h3 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" }\n",
" .text_cell_render h3 {\n",
" font-weight: 300;\n",
" font-size: 18pt;\n",
" line-height: 100%;\n",
" color:#d77c0c;\n",
" margin-bottom: 0.5em;\n",
" margin-top: 2em;\n",
" display: block;\n",
" white-space: nowrap;\n",
" }\n",
" h4 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" }\n",
" .text_cell_render h4 {\n",
" font-weight: 300;\n",
" font-size: 16pt;\n",
" color:#d77c0c;\n",
" margin-bottom: 0.5em;\n",
" margin-top: 0.5em;\n",
" display: block;\n",
" white-space: nowrap;\n",
" }\n",
" h5 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" }\n",
" .text_cell_render h5 {\n",
" font-weight: 300;\n",
" font-style: normal;\n",
" color: #1d3b84;\n",
" font-size: 16pt;\n",
" margin-bottom: 0em;\n",
" margin-top: 1.5em;\n",
" display: block;\n",
" white-space: nowrap;\n",
" }\n",
" div.text_cell_render{\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" line-height: 135%;\n",
" font-size: 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: 300px;\n",
" }\n",
" div.output_subarea.output_stream.output_stdout.output_text {\n",
" overflow-x: auto;\n",
" overflow-y: scroll;\n",
" max-height: 300px;\n",
" }\n",
" code{\n",
" font-size: 78%;\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 0x25e9590>"
]
}
],
"prompt_number": 1
}
],
"metadata": {}