Expanded Jacobian coverage.
Added explicit computation of Jacobian, and, more interestingly, added the use of sympy to compute the Jacobian automatically.
This commit is contained in:
1 parent
79c158b206
commit
be9a77561b
1 file changed
+217
-29
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"metadata": {
|
||||
"name": "",
|
||||
"signature": "sha256:6e6749d931110e1edad026d2237ed80b25dbe6f60372d36194549b6f735220f0"
|
||||
"signature": "sha256:ff55ea156e51d203e3d4a98256614289bbe209beec4a681fe1334120c13e55b2"
|
||||
},
|
||||
"nbformat": 3,
|
||||
"nbformat_minor": 0,
|
||||
@@ -44,7 +44,7 @@
|
||||
" background: transparent;\n",
|
||||
" color: #000000;\n",
|
||||
" font-weight: 600;\n",
|
||||
" font-size: 13pt;\n",
|
||||
" font-size: 11pt;\n",
|
||||
" font-style: bold;\n",
|
||||
" font-family: 'Source Code Pro', Consolas, monocco, monospace;\n",
|
||||
" }\n",
|
||||
@@ -248,13 +248,13 @@
|
||||
],
|
||||
"metadata": {},
|
||||
"output_type": "pyout",
|
||||
"prompt_number": 4,
|
||||
"prompt_number": 1,
|
||||
"text": [
|
||||
"<IPython.core.display.HTML at 0x14a4490>"
|
||||
"<IPython.core.display.HTML at 0x7f1ea414e748>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 4
|
||||
"prompt_number": 1
|
||||
},
|
||||
{
|
||||
"cell_type": "heading",
|
||||
@@ -395,11 +395,11 @@
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x2793590>"
|
||||
"<matplotlib.figure.Figure at 0x7f1e8acc7908>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 5
|
||||
"prompt_number": 2
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -442,14 +442,38 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Instead of computing $\\mathbf{H}$ we will compute the partial derivative of $\\mathbf{H}$ with respect to the robot's position $\\mathbf{x}$. You are probably familiar with the concept of partial derivative, but if not, it just means how $\\mathbf{H}$ changes with respect to the robot's position.\n",
|
||||
"Instead of computing $\\mathbf{H}$ we will compute the partial derivative of $\\mathbf{H}$ with respect to the robot's position $\\mathbf{x}$. You are probably familiar with the concept of partial derivative, but if not, it just means how $\\mathbf{H}$ changes with respect to the robot's position. It is computed as the partial derivative of $\\mathbf{H}$ as follows:\n",
|
||||
"\n",
|
||||
"$$\\frac{\\partial \\mathbf{h}}{\\partial \\mathbf{x}} = \n",
|
||||
"\\begin{bmatrix}\n",
|
||||
"\\frac{\\partial h_1}{\\partial x_1} & \\frac{\\partial h_1}{\\partial x_2} &\\dots \\\\\n",
|
||||
"\\frac{\\partial h_2}{\\partial x_1} & \\frac{\\partial h_2}{\\partial x_2} &\\dots \\\\\n",
|
||||
"\\vdots & \\vdots\n",
|
||||
"\\end{bmatrix}\n",
|
||||
"$$\n",
|
||||
"\n",
|
||||
"Let's work the first partial derivative. We want to find\n",
|
||||
"\n",
|
||||
"$$\\frac{\\partial }{\\partial x} \\sqrt{(x-x_A)^2 + (y-y_A)^2}\n",
|
||||
"$$\n",
|
||||
"\n",
|
||||
"Which we compute as\n",
|
||||
"$$\n",
|
||||
"\\begin{aligned}\n",
|
||||
"\\frac{\\partial h_1}{\\partial x} &= ((x-x_A)^2 + (y-y_A)^2))^\\frac{1}{2} \\\\\n",
|
||||
"&= \\frac{1}{2}\\times 2(x-x_a)\\times ((x-x_A)^2 + (y-y_A)^2))^{-\\frac{1}{2}} \\\\\n",
|
||||
"&= \\frac{x_r - x_A}{\\sqrt{(x_r-x_A)^2 + (y_r-y_A)^2}} \n",
|
||||
"\\end{aligned}\n",
|
||||
"$$\n",
|
||||
"\n",
|
||||
"We continue this computation for the partial derivatives of the two distance equations with respect to $x$, $y$, $dx$ and $dy$, yielding\n",
|
||||
"\n",
|
||||
"$$\\frac{\\partial\\mathbf{h}}{\\partial\\mathbf{x}}=\n",
|
||||
"\\small\\begin{bmatrix}\n",
|
||||
"\\frac{(x_r - x_A)}{\\sqrt{(x_r-x_A)^2 + (y_r-y_A)^2}} & 0 & \n",
|
||||
"\\frac{(y_r - y_A)}{\\sqrt{(x_r-x_A)^2 + (y_r-y_A)^2}} & 0 \\\\\n",
|
||||
"\\frac{(x_r - x_B)}{\\sqrt{(x_r-x_B)^2 + (y_r-y_B)^2}} & 0 &\n",
|
||||
"\\frac{(y_r - y_B)}{\\sqrt{(x_r-x_B)^2 + (y_r-y_B)^2}} & 0 \\\\\n",
|
||||
"\\frac{x_r - x_A}{\\sqrt{(x_r-x_A)^2 + (y_r-y_A)^2}} & 0 & \n",
|
||||
"\\frac{y_r - y_A}{\\sqrt{(x_r-x_A)^2 + (y_r-y_A)^2}} & 0 \\\\\n",
|
||||
"\\frac{x_r - x_B}{\\sqrt{(x_r-x_B)^2 + (y_r-y_B)^2}} & 0 &\n",
|
||||
"\\frac{y_r - y_B}{\\sqrt{(x_r-x_B)^2 + (y_r-y_B)^2}} & 0 \\\\\n",
|
||||
"\\end{bmatrix}\n",
|
||||
"$$"
|
||||
]
|
||||
@@ -458,7 +482,158 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"In a nutshell, the entry (0,0) contains the difference between the x coordinate of the robot and transmitter A's x coordinate divided by the distance between the robot and A. (2,0) contains the same, except for the y coordintates of the robot and transmitters. The bottom row contains the same computations, except for transmitter B. The 0 entries account for the velocity components of the state variables; naturally the range does notvide us with velocity.\n",
|
||||
"That is pretty painful, and these are very simple equations. Computing the Jacobian can be extremely difficult or even impossible for more complicated systems. However, there is an easy way to get Python to do the work for you by using the `sympy` module [1]. `sympy` is a Python library for symbolic mathematics. The full scope of its abilities are beyond this book, but it can perform algebra, integrate and differentiate equations, find solutions to differential equations, and much more. We will use it to compute our Jabobian!\n",
|
||||
"\n",
|
||||
"First, a simple example. We will import sympy, initialize its pretty print functionality (which will print equations using $\\LaTeX$). We will then declare a symbol for numpy to use."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"import sympy\n",
|
||||
"from sympy import init_printing\n",
|
||||
"#from sympy.interactive import printing\n",
|
||||
"init_printing(use_latex='mathjax')\n",
|
||||
"\n",
|
||||
"phi, x = sympy.symbols('\\phi, x')\n",
|
||||
"phi"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"latex": [
|
||||
"$$\\phi$$"
|
||||
],
|
||||
"metadata": {},
|
||||
"output_type": "pyout",
|
||||
"prompt_number": 15,
|
||||
"text": [
|
||||
"\\phi"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 15
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Notice how we use a latex expression for the symbol `phi`. This is not necessary, but if you do it will render as LaTeX when output. Now let's do some math. What is the derivative of $\\sqrt{\\phi}$?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"sympy.diff('sqrt(phi)')"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"latex": [
|
||||
"$$\\frac{1}{2 \\sqrt{\\phi}}$$"
|
||||
],
|
||||
"metadata": {},
|
||||
"output_type": "pyout",
|
||||
"prompt_number": 17,
|
||||
"text": [
|
||||
" 1 \n",
|
||||
"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
|
||||
" ___\n",
|
||||
"2\u22c5\u2572\u2571 \u03c6 "
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 17
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"We can factor equations."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"sympy.factor('phi**3 -phi**2 + phi - 1')"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"latex": [
|
||||
"$$\\left(\\phi - 1\\right) \\left(\\phi^{2} + 1\\right)$$"
|
||||
],
|
||||
"metadata": {},
|
||||
"output_type": "pyout",
|
||||
"prompt_number": 26,
|
||||
"text": [
|
||||
" \u239b 2 \u239e\n",
|
||||
"(\u03c6 - 1)\u22c5\u239d\u03c6 + 1\u23a0"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 26
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"`sympy` has a remarkable list of features, and as much as I enjoy exercising its features we cannot cover them all here. Instead, let's compute our Jacobian."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"phi = sympy.symbols('\\phi')\n",
|
||||
"phi\n",
|
||||
"\n",
|
||||
"x, y, xa, xb, ya, yb, dx, dy = sympy.symbols('x, y, x_a, x_b, y_a, y_b, dx, dy')\n",
|
||||
"\n",
|
||||
"H = sympy.Matrix([[sympy.sqrt((x-xa)**2 + (y-ya)**2)], \n",
|
||||
" [sympy.sqrt((x-xb)**2 + (y-yb)**2)]])\n",
|
||||
"\n",
|
||||
"state = sympy.Matrix([x, dx, y, dy])\n",
|
||||
"H.jacobian(state)"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"latex": [
|
||||
"$$\\left[\\begin{matrix}\\frac{x - x_{a}}{\\sqrt{\\left(x - x_{a}\\right)^{2} + \\left(y - y_{a}\\right)^{2}}} & 0 & \\frac{y - y_{a}}{\\sqrt{\\left(x - x_{a}\\right)^{2} + \\left(y - y_{a}\\right)^{2}}} & 0\\\\\\frac{x - x_{b}}{\\sqrt{\\left(x - x_{b}\\right)^{2} + \\left(y - y_{b}\\right)^{2}}} & 0 & \\frac{y - y_{b}}{\\sqrt{\\left(x - x_{b}\\right)^{2} + \\left(y - y_{b}\\right)^{2}}} & 0\\end{matrix}\\right]$$"
|
||||
],
|
||||
"metadata": {},
|
||||
"output_type": "pyout",
|
||||
"prompt_number": 28,
|
||||
"text": [
|
||||
"\u23a1 x - x\u2090 y - y\u2090 \u23a4\n",
|
||||
"\u23a2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 0\u23a5\n",
|
||||
"\u23a2 _______________________ _______________________ \u23a5\n",
|
||||
"\u23a2 \u2571 2 2 \u2571 2 2 \u23a5\n",
|
||||
"\u23a2 \u2572\u2571 (x - x\u2090) + (y - y\u2090) \u2572\u2571 (x - x\u2090) + (y - y\u2090) \u23a5\n",
|
||||
"\u23a2 \u23a5\n",
|
||||
"\u23a2 x - x_b y - y_b \u23a5\n",
|
||||
"\u23a2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 0\u23a5\n",
|
||||
"\u23a2 _________________________ _________________________ \u23a5\n",
|
||||
"\u23a2 \u2571 2 2 \u2571 2 2 \u23a5\n",
|
||||
"\u23a3\u2572\u2571 (x - x_b) + (y - y_b) \u2572\u2571 (x - x_b) + (y - y_b) \u23a6"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 28
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"In a nutshell, the entry (0,0) contains the difference between the x coordinate of the robot and transmitter A's x coordinate divided by the distance between the robot and A. (2,0) contains the same, except for the y coordintates of the robot and transmitters. The bottom row contains the same computations, except for transmitter B. The 0 entries account for the velocity components of the state variables; naturally the range does not provide us with velocity.\n",
|
||||
"\n",
|
||||
"The values in this matrix change as the robot's position changes, so this is no longer a constant; we will have to recompute it for every time step of the filter.\n",
|
||||
"\n",
|
||||
@@ -516,13 +691,13 @@
|
||||
" theta_a = atan2(pos_a[1]-pos[1], pos_a[0] - pos[0])\n",
|
||||
" theta_b = atan2(pos_b[1]-pos[1], pos_b[0] - pos[0])\n",
|
||||
"\n",
|
||||
" return np.mat([[0, -cos(theta_a), 0, -sin(theta_a)],\n",
|
||||
" [0, -cos(theta_b), 0, -sin(theta_b)]])"
|
||||
" return np.array([[0, -cos(theta_a), 0, -sin(theta_a)],\n",
|
||||
" [0, -cos(theta_b), 0, -sin(theta_b)]])"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 6
|
||||
"prompt_number": 35
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -557,7 +732,7 @@
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 10
|
||||
"prompt_number": 36
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -572,7 +747,7 @@
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"import math\n",
|
||||
"from KalmanFilter import KalmanFilter\n",
|
||||
"from filterpy.kalman import KalmanFilter\n",
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"pos_a = (100,-20)\n",
|
||||
@@ -580,17 +755,15 @@
|
||||
"\n",
|
||||
"f1 = KalmanFilter(dim_x=4, dim_z=2)\n",
|
||||
"\n",
|
||||
"f1.F = np.mat ([[0, 1, 0, 0],\n",
|
||||
" [0, 0, 0, 0],\n",
|
||||
" [0, 0, 0, 1],\n",
|
||||
" [0, 0, 0, 0]])\n",
|
||||
"\n",
|
||||
"f1.B = 0.\n",
|
||||
"f1.F = np.array ([[0, 1, 0, 0],\n",
|
||||
" [0, 0, 0, 0],\n",
|
||||
" [0, 0, 0, 1],\n",
|
||||
" [0, 0, 0, 0]], dtype=float)\n",
|
||||
"\n",
|
||||
"f1.R *= 1.\n",
|
||||
"f1.Q *= .1\n",
|
||||
"\n",
|
||||
"f1.x = np.mat([1,0,1,0]).T\n",
|
||||
"f1.x = np.array([[1,0,1,0]], dtype=float).T\n",
|
||||
"f1.P = np.eye(4) * 5.\n",
|
||||
"\n",
|
||||
"# initialize storage and other variables for the run\n",
|
||||
@@ -613,7 +786,7 @@
|
||||
" # ranges\n",
|
||||
" ra,rb = d.range_of(pos)\n",
|
||||
" rx,ry = d.range_of((pos[0]+f1.x[0,0], pos[1]+f1.x[2,0]))\n",
|
||||
" z = np.mat([[ra-rx],[rb-ry]])\n",
|
||||
" z = np.array([[ra-rx],[rb-ry]])\n",
|
||||
"\n",
|
||||
" # compute linearized H for this time step\n",
|
||||
" f1.H = H_of (pos, pos_a, pos_b)\n",
|
||||
@@ -640,13 +813,13 @@
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAr8AAAFyCAYAAAD8h7IZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4VOXB/vF7JjOTDUgkJAKBFBd2w6IsCioiLWERUAQL\nVFELWtlEjUsFfdUqbbVq3bUK7lgWi1YqIkFBBPSnAgoVwQ0MEUzCmo1kJsn8/lBSwmTPTGaeOd/P\ndb3X9Z7MOZMHbk598uSe59h27tzpFQAAAGAB9mAPAAAAAGgqTH4BAABgGUx+AQAAYBlMfgEAAGAZ\nTH4BAABgGUx+AQAAYBk1Tn4PHTqkSy+9VGPGjNHo0aO1YsUKSdKKFSuUlpamtLQ0rVmzpkkGCgAA\nADSWraZ9fktLS+XxeBQdHa1Dhw5pxIgRWrdunYYNG6alS5eqpKREkydPVkZGRlOOGQAAAGiQGld+\nHQ6HoqOjJUn5+flyuVz64osv1LFjR7Vs2VJt2rRR69attWPHjiYZLAAAANAYjtpOKCws1IQJE5SZ\nmakHH3xQ+/fvV2JiohYtWqS4uDglJiYqJydHXbp0aYrxAgAAAA1W6wfeYmNjtXz5ci1btkwPPPCA\nSkpKJEkTJkzQ8OHDJUk2my2wowQAAAD8oNaV32NOO+00tW3bVsnJyXrnnXcqvp6bm6vExESf87ds\n2aJWrVr5Z5QAAABAFfLz89WtW7c6n1/j5Dc7O1sul0snnXSScnNztWvXLp1yyin65ptvdPDgQZWU\nlCg7O7vKykOrVq105pln1v9PgKBbvny5Ro0aFexhoIHIz2zkZy6yMxv5mWvz5s31Or/Gye++fft0\n5513Vhz/8Y9/VEJCgtLT0zVx4kRJ0pw5cxowTISyzMzMYA8BjUB+ZiM/c5Gd2cjPOmqc/Pbq1UvL\nly/3+fqIESM0YsSIgA0KAAAACASe8AYfv/71r4M9BDQC+ZmN/MxFdmYjP+tg8gsfnTt3DvYQ0Ajk\nZzbyMxfZmY38rKPOuz34i9frVU5OjsrKypr6W4eliIgIJSUl+XW7ufXr1+vcc8/12/uhaZGf2cjP\nXGRnNvKzjiaf/Obk5Kh58+aKiYlp6m8dloqKipSTk6OTTz452EMBAAAIebadO3d6A/HGe/bsqXKr\ns71796pt27aB+JaWxd8pAACwqs2bN6t9+/Z1Pp/OLwAAACyDyS98rF+/PthDQCOQn9nIz1xkZzby\nC6ycAre+yikM9jAkMfn1MX/+fHXs2FEpKSlat25dxdfT09P14IMPVjr31ltvVUpKilq1aqUPPvig\nqYcKAAAQ0nIK3Hp8wx5Ne2NHyEx+6fwex+PxqEOHDsrIyKjXM6J79eqlxx57TOeff77Pa6NGjdJl\nl12mK664wp9DrSSU/04BAID15BS4tfiLbK39/pCGd07QuNQkxUc7A/K96tv5bfLdHkJZdna2iouL\n/brXnz+3IAMAAAhlJ056F4zrWnnSW14u2/798iYlBW2M1B5+cc455+icc86RJJ1yyikVtYdVq1Yp\nJSVFJ598subNm1fn93v44YeVkpKijz76SLfddptSUlI0ZMiQitcPHTqkP/zhD+rSpYt69+6tl19+\nudL1M2bM0O23367JkycrJSVFPXv2VEFBgX/+sLWg92Q28jMb+ZmL7MxGfo1zfL0h2mnXgnFdNbVv\nW5284B+KvuUWNRs/Xi3691d8u3ZqccEFUhCf98DK7y8++ugj7dmzR7169dLu3btlt//v54LMzEzN\nmDGjXqu4N910k2666SaNHj1al112mS6//PJKr1933XVKSkrSF198oX379mnkyJHq0aOHevXqVXHO\nkiVL9PTTT+ull17Sl19+KYeDuAAAQJAdPSp7ZqbsmZk68MNevZYfq9UJHTW8SyuflV7b4cMq79hR\npb/+tcpSUlSekiLFxgZx8Ex+K/F6a64/1/Z6Xa/76aef9N577+m7775TZGSkOnTooFGjRuntt9+u\nNPk977zzNHToUEnSGWec0aDv3RA84cZs5Gc28jMX2ZmN/I5zbFU2IsLnpeZDhihi+3bt65yql84b\nr9XJqRoZmaMFw1IUn3SSz/nFd9wR6NHWW8hNfqP++ldFP/CAz9eP3nqriv/4xzqdX925wXLiivGP\nP/4oSZUmumVlZRo7dmyl80477bTADw4AAFiWIyNDjm3bZP/hh59Xc3/4Qfa9e5W/erXKqlh4+/7F\n17TohxKt3XVYwzsnaH4AP8gWKCE3+S3+4x/rNXGt7/mNUV3tweVyqaya7srx9YljkpOTFRUVpe+/\n/77GKkVV1zYFnm9uNvIzG/mZi+zMZtX8HFu3ypafr9JevVQ+erTKf/UrlbdvL0VGVjqv1g+yGSTk\nJr+hrLraw+mnn66NGzdq8ODBPq8lJSVp+/btlb7WunVrDRgwQHfffbduvfVWuVwubd68Wc2aNVP3\n7t0DMnYAAGBhhYVVdm2L09NrvCycJr3HsNvDCU5ciR07dqxSUlL0+uuv6/HHH1dKSopmzpxZ6Zy5\nc+dq+fLlat++vf7v//6v0mszZszQ2rVr1b17d40ZM6bi6//4xz+0f/9+9e3bV506ddK9997rs3oc\nrG3SrPiTbzghP7ORn7nIzmzhmp/9m28Ue9VVanbllfW6rsrdG/olGz/xlXjIRVjg7xQAABzPtnev\noh94QM6331bxzJkqueYaKSam1uua8uEU/lLfh1yw8gsf7HVoNvIzG/mZi+zMFk75RT75pFqcd568\n8fHK++QTlcyeXevEN5xXek9E5xcAACCMlJ51lvLWrZM3ObnWc8Ox01sbag9hgL9TAABQHybWG6pT\n39oDK78AAACm8XrlfOcdeYYM8dmWrCZWXOk9EZ1f+Ain3pMVkZ/ZyM9cZGc2k/JzrFun5r/5jaLu\nv1/2n36q0zVW6vTWhpVfAAAAA0Rs3aroe+6RfdcuHZ07V55LLpFqeSAWK72+6PyGAf5OAQAIbxGf\nf65mkyapOD1dJVdcIblcNZ4fTp3e2tD5BQAACDNlPXvqyGef1WnLMlZ6a0bntwoDBgzQxo0bq319\n1KhReuWVVxr1Pfbt26eUlBS1bdtWI0aMaNR7+ZtJvSf4Ij+zkZ+5yM5sIZNfcbGUn+/7dZutxokv\nnd66Y/JbhY0bN2rAgAHVvm6z2Rr96OE2bdooMzNTDz30UKPeBwAAGK60VI7331fMjBmK69ZNrv/8\np86XMumtP2oPQeb1BqRy3Sjh+nxzqyA/s5GfucjObMHIz757tyKffFKut95Sefv2co8dq6Nz58pb\nh8/xUG9oOFZ+j3P33XcrJSVFrVq10gcffFDx9UOHDmnixIn61a9+pcmTJ8vtdleatC5fvlwDBgzQ\nqaeeqt/+9rfKzs6ueG3KlCnq0qWL2rdvr7S0NG3fvr1J/0wAACBEud3ytm6t/JUrlb96tUqmT691\n4stKb+Mx+T3O3XffrczMTLVr165SreHee+9VdHS0vv32W1122WX69NNPK17ftGmTZs+erSeffFLf\nfvutevTooRtvvLHi2p49e2rDhg3KzMzUgAEDNH369Cb/c9VXyPSe0CDkZzbyMxfZmS2Q+dl3767y\n6+WdOqk4PV3lp5xS63sw6fUfag91kJGRoWeffVZOp1MXXXSROnToUPHaq6++qokTJ6p3796SpBkz\nZuj000+Xx+OR0+nU9ddfX3HuhAkT9MQTTzT18AEAQBOzZWXJtWyZXMuWyZ6drbwPP5S3Vat6vw/1\nBv8Lucnv0Plb/PI+q6b29sv7SNKBAwfU6rh/sImJiRX//48//qiNGzfqtddeq/haZGSksrOz1aZN\nG82bN0///ve/dfDgQZWXl8vr9crr9Tb6A3OBRG/NbORnNvIzF9mZzV/5Od94Q1HPPiv7N9/Ic9FF\nOvqnP6l04EApIqJe78OkN3BCbvLrz0mrv7Rq1Uq5ubnq2LGjJCk3N7fitXbt2unmm2/WDTfc4HPd\n4sWL9fbbb+utt95ScnKyvvzyS51//vmVJr8ul0tlZWVN8wcBAACB5XKp+IYb5Bk8uNYHUVSFSW/g\n0fmtxvEfaEtLS9Nzzz0nt9ut5cuXa/dx3Z2JEyfqhRde0NatW+X1epWbm6s33nhDklRYWKjo6GjF\nxcUpPz9fDz/8sM/3Of300/X111/rwIEDAf8z1RW9NbORn9nIz1xkZ7Z65VdUJPtXX1X5kmfkSHnS\n0uo98aXT23SY/P6irKxM7du3V0pKin788UdNmjRJKSkpWrhwoe644w6VlJSoY8eOev3119WvX7+K\n6/r27av77rtPM2fOVIcOHTRkyBBt3bpVkvTb3/5W7dq1U7du3XTBBReob9++PnWHXr16acKECTrr\nrLOUkpKiw4cPN+mfGwAA1IHbLee77yrmD39QXLduivrHP/zytkx6m55t586dAdlods+ePTrzzDN9\nvr537161rcP+dag7/k4BAAgQj0cxt9wi53/+o/KOHeW+9FK5R4+WNympUW97Yr1hXGoSE94G2rx5\ns9q3b1/n80Ou8wsAABAynE6VnnXWz1uS1WOCVR06vcFH7QE+6K2ZjfzMRn7mIjuzfbFwoWxZWVW+\n5r7iikZPfKk3hA5WfgEAgCXZsrIUuWSJXP/6l/rn5qrs8cfladfOr9+Dld7Qw+QXPtir0mzkZzby\nMxfZmSdmzhw5331XhU89Jc8ll0h2//1CnElv6GLyCwAALKnwuecU9cgjP29L5qeJL5Pe0Nfknd9j\nTziDfwTi75PemtnIz2zkZy6yM1BkpIpvu02eUaManR+dXnM0+cpvXFycDh48qISEhKb+1mHp4MGD\niouLC/YwAACwJFZ6zdPk+/xK0oEDB1RSUhKIb2s5kZGR/CABAICfuRYtUlnXrirr2bPK19Line truncated
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAr8AAAFyCAYAAAD8h7IZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4VOXdxvF7ZpLJBgSBALKkiIRNQbCAFbG4VDYBEVGB\nKtiKG2BdsCou1VZp1Vctlkqr4C7IooJEQYkW2bRqEQGhLAqYsJiELTuZmWTeP5CUZLJntmfO93Nd\nXldPMkl+cHvqw8M9z7Ht2LHDKwAAAMAC7KEeAAAAAAgWFr8AAACwDBa/AAAAsAwWvwAAALAMFr8A\nAACwDBa/AAAAsIxqF79Hjx7VVVddpSuuuEIjR47U8uXLJUnLly/X4MGDNXjwYK1atSoogwIAAAAN\nZavunF+PxyO32624uDgdPXpUw4YN05o1azRkyBAtXrxYxcXFmjBhgtLS0oI5MwAAAFAv1e78RkVF\nKS4uTpKUl5cnp9OpTZs2KSUlRc2aNdPpp5+u1q1ba/v27UEZFgAAAGiIqJpeUFBQoLFjxyo9PV1P\nP/20Dh06pKSkJC1YsECJiYlKSkpSVlaWunbtGox5AQAAgHqr8Q1vCQkJSk1N1bvvvqunnnpKxcXF\nkqSxY8dq6NChkiSbzRbYKQEAAAA/qHHn96QzzzxTbdq0Udu2bbVixYqyj2dnZyspKcnn9Rs3blSL\nFi38MyUAAABQiby8PHXv3r3Wr6928ZuZmSmn06nTTjtN2dnZ2rNnj8444wzt2rVLR44cUXFxsTIz\nMyutPLRo0ULnnntu3X8FCLnU1FSNGDEi1GOgnsjPbORnLrIzG/mZ6+uvv67T66td/B48eFAPP/xw\n2fX999+v5s2ba9q0aRo3bpwk6YEHHqjHmAhn6enpoR4BDUB+ZiM/c5Gd2cjPOqpd/Pbq1Uupqak+\nHx82bJiGDRsWsKEAAACAQOAJb/Dxq1/9KtQjoAHIz2zkZy6yMxv5WQeLX/jo0qVLqEdAA5Cf2cjP\nXGRnNvKzjlqf9uAvXq9XWVlZKikpCfaPjkgOh0MtW7b063Fz69at04ABA/z2/RBc5Gc28jMX2ZmN\n/Kwj6IvfrKwsNW7cWPHx8cH+0RGpsLBQWVlZatWqVahHAQAACHu2HTt2eAPxjTMyMio96uzAgQNq\n06ZNIH6kZfF7CgAArOrrr79W+/bta/16Or8AAACwDBa/8LFu3bpQj4AGID+zkZ+5yM5s5BdYWfku\n/TerINRjSGLx62Pu3LlKSUlRcnKy1qxZU/bxadOm6emnny732nvvvVfJyclq0aKFVq9eHexRAQAA\nwlpWvkuz1mfotiXbw2bxS+f3FG63Wx06dFBaWlqdnhHdq1cv/e1vf9Mvf/lLn8+NGDFC11xzja6/\n/np/jlpOOP+eAgAA68nKd2nhpkx9uvuohnZprjE9WqppXHRAflZdO79BP+0hnGVmZur48eN+PevP\nn0eQAQAAhLOKi96XxnQL2KK3vqg9/OT888/X+eefL0k644wzymoPK1euVHJyslq1aqUZM2bU+vs9\n++yzSk5O1ueff6777rtPycnJuvTSS8s+f/ToUd1yyy3q2rWrevfurddff73c10+ZMkXTp0/XhAkT\nlJycrHPOOUf5+fn++cXWgN6T2cjPbORnLrIzG/k1zKn1hrhou14a002T+rUNu4WvxM5vmc8//1wZ\nGRnq1auX9u7dK7v9f38uSE9P15QpU+q0i3v33Xfr7rvv1siRI3XNNdfouuuuK/f5W2+9VS1bttSm\nTZt08OBBXX755erZs6d69epV9ppFixbpH//4h1577TVt3bpVUVHEBQAAwocJO70VsZo6hddbff25\nps/X9ut+/PFHffLJJ/r+++8VExOjDh06aMSIEfrggw/KLX4vvPBCDRo0SJJ09tln1+tn1wdPuDEb\n+ZmN/MxFdmYjv7oxcdF7UtjVHmKfeEKnNWvm80/sE0/U+vVVvTZUKu4Y79+/X9KJN8qdccYZOuOM\nMzR//nxlZ2eXe92ZZ54ZtBkBAABqYlK9oSpht/N7/P77dfz++wP2+oaoqvbgdDpVUlJS6edOrU+c\n1LZtW8XGxmr37t3VVikq+9pg4PnmZiM/s5GfucjObORXPb/u9Hq9cr7+ulzjxklOp38HrYWw2/kN\nZ1XVHjp16qTPPvus0s+1bNlS27ZtK/ex1q1bq3///nr00UdVUFAgt9utL774Qlu3bvX7zAAAAPUV\niJ3e2McfV8y8eZLH48dJa4/FbwUVd2JHjx6t5ORkvf3225o1a5aSk5M1derUcq958MEHlZqaqvbt\n2+sPf/hDuc9NmTJFn376qc466yxdccUVZR9/4YUXdOjQIfXt21edO3fWY4895rN7HKpj0viTr9nI\nz2zkZy6yMxv5lReoekPM3LlypqYq/623pPh4P01bNzzkIgLwewoAAPwhkA+niH7/fcXfd5/yPvhA\n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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x2a57d10>"
|
||||
"<matplotlib.figure.Figure at 0x7f1e87783be0>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 14
|
||||
"prompt_number": 37
|
||||
},
|
||||
{
|
||||
"cell_type": "heading",
|
||||
@@ -664,6 +837,21 @@
|
||||
"\n",
|
||||
"We start by assuming some function $\\mathbf f$"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "heading",
|
||||
"level": 2,
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"References"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"[1] http://sympy.org\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {}
|
||||
|
||||
Reference in new issue
Block a user