{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"nbsphinx": "hidden"
},
"source": [
"# The Laplace Transform\n",
"\n",
"*This Jupyter notebook is part of a [collection of notebooks](../index.ipynb) in the bachelors module Signals and Systems, Communications Engineering, Universität Rostock. Please direct questions and suggestions to [Sascha.Spors@uni-rostock.de](mailto:Sascha.Spors@uni-rostock.de).*"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Inverse Transform\n",
"\n",
"So far only the [(forward) Laplace transform](definition.ipynb) has been introduced. The Laplace transform features also an [inverse transform](https://en.wikipedia.org/wiki/Inverse_Laplace_transform). The inverse Laplace transform maps a complex-valued Laplace transform $X(s) \\in \\mathbb{C}$ with complex-valued independent variable $s \\in \\mathbb{C}$ into the complex-valued signal $x(t) \\in \\mathbb{C}$ with real-valued independent variable $t \\in \\mathbb{R}$. It can be shown that the inverse Laplace transform $x(t) = \\mathcal{L}^{-1} \\{ X(s) \\}$ is uniquely determined for most practically relevant signals. This section discusses two different techniques for the computation of the inverse Laplace transform."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Integral Formula\n",
"\n",
"Using results from complex analysis, the inverse Laplace transform is given by the following complex line integral\n",
"\n",
"\\begin{equation}\n",
"x(t) = \\frac{1}{2 \\pi j} \\int_{\\sigma - j \\infty}^{\\sigma + j \\infty} X(s) \\, e^{s t} \\; ds\n",
"\\end{equation}\n",
"\n",
"where $X(s) = \\mathcal{L} \\{ x(t) \\}$ is assumed to be analytic in its simply connected region of convergence (ROC). The notation $\\sigma \\mp j \\infty$ for the lower/upper integration limit denotes an arbitrary integration path which lies in the ROC and ranges from $\\Im \\{s\\} = - \\infty$ to $\\Im \\{s\\} = + \\infty$. The integration path can be chosen parallel to the imaginary axis but also all other paths in the ROC are possible. This results from [Cauchy's integral theorem](https://en.wikipedia.org/wiki/Cauchy's_integral_theorem). Two equivalent paths are shown in the following illustration\n",
"\n",
"![Possible integration paths for the inverse Laplace transform](integration_paths.png)\n",
"\n",
"where the blue line indicates the integration path and the gray area the ROC."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Rational Laplace Transforms\n",
"\n",
"Computing the inverse Laplace transform by above integral formula can be challenging. The [Cauchy residue theorem](https://en.wikipedia.org/wiki/Residue_theorem) provides a practically tractable solution for Laplace transforms $X(s) = \\mathcal{L} \\{ x(t) \\}$ which are given as rational functions. It states that the value of a line integral of an holomorphic function over a closed contour is given by summing up its [residues](https://en.wikipedia.org/wiki/Residue_theorem). The residue is the value of the line integral for a path enclosing a singularity. Consequently, the inverse Laplace transform of a rational Laplace transform can be computed by summing up the individual contributions from its poles. This procedure is detailed in the following."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Basic Procedure\n",
"\n",
"A rational Laplace transform $X(s)$ can be written in terms of its numerator and denominator polynomial\n",
"\n",
"\\begin{equation}\n",
"X(s) = \\frac{\\sum_{m=0}^{M} \\beta_m s^m}{\\sum_{n=0}^{N} \\alpha_n s^n}\n",
"\\end{equation}\n",
"\n",
"where $M$, $N$ denote the order of the numerator and denominator polynomial and $\\beta_m$, $\\alpha_n$ their coefficients, respectively. It is assumed that $\\alpha_N \\neq 0$ and that $M \\leq N$. If $M > N$, $X(s)$ can be decomposed by [polynomial division](https://en.wikipedia.org/wiki/Polynomial_long_division) into a sum of powers of $s$ and a rational function fulfilling $M \\leq N$. \n",
"\n",
"Now a [partial fraction decomposition](https://en.wikipedia.org/wiki/Partial_fraction_decomposition) of $X(s)$ is performed resulting in\n",
"\n",
"\\begin{equation}\n",
"X(s) = A_0 + \\sum_{\\mu = 1}^{L} \\sum_{\\nu = 1}^{R_\\mu} \\frac{A_{\\mu \\nu}}{(s - s_{\\infty \\mu})^\\nu}\n",
"\\end{equation}\n",
"\n",
"where $s_{\\infty \\mu}$ denotes the $\\mu$-th unique pole of $X(s)$, $R_\\mu$ its degree and $L$ the total number of different poles $\\mu = 1 \\dots L$. Using the known Laplace transforms (cf. [example for the modulation theorem](theorems.ipynb#Modulation-Theorem) or [table of selected transforms](table_theorems_transforms.ipynb#Selected-Transforms))\n",
"\n",
"\\begin{equation}\n",
"\\mathcal{L} \\{ t^n e^{-s_0 t} \\epsilon(t) \\} = \\frac{n!}{(s + s_0)^{n+1}} \\qquad \\text{for } \\Re \\{ s \\} > \\Re \\{ - s_0 \\}\n",
"\\end{equation}\n",
"\n",
"and $\\mathcal{L} \\{ \\delta(t) \\} = 1$, together with the linearity of the Laplace transform yields a generic result for the inverse Laplace transform $x(t) = \\mathcal{L}^{-1} \\{ X(s) \\}$ of a right-sided signal\n",
"\n",
"\\begin{equation}\n",
"x(t) = A_0 \\cdot \\delta(t) + \\epsilon(t) \\sum_{\\mu = 1}^{L} e^{s_{\\infty \\mu} t} \\sum_{\\nu = 1}^{R_\\mu} \\frac{A_{\\mu \\nu} \\, t^{\\mu - 1}}{(\\nu -1)!}\n",
"\\end{equation}\n",
"\n",
"It remains to compute the coefficients $A_0$ and $A_{\\mu \\nu}$ of the partial fraction decomposition. The constant coefficient $A_0$ is given as\n",
"\n",
"\\begin{equation}\n",
"A_0 = \\lim_{s \\to \\infty} X(s)\n",
"\\end{equation}\n",
"\n",
"For a pole $s_{\\infty \\mu}$ with degree $R_\\mu = 1$, the coefficient $A_{\\mu 1}$ reads\n",
"\n",
"\\begin{equation}\n",
"A_{\\mu 1} = \\lim_{s \\to s_{\\infty \\mu}} \\left( X(s) \\cdot (s - s_{\\infty \\mu}) \\right)\n",
"\\end{equation}\n",
"\n",
"For a pole $s_{\\infty \\mu}$ of degree $R_\\mu > 1$, the coefficients $A_{\\mu \\nu}$ are given as\n",
"\n",
"\\begin{equation}\n",
"A_{\\mu \\nu} = \\frac{1}{(R_\\mu - \\nu)!} \\lim_{s \\to s_{\\infty \\mu}} \\frac{d^{R_\\mu - \\nu}}{d s^{R_\\mu - \\nu}} \\left( X(s) \\cdot (s - s_{\\infty \\mu})^{R_\\mu} \\right)\n",
"\\end{equation}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Example - Inverse transform of a rational Laplace transform\n",
"\n",
"The inverse transform $x(t) = \\mathcal{L}^{-1} \\{ X(s) \\}$ of \n",
"\n",
"\\begin{equation}\n",
"X(s) = \\frac{1}{(s+1) (s+2)^2} \\qquad \\text{for } \\Re \\{s \\} > -1\n",
"\\end{equation}\n",
"\n",
"is computed using the procedure outline above. First the function $X(s)$ is defined in `SymPy`"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAIkAAAAzBAMAAABRWzbpAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMt0Qq5nNdrvvIlSJZkTVYgFVAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACl0lEQVRIDe1WO4gTURQ9+Uw2M0lmVxtBhB1Ht1CbKUQsUwi2wc/aKAQsLEQIWKRQIWELUVgMWtlIEAURZIMgNhZBBRth0yhiFQR/xUJ0GxFhvPe+mdk3YUKWzRYiuZDLuefcnHnvzjxmgHGR2jeuYxP64cX1TXSNbZmZuiTOaDqXxLHgv5tL9sbP48lbnbLTCWx1Av42xGCrF/8X/5d5e8ybfF0GDGdyl9m+9WNyl5K3HS5AMdhRe8SSQt4aoSt+p5ruTGdE19eAvzJCt2skWEtKfZHUxF8tgX2hm9DwcLEJsP0D7GY5U6U0HOqr5bzQR4ZFqq0yVvvIebCaO06ybvS0Ljss5C30TpRzmo41VWQ9mC2UKjB9f8CUqTcVeKsc4mJ6DFucwniugLmO7G/gTkjjS4QIxF1yPaLsqt4QuGQdZOlpuxRJZxm9uSqXHXIplkkyupSK9VeUKQIXQukB8Fo4TuyXn7MrQsTXUqoSKQtq4rPomst8DXivSMqH6LeCfE+IuEvBITLdoVsywLLomssCEU8VSfke/VaW25QN1z1w23XLBNV0UwNCZp9cfn1k8oTr3nXd/QxhVCjNC+TELkX/j6rja7FbxLILVv0uZYpoLvIUfFck5YuM7FueEHEX2VGuw8q34Ks3dCl08Vjf0XU5lrNJLqUG/T9fA14CQy57gMvAB76ABN2tXA3PVBFfi0EG4Nt9AYWKagjWYi2cPuUAZxRJ+ROQqtd7qg5d1FdLuk2s7QC76teUHs4lR++fKnAwYOlOzkVQe3aFuy95r6aHLoqynEiiI7URdrAmxahzqM5k0LO20Rs/yDd1QcdWQ6p8Wyd1/Egrjmo4BvOelJlGjNWKJQ1bsV1ogjyvVD/ROB2W2mH1F9Dq1aTb8ANEAAAAAElFTkSuQmCC\n",
"text/latex": [
"$$\\frac{1}{\\left(s + 1\\right) \\left(s + 2\\right)^{2}}$$"
],
"text/plain": [
" 1 \n",
"────────────────\n",
" 2\n",
"(s + 1)⋅(s + 2) "
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sympy as sym\n",
"%matplotlib inline\n",
"sym.init_printing()\n",
"\n",
"s = sym.symbols('s', complex=True)\n",
"t = sym.symbols('t', real=True)\n",
"\n",
"X = 1/((s+1)*(s+2)**2)\n",
"X"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since $X(s)$ has two real-values poles, $x_{\\infty 1} = -1$ with degree $R_1 = 1$ and $x_{\\infty 2} = -2$ with degree $R_2 = 2$, the following partial fraction decomposition is chosen as ansatz in accordance with above given formula"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAARMAAAA0BAMAAABbWcGxAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIs1UmauJMnZmRLsQ3e++988cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEXUlEQVRYCc2YTWgTQRTH3zYhadO0DYIilJqAIIqF9iAiiJhDFAWFHvSk0nqweFAaQdCLmINIRcQoHj2IerCIUEGogtA9ieClIB4EqwUv4qFNK34r68y+2d2ZyczsLKStA9u8/3u/ee9l9rXJFiB2OaVYhABOifywXE7JEpSxtobsUWk7CncmYYVau61asaMwcRJWaGXPoiA1wo7CzUlYvlxm3Xdeamw7CjcnYYVy69u/CFot7Cjcm4QVqpVTPwWtFnYU7k3C8tVyg9lvvFbbdhTuTcIK1dLgfAXI38RLCHECqRcnjvokF1CYEUv5BOtqZc9vgPPX8NJtRKoMB31SR6E/Yilvv/I1gL8E38Uu9U5G/YJi1SfVFHo51udNrBBLE/WeXOZWGHXbphWO9XmhnElMkOBAbCsBBaexaZuMlPUvE8zFnDkipgsxpxJS2XexrQgs5aW1RtKBzE8vubDT22RuJaJ63bhWRJby0qK3wLzMs8L2OkPZQuzYcqzPi3VTnqgVyqqV3nNnXdtWKOvzYrH0MJmGcNEZlNe6gX1Ar2ipqAXPs6AwB2XpJa3jY1XOs4Oz9WYrqaiKU7s+GCloZRG7XFHxNOyuR2pVW7kHF0f+k1bKUBwCGL3M2rE71FZS4Tm0P6kMT0KmlpskroOzs/Ozs29osMdTroZIKRn8zeByaSjeTfO+JFVnoLsK7Ot0K9+vXS76xv1VBuiag2IBPqK2295KCusC5OoA5BnpogtvV62V/OhhlxTfQK7ORdrKp1VrJQ3pGYBXXj+kppdGyA1iDxmtPHq7XNBzx+EetuzG9gI9R3/piziVrdV4KiD81w6Xb4X8MpcwrPqgw0j+0ICLFoCeWguZX/FUQLDXDLlB4Rq95Ia2bIR1r+uZsDvyQDEvJyC6oPBRF/qj49ZggTu8G8ZWGLXggvClA5O0DwbJpNcHVDvPJa9WJmrlGMBwtSnV9iYPaYBOld/jWjijiHOuzPgpVMZWTl52JQo+oIP7mS9xIjBxqvpJT1PnDgRO9esU3MeAqZXOaq4sUdkfTfnSdd7FZg+n6hZAt+c1+HiT7TTgGTpNrRShk5UJqa5yU65uwcNInKpuV4gphfP7BvVzH7CgGNvis4JMVZrT3RVcrBWcqjbhwAQuEmPeCIrw/SpayXjBPz0CqqMcpQisvdRQT1VmKIBMrw//YDQoojoVyE27IrUdHP+g+MxbiNBMVUeJB9U2eaiNb4X8mexxcT9rODsC7cwT5X1NTM1UpWYiTGdthlQZY4ZTaavBNpaAUX2VChkCaX0mWjNV2YbEKuT58SvMG7RyZOFNTQKz4+N1kRrwvCUJAqCtaKYqN9dEGxxBKwaEhEzURrpVPVU2NygqPBGZBstEPSWHopmqjklDzmUInSDfWjVTla4tQz1DykcAuqnqKhj2LUOoq8onFaaqj4+sgC3+BRamav8KlBdKPBYUJ5wVnlryZMFVF8xOV5ArIJy6poj/6U9j/wBPy4xPOXnUhQAAAABJRU5ErkJggg==\n",
"text/latex": [
"$$A_{0} + \\frac{A_{11}}{s + 1} + \\frac{A_{21}}{s + 2} + \\frac{A_{22}}{\\left(s + 2\\right)^{2}}$$"
],
"text/plain": [
" A_{11} A_{21} A_{22} \n",
"A₀ + ────── + ────── + ────────\n",
" s + 1 s + 2 2\n",
" (s + 2) "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A0, A11, A21, A22 = sym.symbols('A_0 A_{11} A_{21} A_{22}', real=True)\n",
"Xp = A0 + A11/(s+1) + A21/(s+2) + A22/(s+2)**2\n",
"Xp"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The four real-valued constants $A_0$, $A_{11}$, $A_{21}$ and $A_{22}$ of the partial fraction decomposition will be determined later. First a look is taken at the inverse Laplace transforms of the individual summands composed from the constant and the individual poles. For the constant we get"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAADsAAAAVBAMAAAAKrYvGAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIs1UmauJMnZmRLsQ3e++988cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABdElEQVQoFW1QPUsDURCc5C7fl3jYaw6shIAp1DYhiGCX3iJnYbAz/yBXiNgZwV+gBGyEExS0ypVCmoggiE3ARqwupgiKEGffy1llYWdndt7t23fA3LClq0DIooBErPYmzXRZxJWAxJouQBLdgHxTaX0IMKaRnVMDLQewnoCSbpuN6Jp0XTpmh5+EwLm29w5bmsAaCykwTYc1IEHMOy1LlegFhAtm3gXinMKDqKhKul7xidtAt3fnIVkX+xJtVyqQcRK/LKvMipIEVFHkseYxULSNCRvPzBrTGBDSt1sNH0kv62MXKbE/mS/MVEh4BBYGKLQwwrfu0LZ+6GSHhCrXHHIu3q0Jb2dnhU6IQA3PdviCEO0Ar5ggXqZ9z7/rGDYyPrBMnRuJ/YEDbFBhH0jUeafpoT8tweh9uRw+RvLEpYtr/qoHDs3bolSo1WY839JkaaZZ+DAnUpmqZjtRg7V5FPyrG8Vi3Gxu9FU3F8w1uRj3As6AP4N5USa6GOfTAAAAAElFTkSuQmCC\n",
"text/latex": [
"$$A_{0} \\delta\\left(t\\right)$$"
],
"text/plain": [
"A₀⋅δ(t)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x0 = sym.inverse_laplace_transform(Xp.args[0], s, t)\n",
"x0"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the first pole $s_{\\infty 1}$ with degree zero we get"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAGIAAAAYBAMAAADzMjWaAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIs1UmauJMnZmRLsQ3e++988cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB6UlEQVQ4EX1SS2sTYRQ9k4l5fnYGd1Ko40YQBOMPkMbiIt11UyiIZCwURBDzDzKglu4MIoi4cKDdViO4KQqG0kVFSlMQu80P6CK+aKuLeu43mQeTMAfOfZxzb+4kEyATlzPdCaYaThAzJdPJtMdN4+GVVqQaUukgxQUJE5CrxeJjKSveSLg+yulk9aiUVuSQ6TIAeo/dme4SofiReI+3Im2pPuM2uWcj12MG8k1b57HwVNkodHFMY56cBcp1PXTvkdydgEYBaPv4RWtAzpFHJAzvWU3yODZeAndRPOVXduh+J6/KVB6zHckjqPtPemENqBOYfznjonLn3xKwItY62m48gs1WMdGWjlH4AeT4meaQU89lso5LC8AXJ6BxipIvcoDqn8XmADhf4x2H0k2y9OF2s4viWl8T1ZPVB1RDTHWx7wFTPrdcim1yF7D6vDmixXsJWB7e9IKNfZ+6vKI6tweJDZdaDI59Yyf/l3dQ+qkqHfbDeENu0w5h+aa8gqoHLOMG8BqYkZ6/RvhUZQc7djgPnOvstdgVFoBFxbUGvp5dg/n5pxttYHWNRgTVuCV1pQ9Mv2JxEDnxRiwlq8OgMbgZInyqsE/lF0Gf70S6sfzbE0ZCqqjaWphOyRmt6mrzU8ZI2rooQtnGf0c/cOTzd0xoAAAAAElFTkSuQmCC\n",
"text/latex": [
"$$A_{11} e^{- t} \\theta\\left(t\\right)$$"
],
"text/plain": [
" -t \n",
"A_{11}⋅ℯ ⋅Heaviside(t)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x1 = sym.inverse_laplace_transform(Xp.args[1], s, t)\n",
"x1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the second pole $s_{\\infty 2}$ with degree two we get two contributions"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAGsAAAAYBAMAAAAPJx5QAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIs1UmauJMnZmRLsQ3e++988cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACJklEQVQ4EYVSTYvTUBQ9aTJtmsa2CAoudApuByz+gRnFhQOz6GaW0ig4urNudCEyATfFjVHcGxDBZRaKDAqNLkQRaRRxtv0BLurHWBWhnvvSNJm2xAv365x737svuUCO2FubIQr1nIqFlAEjQn8hlQfWfG2Ek3kVC7lyqI0Of7yUcpoKp1MfTJn9UTHC8QxyS8WPE+REEsz6myH+CmZe7NDqDg2TpnLQx7FP7Y3nlDq0F7AGgu7YEe0rqv0BWBEIMNrTcWMgsYdw1Wy9BIoBRsTWqfoQuB/z5690ksJ9Xnt2fcNwHWDbx3cyA6rRAKohA2junab4OamOx0NrnUeeQ+k3YDVYccABCp6UGlhVXmLK6+5GHEyt/Qv6H9Y5wKPeUxfFllAPsU0gEWsX15J44s0Ril8nl6wSKzeEWMNyC2r/3jJf9nBb0IxU9jbbA87XJHaaqkc05pMz7YCTGlGpy7zX3fKJZqUaoO/yS/gEP1NLQ5o3QC2C2j85Zo/QjNRcPAjjNptvjP/lGq8fQPZP3f5zpodp38cnukKTHUOEqszyCMit3D+5jVPoM501X/9CqOKyqKHXUQ6AYwLwO4H7J233YJ9ilpUl732HuXz3pRbfZLh4N16B3vvmyP6pNvNyN9sisX1WHWTxUG3H45vqaQX3T7WlyFy0O0GOpozs3//aJiusVnrSKfunXfjhpgfNR5V4OC2Yp/IQO66vhHlFC7gjCrsL/AOqC4ZRhtSFIQAAAABJRU5ErkJggg==\n",
"text/latex": [
"$$A_{21} e^{- 2 t} \\theta\\left(t\\right)$$"
],
"text/plain": [
" -2⋅t \n",
"A_{21}⋅ℯ ⋅Heaviside(t)"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x2 = sym.inverse_laplace_transform(Xp.args[2], s, t)\n",
"x2"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAHEAAAAYBAMAAAA/qw9xAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIs1UmauJMnZmRLsQ3e++988cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACT0lEQVQ4EYVSS2gTURQ900kz+UwzQXBVNBFBEArGjdtGEamgkE1AUEkUIiIUpyB0VToLW9wZQRBBMPgBN9UUFC0KnYWIUEojiisXWYtgVCRtXYznvkmcEabJhXM/59w3793LAEPsXe0csG9IU6RcxGmYnUhpCLmNnK3nhzRFyveQm5k+YAdaVlLlJNklbiebxkgh0BIqf9InDvWTiGh8geWST9RsUY+Ig38e0D1V9ty6/xTjNW0ZGHfxVJQVs0Vv5okPwIRQQKziN/vVpB96XisZ2QUzi3gTXWmt86IOcNuXL1y1Q93HQjmvnL3mTsWB+QZ+UcgQsTyjywSac7MgsWef+4mK3z0Pj+4A52FskXhAjFWBEd7Nb2BSRcmROvvnDMzL111V/XPmJvRtVieAx6svHMRLIj3EfFWibzLFkm1U+7UfE13EfzA9SMgiknk6FJErwbxUdgUyhbaFREOUwNK/y5U2y4+ELEJv0SWeH680+eRYSyBTpDcXr1AIW6aJDYfEV0IWYfBleA9YLVgNrSvARgOWGoJSYJaD+y5LnjRl3lSbrshttZF0ta4Az2BaVdL/G7/3SZj9PNSBq16bqnPHcne8pXARh2XtBekLzGro36R6xZ68nkWyCexlnZa1zbkKZdPh4t5myYRstL5uS1kDRkucL+ZgzZuAvvqzCu0N/wli/C6weMNhV9jMqaOqXGLTSp3zhb68GzMQDLYxdTOwJ2jTXs6eEgRMZJYs+vTJQM14XkcQMNHZsqK1ZrQ6iF1TYtod1BOtaXXhbwF/AXm3kQIRUQrCAAAAAElFTkSuQmCC\n",
"text/latex": [
"$$A_{22} t e^{- 2 t} \\theta\\left(t\\right)$$"
],
"text/plain": [
" -2⋅t \n",
"A_{22}⋅t⋅ℯ ⋅Heaviside(t)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x3 = sym.inverse_laplace_transform(Xp.args[3], s, t)\n",
"x3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The inverse Laplace transform of $X(s)$ is now composed from the superposition of the four individual parts"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAAYBAMAAABq77sGAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIs1UmauJMnZmRLsQ3e++988cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAE/klEQVRYCa1WXWgcVRT+JjPZv0yTRTAIQbMiFIRCg6gIUhJLKym0kJc+qWR9SAxCcQtiBZHMg4agiLEIvgguakEfKltQtCjsCFKEIon/SN0S8EXEn01LTVOV9XxzZ3Z+MrPT7OTAmXvPvef77nf23pm9wG7ZnZmILsw9CmSjkPXN+eM2BsqZlKSAzXZKQu/pKRxDRgpZwICxhtXeK2Wc1SuZCG5gvJaRQtYfqWubuGcHQpyt38n+ayf21nz+HcPxJsZPZqSQ5Yu2tjn6zRO+EISV3OLNaAcvcaYwwYH3vNFgq1WCkd8fcCAq7gMOnEBmClk9t4a7fFHRQvZ7UzmcsaV/vxMrud6U2w60IwNuOGJLpzBXY9gHHPmfkZWCSz9v41+2sUr0DqdoQ2U+zYr418A+BhGbjNaZ/1TsHD5g3nlzTZ79wDFm90VBmbTnqKIM7TOU1hnHKjFmnfJkujDDJGMF0NvA6wzEShJ7dnjD64XbF80ycg1symg/cG0mX+5Bgff91UIKKDNgt+JkYeZzOb6xSh5/qubmmlfZGRY3KtLa0hHTLafhIzfKSmJsOgcs1kF8P/CxU0/bPSjwQHfJsALK9E37+NRRw6omKNGsVye83KYtvbfF91SBAXcfA3XeVnB+CUmI2LtvAI8hvyXD/cD/6nTQgyJQZ1gBZfo23Om0S0dk02KVGJh0C8K9kw1BPQycaX5kITejKAJ1TumsxDNz4QXb68t7eR36DQn7hJMoiSJQZ0iBI/PC8lFfhNOLp3kHi1WVWKwM8mt1t/ikeLEiDzG/ztJE/m815jzP1vJVPyxsIse3t084iZIo/DojCkRm6Uc844twevE0UxiXjZtfAsbLOl+/b8UPiutrDipQpwHtmvzqp5VrWyjUVQqfQ9eOz65LmwbnXZYUEXgvCr9OpYAUzpVYZI6v4CViAxarpPDhodkGclapgUeQZ52/if8gnm/Lw2i1Lv/Raqkj/PKhw/8Az76ifOj60pOS4dlwA6uWBGlw3mVJEYGTJpYCx1qtP1ut75kApYAUdMpsLs/XnSn/EUvzpdwL1zBcwwa2VGki1OSLVlpX0O65NS3gPxk7oHxEFa+ShMXCW7YEaXDeZUkRgZMmiaK7n64CUtApUw5Y1GJppuTjui5HFr+Ym+qVlJtTqQ17+7k1hPCyuFdnVfq+rdbxHaM0uNxlVZ1VH+v2kii6dboKSEGnzOAHowcNLwFymVu08ZP8yzt3zE/kf7Kil1FsKFx3P/lvzTuiWyc/6hMqhc+Ruv4721S43GVJEYH3oujW6SkghThlytHViQ1YnJI7ZH5og3X+igXcx+w5YHBGjrNhSSDm1amtS9Asd+ssVvCFRJ4NrnxVYz8VLndZ1hmBE5pE4dXZVUAKcco8DfMhYgMWQ3Oxsw9680pVzu1V5JarzD4r38LzK/KDu0W4dZrNKzYe7Ozt1omlZYv5rpnTar1U+JitKMJwsiRRuHX6CkghTpmFhWVCg5ZII186fodc2+NsC3C7G3v76c1757YbhztpcN5lHYowLBhFKbz99HJI4dB4A/HtNhp5Ia1SxUsuTqneEXegJHsbsgMS0eMtDc67bA84SaMUwXs850nh0DBItm00kjofuMKdc6BaI4FhdP806EmWAuddthectDdBQZo0S6G56OCH7DSahPmMcLLuAsVN0GjOQX0toYzU4Yxw8u8CRYjmf8QP7O/IwwTdAAAAAElFTkSuQmCC\n",
"text/latex": [
"$$A_{0} \\delta\\left(t\\right) + A_{11} e^{- t} \\theta\\left(t\\right) + A_{21} e^{- 2 t} \\theta\\left(t\\right) + A_{22} t e^{- 2 t} \\theta\\left(t\\right)$$"
],
"text/plain": [
" -t -2⋅t -2⋅t\n",
"A₀⋅δ(t) + A_{11}⋅ℯ ⋅Heaviside(t) + A_{21}⋅ℯ ⋅Heaviside(t) + A_{22}⋅t⋅ℯ \n",
"\n",
" \n",
"⋅Heaviside(t)"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = x0 + x1 + x2 + x3\n",
"x"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the final solution the four coefficients are determined using the given limit formulas for the coefficients of a partial fraction decomposition"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAAVBAMAAABPpbMoAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEER2zVSJ3ZkiZjKru+/kt61jAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADv0lEQVRIDdWWPWgUQRTH33q5j82Z3IJiIYoi2giSAy0s1JwWWuZSWsgdnESEqKdNFEUucGCKFAeKWBjvrOw0nUoCiYhgocSAheBH0tiYIolEkxjlfG9m3+zO7my4lHnwbt6895+Z387tzi4AWPtg85l9VjIf6RWtnWv1Eu61KiTdhsQ8cQss49Mkji/KIW0LPJTbvqM1DrW2R+tx57nDkdaaxSxJX+VIa8MsWlks9YVSibIsFILwbXnrhjbG7cSbhqz1tscIbxSr8buq7s6pjAxCLP66u9QFyjH88KpfgfETgEuBlOimpmqmdLcRPkLME8TM8CEW1stWLOWHT9xf0xWA/0vBBHTxymhAKbpm+AgxT2CGD7OwXrYh+LuxX7oCVgC68oEcdu1styELYISPEvO0ZvgwC+tlG4KvxP94iusYWgTf8HIcpaCgZ5MVUTLCR4l5MjO8xkJS4vGZB5/KUXpLPv1bla0lDG3sT2RVTgUHYKKoOhTsyYmuET5KLEbgjxFeYyGl4OEh2IqlTlCi3qDfFNh/8eEtFakDDrqAL1JPtwrUJwF25qRjzZJ1I7wQW33vHDHAE8shEfCSZUf/KyAnIx6fiaXqePOOXxPZ40PD/wBKcEhpLNz5rvDOxz4NTX2A9OGycKU23/NSnIJUmQZ4tn2A7GYEvGSpwB0gV2adEaNG3aXsj3mwqg6WLaRcBpiDTE2J8Z4v5FWPg20AmTK+2lzntBleijN77TUxwBNzZLptXJafUB8lZ6mvFTufOIWZjkn8SaHfBnsVOj3crwDPHMzrVgFIzrYKL8XtzobgJQs8RnByCJuAL9SwIF5SBzHogfQiJBtK+xSgyje0Sm7BOr28zTsfuFYW0xo0IGy08+4zo4qSBbv0GiIPmYC/TGmCt2cxmKkhfGcWI/l0J/PWHB8lmJT2CJsOfBf74L3TJngqsBjwY8SFd8U8HcEHUi4LAH33yG+f4LwCXlwWwlszSw6ca57G2yaTp3nFuWqVjo1CEmfw2e7mSYjPLBX98PKcfz9/KwsDjk8LSmxPy6vFovtScGVbvy2/DizBLAAjOBk5mn7Oi6XkfyJuG3cy7YGVuV63FGh8O++rxDV4VXgIL3nnVc4XmJewJ9M1cp9QC3nnVbIE+1XsBsVgQvbN8Amj2P48NrgevHmJkbEXDrlxSkwK+NisV06UBr2OiOjcMph9fiVLHijh0WiwzmZzwSBmZcQS880mkEdZlQrW96gy5dvXK4ZqjVCmhcTGluAJrR8ievCGE5uoTffnAf4D3pn+qxyRmogAAAAASUVORK5CYII=\n",
"text/latex": [
"$$\\left \\{ A_{0} : 0, \\quad A_{11} : 1, \\quad A_{21} : -1, \\quad A_{22} : -1\\right \\}$$"
],
"text/plain": [
"{A₀: 0, A_{11}: 1, A_{21}: -1, A_{22}: -1}"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"coeffs = {A0 : sym.limit(X, s, sym.oo)}\n",
"coeffs.update({A11 : sym.limit(X*(s+1), s, -1)})\n",
"coeffs.update({A21 : sym.limit(sym.diff(X*(s+2)**2, s), s, -2)})\n",
"coeffs.update({A22 : sym.limit(X*(s+2)**2, s, -2)})\n",
"coeffs"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Substitution into the inverse Laplace transform yields the final solution $x(t) = \\mathcal{L}^{-1}\\{ X(s) \\}$"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAASIAAAAYBAMAAACsBu36AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMiJUmYlEq7t2Zu/qvyblAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD70lEQVRIDZVWTYhTVxT+3kxefibJ5OFQFFqYFLF0U4jNqMXVgyoVXEzAjTiUCS2FLoqOitDFDITahY5Cgy4KpT8p7SpaHEE3/jBvVa0MNEpLF6V0XEqhHWEsjo6dfue+F/LuzXvJ5MC999xzvnO/c++5eTdAtGyb/xbYEe2Lsw4Et840HQxV4tbqts/gJKyVbnsPy2DwFFIljPdYznStYdpNFk1rz/lg8ELdXsV7PRfUnfcxvf/0627HaIuquo5N02wNrsrRqyZ5x149/OannSX6EuA0hqodPH4UPeOFLKYahueq4v3ShGjzdAmvhQx9CRI7UXAk4O730idr0vt5Ka27U/DcvCueD5Xbz0upEd3bDh6LOZZgzD/jxE3KdWDKwdeCz7bGZNjCRsSQSlIMIQlCFPy2VaLHKrLtAl6l3iUHhaEC+yoyy3TGExzTQu1GonLPYpLnUHDpmWMjIj8ToL4KxtAg8PQCVmlKtXiqK8BvIbepHsH+XOOlWALCT2ghU/vecWbTQGINhSo9y2yCeMgm8pE/hHuBT9bxL22jbKkiRycM0HT72r7jKa8WS0DwW1rAPxsb+PwXYKSESW44UwwQbwSoiIwE/h0SL4i4wDZcA4YYGiOjGxsrmTk3lgCZS88vwzp/x9zUuIdjdW645iMwHxC0M9JDrHUk14j4GPhi8YaHdMPIZ9vSccMSR+CX/aKbqBkBP7v4rOJvVi4GHgT+dkZ6SG4V6SdEyEnKvcwX2YUkM4EDoamocQSq7PYL5Hgemiw2m//RMFz1Lwbe50QkyMgIyT5rXlmmdzeb3LpkiV1Iplv4KTQVtZtgS1lkQsqeXb971sDjL7ASvKLMVC4GJgVwslz+u1zeS80IGV0AqwA8YpN7mZBjtbYrCpfq4tIZc8uRBIQC43UUGkrTunXk5TMmGREB/xvFMTgjI6Tg4U+HXmZkyX1SHxyObXnWVjpjHAHwDaxCrQMMNK47PENdXggiYFbNCGHSeySSr0NmBU5X1Z6KU5NYAuATfCBlqWp4YA1HZdNZTyGA3wN/cEZGSKGeVB+sW0C6mKwgv6Avx0omdUssAdC0PP4ytlaMgB+sCbGkGwoBzAb+ICMjZKQ15gqA34iRxiv8MXgy68gDWKc6M6XFEfAd+4Nv3pJn4LH1jsoxU/IR4GOlJMjICLFmfcKL/ONyu8Ufg7HB3PmlzRKYuK65OinyMDMl7Yy6gMow7Pr2Q9HuKKtJEIXRbMGbKU+okoiXNoRvP8hzIVsf1SToA+fV9s9/qi/QB1xXg72wSThhAxLw8+IvfnWTFC8rXNbZJJywAQkY8a4snvdPStTeYrfE/2tvkO5tE/wPEJoKOpmaogUAAAAASUVORK5CYII=\n",
"text/latex": [
"$$- t e^{- 2 t} \\theta\\left(t\\right) + e^{- t} \\theta\\left(t\\right) - e^{- 2 t} \\theta\\left(t\\right)$$"
],
"text/plain": [
" -2⋅t -t -2⋅t \n",
"- t⋅ℯ ⋅Heaviside(t) + ℯ ⋅Heaviside(t) - ℯ ⋅Heaviside(t)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = x.subs(coeffs)\n",
"x"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The solution is plotted for illustration"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"application/pdf": "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Rmlyc3RDaGFyIDAKL0ZvbnRCQm94IFsgLTEwMTYgLTM1MSAxNjYwIDEwNjggXSAvRm9udERlc2NyaXB0b3IgMTMgMCBSCi9Gb250TWF0cml4IFsgMC4wMDEgMCAwIDAuMDAxIDAgMCBdIC9MYXN0Q2hhciAyNTUgL05hbWUgL0RlamFWdVNhbnMtT2JsaXF1ZQovU3VidHlwZSAvVHlwZTMgL1R5cGUgL0ZvbnQgL1dpZHRocyAxMiAwIFIgPj4KZW5kb2JqCjEzIDAgb2JqCjw8IC9Bc2NlbnQgOTI5IC9DYXBIZWlnaHQgMCAvRGVzY2VudCAtMjM2IC9GbGFncyA5NgovRm9udEJCb3ggWyAtMTAxNiAtMzUxIDE2NjAgMTA2OCBdIC9Gb250TmFtZSAvRGVqYVZ1U2Fucy1PYmxpcXVlCi9JdGFsaWNBbmdsZSAwIC9NYXhXaWR0aCAxMzUwIC9TdGVtViAwIC9UeXBlIC9Gb250RGVzY3JpcHRvciAvWEhlaWdodCAwID4+CmVuZG9iagoxMiAwIG9iagpbIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4IDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4MzggMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAzMzcgMzM3IDgzOCA4MzggODM4IDUzMSAxMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3NTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3NDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4NCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMzNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1IDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4IDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEgNTIxIDM5MiA2MzQgNTkyIDgxOCA1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MDIxIC00NjMgMTc5NCAxMjMzIF0gL0ZvbnROYW1lIC9EZWphVnVTYW5zIC9JdGFsaWNBbmdsZSAwCi9NYXhXaWR0aCAxMzQyIC9TdGVtViAwIC9UeXBlIC9Gb250RGVzY3JpcHRvciAvWEhlaWdodCAwID4+CmVuZG9iagoxOCAwIG9iagpbIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4IDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4MzggMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAzMzcgMzM3IDgzOCA4MzggODM4IDUzMSAxMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3NTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3NDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4NCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMzNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1IDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4IDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEgNTIxIDM5MiA2MzQgNTkyIDgxOCA1OTIgNTkyIDUyNSA2MzYgMzM3IDYzNiA4MzggNjAwIDYzNiA2MDAgMzE4CjM1MiA1MTggMTAwMCA1MDAgNTAwIDUwMCAxMzQyIDYzNSA0MDAgMTA3MCA2MDAgNjg1IDYwMCA2MDAgMzE4IDMxOCA1MTggNTE4CjU5MCA1MDAgMTAwMCA1MDAgMTAwMCA1MjEgNDAwIDEwMjMgNjAwIDUyNSA2MTEgMzE4IDQwMSA2MzYgNjM2IDYzNiA2MzYgMzM3CjUwMCA1MDAgMTAwMCA0NzEgNjEyIDgzOCAzNjEgMTAwMCA1MDAgNTAwIDgzOCA0MDEgNDAxIDUwMCA2MzYgNjM2IDMxOCA1MDAKNDAxIDQ3MSA2MTIgOTY5IDk2OSA5NjkgNTMxIDY4NCA2ODQgNjg0IDY4NCA2ODQgNjg0IDk3NCA2OTggNjMyIDYzMiA2MzIgNjMyCjI5NSAyOTUgMjk1IDI5NSA3NzUgNzQ4IDc4NyA3ODcgNzg3IDc4NyA3ODcgODM4IDc4NyA3MzIgNzMyIDczMiA3MzIgNjExIDYwNQo2MzAgNjEzIDYxMyA2MTMgNjEzIDYxMyA2MTMgOTgyIDU1MCA2MTUgNjE1IDYxNSA2MTUgMjc4IDI3OCAyNzggMjc4IDYxMiA2MzQKNjEyIDYxMiA2MTIgNjEyIDYxMiA4MzggNjEyIDYzNCA2MzQgNjM0IDYzNCA1OTIgNjM1IDU5MiBdCmVuZG9iagoyMSAwIG9iago8PCAvZWlnaHQgMjIgMCBSIC9mb3VyIDIzIDAgUiAvb25lIDI0IDAgUiAvcGFyZW5sZWZ0IDI1IDAgUgovcGFyZW5yaWdodCAyNiAwIFIgL3BlcmlvZCAyNyAwIFIgL3NpeCAyOCAwIFIgL3QgMjkgMCBSIC90d28gMzAgMCBSCi96ZXJvIDMxIDAgUiA+PgplbmRvYmoKMyAwIG9iago8PCAvRjEgMjAgMCBSIC9GMiAxNCAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL0ExIDw8IC9DQSAwIC9UeXBlIC9FeHRHU3RhdGUgL2NhIDEgPj4KL0EyIDw8IC9DQSAxIC9UeXBlIC9FeHRHU3RhdGUgL2NhIDEgPj4gPj4KZW5kb2JqCjUgMCBvYmoKPDwgPj4KZW5kb2JqCjYgMCBvYmoKPDwgPj4KZW5kb2JqCjcgMCBvYmoKPDwgPj4KZW5kb2JqCjIgMCBvYmoKPDwgL0NvdW50IDEgL0tpZHMgWyAxMCAwIFIgXSAvVHlwZSAvUGFnZXMgPj4KZW5kb2JqCjMyIDAgb2JqCjw8IC9DcmVhdGlvbkRhdGUgKEQ6MjAxOTA1MDgxNTA1MTErMDInMDAnKQovQ3JlYXRvciAobWF0cGxvdGxpYiAzLjAuMywgaHR0cDovL21hdHBsb3RsaWIub3JnKQovUHJvZHVjZXIgKG1hdHBsb3RsaWIgcGRmIGJhY2tlbmQgMy4wLjMpID4+CmVuZG9iagp4cmVmCjAgMzMKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE2IDAwMDAwIG4gCjAwMDAwMDg3NDMgMDAwMDAgbiAKMDAwMDAwODUzOCAwMDAwMCBuIAowMDAwMDA4NTgxIDAwMDAwIG4gCjAwMDAwMDg2ODAgMDAwMDAgbiAKMDAwMDAwODcwMSAwMDAwMCBuIAowMDAwMDA4NzIyIDAwMDAwIG4gCjAwMDAwMDAwNjUgMDAwMDAgbiAKMDAwMDAwMDQwMiAwMDAwMCBuIAowMDAwMDAwMjA4IDAwMDAwIG4gCjAwMDAwMDIxNDAgMDAwMDAgbiAKMDAwMDAwMzEwNyAwMDAwMCBuIAowMDAwMDAyODk5IDAwMDAwIG4gCjAwMDAwMDI1NzYgMDAwMDAgbiAKMDAwMDAwNDE2MCAwMDAwMCBuIAowMDAwMDAyMTYxIDAwMDAwIG4gCjAwMDAwMDI0MTIgMDAwMDAgbiAKMDAwMDAwNzMyNSAwMDAwMCBuIAowMDAwMDA3MTI1IDAwMDAwIG4gCjAwMDAwMDY3NDIgMDAwMDAgbiAKMDAwMDAwODM3OCAwMDAwMCBuIAowMDAwMDA0MjAyIDAwMDAwIG4gCjAwMDAwMDQ2NjcgMDAwMDAgbiAKMDAwMDAwNDgyOSAwMDAwMCBuIAowMDAwMDA0OTgxIDAwMDAwIG4gCjAwMDAwMDUyMDEgMDAwMDAgbiAKMDAwMDAwNTQyMyAwMDAwMCBuIAowMDAwMDA1NTQ0IDAwMDAwIG4gCjAwMDAwMDU5MzQgMDAwMDAgbiAKMDAwMDAwNjEzOCAwMDAwMCBuIAowMDAwMDA2NDU5IDAwMDAwIG4gCjAwMDAwMDg4MDMgMDAwMDAgbiAKdHJhaWxlcgo8PCAvSW5mbyAzMiAwIFIgL1Jvb3QgMSAwIFIgL1NpemUgMzMgPj4Kc3RhcnR4cmVmCjg5NTcKJSVFT0YK\n",
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n"
],
"text/plain": [
"