From b2a3ce2a28e72ad893711b48fca1f5c3b3f19cee Mon Sep 17 00:00:00 2001 From: Roger Labbe Date: Fri, 1 Jan 2016 15:18:35 -0800 Subject: [PATCH] Major rewrite of matrix exponential section. I was conflating thematrix exponential with Taylor series, making the whole thing quite confusing. There was also significant duplication of content, such as presenting the calculus form of Newton's equations multiple times in slightly different ways. I've made it all hang together now. --- 07-Kalman-Filter-Math.ipynb | 838 +++++++++++++++++------------------- 1 file changed, 387 insertions(+), 451 deletions(-) diff --git a/07-Kalman-Filter-Math.ipynb b/07-Kalman-Filter-Math.ipynb index cd78752..2dddda4 100644 --- a/07-Kalman-Filter-Math.ipynb +++ b/07-Kalman-Filter-Math.ipynb @@ -290,168 +290,107 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Modeling a Dynamic System that Has Noise\n", + "## Modeling a Dynamic System\n", "\n", - "A *dynamic system* is a physical systems whose state evolves over time. Modeling dynamic systems is properly the topic of several undergraduate and graduate courses in mathematics. To an extent there is no substitute for a few semesters of ordinary and partial differential equations followed by a graduate course in control sytem theory. If you are a hobbyist, or trying to solve one very specific filtering problem at work you probably do not have the time and/or inclination to devote a year or more to that education.\n", + "A *dynamic system* is a physical system whose state (position, temperature, etc) evolves over time. Calculus is the math of changing values, so we use differential equations to model dynamic systems. Some systems cannot be modeled with differential equations, but we will not encounter those in this book.\n", "\n", - "However, I can present enough of the theory to allow us to create the system equations for many different Kalman filters, and give you enough background to at least follow the mathematics in the literature. My goal is to get you to the stage where you can read a Kalman filtering book or paper and understand it well enough to implement the algorithms. The background math is deep, but we end up using a few simple techniques over and over again in practice.\n", + "Modeling dynamic systems is properly the topic of several college courses. To an extent there is no substitute for a few semesters of ordinary and partial differential equations followed by a graduate course in control system theory. If you are a hobbyist, or trying to solve one very specific filtering problem at work you probably do not have the time and/or inclination to devote a year or more to that education.\n", + "\n", + "Fortunately, I can present enough of the theory to allow us to create the system equations for many different Kalman filters. My goal is to get you to the stage where you can read a publication and understand it well enough to implement the algorithms. The background math is deep, but in practice we end up using a few simple techniques over and over again.\n", "\n", "We need to start by understanding the underlying equations and assumptions that the Kalman filter uses. We are trying to model real world phenomena, so what do we have to consider?\n", "\n", - "Each physical system has a process. For example, a car traveling at a certain velocity goes so far in a fixed amount of time, and its velocity varies as a function of its acceleration. We describe that behavior with the well known Newtonian equations we learned in high school.\n", + "Each physical system has a process. For example, a car traveling at a certain velocity goes so far in a fixed amount of time, and its velocity varies as a function of its acceleration. We describe that behavior with the well known Newtonian equations that we learned in high school.\n", "\n", "$$\n", "\\begin{aligned}\n", "v&=at\\\\\n", - "x &= \\frac{1}{2}at^2 + v_0t + d_0\n", + "x &= \\frac{1}{2}at^2 + v_0t + x_0\n", "\\end{aligned}\n", "$$\n", "\n", - "And once we learned calculus we saw them in this form:\n", + "Once we learned calculus we saw them in this form:\n", "\n", + "$$ \\mathbf v = \\frac{d \\mathbf x}{d t}, \n", + "\\quad \\mathbf a = \\frac{d \\mathbf v}{d t} = \\frac{d^2 \\mathbf x}{d t^2}\n", "$$\n", - "\\begin{aligned}\n", - " \\mathbf v &= \\frac{d \\mathbf x}{d t}\\\\ \n", - " \\quad \\mathbf{a} &= \\frac{d \\mathbf v}{d t} \\\\\n", - " &= \\frac{d^2 \\mathbf x}{d t^2} \\,\\!\n", - "\\end{aligned}\n", - " $$\n", " \n", - "Accurately modeling a system is impossible for anything but the most trivial problem. A typical automobile tracking problem would have you compute the distance traveled given a constant velocity or acceleration. But, of course we know this is not all that is happening. No car travels on a perfect road. There are bumps that cause the car to slow down, there is wind drag, there are hills that raise and lower the speed. The suspension is a mechanical system with friction and imperfect springs. We have no way to measure or model wind gusts. \n", + "Perfectly modeling a system is impossible except for the most trivial problems. A typical automobile tracking problem would have you compute the distance traveled given a constant velocity or acceleration. But, of course we know this is not all that is happening. No car travels on a perfect road. There are bumps that cause the car to slow down, there is wind drag, there are hills that raise and lower the speed. The suspension is a mechanical system with friction and imperfect springs. Gusts of wind alter the car's state.\n", "\n", - "So control theory is forced to make a simplification. At any time $t$ we say that the actual value (such as the position of our car) is the predicted value from the imperfect model plus some unknown *process noise*:\n", + "So control theory is forced to make a simplification. At any time $t$ we say that the true state (such as the position of our car) is the predicted value from the imperfect model plus some unknown *process noise*:\n", "\n", "$$\n", "x(t) = x_{pred}(t) + noise(t)\n", "$$\n", "\n", - "This is not meant to imply that $noise(t)$ is a function that we can derive analytically or that it is well behaved. If there is a bump in the road at $t=10$ then the noise factor will incorporate that effect. Again, this is not implying that we model, compute, or even know the value of $noise(t)$, it is merely a statement of fact - we can always describe the actual value as the predicted value from our idealized model plus some other value. Also \"noise\" does not imply random events. If we are modeling a thrown ball, and our model assumes the ball is in a vacuum, then the effect of air drag is process noise in this context.\n", + "This is not meant to imply that $noise(t)$ is a function that we can derive analytically. It is merely a statement of fact - we can always describe the true value as the predicted value plus the process noise. \"Noise\" does not imply random events. If we are tracking a thrown ball in the atmosphere, and our model assumes the ball is in a vacuum, then the effect of air drag is process noise in this context.\n", "\n", - "In the next section we will learn techniques to convert a set of differential equations into a set of linear equations. Using the same notation from previous chapters, we can say that our model of the system without noise is:\n", + "In the next section we will learn techniques to convert a set of differential equations into a set of first-order differential equations. Assuming that, we can say that our model of the system without noise is:\n", "\n", - "$$ f(\\mathbf x) = \\mathbf{Ax}$$\n", + "$$ \\dot{\\mathbf x} = \\mathbf{Ax}$$\n", "\n", - "That is, we have a set of linear equations that describe our system. For our car, \n", - "$\\mathbf A$ will be the coefficients for Newton's equations of motion. \n", + "That is, we have a set of linear equations that describe the dynamics of the system. Now we need to model the noise. We will call that $\\mathbf w$, and add it to the equation. \n", "\n", - "Now we need to model the noise. We will call that *w*, and add it to the equation.\n", + "$$ \\dot{\\mathbf x} = \\mathbf{Ax} + \\mathbf w$$\n", "\n", - "$$ f(\\mathbf x) = \\mathbf{Ax} + \\mathbf w$$\n", + "$\\mathbf w$ may strike you as a poor choice for the name, but you will soon see that the Kalman filter assumes *white* noise.\n", "\n", - "Finally, we need to consider inputs into the system. We are dealing with linear problems here, so we will assume that there is some input $u$ into the system, and that we have some linear model that defines how that input changes the system. For example, pressing the accelerator in your car makes it accelerate, and gravity causes balls to fall. Both are contol inputs. We will need a matrix $\\mathbf B$ to convert $u$ into the effect on the system. We add that into our equation:\n", + "Finally, we need to consider any inputs into the system. We assume an input $\\mathbf u$, and that there exists a linear model that defines how that input changes the system. For example, pressing the accelerator in your car makes it accelerate, and gravity causes balls to fall. Both are contol inputs. We will need a matrix $\\mathbf B$ to convert $u$ into the effect on the system. We add that into our equation:\n", "\n", - "$$ f(\\mathbf x) = \\mathbf{Ax} + \\mathbf{Bu} + \\mathbf{w}$$\n", + "$$ \\dot{\\mathbf x} = \\mathbf{Ax} + \\mathbf{Bu} + \\mathbf{w}$$\n", "\n", - "And that's it. That is one of the equations that Dr. Kalman set out to solve, and he found a way to compute an optimal solution if we assume certain properties of $w$." + "And that's it. That is one of the equations that Dr. Kalman set out to solve, and he found an optimal esitmator if we assume certain properties of $\\mathbf w$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## State-Space Representations of Dynamic Systems" + "## State-Space Representation of Dynamic Systems" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The equation $\\mathbf{v} = \\frac{d \\mathbf x}{d t}$ is the simplest possible differential equation. We trivially integrate it into the high school physics equation $x = v\\Delta t + x_0$. We then use a computer to compute the position $\\mathbf x$ for any arbitrary time step $\\Delta t$. We call this equation *discretized* because we can compute the state for a discrete time step $\\Delta t$. Almost all other differential equations encountered in physical systems will not yield to this approach. \n", + "In the last section we derived the equation\n", "\n", - "*State-space* methods became popular around the time of the Apollo missions, largely due to the work of Dr. Kalman. The idea is simple. Start with a system of $n^{th}$-order differential equations which model a dynamic system. Next, convert the equations into an equivalent set of first-order differential equations. We can then represent that set of first order equations in vector matrix form. These equations are continuous. We wish to computes these equations with a computer, so we use another technique to *discretize* the equations. Once in this form we use the formidable powers of linear algebra to solve the system of equations. The Kalman filter is an example of this power. \n", + "$$ \\dot{\\mathbf x} = \\mathbf{Ax}+ \\mathbf{Bu} + \\mathbf{w}$$.\n", "\n", - "This presentation and this book is limited to dynamic systems can be represented with differential equation. Not all systems can be represented in this form. *Hybrid System Theory* tackles those sorts of systems." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's put this into mathematical notation. We have a $n^{th}$-order differential equation with control input $u$ which describes our system:\n", + "However, for our filters we are not interested in the derivative of $\\mathbf x$, but in $\\mathbf x$ itself. Ignoring the noise for a moment, we want an equation that recusively finds the value of $\\mathbf x$ at time $t_k$ in terms of $\\mathbf x$ at time $t_{k-1}$:\n", "\n", - "$$a_n \\frac{d^ny}{dt^n} + a_{n-1} \\frac{d^{n-1}y}{dt^{n-1}} + \\dots + a_2 \\frac{d^2y}{dt^2} + a_1 \\frac{dy}{dt} + a_0 = u$$\n", + "$$\\mathbf x(t_k) = \\mathbf F(\\Delta t)\\mathbf x(t_{k-1}) + \\mathbf B(t_k) + \\mathbf u (t_k)$$\n", "\n", - "We can convert this system into a set of first order equations using a technique I will explain later:\n", + "Convention allows us to write $\\mathbf x(t_k)$ as $\\mathbf x_k$, which means the \n", + "the value of $\\mathbf x$ at the k$^{th}$ value of $t$.\n", "\n", - "$$\\frac{dx_1}{dt} = x_2\\\\\n", - "\\frac{dx_2}{dt} = x_3 \\\\\n", - "\\vdots \\\\\n", - "\\frac{dx_{n-1}}{dt} = x_n \\\\\n", - "\\frac{dx_n}{dt} = \\frac{1}{a_n}\\sum\\limits_{i=0}^{n-1}a_ix_{i+1} + \\frac{1}{a_n}u\n", - "$$\n", + "$$\\mathbf x_k = \\mathbf{Fx}_{k-1} + \\mathbf B_k\\mathbf u_k$$\n", "\n", - "Using vector-matrix notation we have:\n", + "$\\mathbf F$ is the familiar *state transition matrix*, named due to its ability to transition the state from the previous time step to the current time step.\n", "\n", - "$$\\begin{bmatrix}\\frac{dx_1}{dt} \\\\ \\frac{dx_2}{dt} \\\\ \\vdots \\\\ \\frac{dx_n}{dt}\\end{bmatrix} = \n", - "\\begin{bmatrix}0 & 1 & 0 &\\cdots & 0 \\\\\n", - "0 & 0 & 1 & \\cdots & 0 \\\\\n", - "\\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", - "-\\frac{a_0}{a_n} & -\\frac{a_1}{a_n} & -\\frac{a_2}{a_n} & \\cdots & -\\frac{a_{n-1}}{a_n}\\end{bmatrix}\n", - "\\begin{bmatrix}x_1 \\\\ x_2 \\\\ \\vdots \\\\ x_n\\end{bmatrix} + \n", - "\\begin{bmatrix}0 \\\\ 0 \\\\ \\vdots \\\\ \\frac{1}{a_n}\\end{bmatrix}u$$\n", + "Normally finding this equation is quite difficult. The equation $\\dot x = v$ is the simplest possible differential equation and we trivially integrate it as:\n", "\n", - "which we then write as\n", + "$$ \\int\\limits_{x_{k-1}}^{x_k} \\mathrm{d}x = \\int\\limits_{0}^{\\Delta t} v\\, \\mathrm{d}t \\\\\n", + "x_k-x_0 = v \\Delta t \\\\\n", + "x_k = v \\Delta t + x_0$$\n", "\n", - "$$\\frac{d\\mathbf x}{dt} = \\mathbf{Ax} + \\mathbf{bu}$$\n", + "This equation is *recursive*: we compute the value of $x$ at time $t$ based on its value at time $t-1$. This recursive form enables us to represent the system (process model) in the form required by the Kalman filter:\n", "\n", - "which you will recognize this form from the previous section. We are interested in the state $\\mathbf x$, not $\\frac{d\\mathbf x}{dt}$, so we will need a technique to find the *fundamental matrix* $\\Phi$ for that first order differential equation. The fundamental matrix discretizes the differential equation by propogating the system state from time $t_0$ to time $t_1$ with the recursive equation:\n", + "$$\\begin{aligned}\n", + "\\mathbf x_k &= \\mathbf{Fx}_{k-1} \\\\\n", + "&= \\begin{bmatrix} 1 & \\Delta t \\\\ 0 & 1\\end{bmatrix}\n", + "\\begin{bmatrix}x_{k-1} \\\\ \\dot x_{k-1}\\end{bmatrix}\n", + "\\end{aligned}$$\n", "\n", - "$$\\mathbf x(t) = \\Phi(t_1-t_0)\\mathbf x(t_0)$$\n", + "We can do that only because $\\dot x = v$ is simplest differential equation possible. Almost all other in physical systems result in more complicated differential equation which do not yield to this approach. \n", "\n", - "$\\Phi$ is the state transition function matrix $\\mathbf{F}$ that we use in the Kalman filter predict step." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Why This is Hard\n", + "*State-space* methods became popular around the time of the Apollo missions, largely due to the work of Dr. Kalman. The idea is simple. Model a system with a set of $n^{th}$-order differential equations. Convert them into an equivalent set of first-order differential equations. Put them into the vector-matrix form used in the previous section: $ \\dot{\\mathbf x} = \\mathbf{Ax} + \\mathbf{Bu}$. Once in this form we use of of several techniques to convert these linear differential equations into the recursive equation:\n", "\n", - "I asserted that we can model dynamic systems with a set of first order differential equations. For example, we already presented the Newtonian equation\n", + "$$ \\mathbf x_k = \\mathbf{Fx}_{k-1} + \\mathbf B_k\\mathbf u_k$$\n", "\n", - "$$\\mathbf{v}= \\frac{d \\mathbf x}{d t} = \\dot{\\mathbf x}$$\n", + "Some books call the state transition matrix the *fundamental matrix*. Many use $\\mathbf \\Phi$ instead of $\\mathbf F$. Sources based heavily on control theory tend to use these forms.\n", "\n", - "In general terms we can then say that a dynamic system consists of equations of the form\n", - "\n", - "$$ g(t) = \\dot x$$\n", - "\n", - "if the behavior of the system depends on time. However, if the system is *time invariant* the equations are of the form\n", - "\n", - "$$ f(x) = \\dot x$$\n", - "\n", - "What does *time invariant* mean? Consider a home stereo. If you input a signal $x$ into it at time $t$, it will output some signal $f(x)$. If you instead perform the input at time $t + \\Delta t$ the output signal will be the same except shifted in time. A counterexample is $x(t) = \\sin(t)$, and the sytem is $f(x) = t\\times x(t) = t \\sin(t)$. This is not time invariant; the value will be different at different times due to the multiplication by t. An aircraft is not time invariant. If you make a control input to the aircraft at a later time it's behavior will be different because it will have burned additional fuel and thus lost weight, drag may be different due to being at a different altitude, and so on.\n", - "\n", - "We can solve these equations by integrating each side. The time variant equation is very straightforward. Starting with \n", - "\n", - "$$\\dot{\\mathbf x}=\\mathbf{v}$$ we get the expected\n", - "\n", - "$$ \\int \\dot{\\mathbf x}\\mathrm{d}t = \\int \\mathbf{v} \\mathrm{d}t\\\\\n", - "x = vt + x_0$$\n", - "\n", - "However, integrating the time invariant equation is not so straightforward. \n", - "\n", - "$$ \\dot x = f(x) \\\\\n", - "\\frac{dx}{dt} = f(x)\n", - "$$ \n", - "\n", - "Using the *separation of variables* techniques we divide by $f(x)$ and move the $dt$ term to the right so we can integrate each side:\n", - "\n", - "$$\n", - "\\int^x_{x_0} \\frac{1}{f(x)} dx = \\int^t_{t_0} dt\\\\\n", - "$$\n", - "\n", - "If we name $\\int \\frac{1}{f(x)} dx$ as $F(x)$, we get\n", - "\n", - "$$F(x) - F(x_0) = t-t_0$$\n", - "\n", - "We then solve for x with\n", - "\n", - "$$F(x) = t - t_0 + F(x_0) \\\\\n", - "x = F^{-1}[t-t_0 + F(x_0)]$$\n", - "\n", - "In other words, we need to find the inverse of $F$. This is not at all trivial, and a significant amount of coursework in a STEM education is devoted to finding tricky, analytic solutions to this problem. \n", - "\n", - "However, they are tricks, and many simple forms of $f(x)$ either have no closed form solution or pose extreme difficulties. Instead, the practicing engineer turns to state-space methods to find solutions." + "These are called *state-space* methods because we are expressing the solution of the differential equations in terms of the system state. " ] }, { @@ -460,11 +399,16 @@ "source": [ "### Forming First Order Equations from Higher Order Equations\n", "\n", - "Many models of physical systems require second or higher order equations. State-space methods require first-order differential equations. Any higher order system of equations can be converted to a first order set of equations by defining extra variables for the first order terms and then solving. \n", + "Many models of physical systems require second or higher order differential equations with control input $u$:\n", "\n", - "Let's do an example. Given the system $\\ddot{x} - 6\\dot x + 9x = t$ find the first order equations.\n", + "$$a_n \\frac{d^ny}{dt^n} + a_{n-1} \\frac{d^{n-1}y}{dt^{n-1}} + \\dots + a_2 \\frac{d^2y}{dt^2} + a_1 \\frac{dy}{dt} + a_0 = u$$\n", "\n", - "The first step is to isolate the highest order term onto one side of the equation .\n", + "State-space methods require first-order equations. Any higher order system of equations can be reduced to first-order by defining extra variables for the derivatives and then solving. \n", + "\n", + "\n", + "Let's do an example. Given the system $\\ddot{x} - 6\\dot x + 9x = t$ find the equivalent first order equations. I've used the dot notation for the time derivatives for clarity.\n", + "\n", + "The first step is to isolate the highest order term onto one side of the equation.\n", "\n", "$$\\ddot{x} = 6\\dot x - 9x + t$$\n", "\n", @@ -474,9 +418,9 @@ "x_2(t) = \\dot x\n", "$$\n", "\n", - "Now we will substitute these into the original equation and solve, giving us a set of first order equations in terms of these new variables. It is conventional to drop the $(t)$ for notational convenience.\n", + "Now we will substitute these into the original equation and solve. The solution yields a set of first-order equations in terms of these new variables. It is conventional to drop the $(t)$ for notational convenience.\n", "\n", - "First, we know that $\\dot x_1 = x_2$ and that $\\dot x_2 = \\ddot{x}$. Therefore\n", + "We know that $\\dot x_1 = x_2$ and that $\\dot x_2 = \\ddot{x}$. Therefore\n", "\n", "$$\\begin{aligned}\n", "\\dot x_2 &= \\ddot{x} \\\\\n", @@ -484,7 +428,7 @@ " &= 6x_2-9x_1 + t\n", "\\end{aligned}$$\n", "\n", - "Therefore our first order system of equations is\n", + "Therefore our first-order system of equations is\n", "\n", "$$\\begin{aligned}\\dot x_1 &= x_2 \\\\\n", "\\dot x_2 &= 6x_2-9x_1 + t\\end{aligned}$$\n", @@ -492,25 +436,52 @@ "If you practice this a bit you will become adept at it. Isolate the highest term, define a new variable and its derivatives, and then substitute." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### First Order Differential Equations In State-Space Form\n", + "\n", + "Substituting the newly defined variables from the previous section:\n", + "\n", + "$$\\frac{dx_1}{dt} = x_2,\\, \n", + "\\frac{dx_2}{dt} = x_3, \\, ..., \\, \n", + "\\frac{dx_{n-1}}{dt} = x_n$$\n", + "\n", + "into the first order equations yields: \n", + "\n", + "$$\\frac{dx_n}{dt} = \\frac{1}{a_n}\\sum\\limits_{i=0}^{n-1}a_ix_{i+1} + \\frac{1}{a_n}u\n", + "$$\n", + "\n", + "\n", + "Using vector-matrix notation we have:\n", + "\n", + "$$\\begin{bmatrix}\\frac{dx_1}{dt} \\\\ \\frac{dx_2}{dt} \\\\ \\vdots \\\\ \\frac{dx_n}{dt}\\end{bmatrix} = \n", + "\\begin{bmatrix}\\dot x_1 \\\\ \\dot x_2 \\\\ \\vdots \\\\ \\dot x_n\\end{bmatrix}=\n", + "\\begin{bmatrix}0 & 1 & 0 &\\cdots & 0 \\\\\n", + "0 & 0 & 1 & \\cdots & 0 \\\\\n", + "\\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", + "-\\frac{a_0}{a_n} & -\\frac{a_1}{a_n} & -\\frac{a_2}{a_n} & \\cdots & -\\frac{a_{n-1}}{a_n}\\end{bmatrix}\n", + "\\begin{bmatrix}x_1 \\\\ x_2 \\\\ \\vdots \\\\ x_n\\end{bmatrix} + \n", + "\\begin{bmatrix}0 \\\\ 0 \\\\ \\vdots \\\\ \\frac{1}{a_n}\\end{bmatrix}u$$\n", + "\n", + "which we then write as $\\dot{\\mathbf x} = \\mathbf{Ax} + \\mathbf{B}u$." + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Finding the Fundamental Matrix for Time Invariant Systems\n", "\n", - "We express the system equations in state-space form (i.e. using linear algebra equations) with\n", + "We express the system equations in state-space form with\n", "\n", "$$ \\dot{\\mathbf x} = \\mathbf{Ax}$$\n", "\n", - "Now we assert that we want to find the *fundamental matrix* $\\Phi$ that propagates the state $\\mathbf x$ with the equation\n", + "and want to find the *fundamental matrix* $\\mathbf F$ that propagates the state $\\mathbf x$ with the equation\n", "\n", - "$$\\mathbf x(t_1) = \\Phi(t_1-t_0)\\mathbf x(t_0)$$\n", - "\n", - "which we can equivalently write as\n", - "\n", - "$$\\mathbf x(t_k) = \\Phi(\\Delta t)\\mathbf x(t_{k-1})$$\n", - "\n", - "You will recognize as the state transition matrix we use in the prediction step of the Kalman filter. We want to compute the value of $\\mathbf x$ at time $t$ by multiplying its previous value by some matrix $\\Phi$.\n", + "$$\\begin{aligned}\n", + "\\mathbf x(t_k) = \\mathbf F(\\Delta t)\\mathbf x(t_{k-1})\\end{aligned}$$\n", "\n", "It is conventional to drop the $t_k$ and use the notation\n", "\n", @@ -525,112 +496,152 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Taylor Series Expansion\n", + "### The Matrix Exponential\n", "\n", - "Taylor series represents a function as an infinite sum of terms. The terms are linear, even for a nonlinear function, so we can express any arbitrary nonlinear function using linear algebra. The cost of this choice is that unless we use an infinite number of terms the value we compute will be approximate rather than exact.\n", + "The solution to the equation $\\frac{dx}{dt} = kx$ can be found by:\n", "\n", - "For a real or complex function the Taylor series of a function $f(x)$ evaluated at $t$ is defined as \n", + "$$\\frac{dx}{dt} = kx \\\\\n", + "\\frac{dx}{x} = k\\, dt \\\\\n", + "\\int \\frac{1}{x}\\, dx = \\int k\\, dt \\\\\n", + "\\log x = kt + c \\\\\n", + "x = e^{kt+c} \\\\\n", + "x = e^ce^{kt} \\\\\n", + "x = c_0e^{kt}$$\n", "\n", - "$$ \\Phi(t) = e^{\\mathbf{F}t} = \\mathbf{I} + \\mathbf{F}t + \\frac{(\\mathbf{F}t)^2}{2!} + \\frac{(\\mathbf{F}t)^3}{3!} + ... $$\n", + "Using similar math, the solution to the first-order equation \n", "\n", - "This is easy to compute, and thus is the typical approach used in Kalman filter design when the filter is reasonably small. If you are wondering where $e$ came from, I point you to the Wikipedia article on the matrix exponential [1]. Here the important point is to recognize the very simple and regular form this equation takes. \n", + "$$\\dot{\\mathbf x} = \\mathbf{Ax} ,\\, \\, \\, \\mathbf x(0) = \\mathbf x_0$$\n", "\n", - "Before applying it to a matrix lets do the Taylor expansion of a real function since this is much easier to visualize. I choose sin(x). The Taylor series for a real or complex function f(x) about x=a is\n", + "where $\\mathbf A$ is a constant matrix, is\n", "\n", - "$$f(x) = \\sum_{n=0}^\\infty\\frac{f^{(n)}(a)}{x!}(x-a)^n$$\n", + "$$\\mathbf x = e^{\\mathbf At}\\mathbf x_0$$\n", "\n", - "where $f^{n}$ is the nth derivative of f. To compute the Taylor series for $f(x)=sin(x)$ at $x=0$ Let's first work out the terms for f.\n", + "Substituting $F = e^{\\mathbf At}$, we can write \n", + "\n", + "$$\\mathbf x_k = \\mathbf F\\mathbf x_{k-1}$$\n", + "\n", + "which is the form we are looking for! We have reduced the problem of finding the fundamental matrix to one of finding the value for $e^{\\mathbf At}$.\n", + "\n", + "$e^{\\mathbf At}$ is known as the matrix exponential. It can be computed with this power series:\n", + "\n", + "$$e^{\\mathbf At} = \\mathbf{I} + \\mathbf{A}t + \\frac{(\\mathbf{A}t)^2}{2!} + \\frac{(\\mathbf{A}t)^3}{3!} + ... $$\n", + "\n", + "That series is found by doing a Taylor series expansion of $e^{\\mathbf At}$, which I will not cover here.\n", + "\n", + "Let's use this to find the solution to Newton's equations. Using $v$ as an substitution for $\\dot x$, and assuming constant velocity we get the linear matrix-vector form \n", + "\n", + "$$\\begin{bmatrix}\\dot x \\\\ \\dot v\\end{bmatrix} =\\begin{bmatrix}0&1\\\\0&0\\end{bmatrix} \\begin{bmatrix}x \\\\ v\\end{bmatrix}$$\n", + "\n", + "This is a first order differential equation, so we can set $\\mathbf{A}=\\begin{bmatrix}0&1\\\\0&0\\end{bmatrix}$ and solve the following equation.\n", + "\n", + "$$\\mathbf F e^{\\mathbf At} = \\mathbf{I} + \\mathbf At + \\frac{(\\mathbf At)^2}{2!} + \\frac{(\\mathbf At)^3}{3!} + ... $$\n", + "\n", + "If you perform the multiplication you will find that $\\mathbf{A}^2=\\begin{bmatrix}0&0\\\\0&0\\end{bmatrix}$, which means that all higher powers of $\\mathbf{A}$ are also $\\mathbf{0}$. Thus we get an exact answer without an infinite number of terms:\n", "\n", - "$$\\begin{aligned}\n", - "f^{0}(x) &= sin(x) ,\\ \\ &f^{0}(0) &= 0 \\\\\n", - "f^{1}(x) &= cos(x),\\ \\ &f^{1}(0) &= 1 \\\\\n", - "f^{2}(x) &= -sin(x),\\ \\ &f^{2}(0) &= 0 \\\\\n", - "f^{3}(x) &= -cos(x),\\ \\ &f^{3}(0) &= -1 \\\\\n", - "f^{4}(x) &= sin(x),\\ \\ &f^{4}(0) &= 0 \\\\\n", - "f^{5}(x) &= cos(x),\\ \\ &f^{5}(0) &= 1\n", - "\\end{aligned}\n", "$$\n", + "\\begin{aligned}\n", + "\\mathbf F &=\\mathbf{I} + \\mathbf At + \\mathbf{0} \\\\\n", + "&= \\begin{bmatrix}1&0\\\\0&1\\end{bmatrix} + \\begin{bmatrix}0&1\\\\0&0\\end{bmatrix}t\\\\\n", + "&= \\begin{bmatrix}1&t\\\\0&1\\end{bmatrix}\n", + "\\end{aligned}$$\n", "\n", - "Now we can substitute these values into the equation.\n", + "We plug this into $\\mathbf x_k= \\mathbf{Fx}_{k-1}$ to get\n", "\n", - "$$\\sin(x) = \\frac{0}{0!}(x)^0 + \\frac{1}{1!}(x)^1 + \\frac{0}{2!}(x)^2 + \\frac{-1}{3!}(x)^3 + \\frac{0}{4!}(x)^4 + \\frac{-1}{5!}(x)^5 + ... $$\n", + "$$\n", + "\\begin{aligned}\n", + "x_k &=\\begin{bmatrix}1&\\Delta t\\\\0&1\\end{bmatrix}x_{k-1}\n", + "\\end{aligned}$$\n", "\n", - "And let's test this with some code:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "estimate of sin(.3) is 0.30452025\n", - "exact value of sin(.3) is 0.295520206661\n" - ] - } - ], - "source": [ - "import numpy as np\n", - "\n", - "x = .3\n", - "estimate = x + x**3/6 + x**5/120\n", - "exact = np.sin(.3)\n", - "\n", - "print('estimate of sin(.3) is', estimate)\n", - "print('exact value of sin(.3) is', exact)" + "You will recognize this as the matrix we derived analytically for the constant velocity Kalman filter in the **Multivariate Kalman Filter** chapter." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "This is not bad for only three terms. If you are curious, go ahead and implement this as a Python function to compute the series for an arbitrary number of terms. But I will forge ahead to the matrix form of the equation. \n", + "### Time Invariance\n", "\n", - "Let's consider tracking an object moving in a vacuum. In one dimension the differential equation for motion with zero acceleration is\n", + "If the behavior of the system depends on time we can say that a dynamic system is described by the first-order differential equation\n", "\n", - "$$ v = \\dot x\\\\a=\\ddot{x} =0,$$\n", + "$$ g(t) = \\dot x$$\n", "\n", - "which we can put in state-space matrix form as\n", + "However, if the system is *time invariant* the equation is of the form:\n", "\n", - "$$\\begin{bmatrix}\\dot x \\\\ \\ddot{x}\\end{bmatrix} =\\begin{bmatrix}0&1\\\\0&0\\end{bmatrix} \\begin{bmatrix}x \\\\ \\dot x\\end{bmatrix}$$\n", + "$$ f(x) = \\dot x$$\n", "\n", - "This is a first order differential equation, so we can set $\\mathbf{F}=\\begin{bmatrix}0&1\\\\0&0\\end{bmatrix}$ and solve the following equation.\n", + "What does *time invariant* mean? Consider a home stereo. If you input a signal $x$ into it at time $t$, it will output some signal $f(x)$. If you instead perform the input at time $t + \\Delta t$ the output signal will be the same $f(x)$, shifted in time.\n", "\n", - "$$\\Phi(t) = e^{\\mathbf{F}t} = \\mathbf{I} + \\mathbf{F}t + \\frac{(\\mathbf{F}t)^2}{2!} + \\frac{(\\mathbf{F}t)^3}{3!} + ... $$\n", + "A counter-example is $x(t) = \\sin(t)$, with the system $f(x) = t\\, x(t) = t \\sin(t)$. This is not time invariant; the value will be different at different times due to the multiplication by t. An aircraft is not time invariant. If you make a control input to the aircraft at a later time its behavior will be different because it will have burned fuel and thus lost weight. Lower weight results in different behavior.\n", "\n", - "If you perform the multiplication you will find that $\\mathbf{F}^2=\\begin{bmatrix}0&0\\\\0&0\\end{bmatrix}$, which means that all higher powers of $\\mathbf{F}$ are also $\\mathbf{0}$. Thus we get an exact answer without an infinite number of terms:\n", + "We can solve these equations by integrating each side. I demonstrated integrating the time invariants system $v = \\dot x$ above. However, integrating the time invariant equation $\\dot x = f(x)$ is not so straightforward. Using the *separation of variables* techniques we divide by $f(x)$ and move the $dt$ term to the right so we can integrate each side:\n", "\n", "$$\n", - "\\begin{aligned}\n", - "\\Phi(t) &=\\mathbf{I} + \\mathbf{F}t + \\mathbf{0} \\\\\n", - "&= \\begin{bmatrix}1&0\\\\0&1\\end{bmatrix} + \\begin{bmatrix}0&1\\\\0&0\\end{bmatrix}t\\\\\n", - "&= \\begin{bmatrix}1&t\\\\0&1\\end{bmatrix}\n", + "\\frac{dx}{dt} = f(x) \\\\\n", + "\\int^x_{x_0} \\frac{1}{f(x)} dx = \\int^t_{t_0} dt\\\\\n", + "$$\n", + "\n", + "If we let $F(x) = \\int \\frac{1}{f(x)} dx$ we get\n", + "\n", + "$$F(x) - F(x_0) = t-t_0$$\n", + "\n", + "We then solve for x with\n", + "\n", + "$$F(x) = t - t_0 + F(x_0) \\\\\n", + "x = F^{-1}[t-t_0 + F(x_0)]$$\n", + "\n", + "In other words, we need to find the inverse of $F$. This is not trivial, and a significant amount of coursework in a STEM education is devoted to finding tricky, analytic solutions to this problem. \n", + "\n", + "However, they are tricks, and many simple forms of $f(x)$ either have no closed form solution or pose extreme difficulties. Instead, the practicing engineer turns to state-space methods to find approximate solutions.\n", + "\n", + "The advantage of the matrix exponential is that we can use it for any arbitrary set of differential equations which are *time invariant*. However, we often use this technique even when the equations are not time invariant. As an aircraft flies it burns fuel and loses weight. However, the weight loss over one second is negligible, and so the system is nearly linear over that time step. Our answers will still be reasonably accurate so long as the time step is short." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Example: Mass-Spring-Damper Model\n", + "\n", + "Suppose we wanted to track the motion of a weight on a spring and connected to a damper, such as an automobile's suspension. The equation for the motion with $m$ being the mass, $k$ the spring constant, and $c$ the damping force, under some input $u$ is \n", + "\n", + "$$m\\frac{d^2x}{dt^2} + c\\frac{dx}{dt} +kx = u$$\n", + "\n", + "For notational convenience I will write that as\n", + "\n", + "$$m\\ddot x + c\\dot x + kx = u$$\n", + "\n", + "I can turn this into a system of first order equations by setting $x_1(t)=x(t)$, and then substituting as follows:\n", + "\n", + "$$\\begin{aligned}\n", + "x_1 &= x \\\\\n", + "x_2 &= \\dot x_1 \\\\\n", + "\\dot x_2 &= \\dot x_1 = \\ddot x\n", "\\end{aligned}$$\n", "\n", - "We plug this into $x(t_k) = \\Phi(\\Delta t)x(t_{k-1})$ to get\n", + "As is common I dropped the $(t)$ for notational convenience. This gives the equation\n", "\n", - "$$\n", - "\\begin{aligned}\n", - "x(t_k) &= \\Phi(\\Delta t)x(t_{k-1}) \\\\\n", - "\\overline x &= \\Phi(\\Delta t)x \\\\\n", - "\\overline x &=\\begin{bmatrix}1&\\Delta t\\\\0&1\\end{bmatrix}x \\\\\n", - "\\overline{\\begin{bmatrix}x \\\\ \\dot x\\end{bmatrix}} &=\\begin{bmatrix}1&\\Delta t\\\\0&1\\end{bmatrix}\\begin{bmatrix}x \\\\ \\dot x\\end{bmatrix}\n", - "\\end{aligned}$$\n", + "$$m\\dot x_2 + c x_2 +kx_1 = u$$\n", "\n", - "This should look very familiar to you! This is the equation we used in the **Multivariate Kalman Filter** chapter to track a moving object.\n", + "Solving for $\\dot x_2$ we get a first order equation:\n", "\n", - "$$\n", - "\\overline{{\\begin{bmatrix}x\\\\\\dot x\\end{bmatrix}}} =\\begin{bmatrix}1&\\Delta t \\\\ 0&1\\end{bmatrix} \\begin{bmatrix}x \\\\ \\dot x\\end{bmatrix}\n", - "$$\n", + "$$\\dot x_2 = -\\frac{c}{m}x_2 - \\frac{k}{m}x_1 + \\frac{1}{m}u$$\n", "\n", - "We derived this equation in that chapter by using techniques that are much easier to understand. The advantage of the Taylor series expansion is that we can use it for any arbitrary set of differential equations which are time invariant. \n", + "We put this into matrix form:\n", "\n", - "However, we often use a Taylor expansion even when the equations are not time invariant. As an aircraft flies it loses weight as it burns fuel. The answer will still be reasonably accurate so long as the time step is short and the system is nearly constant over that time step. The weight loss is neglible over one second, so the Taylor expansion will be sufficiently accurate for our purposes." + "$$\\begin{bmatrix} \\dot x_1 \\\\ \\dot x_2 \\end{bmatrix} = \n", + "\\begin{bmatrix}0 & 1 \\\\ -k/m & -c/m \\end{bmatrix}\n", + "\\begin{bmatrix} x_1 \\\\ x_2 \\end{bmatrix} + \n", + "\\begin{bmatrix} 0 \\\\ 1/m \\end{bmatrix}u$$\n", + "\n", + "Now we use the matrix exponential to find the state transition matrix:\n", + "\n", + "$$\\Phi(t) = e^{\\mathbf At} = \\mathbf{I} + \\mathbf At + \\frac{(\\mathbf At)^2}{2!} + \\frac{(\\mathbf At)^3}{3!} + ... $$\n", + "\n", + "The first two terms give us\n", + "\n", + "$$\\mathbf F = \\begin{bmatrix}1 & t \\\\ -(k/m) t & 1-(c/m) t \\end{bmatrix}$$\n", + "\n", + "This may or may not give you enough precision. You can easily check this by computing $\\frac{(\\mathbf At)^2}{2!}$ for your constants and seeing how much this matrix contributes to the results. " ] }, { @@ -643,7 +654,7 @@ "\n", "$$ \\Phi(t) = \\mathcal{L}^{-1}[(s\\mathbf{I} - \\mathbf{F})^{-1}]$$\n", "\n", - "I have no intention of going into this other than to say that the inverse Laplace transform $\\mathcal{L}^{-1}$ converts a signal into the frequency (time) domain, but finding a solution to the equation above is non-trivial. If you are interested, the Wikipedia article on LTI system theory provides an introduction [2]. I mention LTI because you will find some literature using it to design the Kalman filter matrices for difficult problems. " + "I have no intention of going into this other than to say that the Laplace transform $\\mathcal{L}$ converts a signal into a space $s$ that excludes time, but finding a solution to the equation above is non-trivial. If you are interested, the Wikipedia article on LTI system theory provides an introduction [2]. I mention LTI because you will find some literature using it to design the Kalman filter matrices for difficult problems. " ] }, { @@ -652,20 +663,20 @@ "source": [ "### Numerical Solutions\n", "\n", - "Finally, there are numerous numerical techniques to find $\\Phi$. As filters get larger finding analytical solutions becomes very tedious (though packages like SymPy make it easier). C. F. van Loan [3] has developed a technique that finds both $\\Phi$ and $\\mathbf Q$ numerically. Given the continuous model\n", + "Finally, there are numerous numerical techniques to find $\\mathbf F$. As filters get larger finding analytical solutions becomes very tedious (though packages like SymPy make it easier). C. F. van Loan [3] has developed a technique that finds both $\\Phi$ and $\\mathbf Q$ numerically. Given the continuous model\n", "\n", - "$$ x' = Fx + Gu$$\n", + "$$ \\dot x = Ax + Gw$$\n", "\n", - "where $u$ is the unity white noise, van Loan's method computes the $\\Phi$ and $\\mathbf Q_k$ which discretizes that equation.\n", + "where $w$ is the unity white noise, van Loan's method computes both $\\mathbf F_k$ and $\\mathbf Q_k$.\n", " \n", "I have implemented van Loan's method in `FilterPy`. You may use it as follows:\n", "\n", "```python\n", "from filterpy.common import van_loan_discretization\n", "\n", - "F = np.array([[0., 1.], [-1., 0.]])\n", + "A = np.array([[0., 1.], [-1., 0.]])\n", "G = np.array([[0.], [2.]]) # white noise scaling\n", - "phi, Q = van_loan_discretization(F, G, dt=0.1)\n", + "F, Q = van_loan_discretization(A, G, dt=0.1)\n", "```\n", " \n", "In the section *Numeric Integration of Differential Equations* I present alternative methods which are very commonly used in Kalman filtering." @@ -689,7 +700,7 @@ "\n", "We have been using a process model of\n", "\n", - "$$ f(\\mathbf x) = \\mathbf{Fx} + \\mathbf{w}$$\n", + "$$ \\dot{\\mathbf x} = \\mathbf{Ax} + \\mathbf{Bu} + \\mathbf{w}$$\n", "\n", "where $\\mathbf{w}$ is the process noise. Kinematic systems are *continuous* - their inputs and outputs can vary at any arbitrary point in time. However, our Kalman filters are *discrete*. We sample the system at regular intervals. Therefore we must find the discrete representation for the noise term in the equation above. This depends on what assumptions we make about the behavior of the noise. We will consider two different models for the noise." ] @@ -711,7 +722,7 @@ "\n", "Since the noise is changing continuously we will need to integrate to get the discrete noise for the discretization interval that we have chosen. We will not prove it here, but the equation for the discretization of the noise is\n", "\n", - "$$\\mathbf Q = \\int_0^{\\Delta t} \\Phi(t)\\mathbf{Q_c}\\Phi^\\mathsf{T}(t) dt$$\n", + "$$\\mathbf Q = \\int_0^{\\Delta t} \\mathbf F(t)\\mathbf{Q_c}\\mathbf F^\\mathsf{T}(t) dt$$\n", "\n", "where $\\mathbf{Q_c}$ is the continuous noise. This gives us\n", "\n", @@ -731,7 +742,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -758,7 +769,7 @@ "⎣ 6 2 ⎦ " ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -793,7 +804,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": { "collapsed": false }, @@ -814,7 +825,7 @@ "[\\Delta{t}⋅\\Phi_s]" ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -829,7 +840,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": { "collapsed": false }, @@ -858,7 +869,7 @@ "⎣ 2 ⎦ " ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -908,7 +919,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": { "collapsed": false }, @@ -930,7 +941,7 @@ "⎣ 2 ⎦ " ] }, - "execution_count": 6, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -970,7 +981,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": { "collapsed": false }, @@ -997,7 +1008,7 @@ "⎣ 2 ⎦ " ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -1035,7 +1046,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": { "collapsed": false }, @@ -1059,7 +1070,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": { "collapsed": false }, @@ -1088,7 +1099,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": { "collapsed": false }, @@ -1109,7 +1120,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": { "collapsed": false }, @@ -1140,7 +1151,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": { "collapsed": false }, @@ -1194,35 +1205,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "So far in this book we have been working with systems that can be expressed with simple linear differential equations such as\n", + "We've been exposed to several numerical techniques to solve linear differential equations. These include state-space methods, the Laplace transform, and van Loan's method. \n", "\n", - "$$v = \\dot x = \\frac{dx}{dt}$$\n", + "These work well for linear ordinary differential equations (ODEs), but do not work well for nonlinear equations. For example, consider trying to predict the position of a rapidly turning car. Cars maneuver by turning the front wheels. This makes them pivot around their rear axle as it moves forward. Therefore the path will be continuously varying and a linear prediction will necessarily produce an incorrect value. If the change in the system is small enough relative to $\\Delta t$ this can often produce adequate results, but that will rarely be the case with the nonlinear Kalman filters we will be studying in subsequent chapters. \n", "\n", - "which we can integrate into a closed form solution, in this case $x(t) =vt + x_0$. This equation is then put into the system matrix $\\mathbf{F}$, which allows the Kalman filter equations to predict the system state in the future. For example, our constant velocity filters use\n", - "\n", - "$$\\mathbf{F} = \\begin{bmatrix}\n", - "1 & \\Delta t \\\\ 0 & 1\\end{bmatrix}$$.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The Kalman filter predict equation is $\\mathbf{\\overline x} = \\mathbf{Fx} + \\mathbf{Bu}$. Hence the prediction is\n", - "\n", - "$$\\mathbf{\\overline x} = \\begin{bmatrix}\n", - "1 & \\Delta t \\\\ 0 & 1\\end{bmatrix}\\begin{bmatrix}\n", - "x\\\\ \\dot x\\end{bmatrix}\n", - "$$\n", - "\n", - "which multiplies out to \n", - "\n", - "$$\\begin{aligned}\\overline x &= x + v\\Delta t \\\\\n", - "\\bar{\\dot x} &= \\dot x\\end{aligned}$$.\n", - "\n", - "This works for linear ordinary differential equations (ODEs), but does not work well for nonlinear equations. For example, consider trying to predict the position of a rapidly turning car. Cars turn by pivoting the front wheels, which cause the car to pivot around the rear axle. Therefore the path will be continuously varying and a linear prediction will necessarily produce an incorrect value. If the change in the system is small enough relative to $\\Delta t$ this can often produce adequate results, but that will rarely be the case with the nonlinear Kalman filters we will be studying in subsequent chapters. Another problem is that even trivial systems produce differential equations for which finding closed form solutions is difficult or impossible. \n", - "\n", - "For these reasons we need to know how to numerically integrate differential equations. This can be a vast topic that requires several books to fully cover it. If you need to explore this topic in depth for typical physical systems *Computational Physics in Python* by Dr. Eric Ayars is excellent, and available for free here:\n", + "For these reasons we need to know how to numerically integrate ODEs. This can be a vast topic that requires several books. If you need to explore this topic in depth *Computational Physics in Python* by Dr. Eric Ayars is excellent, and available for free here:\n", "\n", "http://phys.csuchico.edu/ayars/312/Handouts/comp-phys-python.pdf\n", "\n", @@ -1239,68 +1226,46 @@ "\n", "$$ y' = y, \\\\ y(0) = 1$$\n", "\n", - "I happen to know the exact answer is $y=e^t$, but of course in general we will not know the exact solution. In general all we know is the derivative of the equation, which is equal to the slope. We also know the initial value: at $t=0$, $y=1$. If we know these two pieces of information we can predict that value for y(1): it is the slope of the function at $t=0$. I've plotted this below" + "We happen to know the exact answer is $y=e^t$ because we solved it earlier, but for an arbitrary ODE we will not know the exact solution. In general all we know is the derivative of the equation, which is equal to the slope. We also know the initial value: at $t=0$, $y=1$. If we know these two pieces of information we can predict the value at $y(t=1)$ using the slope at $t=0$ and the value of $y(0)$. I've plotted this below." ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": true }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuEAAADaCAYAAAAIYpzVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtQm9edN/CvLkjcBYj73WAwAWwMxklsY8dNYt446XZ3\nkknSOhvHfju77Y7TTfCb2dQzTuI0btM4jbfpTu3OTseEtk6bZJMmm6ljB++mtomdBsLF+MLFxghs\nEBgBEiAQIJ33DwkZWeJqIRB8PzMM8DznOTpynpG/Pvk950iEEAJEREREROQx0vkeABERERHRUsMQ\nTkRERETkYQzhREREREQexhBORERERORhDOFERERERB7GEE5ERERE5GEM4UREREREHjZpCP/1r3+N\nnJwcqFQqqFQqrF+/HseOHZu0w9raWtx3333w9/dHfHw8XnvtNbcOmIiIiIjI28knO5mQkIADBw4g\nLS0NFosF77zzDv7hH/4B33zzDVauXOnU3mAwYMuWLdi8eTMqKipw+fJl7Ny5EwEBAdi9e/ecvQki\nIiIiIm8imemOmWq1Gj//+c/xT//0T07nDh8+jD179qCjowNKpRIA8NOf/hSHDx/G9evX3TNiIiIi\nIiIvN+2acLPZjD/96U8YGBjA+vXrXbY5d+4cNm7caA/gAFBYWIi2tjZoNJo7Hy0RERER0SIwaTkK\nYK3xXrduHUwmEwIDA/HnP/8ZWVlZLttqtVokJiY6HIuKirKfS0pKcsOQiYiIiIi825QhPCMjA+fP\nn4der8cHH3yA7du3469//avLIC6RSGb04nq9fkbtiYiIiIgWEpVKNavrpgzhPj4+SElJAQDk5uai\nvLwc//7v/47f/va3Tm2jo6Oh1WodjnV0dNjPERERERHRLNYJN5vNGB4ednlu3bp1OHPmDEwmk/1Y\naWkp4uLiWIpCRERERGQz6Uz4j3/8Y3z7299GfHw8+vr68O677+LUqVP2tcL37NmD8vJynDx5EgCw\nbds2vPrqq9ixYwf27t2L+vp6vPHGG9i3b9+UA5ntVD6Rp1RUVAAA8vPz53kkRFPj/UrehPcreRt3\nlFRPGsI7Ojrwj//4j9BqtVCpVMjJycHx48exZcsWANaHLZuamuztg4ODUVpail27diE/Px9hYWF4\n4YUXUFRUdMcDJSIiIiJaLCYN4cXFxZNe7Op8dnY2Tp06dWejIiIiIiJaxGZcE05ERERERHeGIZyI\n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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "import numpy as np\n", "import matplotlib.pyplot as plt\n", "t = np.linspace(-1, 1, 10)\n", "plt.plot(t, np.exp(t))\n", - "t = np.linspace(0, 1, 2)\n", - "plt.plot(t,t+1);" + "t = np.linspace(-1, 1, 2)\n", + "plt.plot(t,t+1, ls='--', c='k');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "If the curve is relatively straight than the line formed by the slope will not be very far from the curve. Here the step size of 1 is rather large. You can see that the slope is very close to the line at $t=0.1$ but far at $t=1$. But let's continue with a step size of 1 for a moment. We can see that at $t=1$ the estimated value of $y$ is 2. Now we can compute the value at $t=2$ by taking the slope of the curve at $t=1$ and adding it to our initial estimate. The slope is computed with $y'=y$, so the slope is 2." + "You can see that the slope is very close to the curve at $t=0.1$, but far from it\n", + "at $t=1$. But let's continue with a step size of 1 for a moment. We can see that at $t=1$ the estimated value of $y$ is 2. Now we can compute the value at $t=2$ by taking the slope of the curve at $t=1$ and adding it to our initial estimate. The slope is computed with $y'=y$, so the slope is 2." ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "image/png": "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\n+XgAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import book_plots\n", "t = np.linspace(-1, 2, 20)\n", "plt.plot(t, np.exp(t))\n", "t = np.linspace(0, 1, 2)\n", - "plt.plot([1, 2, 4])\n", + "plt.plot([1, 2, 4], ls='--', c='k')\n", "book_plots.set_labels(x='x', y='y');" ] }, @@ -1308,12 +1273,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Here we see the next estimate for y is 4. The errors are quickly getting large, and you might be unimpressed. But 1 is a very large step size. Let's put this algorithm in code, and verify that it works by trying to generate the result above." + "Here we see the next estimate for y is 4. The errors are getting large quickly, and you might be unimpressed. But 1 is a very large step size. Let's put this algorithm in code, and verify that it works by using a small step size." ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": { "collapsed": true }, @@ -1330,20 +1295,11 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.0\n", - "4.0\n" - ] - } - ], + "outputs": [], "source": [ "def dx(t, y): return y\n", "\n", @@ -1360,22 +1316,11 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "image/png": "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\ndeugVCrx1P9v735CmvzjOIB/pjyb2LaoIIce1KKIPJShgVAZSHU2CIsg7CIUmdglY6dEOhRWJw/l\nQQ+GohJBlHgwadIuweamYkhJHfoDFS0WlGHv3yE2fuazuefxeb6PyvsFgza/D7z99N2bb6F7mpuz\nrlPZcXZjvxvHfjeH/W4O+90atvY7LNLf3w9N09Dd3Y3Z2Vk0NzfD6/Xi3bt3uusTiQSKiorQ0NCA\n6elpDA0NwefzobOz06pIprPNz8/D5XJhdHQUnz59Sj8WFhYsz/bkyRMEg0EMDQ2hsLAQvb29Wder\nnJvRbCrnduLECfT09GB6ehrxeBz19fUIBAL4+vVrxmtUzc5MNlWze/ToEUZGRvD69WvMzc0hGAxC\n0zTEYjHd9Sr3m9FsKvfb/4XDYZSXl2Pfvn1obm7OuE7l7OzGfjeH/W4O+90c9vvq2d3vlh26Dx48\niKampiWv7dq1C9euXdNd39XVhc2bN+Pnz5/p1zo6OlBSUmJVJNPZUn/ZL1++tDxLNl6vd8XiUzk3\no9mcmhsAJJNJ5Ofn4/HjxxnXODW7XLI5ObutW7fi3r17ul9zama5ZHNiZt++fcPOnTsxPj6Oo0eP\nZi1lp2dnJfb76rHfzWO/m8d+z52Kfrfkx0tStwo+fvz4ktez3So4HA7L4cOHxePxLFn//v17efv2\nrRWxTGdLOXnypBQVFcmhQ4dkeHjYskyroWpuq+HE3L5//y5//vyRLVu2ZFzj1OxyyZaicnaLi4vS\n398vP378yPjxb07NLJdsKSpn1tTUJKdOnZLa2lrBCr8Osx7eq7lgv6uzHvYM+914thT2e+7ZUjZa\nv1ty6DZzq+CPHz8uW596nukaVdl8Pp90dnbK4OCgPH36VOrq6qShoUH6+vosy2WWqrmZ4eTcWlpa\npLKyUmpqajKucWp2uWRTObt4PC5er1cKCgrkwoUL8vDhQ6moqNBdq3pmRrKp3m/379+XN2/eSEdH\nh4iIuFyurOvX8nvVCPa7Omt5z7DfzWdjvxvPtlH73ZHbwIus/A05adu2bdLa2pp+fuDAAfny5Yvc\nvHlTzp4962Ayzk3PlStX5MWLFzIxMZF1Pk7MLtdsKme3Z88eicVikkgkZHBwUM6dOyfj4+O65ad6\nZkayqZzZq1evJBgMysTEhOTn54uICP7+eF7Ga9bye9Vua/l7Z7+bw35fjv1uX7aN2u+W/E+3mVsF\nBwKBZf8aSF0fCASsiGU6m57q6mqZm5uzLJdZquZmFbvn1traKgMDAzI2NiZlZWVZ16qenZFseuya\nnaZpsmPHDqmsrJQbN27I/v375c6dO7prVc/MSDY9ds0sHA7L58+fpaKiQjRNE03T5Pnz59LV1SVu\nt1t+//697Jr19l7NhP2uznrbM+x39rtd2fRshH635NBt5lbBNTU1EgqF5NevX0vWl5SUSGlpqRWx\nTGfTE41Gpbi42LJcZqmam1XsnFtLS0u69Hbv3r3iepWzM5pNj6o9t7i4KAsLC7pfc3q/Zcumx66Z\n1dfXy9TUlExOTsrk5KREo1GpqqqSM2fOSDQaFU3Tll3j9Oyswn5XZ73tGfY7+92ubHo2RL9b8Auf\nAICBgQG43W50d3djZmYGly9fhs/nS39sU1tbG+rq6tLrE4kEAoEATp8+jampKQwPD8Pv9+P27dtW\nRTKdraenBw8ePMDMzAxmZ2dx69YtuN1u3L171/JsyWQSkUgEkUgEhYWFaG9vRyQSWRNzM5pN5dwu\nXrwIv9+PsbExfPjwIf1IJpPpNU7Nzkw2VbO7evUqQqEQ5ufnEYvF0NbWhry8PIyMjOjmUrnfjGZT\nud/01NbW4tKlS+nnTs7Obux3c9jv5rDfzWG/W8eufrfs0A38/QiVsrIyeDweVFVVIRQKpb/W2NiI\n8vLyJevj8TiOHDmCgoICFBcXo7293co4prP19vZi79692LRpE/x+P6qrq9HX12dLrmfPnsHlcsHl\nciEvLy/95/Pnz+tmA9TNzWg2lXP7N1Pqcf369fQap2ZnJpuq2TU2NqK0tBQejwfbt2/HsWPHMDo6\nmjEXoG6/Gc2mcr/p+fcjpZzuOLux341jv5vDfjeH/W4du/qdt4EnIiIiIrKZpbeBJyIiIiKi5Xjo\nJiIiIiKyGQ/dREREREQ246GbiIiIiMhmPHQTEREREdmMh24iIiIiIpvx0E1EREREZDMeuomIiIiI\nbMZDNxERERGRzf4D/5LV+BTC2R4AAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "ys = euler(0, 4, 1, dx, step=0.00001)\n", "plt.subplot(1,2,1)\n", @@ -1389,22 +1334,11 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "exact answer= 54.5981500331\n", - "euler answer= 54.59705808834125\n", - "difference = 0.00109194480299\n", - "iterations = 400000\n" - ] - } - ], + "outputs": [], "source": [ "print('exact answer=', np.exp(4))\n", "print('euler answer=', ys[-1])\n", @@ -1416,7 +1350,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Here we see that the error is reasonably small, but it took a very large number of iterations to get three digits of precision. In practice Euler's method is too slow for most problems, and we use higher level methods.\n", + "Here we see that the error is reasonably small, but it took a very large number of iterations to get three digits of precision. In practice Euler's method is too slow for most problems, and we use more sophisticated methods.\n", "\n", "Before we go on, let's formally derive Euler's method, as it is the basis for the more advanced Runge Kutta methods used in the next section. In fact, Euler's method is the simplest form of Runge Kutta.\n", "\n", @@ -1440,7 +1374,7 @@ "metadata": {}, "source": [ "\n", - "Runge Kutta integration is the workhorse of numerical integration. As mentioned earlier there are a vast number of methods in the literature. In practice, using the Runge Kutta algorithm that I present here will solve most any problem you will face. It offers a very good balance of speed, precision, and stability, and it is the 'go to' numerical integration method unless you have a very good reason to choose something different. If you have the knowledge to make that decision you have no need to be reading this section!\n", + "Runge Kutta integration is the workhorse of numerical integration. There are a vast number of methods in the literature. In practice, using the Runge Kutta algorithm that I present here will solve most any problem you will face. It offers a very good balance of speed, precision, and stability, and it is the 'go to' numerical integration method unless you have a very good reason to choose something different.\n", "\n", "Let's dive in. We start with some differential equation\n", "\n", @@ -1465,12 +1399,14 @@ "k_3 &= f(y+\\frac{1}{2}k_2, t+\\frac{1}{2}\\Delta t)\\Delta t \\\\\n", "k_4 &= f(y+k_3, t+\\Delta t)\\Delta t\n", "\\end{aligned}\n", - "$$\n" + "$$\n", + "\n", + "Here is the corresponding code:" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1508,29 +1444,11 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "max error 5.206970035942504e-05\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuMAAADaCAYAAAAMl0zoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt4VOW5/vHvzOR8YCAhk4EEQ5BAIGg2gvwwahQJtFYE\naSsIVbGyS7WYTUxrLB4KrRSKsmnkpNYWobARa0upbdVGCijZ0V1AUCEG0XBMmAFCyHFymlm/P5DB\nKUIIh0wO9+e6cgHvetbMs/o2cmfxrndMhmEYiIiIiIhIqzP7uwERERERkc5KYVxERERExE8UxkVE\nRERE/ERhXERERETETxTGRURERET8RGFcRERERMRPFMZFRERERPyk2TDudrt5+umn6dOnD6GhofTp\n04enn34at9vtUzd79mzi4uIICwtjxIgRFBYW+hyvr68nMzOTmJgYIiIiGDduHCUlJZf3akRERERE\n2pFmw/j8+fNZtmwZixcvZs+ePTz//PMsW7aMefPm+dQsXLiQJUuWsHXrVmw2G6NGjaK6utpbk5WV\nxbp161i7di1btmyhsrKSMWPG4PF4rsyViYiIiIi0cabmPoFzzJgxxMTE8Morr3jHpkyZwokTJ/jr\nX/+KYRj07NmT//qv/2LmzJkA1NXVYbPZWLBgAdOmTaOiogKbzcaKFSuYNGkSAIcPHyYhIYG33nqL\n0aNHX8FLFBERERFpm5q9M37zzTezceNG9uzZA0BhYSGbNm3ijjvuAGDfvn04nU6fQB0SEkJ6ejoF\nBQUAbN++ncbGRp+a+Ph4BgwY4K0REREREelsAporePzxx6msrGTgwIFYLBaampp46qmneOihhwBw\nOBwAxMbG+pxns9koLS311lgsFqKjo31qYmNjcTqdl+VCRERERETam2bD+Nq1a1m1ahWvvvoqKSkp\n7NixgxkzZtC7d28efPDB855rMpla1ExFRUWL6kVERERE2hKr1dqi+maXqTz22GM89thjTJgwgZSU\nFO69916ys7O9D3Da7XaAs+5wO51O7zG73Y7b7aasrMynxuFweGtERERERDqbZsO4y+XCbPYtM5vN\nnH7uMzExEbvdTl5envd4XV0d+fn5pKWlATBkyBACAwN9ag4fPkxRUZG3RkRERESks2l2mcqdd97J\nr371KxITExk4cCA7duzg17/+NVOmTAFOLUXJyspi7ty5JCcnk5SUxJw5c4iMjGTy5MnAqdv1U6dO\n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\nx+Nh2LBh/PKXvwQgNTWVvXv3snTpUoXxdmbt2rWsWrWKV199lZSUFHbs2MGMGTPo3bs3Dz74oL/b\nkytAf3e2X01NTdx7771UVlbyt7/97by1bSKMd+/eHYvFgtPp9Bl3Op306NHDT13JpXj00Uf5wx/+\nwKZNm+jdu7e/25EWev/99zl+/DgpKSneMbfbzZYtW3jppZeoqakhMDDQjx3KherZsycDBw70GUtO\nTubgwYN+6kgu1mOPPUZOTg4TJkwAICUlhQMHDjBv3jyF8XbMbrcDpzJPfHy8d9zpdHqPSfvS1NTE\npEmT2L17N5s3b252qW6bWDMeFBTEkCFDyMvL8xl/5513SEtL81NXcrFmzJjBa6+9xsaNG+nXr5+/\n25GLMH78eHbt2sVHH33ERx99xM6dOxk6dCiTJk1i586dCuLtyI033khRUZHP2GeffaYfktshl8uF\n2ez717bZbNa/WLVziYmJ2O12nwxUV1dHfn6+MlA71NjYyMSJE9m1axebNm26oJ2r2sSdcTi1pOG+\n++5j2LBhpKWl8eKLL+JwOLQWrp2ZPn06q1evZv369VitVu9auMjISMLDw/3cnVwoq9WK1Wr1GQsL\nC6Nbt25n3WWVtu3RRx8lLS2NuXPnMmHCBHbs2MHixYu1HV47dOedd/KrX/2KxMREBg4cyI4dO/j1\nr3/NlClT/N2aNKOmpoa9e/cCp5aOHThwgJ07dxIdHU2vXr3Iyspi7ty5JCcnk5SUxJw5c4iMjGTy\n5Ml+7lz+3fnmsmfPntx9991s27aNv/71rxiG4c1BXbt2JSQk5Otf9DLu8HLJli1bZvTu3dsIDg42\nhg4damzZssXfLUkLmUwmw2w2GyaTyefr5z//ub9bk0ukrQ3br7///e9GamqqERISYvTv399YvHix\nv1uSi1BVVWVkZWUZCQkJRmhoqNGnTx/jySefNOrr6/3dmjRj06ZN3r8Pv/p35Pe//31vzezZs40e\nPXoYISEhxq233mrs3r3bjx3LuZxvLvfv33/OHHS+LRBNhqF/3xIRERER8Yc2sWZcRERERKQzUhgX\nEREREfEThXERERERET9RGBcRERER8ROFcRERERERP1EYFxERERHxE4VxERERERE/URgXEREREfET\nhXERERERET/5/75VNLCawqBiAAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import math\n", "import numpy as np\n", @@ -1546,7 +1464,6 @@ "while t <= 10:\n", " y = runge_kutta4(y, t, dt, func)\n", " t += dt\n", - "\n", " ys.append(y)\n", " ts.append(t)\n", "\n", @@ -1558,6 +1475,120 @@ "print(\"max error {}\".format(max(error)))" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Linearizing with the Taylor Series\n", + "\n", + "Taylor series represents a function as an infinite sum of terms. The terms are linear, even for a nonlinear function, so we can express any arbitrary nonlinear function using linear algebra. The cost of this choice is that unless we use an infinite number of terms the value we compute will be approximate rather than exact.\n", + "\n", + "Before applying it to a matrix lets do the Taylor expansion of a real function since this is much easier to visualize. I choose sin(x). The Taylor series for a real or complex function f(x) at x=a is the infinite series\n", + "\n", + "$$f(x) = f(a) + f'(a)(x-a) + \\frac{f''(a)}{2!}(x-a)^2 + \\, ...\\, + \\frac{f^{(n)}(a)}{n!}(x-a)^n + \\, ...$$\n", + "\n", + "where $f^{n}$ is the nth derivative of f. To compute the Taylor series for $f(x)=sin(x)$ at $x=0$ Let's first work out the terms for f.\n", + "\n", + "$$\\begin{aligned}\n", + "f^{0}(x) &= sin(x) ,\\ \\ &f^{0}(0) &= 0 \\\\\n", + "f^{1}(x) &= cos(x),\\ \\ &f^{1}(0) &= 1 \\\\\n", + "f^{2}(x) &= -sin(x),\\ \\ &f^{2}(0) &= 0 \\\\\n", + "f^{3}(x) &= -cos(x),\\ \\ &f^{3}(0) &= -1 \\\\\n", + "f^{4}(x) &= sin(x),\\ \\ &f^{4}(0) &= 0 \\\\\n", + "f^{5}(x) &= cos(x),\\ \\ &f^{5}(0) &= 1\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "Now we can substitute these values into the equation.\n", + "\n", + "$$\\sin(x) = \\frac{0}{0!}(x)^0 + \\frac{1}{1!}(x)^1 + \\frac{0}{2!}(x)^2 + \\frac{-1}{3!}(x)^3 + \\frac{0}{4!}(x)^4 + \\frac{-1}{5!}(x)^5 + ... $$\n", + "\n", + "And let's test this with some code:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "estimate of sin(.3) is 0.30452025\n", + "exact value of sin(.3) is 0.295520206661\n" + ] + } + ], + "source": [ + "x = .3\n", + "estimate = x + x**3/6 + x**5/120\n", + "exact = np.sin(.3)\n", + "\n", + "print('estimate of sin(.3) is', estimate)\n", + "print('exact value of sin(.3) is', exact)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is not bad for only three terms. If you are curious, go ahead and implement this as a Python function to compute the series for an arbitrary number of terms.\n", + "\n", + "Now we can consider how to linearize a nonlinear " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Bayesian Filtering\n", + "\n", + "Starting in the Discrete Bayes chapter I used a Bayesian formulation for filtering. Traditionally, Kalman filters use a least-squares formulation. **blah**\n", + "\n", + "Suppose we are tracking an object. We define its *state* at a specific time as its position, velocity, and so on. For example, we might write the state at time $t$ as $\\mathbf x_t = \\begin{bmatrix}x_t &\\dot x_t \\end{bmatrix}^\\mathsf T$. \n", + "\n", + "When we take a measurement of the object we are measuring the state. Sensors are noisy, so the measurement is corrupted with noise. Clearly though, the measurement is determined by the state. That is, the object's state determines the measurement, the measurement does not determine the state. The state is the *input*, the measurement is the *output*.\n", + "\n", + "In filtering we are presented a set of measurements from time 0 to time $t$, $\\mathbf z_{0:t}$, and want to compute the corresponding states for those times, $\\mathbf x_{0:t}$. This is called *statistical inversion* because we are trying to compute the input from the output. \n", + "\n", + "Recall Bayes Theorem:\n", + "\n", + "$$P(x \\mid z) = \\frac{P(z \\mid x)P(x)}{P(z)}$$\n", + "\n", + "where $P(z \\mid x)$ is the *likelihood* of the measurement $z$, $P(x)$ is the *prior* based on our process model, and $P(z)$ is a normalization constant. $P(x \\mid z)$ is the *posterior*, or the distribution after incorporating the measurement $z$, also called the *evidence*.\n", + "\n", + "This is a *statistical inversion* as it goes from $P(z \\mid x)$ to $P(x \\mid z)$. The solution to our filtering problem can be expressed as:\n", + "\n", + "$$P(\\mathbf x_{0:t} \\mid \\mathbf z_{0:t}) = \\frac{P(\\mathbf z_{0:t} \\mid \\mathbf x_{0:t})P(\\mathbf x_{0:t})}{P(\\mathbf z_{0:t})}$$\n", + "\n", + "That is all well and good until the next measurement $\\mathbf z_{t+1}$ comes in, at which point we need to recompute the entire expression for the range $0:t+1$. \n", + "\n", + "\n", + "In practice this is intractable because we are trying to compute the posterior distribution $P(\\mathbf x_{0:t} \\mid \\mathbf z_{0:t})$ for the state over the full range of time steps. But do we really care about the probability distribution at the third step (say) when we just received the tenth measurement? Not usually. So we relax our requirements and only compute the distributions for the current time step.\n", + "\n", + "The first simplification is we describe our process (e.g., the motion model for a moving object) as a *Markov chain*. That is, we say that the current state is solely dependent on the previous state and a transition probability $P(\\mathbf x_k \\mid \\mathbf x_{k-1})$, which is just the probability of going from the last state to the current one. We write:\n", + "\n", + "$$\\mathbf x_k \\sim P(\\mathbf x_k \\mid \\mathbf x_{k-1})$$\n", + "\n", + "The next simplification we make is do define the *measurement model* as depending on the current state $\\mathbf x_k$ with the conditional probability of the measurement given the current state: $P(\\mathbf z_t \\mid \\mathbf x_x)$. We write:\n", + "\n", + "$$\\mathbf z_k \\sim P(\\mathbf z_t \\mid \\mathbf x_x)$$\n", + "\n", + "We have a recurrance now, so we need an initial condition to terminate it. Therefore we say that the initial distribution is the probablity of the state $\\mathbf x_0$:\n", + "\n", + "$$\\mathbf x_0 \\sim P(\\mathbf x_0)$$\n", + "\n", + "\n", + "These terms are plugged into Bayes equation. If we have the state $\\mathbf x_0$ and the first measurement we can estimate $P(\\mathbf x_1 | \\mathbf z_1)$. The motion model creates the prior $P(\\mathbf x_2 \\mid \\mathbf x_1)$. We feed this back into Bayes theorem to compute $P(\\mathbf x_2 | \\mathbf z_2)$. We continue this predictor-corrector algorithm, recursively computing the state and distribution at time $t$ based solely on the state and distribution at time $t-1$ and the measurement at time $t$.\n", + "\n", + "The details of the mathematics for this computation varies based on the problem. The **Discrete Bayes** and **Univariate Kalman Filter** chapters gave two different formulations which you should have been able to reason through. The univariate Kalman filter assumes that for a scalar state both the noise and process are linear model are affected by zero-mean, uncorrelated Gaussian noise. \n", + "\n", + "The Multivariate Kalman filter make the same assumption but for states and measurements that are vectors, not scalars. Dr. Kalman was able to prove that if these assumptions hold true then the Kalman filter is *optimal*. Colloquially this means there is no way to derive more information from the noise. In the remainder of the book I will present filters that relax the constraints on linearity and Gaussian noise." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1570,14 +1601,14 @@ "\n", "$$\n", "\\begin{aligned}\n", - "\\mathbf{\\overline x} &= \\mathbf{F x} + \\mathbf{B u} \\\\\n", + "\\mathbf{\\bar{x}} &= \\mathbf{F x} + \\mathbf{B u} \\\\\n", "\\mathbf{\\bar{P}} &= \\mathbf{FPF}^\\mathsf{T} + \\mathbf Q\n", "\\end{aligned}\n", "$$\n", "\n", "For a univariate problem the state $\\mathbf x$ only has one variable, so it is a $1\\times 1$ matrix. Our motion $\\mathbf{u}$ is also a $1\\times 1$ matrix. Therefore, $\\mathbf{F}$ and $\\mathbf B$ must also be $1\\times 1$ matrices. That means that they are all scalars, and we can write\n", "\n", - "$$\\overline x = Fx + Bu$$\n", + "$$\\bar{x} = Fx + Bu$$\n", "\n", "Here the variables are not bold, denoting that they are not matrices or vectors. \n", "\n", @@ -1612,8 +1643,8 @@ "$$\n", "\\begin{aligned}\n", "\\mathbf{K}&= \\mathbf{\\bar{P}H}^\\mathsf{T} (\\mathbf{H\\bar{P}H}^\\mathsf{T} + \\mathbf R)^{-1} \\\\\n", - "\\textbf{y} &= \\mathbf z - \\mathbf{H \\overline x}\\\\\n", - "\\mathbf x&=\\mathbf{\\overline x} +\\mathbf{K\\textbf{y}} \\\\\n", + "\\textbf{y} &= \\mathbf z - \\mathbf{H \\bar{x}}\\\\\n", + "\\mathbf x&=\\mathbf{\\bar{x}} +\\mathbf{K\\textbf{y}} \\\\\n", "\\mathbf P&= (\\mathbf{I}-\\mathbf{KH})\\mathbf{\\bar{P}}\n", "\\end{aligned}\n", "$$\n", @@ -1623,8 +1654,8 @@ "$$\n", "\\begin{aligned}\n", "K &=\\frac{\\bar{P}}{\\bar{P} + R} \\\\\n", - "y &= z - \\overline x\\\\\n", - "x &=\\overline x+Ky \\\\\n", + "y &= z - \\bar{x}\\\\\n", + "x &=\\bar{x}+Ky \\\\\n", "P &= (1-K)\\bar{P}\n", "\\end{aligned}\n", "$$\n", @@ -1765,22 +1796,11 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "image/png": "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\nhBDiM/8/3QDBZRpvieYAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from book_format import set_figsize, figsize\n", "\n", @@ -1801,9 +1821,9 @@ "\n", "Let's start with some definitions which should be familiar to you. First, we define the innovation as \n", "\n", - "$$\\delta \\mathbf{\\bar{z}}= \\mathbf z - h(\\mathbf{\\overline x})$$\n", + "$$\\delta \\mathbf{\\bar{z}}= \\mathbf z - h(\\mathbf{\\bar{x}})$$\n", "\n", - "where $\\mathbf z$ is the measurement, $h(\\bullet)$ is the measurement function, and $\\delta \\mathbf{\\bar{z}}$ is the innovation, which we abbreviate as $y$ in FilterPy. In other words, this is the equation $\\mathbf{y} = \\mathbf z - \\mathbf{H\\overline x}$ in the linear Kalman filter's update step.\n", + "where $\\mathbf z$ is the measurement, $h(\\bullet)$ is the measurement function, and $\\delta \\mathbf{\\bar{z}}$ is the innovation, which we abbreviate as $y$ in FilterPy. In other words, this is the equation $\\mathbf{y} = \\mathbf z - \\mathbf{H\\bar{x}}$ in the linear Kalman filter's update step.\n", "\n", "Next, the *measurement residual* is\n", "\n", @@ -1990,39 +2010,11 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "iteration: 1\n", - "innovation [-148.512 28.6789 -148.5361]\n", - "pos [ 805.4175 205.2868]\n", - "\n", - "\n", - "iteration: 2\n", - "innovation [-0.1177 -7.4049 -0.1599]\n", - "pos [ 800.04 199.9746]\n", - "\n", - "\n", - "iteration: 3\n", - "innovation [-0.0463 -0.001 -0.0463]\n", - "pos [ 800. 200.]\n", - "\n", - "\n", - "iteration: 4\n", - "innovation [-0. -0. -0.]\n", - "pos [ 800. 200.]\n", - "\n", - "\n", - "Iterated solution: [ 800. 200.]\n" - ] - } - ], + "outputs": [], "source": [ "import numpy as np\n", "from numpy.linalg import norm, inv\n", @@ -2123,35 +2115,12 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "iteration: 1\n", - "innovation [-0.0009 -1.3868 -0.0024]\n", - "pos [ 800.0014 199.9991]\n", - "\n", - "\n", - "iteration: 2\n", - "innovation [-0.0016 -0. -0.0016]\n", - "pos [ 800. 200.]\n", - "\n", - "\n", - "iteration: 3\n", - "innovation [-0. -0. -0.]\n", - "pos [ 800. 200.]\n", - "\n", - "\n", - "Iterated solution: [ 800. 200.]\n" - ] - } - ], + "outputs": [], "source": [ "pos, converted = lop_ils(rz, sat_pos, (801, 201), hx=hx_ils)\n", "print('Iterated solution: ', pos)" @@ -2168,44 +2137,11 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "iteration: 1\n", - "innovation [ 129.8823 100.461 107.5398]\n", - "pos [ 831.4474 186.1222]\n", - "\n", - "\n", - "iteration: 2\n", - "innovation [-31.6446 -7.4837 -30.7861]\n", - "pos [ 800.3284 198.8076]\n", - "\n", - "\n", - "iteration: 3\n", - "innovation [-0.6041 -0.3813 0.3569]\n", - "pos [ 799.948 198.6026]\n", - "\n", - "\n", - "iteration: 4\n", - "innovation [-0.4803 0.0004 0.4802]\n", - "pos [ 799.9476 198.6025]\n", - "\n", - "\n", - "iteration: 5\n", - "innovation [-0.4802 0.0007 0.4803]\n", - "pos [ 799.9476 198.6025]\n", - "\n", - "\n", - "Iterated solution: [ 799.948 198.602]\n" - ] - } - ], + "outputs": [], "source": [ "# add some noise\n", "nrz = []\n", @@ -2259,7 +2195,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.5.0" } }, "nbformat": 4,