Skip to content

Instantly share code, notes, and snippets.

@alanlujan91
Created July 13, 2020 21:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alanlujan91/21975ca59f866eed10b759e0d5cab79e to your computer and use it in GitHub Desktop.
Save alanlujan91/21975ca59f866eed10b759e0d5cab79e to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from numba import njit"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To begin our exposition of complete cubic splines, we assume that we have data for $\\{x_i, y_i\\}_{i = 0}^n$ where $y_i = f(x_i)$ and $f$ is the function we are trying to approximate. A cublic spline is defined as:\n",
"\n",
"\\begin{equation}\n",
" S_n(x) = \\begin{cases}\n",
" p_1(x) & = \\ a_1 x^3 + b_1 x^2 + c_1 x + d_1, \\ x \\in [x_0, x_1] \\\\\n",
" p_2(x) & = \\ a_2 x^3 + b_2 x^2 + c_2 x + d_2, \\ x \\in [x_1, x_2] \\\\\n",
" & \\ \\vdots \\\\\n",
" p_n(x) & = \\ a_n x^3 + b_n x^2 + c_n x + d_n, \\ x \\in [x_{n-1}, x_n] \\\\\n",
" \\end{cases}\n",
"\\end{equation}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"The cublic spline $S_n(x)$ must also meet certain conditions:\n",
"- piecewise cubic polynomial, as seen above\n",
"- is in $C^2$, so it is continuous and has a continuous 1st and 2nd derivatives in the interval $[x_0, x_1]$\n",
"- it interpolates the data such that $S_n(x_i) = y_i$\n",
"\n",
"To meet the criteria above, we impose some conditions on the piecewise polynomials.\n",
"- interpolating conditions: $p_{i}(x_{i-1}) = y_{i-1}$ and $p_i(x_i) = y_i$ for all $i = 1, \\dots, n$\n",
"- 1st order smoothing conditions: $p_i'(x_i) = p_{i+1}'(x_i)$ for all $i = 1, \\dots, n-1$\n",
"- 2nd order smoothing conditions: $p_i''(x_i) = p_{i+1}''(x_i)$ for all $i = 1, \\dots, n-1$\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Clearly, the number of conditions is $2n + 2(n-1) = 4n-2$ and the number of unknowns is $4n$, so to fully identify these parameters, we need two additional conditions. Usually, \"natural\" or \"not-a-knot\" conditions are imposed, but in this notebook I will present a cubic interpolant that meets the above requirements and reduces the number of unknowns to just $n+1$, the so called **complete cubic spline**. \n",
"\n",
"We begin by defining $z_i = S_n''(x_i)$ for all $i = 0, \\dots, n$, which are the 2nd derivatives of the spline at every point $x_i$. By the 2nd order smoothing conditions, we know that for each interior knot $z_i$ must satisfy the following condition. \n",
"\n",
"\\begin{equation}\n",
" p_i''(x_i) = z_i = p_{i+1}''(x_i) \\text{ for all } i = 1, \\dots, n-1\n",
"\\end{equation}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$S_n(x)$ is defined as $p_{i+1}(x)$ on $x\\in[x_i, x_{i+1}]$, so $p_{i+1}''(x)$ must be the linear function joining the points $(x_i, z_i)$ and $(x_{i+1}, z_{i+1})$. Thus, we can define $p_{i+1}(x)$ as\n",
"\n",
"\\begin{equation}\n",
" p_{i+1}''(x) = \\frac{z_i}{h_{i+1}} (x_{i+1}-x) + \\frac{z_{i+1}}{h_{i+1}} (x-x_i)\n",
"\\end{equation}\n",
"\n",
"where $h_{i+1} = x_{i+1}-x_i$. If we integrate this expression twice, we obtain \n",
"\n",
"\\begin{equation}\n",
" p_{i+1}(x) = \\frac{z_i}{6h_{i+1}} (x_{i+1}-x)^3 + \\frac{z_{i+1}}{6h_{i+1}} (x-x_i)^3 + C(x_{i+1}-x) + D(x-x_i)\n",
"\\end{equation}\n",
"\n",
"where $C$ and $D$ are constants of integration."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Taking the interpolating conditions $p_{i+1}(x_{i}) = y_{i}$ and $p_{i+1}(x_{i+1}) = y_{i+1}$ result in \n",
"\n",
"\\begin{equation}\n",
" p_{i+1}(x_i) = \\frac{z_i}{6h_{i+1}} (x_{i+1}-x_i)^3 + C(x_{i+1}-x_i) = y_i \\quad \\Rightarrow \\quad C = \\left( \\frac{y_i}{h_{i+1}} - \\frac{z_i h_{i+1}}{6} \\right)\n",
"\\end{equation}\n",
"\n",
"and \n",
"\n",
"\\begin{equation}\n",
" p_{i+1}(x_{i+1}) = \\frac{z_{i+1}}{6h_{i+1}} (x_{i+1}-x_i)^3 + D(x_{i+1}-x_i) = y_{i+1} \\quad \\Rightarrow \\quad D = \\left( \\frac{y_{i+1}}{h_{i+1}} - \\frac{z_{i+1} h_{i+1}}{6} \\right)\n",
"\\end{equation}\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So then, \n",
"\n",
"\\begin{equation}\n",
" p_{i+1}(x) = \\frac{z_i}{6h_{i+1}} (x_{i+1}-x)^3 + \\frac{z_{i+1}}{6h_{i+1}} (x-x_i)^3 + \\left( \\frac{y_i}{h_{i+1}} - \\frac{z_i h_{i+1}}{6} \\right)(x_{i+1}-x) + \\left( \\frac{y_{i+1}}{h_{i+1}} - \\frac{z_{i+1} h_{i+1}}{6} \\right) (x-x_i)\n",
"\\end{equation}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We now have used the interpolating conditions and the 2nd order conditions to construct the polynomial, but we still need to assure it meets the 1st order requirements $p_i'(x_i) = p_{i+1}'(x_i)$. The first derivative of the polynomial is\n",
"\n",
"\\begin{equation}\n",
" p_{i+1}'(x) = - \\frac{z_i}{2h_{i+1}} (x_{i+1}-x)^2 + \\frac{z_{i+1}}{2h_{i+1}} (x-x_i)^2 - \\left( \\frac{y_i}{h_{i+1}} - \\frac{z_i h_{i+1}}{6} \\right) + \\left( \\frac{y_{i+1}}{h_{i+1}} - \\frac{z_{i+1} h_{i+1}}{6} \\right) \n",
"\\end{equation}\n",
"\n",
"which by the 2nd order condition implies\n",
"\n",
"\\begin{equation}\n",
" p_{i+1}'(x_i) = - \\left( \\frac{h_{i+1}}{3} \\right) z_i - \\left( \\frac{h_{i+1}}{6} \\right) z_{i+1} + m_{i+1}\n",
"\\end{equation}\n",
"\n",
"and equivalently\n",
"\n",
"\\begin{equation}\n",
" p_{i}'(x_i) = - \\left( \\frac{h_{i}}{3} \\right) z_{i-1} - \\left( \\frac{h_{i}}{6} \\right) z_{i} + m_{i}\n",
"\\end{equation}\n",
"\n",
"where $m_{i+1} = \\frac{y_{i+1}-y_i}{h_{i+1}} = \\frac{y_{i+1}-y_i}{x_{i+1} - x_i}$, a familiar linear slope equation."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Setting these 2 equations equal and rearanging results in\n",
"\n",
"\\begin{equation}\n",
" h_i z_{i-1} + 2(h_i + h_{i+1})z_i + h_{i+1} z_{i+1} = 6m_{i+1} + 6m_i\n",
"\\end{equation}\n",
"\n",
"As stated previously, the equation above only applies to interior knots and defines $z_1, \\dots, z_{n-1}$, so we have $n-1$ equations for $n+1$ unknowns. To pin down $z_0$ and $z_n$ we need the endpoint derivative conditions $p_1'(x_0) = f'(x_0) = f_0'$ and $p_n'(x_n)=f'(x_n) = f_n'$. This results in the final equations:\n",
"\n",
"\\begin{equation}\n",
" 2 h_1 z_0 + h_1z_1 = 6 m_1 + 6f_0' \\text{ and } h_n z_{n-1} + 2 h_n z_n = 6 f_n' - 6 m_n.\n",
"\\end{equation}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally we can establish a system of equations $\\bm{Az}=\\bm{d}$ where $\\bm{z} = [z_0, z_1, \\dots, z_n]'$ and $\\bm{d} = [d_0, d_1, \\dots, d_n]'$. Define $\\bm{d}$ as \n",
"\n",
"\\begin{equation}\n",
" d_i = \\begin{cases}\n",
" 6 m_1 - 6f_0' & i = 0 \\\\\n",
" 6m_{i+1} + 6m_i & i = 1, \\dots, n-1 \\\\\n",
" 6 f_n' - 6 m_n & i = n\n",
" \\end{cases}\n",
"\\end{equation} \n",
"\n",
"and $\\bm{A}$ as the tri-diagonal matrix\n",
"\n",
"\\begin{equation} \n",
" \\bm{A} = \\begin{bmatrix}\n",
" 2h_1 & h_1 \\\\\n",
" h_1 & 2(h_1 + h_2) & h_2 \\\\\n",
" & h_2 & 2(h_2 + h_3) & h_3 \\\\\n",
" & \\ddots & \\ddots & \\ddots \\\\\n",
" & & h_{n-1} & 2(h_{n-1} + h_n) & h_{n-1} \\\\\n",
" & & & h_n & 2h_n\n",
" \\end{bmatrix}\n",
"\\end{equation}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can now solve this system with any standard solver, but the code below presents an algorithm by (Moler, 2004) for quick and efficient calculation.\n",
"\n",
"Finally, we turn back to the endpoint derivative conditions. Evidently, if we don't know the function we are trying to approximate we will often not know the derivative at the endpoints either. One approach is to set these to 0, but better approximations of the endpoint derivatives can be used. A simple approximation is to use the slope of the line joining the points $(x_0, y_0)$ and $(x_1, y_1)$ as $f_0'$ such that the derivative of the spline at the knot $x_0$ in essence \"points to\" the value of the function $y_1$ at knot $x_1$, _i.e._ $f_0' = m_1$ and by symmetry $f_n'=m_n$. Note that this results in $d_0 = 0$ and $d_n=0$."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"@njit\n",
"def splrep(x, y):\n",
"\n",
" size = x.size\n",
"\n",
" xdiff = np.diff(x)\n",
" ydiff = np.diff(y)\n",
" slope = ydiff / xdiff\n",
"\n",
" d = np.empty(size)\n",
" d[0] = 0\n",
" d[1:-1] = 6 * slope[1:] - 6 * slope[:-1]\n",
" d[-1] = 0\n",
"\n",
" Ad = np.empty(size)\n",
" Ad[1: -1] = 2 * (xdiff[: -1] + xdiff[1:])\n",
"\n",
" A = np.diag(Ad) + np.diag(xdiff, -1) + np.diag(xdiff, 1)\n",
" A[0, :3] = [1, -2, 1]\n",
" A[-1, -3:] = [1, -2, 1]\n",
"\n",
" return np.linalg.solve(A, d)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# interpolate and extrapolate vectors\n",
"# extrapolation using end polynomials\n",
"@njit\n",
"def splevec(x0, x, y, z):\n",
" \"\"\"\n",
" x0: internal point to be evaluated, can be vector\n",
" x: vector of basis points where function is defined\n",
" y: vector of functional values for each point in x\n",
" z: spline coefficients calculated by splrep\n",
" \"\"\"\n",
" # convert to array if not array\n",
" x0 = np.asarray(x0)\n",
"\n",
" # find index\n",
" index = np.searchsorted(x, x0)\n",
" nx = x.size\n",
" \n",
" index[index == 0] = 1\n",
" index[index == nx] = nx-1 \n",
"\n",
" xi1, xi0 = x[index], x[index - 1]\n",
" yi1, yi0 = y[index], y[index - 1]\n",
" zi1, zi0 = z[index], z[index - 1]\n",
" hi1 = xi1 - xi0\n",
"\n",
" # calculate cubic\n",
" f0 = (zi0 / (6 * hi1) * (xi1 - x0) ** 3\n",
" + zi1 / (6 * hi1) * (x0 - xi0) ** 3\n",
" + (yi1 / hi1 - zi1 * hi1 / 6) * (x0 - xi0)\n",
" + (yi0 / hi1 - zi0 * hi1 / 6) * (xi1 - x0))\n",
"\n",
" return f0 "
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# interpolate and extrapolate scalars\n",
"# extrapolation using end polynomials\n",
"@njit\n",
"def spleval(x0, x, y, z):\n",
"\n",
" index = np.searchsorted(x, x0)\n",
" nx = x.size\n",
" \n",
" index = 1 if index == 0 else index\n",
" index = nx-1 if index == nx else index\n",
"\n",
" xi1, xi0 = x[index], x[index - 1]\n",
" yi1, yi0 = y[index], y[index - 1]\n",
" zi1, zi0 = z[index], z[index - 1]\n",
" hi1 = xi1 - xi0\n",
"\n",
" # calculate cubic\n",
" f0 = (zi0 / (6 * hi1) * (xi1 - x0) ** 3\n",
" + zi1 / (6 * hi1) * (x0 - xi0) ** 3\n",
" + (yi1 / hi1 - zi1 * hi1 / 6) * (x0 - xi0)\n",
" + (yi0 / hi1 - zi0 * hi1 / 6) * (xi1 - x0))\n",
"\n",
" return f0"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"@njit\n",
"def spldervec(x0, x, y, z):\n",
" # find index\n",
" index = np.searchsorted(x, x0)\n",
" nx = x.size\n",
" \n",
" index[index == 0] = 1\n",
" index[index == nx] = nx-1 \n",
"\n",
" xi1, xi0 = x[index], x[index - 1]\n",
" yi1, yi0 = y[index], y[index - 1]\n",
" zi1, zi0 = z[index], z[index - 1]\n",
" hi1 = xi1 - xi0\n",
"\n",
" # calculate cubic\n",
" df0 = (- zi0 / (2 * hi1) * (xi1 - x0) ** 2\n",
" + zi1 / (2 * hi1) * (x0 - xi0) ** 2\n",
" + (yi1 / hi1 - zi1 * hi1 / 6)\n",
" - (yi0 / hi1 - zi0 * hi1 / 6))\n",
"\n",
" return df0"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"@njit\n",
"def splder(x0, x, y, z):\n",
" # find index\n",
" index = np.searchsorted(x, x0)\n",
" nx = x.size\n",
" \n",
" index[index == 0] = 1\n",
" index[index == nx] = nx-1 \n",
"\n",
" xi1, xi0 = x[index], x[index - 1]\n",
" yi1, yi0 = y[index], y[index - 1]\n",
" zi1, zi0 = z[index], z[index - 1]\n",
" hi1 = xi1 - xi0\n",
"\n",
" # calculate cubic\n",
" df0 = (- zi0 / (2 * hi1) * (xi1 - x0) ** 2\n",
" + zi1 / (2 * hi1) * (x0 - xi0) ** 2\n",
" + (yi1 / hi1 - zi1 * hi1 / 6)\n",
" - (yi0 / hi1 - zi0 * hi1 / 6))\n",
"\n",
" return df0"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"@njit\n",
"def splkd(x, y, z):\n",
" size = x.size\n",
"\n",
" xdiff = np.diff(x)\n",
" ydiff = np.diff(y)\n",
" slope = ydiff / xdiff\n",
"\n",
" df = np.empty(size)\n",
"\n",
" df[:-1] = -xdiff / 3 * z[:-1] - xdiff / 6 * z[1:] + slope\n",
"\n",
" df[-1] = xdiff[-1] / 3 * z[-1] + xdiff[-1] / 6 * z[-2] + slope[-1]\n",
"\n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def f1(x):\n",
" return x ** 2 * np.sin(np.pi * x)\n",
"\n",
"\n",
"def df1(x):\n",
" return x * (2 * np.sin(np.pi * x) + np.pi * x * np.cos(np.pi * x))\n",
"\n",
"\n",
"def d2f1(x):\n",
" return (2 - (np.pi * x) ** 2) * np.sin(np.pi * x) + 4 * np.pi * x * np.cos(np.pi * x)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x1e144598408>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"f = f1\n",
"\n",
"x_sparse = np.linspace(0, 1, 11)\n",
"x_dense = np.linspace(0, 1, 201)\n",
"x_big = np.linspace(-0.1, 1.1, 251)\n",
"\n",
"y_data = f(x_sparse)\n",
"y_true = f(x_big)\n",
"\n",
"z = splrep(x_sparse, y_data)\n",
"\n",
"y_interp = splevec(x_dense, x_sparse, y_data, z)\n",
"y_extrap = splevec(x_big, x_sparse, y_data, z)\n",
"\n",
"plt.scatter(x_sparse, y_data, label=\"data\")\n",
"plt.plot(x_big, y_true, label=\"true\")\n",
"plt.plot(x_dense, y_interp, label=\"interp\")\n",
"plt.plot(x_big, y_extrap, label=\"extrap\")\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x1e145e1f148>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df = df1\n",
"\n",
"dy_true = df(x_big)\n",
"\n",
"dy_knots = splkd(x_sparse, y_data, z)\n",
"dy_interp = splder(x_dense, x_sparse, y_data, z)\n",
"dy_extrap = splder(x_big, x_sparse,y_data,z)\n",
"\n",
"plt.plot(x_big, dy_true, label='true')\n",
"plt.plot(x_dense, dy_interp, label='interp')\n",
"plt.plot(x_big, dy_extrap, label='extrap')\n",
"plt.scatter(x_sparse, dy_knots, label='knots')\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x1e1459da348>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"d2f = d2f1\n",
"\n",
"d2y_true = d2f(x_big)\n",
"\n",
"d2y_interp = np.interp(x_dense, x_sparse, z)\n",
"d2y_extrap = np.interp(x_big, x_sparse, z)\n",
"\n",
"plt.plot(x_big, d2y_true, label=\"true\")\n",
"plt.plot(x_dense, d2y_interp, label=\"interp\")\n",
"plt.plot(x_big, d2y_extrap, label=\"extrap\")\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"def f2(x):\n",
" return np.sin(2 * np.pi * x)\n",
"\n",
"\n",
"def df2(x):\n",
" return 2 * np.pi * np.cos(2 * np.pi * x)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x1e145daa0c8>"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"f = f2\n",
"\n",
"x_sparse = np.linspace(-1, 1, 11)\n",
"x_dense = np.linspace(-1, 1, 201)\n",
"x_big = np.linspace(-1.1, 1.1, 251)\n",
"\n",
"y_data = f(x_sparse)\n",
"y_true = f(x_big)\n",
"\n",
"z = splrep(x_sparse, y_data)\n",
"\n",
"y_interp = splevec(x_dense, x_sparse, y_data, z)\n",
"y_extrap = splevec(x_big, x_sparse, y_data, z)\n",
"\n",
"plt.scatter(x_sparse, y_data, label=\"data\")\n",
"plt.plot(x_big, y_true, label=\"true\")\n",
"plt.plot(x_dense, y_interp, label=\"interp\")\n",
"plt.plot(x_big, y_extrap, label=\"extrap\")\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x1e14464a0c8>"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df = df2\n",
"\n",
"dy_true = df(x_big)\n",
"\n",
"dy_knots = splkd(x_sparse, y_data, z)\n",
"dy_interp = splder(x_dense, x_sparse, y_data, z)\n",
"dy_extrap = splder(x_big, x_sparse,y_data,z)\n",
"\n",
"plt.plot(x_big, dy_true, label='true')\n",
"plt.plot(x_dense, dy_interp, label='interp')\n",
"plt.plot(x_big, dy_extrap, label='extrap')\n",
"plt.scatter(x_sparse, dy_knots, label='knots')\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment