Symbology changes.
Working on finalizing the symbology used in this book. Added appendix to document what other books in the field use for the Kalman filter equations.
This commit is contained in:
parent
3a89d60d6c
commit
d8df25fe7b
379
Appendix_Symbols_and_Notations.ipynb
Normal file
379
Appendix_Symbols_and_Notations.ipynb
Normal file
@ -0,0 +1,379 @@
|
||||
{
|
||||
"metadata": {
|
||||
"name": "",
|
||||
"signature": "sha256:a8b813a30b8d5fe32572b34d0caaf86174716f527fd81c8e83766fd8b0c6d59b"
|
||||
},
|
||||
"nbformat": 3,
|
||||
"nbformat_minor": 0,
|
||||
"worksheets": [
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"#format the book\n",
|
||||
"%matplotlib inline\n",
|
||||
"from __future__ import division, print_function\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import book_format\n",
|
||||
"book_format.load_style()"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"html": [
|
||||
"<style>\n",
|
||||
"@import url('http://fonts.googleapis.com/css?family=Source+Code+Pro');\n",
|
||||
"\n",
|
||||
" div.cell{\n",
|
||||
" width: 850px;\n",
|
||||
" margin-left: 0% !important;\n",
|
||||
" margin-right: auto;\n",
|
||||
" }\n",
|
||||
" div.text_cell code {\n",
|
||||
" background: transparent;\n",
|
||||
" color: #000000;\n",
|
||||
" font-weight: 600;\n",
|
||||
" font-size: 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: 'Open sans',verdana,arial,sans-serif;\n",
|
||||
" line-height: 135%;\n",
|
||||
" font-size: 110%;\n",
|
||||
" width:750px;\n",
|
||||
" margin-left:auto;\n",
|
||||
" margin-right:auto;\n",
|
||||
" text-align:justify;\n",
|
||||
" text-justify:inter-word;\n",
|
||||
" }\n",
|
||||
" div.output_subarea.output_text.output_pyout {\n",
|
||||
" overflow-x: auto;\n",
|
||||
" overflow-y: scroll;\n",
|
||||
" max-height: 300px;\n",
|
||||
" }\n",
|
||||
" div.output_subarea.output_stream.output_stdout.output_text {\n",
|
||||
" overflow-x: auto;\n",
|
||||
" overflow-y: scroll;\n",
|
||||
" max-height: 300px;\n",
|
||||
" }\n",
|
||||
" code{\n",
|
||||
" font-size: 70%;\n",
|
||||
" }\n",
|
||||
" .rendered_html code{\n",
|
||||
" background-color: transparent;\n",
|
||||
" }\n",
|
||||
" ul{\n",
|
||||
" margin: 2em;\n",
|
||||
" }\n",
|
||||
" ul li{\n",
|
||||
" padding-left: 0.5em; \n",
|
||||
" margin-bottom: 0.5em; \n",
|
||||
" margin-top: 0.5em; \n",
|
||||
" }\n",
|
||||
" ul li li{\n",
|
||||
" padding-left: 0.2em; \n",
|
||||
" margin-bottom: 0.2em; \n",
|
||||
" margin-top: 0.2em; \n",
|
||||
" }\n",
|
||||
" ol{\n",
|
||||
" margin: 2em;\n",
|
||||
" }\n",
|
||||
" ol li{\n",
|
||||
" padding-left: 0.5em; \n",
|
||||
" margin-bottom: 0.5em; \n",
|
||||
" margin-top: 0.5em; \n",
|
||||
" }\n",
|
||||
" ul li{\n",
|
||||
" padding-left: 0.5em; \n",
|
||||
" margin-bottom: 0.5em; \n",
|
||||
" margin-top: 0.2em; \n",
|
||||
" }\n",
|
||||
" a:link{\n",
|
||||
" font-weight: bold;\n",
|
||||
" color:#447adb;\n",
|
||||
" }\n",
|
||||
" a:visited{\n",
|
||||
" font-weight: bold;\n",
|
||||
" color: #1d3b84;\n",
|
||||
" }\n",
|
||||
" a:hover{\n",
|
||||
" font-weight: bold;\n",
|
||||
" color: #1d3b84;\n",
|
||||
" }\n",
|
||||
" a:focus{\n",
|
||||
" font-weight: bold;\n",
|
||||
" color:#447adb;\n",
|
||||
" }\n",
|
||||
" a:active{\n",
|
||||
" font-weight: bold;\n",
|
||||
" color:#447adb;\n",
|
||||
" }\n",
|
||||
" .rendered_html :link {\n",
|
||||
" text-decoration: underline; \n",
|
||||
" }\n",
|
||||
" .rendered_html :hover {\n",
|
||||
" text-decoration: none; \n",
|
||||
" }\n",
|
||||
" .rendered_html :visited {\n",
|
||||
" text-decoration: none;\n",
|
||||
" }\n",
|
||||
" .rendered_html :focus {\n",
|
||||
" text-decoration: none;\n",
|
||||
" }\n",
|
||||
" .rendered_html :active {\n",
|
||||
" text-decoration: none;\n",
|
||||
" }\n",
|
||||
" .warning{\n",
|
||||
" color: rgb( 240, 20, 20 )\n",
|
||||
" } \n",
|
||||
" hr {\n",
|
||||
" color: #f3f3f3;\n",
|
||||
" background-color: #f3f3f3;\n",
|
||||
" height: 1px;\n",
|
||||
" }\n",
|
||||
" blockquote{\n",
|
||||
" display:block;\n",
|
||||
" background: #fcfcfc;\n",
|
||||
" border-left: 5px solid #c76c0c;\n",
|
||||
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
|
||||
" width:680px;\n",
|
||||
" padding: 10px 10px 10px 10px;\n",
|
||||
" text-align:justify;\n",
|
||||
" text-justify:inter-word;\n",
|
||||
" }\n",
|
||||
" blockquote p {\n",
|
||||
" margin-bottom: 0;\n",
|
||||
" line-height: 125%;\n",
|
||||
" font-size: 100%;\n",
|
||||
" }\n",
|
||||
"</style>\n",
|
||||
"<script>\n",
|
||||
" MathJax.Hub.Config({\n",
|
||||
" TeX: {\n",
|
||||
" extensions: [\"AMSmath.js\"]\n",
|
||||
" },\n",
|
||||
" tex2jax: {\n",
|
||||
" inlineMath: [ ['$','$'], [\"\\\\(\",\"\\\\)\"] ],\n",
|
||||
" displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"] ]\n",
|
||||
" },\n",
|
||||
" displayAlign: 'center', // Change this to 'center' to center equations.\n",
|
||||
" \"HTML-CSS\": {\n",
|
||||
" styles: {'.MathJax_Display': {\"margin\": 4}}\n",
|
||||
" }\n",
|
||||
" });\n",
|
||||
"</script>\n"
|
||||
],
|
||||
"metadata": {},
|
||||
"output_type": "pyout",
|
||||
"prompt_number": 3,
|
||||
"text": [
|
||||
"<IPython.core.display.HTML at 0x7fe174bfb350>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 3
|
||||
},
|
||||
{
|
||||
"cell_type": "heading",
|
||||
"level": 1,
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Appendix I : Symbology"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"This is just notes at this point. \n",
|
||||
"\n",
|
||||
"### State\n",
|
||||
"\n",
|
||||
"$x$ (Brookner, Zarchan, Brown)\n",
|
||||
"\n",
|
||||
"$\\underline{x}$ Gelb)\n",
|
||||
"\n",
|
||||
"### State at step n\n",
|
||||
"\n",
|
||||
"$x_n$ (Brookner)\n",
|
||||
"\n",
|
||||
"$x_k$ (Brown, Zarchan)\n",
|
||||
"\n",
|
||||
"$\\underline{x}_k$ (Gelb)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"### Prediction\n",
|
||||
"\n",
|
||||
"$x^-$\n",
|
||||
"\n",
|
||||
"$x_{n,n-1}$ (Brookner) \n",
|
||||
"\n",
|
||||
"$x_{k+1,k}$\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"## measurement\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"$x^*$\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Y_n (Brookner)\n",
|
||||
"\n",
|
||||
"##control transition Matrix\n",
|
||||
"\n",
|
||||
"$G$ (Zarchan)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Not used (Brookner)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#Nomenclature\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"## Equations\n",
|
||||
"### Brookner\n",
|
||||
"\n",
|
||||
"$$\n",
|
||||
"\\begin{aligned}\n",
|
||||
"X^*_{n+1,n} &= \\Phi X^*_{n,n} \\\\\n",
|
||||
"X^*_{n,n} &= X^*_{n,n-1} +H_n(Y_n - MX^*_{n,n-1}) \\\\\n",
|
||||
"H_n &= S^*_{n,n-1}M^T[R_n + MS^*_{n,n-1}M^T]^{-1} \\\\\n",
|
||||
"S^*_{n,n-1} &= \\Phi S^*_{n-1,n-1}\\Phi^T + Q_n \\\\\n",
|
||||
"S^*_{n-1,n-1} &= (I-H_{n-1}M)S^*_{n-1,n-2}\n",
|
||||
"\\end{aligned}$$\n",
|
||||
"\n",
|
||||
"### Gelb\n",
|
||||
"\n",
|
||||
"$$\n",
|
||||
"\\begin{aligned}\n",
|
||||
"\\underline{\\hat{x}}_k(-) &= \\Phi_{k-1} \\underline{\\hat{x}}_{k-1}(+) \\\\\n",
|
||||
"\\underline{\\hat{x}}_k(+) &= \\underline{\\hat{x}}_k(-) +K_k[Z_k - H_k\\underline{\\hat{x}}_k(-)] \\\\\n",
|
||||
"K_k &= P_k(-)H_k^T[H_kP_k(-)H_k^T + R_k]^{-1}\\\\\n",
|
||||
"P_k(+) &= \\Phi_{k-1} P_{k-1}(+)\\Phi_{k-1}^T + Q_{k-1} \\\\\n",
|
||||
"P_k(-) &= (I-K_kH_k)P_k(-)\n",
|
||||
"\\end{aligned}$$\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"### Brown\n",
|
||||
"\n",
|
||||
"$$\n",
|
||||
"\\begin{aligned}\n",
|
||||
"\\hat{x}^-_{k+1} &= \\phi_{k}\\hat{x}_{k} \\\\\n",
|
||||
"\\hat{x}_k &= \\hat{x}^-_k +K_k[z_k - H_k\\hat{x}^-_k] \\\\\n",
|
||||
"K_k &= P^-_kH_k^T[H_kP^-_kH_k^T + R_k]^{-1}\\\\\n",
|
||||
"P^-_{k+1} &= \\phi_k P_k\\phi_k^T + Q_{k} \\\\\n",
|
||||
"P_k &= (I-K_kH_k)P^-_k\n",
|
||||
"\\end{aligned}$$\n",
|
||||
"## \n",
|
||||
"\n",
|
||||
"### Zarchan\n",
|
||||
"\n",
|
||||
"$$\n",
|
||||
"\\begin{aligned}\n",
|
||||
"\\hat{x}_{k} &= \\Phi_{k}\\hat{x}_{k-1} + G_ku_{k-1} + K_k[z_k - H\\Phi_{k}\\hat{x}_{k-1} - HG_ku_{k-1} ] \\\\\n",
|
||||
"M_{k} &= \\Phi_k P_{k-1}\\phi_k^T + Q_{k} \\\\\n",
|
||||
"K_k &= M_kH^T[HM_kH^T + R_k]^{-1}\\\\\n",
|
||||
"P_k &= (I-K_kH)M_k\n",
|
||||
"\\end{aligned}$$\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": []
|
||||
}
|
||||
],
|
||||
"metadata": {}
|
||||
}
|
||||
]
|
||||
}
|
File diff suppressed because one or more lines are too long
@ -86,7 +86,8 @@ Contents
|
||||
* [**Chapter N: Designing Nonlinear Kalman Filters**](http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/Designing_Nonlinear_Kalman_Filters.ipynb)
|
||||
Building on the material in chapters 8 and 9 we walk through the design of several nonlinear filters.
|
||||
|
||||
|
||||
*[**Appendix: Symbols and Notations**](http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/Appendix_Symbols_and_Notations.ipynb)
|
||||
Math symbology used by this book and by the notable books in the literature.
|
||||
|
||||
|
||||
Reading the book
|
||||
|
@ -11,20 +11,20 @@ import stats
|
||||
|
||||
def show_residual_chart():
|
||||
plt.xlim([0.9,2.5])
|
||||
plt.ylim([0.5,2.5])
|
||||
plt.ylim([1.5,3.5])
|
||||
|
||||
plt.scatter ([1,2,2],[1,2,1.3])
|
||||
plt.scatter ([2],[1.8],marker='o')
|
||||
plt.scatter ([1,2,2],[2,3,2.3])
|
||||
plt.scatter ([2],[2.8],marker='o')
|
||||
ax = plt.axes()
|
||||
ax.annotate('', xy=(2,2), xytext=(1,1),
|
||||
ax.annotate('', xy=(2,3), xytext=(1,2),
|
||||
arrowprops=dict(arrowstyle='->', ec='b',shrinkA=3, shrinkB=4))
|
||||
ax.annotate('prediction', xy=(2.04,2.), color='b')
|
||||
ax.annotate('measurement', xy=(2.05, 1.28))
|
||||
ax.annotate('prior measurement', xy=(1, 0.9))
|
||||
ax.annotate('residual', xy=(2.04,1.6), color='r')
|
||||
ax.annotate('new estimate', xy=(2,1.8),xytext=(2.1,1.8),
|
||||
ax.annotate('prediction', xy=(2.04,3.), color='b')
|
||||
ax.annotate('measurement', xy=(2.05, 2.28))
|
||||
ax.annotate('prior estimate', xy=(1, 1.9))
|
||||
ax.annotate('residual', xy=(2.04,2.6), color='r')
|
||||
ax.annotate('new estimate', xy=(2,2.8),xytext=(2.1,2.8),
|
||||
arrowprops=dict(arrowstyle='->', ec="k", shrinkA=3, shrinkB=4))
|
||||
ax.annotate('', xy=(2,2), xytext=(2,1.3),
|
||||
ax.annotate('', xy=(2,3), xytext=(2,2.3),
|
||||
arrowprops=dict(arrowstyle="-",
|
||||
ec="r",
|
||||
shrinkA=5, shrinkB=5))
|
||||
@ -124,4 +124,4 @@ def show_x_with_unobserved():
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
show_x_with_unobserved()
|
||||
show_residual_chart()
|
||||
|
@ -122,7 +122,7 @@
|
||||
" \n",
|
||||
"\n",
|
||||
"\n",
|
||||
"[**Appendix: Symbols and Notations**](not implemented)\n",
|
||||
"[**Appendix: Symbols and Notations**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Appendix_Symbols_and_Notations.ipynb)\n",
|
||||
"\n",
|
||||
"Symbols and notations used in this book. Comparison with notations used in the literature.\n",
|
||||
"\n",
|
||||
|
Loading…
Reference in New Issue
Block a user