Appendix C — Sympy: Laplace Transform

C.1 Importing sympy

import sympy
from sympy import laplace_transform, inverse_laplace_transform, pi
sympy.init_printing()

from IPython.display import display

print("sympy: ", sympy.__version__)
sympy:  1.12

C.2 Symbols and Functions

a, b = sympy.symbols("a, b", positive=True, constant=True)
n, m = sympy.symbols("n, m", positive=True, constant=True, integer=True)

t, tau, tau1, tau2 = sympy.symbols("t, tau, tau1, tau2", positive=True)

y = sympy.Function("y")
f = sympy.Function("f")
g = sympy.Function("g")

s = sympy.symbols("s")

Y = sympy.Function("Y")
F = sympy.Function("F")
G = sympy.Function("G")

Ly = laplace_transform_(y(t), t, s)
Lf = laplace_transform_(f(t), t, s)
Lg = laplace_transform_(g(t), t, s)

C.3 Laplace transform

eq = 1
Leq = laplace_transform_(eq, t, s)
Leq

\(\displaystyle \frac{1}{s}\)

eq = t
Leq = laplace_transform_(eq, t, s)
Leq

\(\displaystyle \frac{1}{s^{2}}\)

eq = sympy.exp(-3 *t)
Leq = laplace_transform_(eq, t, s)
Leq

\(\displaystyle \frac{1}{s + 3}\)

eq = 2 *sympy.Heaviside(t -3)
Leq = laplace_transform_(eq, t, s)
Leq

\(\displaystyle \frac{2 e^{- 3 s}}{s}\)

eq = sympy.sin(2 *t)**2
Leq = laplace_transform_(eq, t, s)
Leq

\(\displaystyle \frac{2}{s^{2} + 4} + \frac{1}{s}\)

C.4 Inverse Laplace transform

Leq = 1 / s**3
eq = inverse_laplace_transform(Leq, s, t)
eq

\(\displaystyle \frac{t^{2}}{2}\)

Leq = (-2 *s +6) / (s**2 + 4)
eq = inverse_laplace_transform(Leq, s, t)
eq

\(\displaystyle 3 \sin{\left(2 t \right)} - 2 \cos{\left(2 t \right)}\)

C.5 Laplace transform of derivatives

eq = y(t).diff(t, 2) +2 *y(t).diff(t) +10 *y(t)
eq

\(\displaystyle 10 y{\left(t \right)} + 2 \frac{d}{d t} y{\left(t \right)} + \frac{d^{2}}{d t^{2}} y{\left(t \right)}\)

Leq = subs_(laplace_transform_(eq, t, s), Ly, Y(s))
Leq

\(\displaystyle s^{2} Y{\left(s \right)} + 2 s Y{\left(s \right)} - s y{\left(0 \right)} + 10 Y{\left(s \right)} - 2 y{\left(0 \right)} - \left. \frac{d}{d t} y{\left(t \right)} \right|_{\substack{ t=0 }}\)

ics = {y(0): 1, y(t).diff(t).subs(t, 0): 1}

Leq = Leq.subs(ics)
Leq

\(\displaystyle s^{2} Y{\left(s \right)} + 2 s Y{\left(s \right)} - s + 10 Y{\left(s \right)} - 3\)

sol = sympy.solve(Leq, Y(s))[0]
sol

\(\displaystyle \frac{s + 3}{s^{2} + 2 s + 10}\)

C.6 Laplace transform of integrals

eq = sympy.integrate(g(tau1), (tau1, 0, t)) +sympy.integrate(sympy.integrate(f(tau2), (tau2, 0, tau1)), (tau1, 0, t))
eq

\(\displaystyle \int\limits_{0}^{t} g{\left(\tau_{1} \right)}\, d\tau_{1} + \int\limits_{0}^{t}\int\limits_{0}^{\tau_{1}} f{\left(\tau_{2} \right)}\, d\tau_{2}\, d\tau_{1}\)

Leq = subs_(laplace_transform_(eq, t, s), Lf, F(s))
Leq = subs_(Leq, Lg, G(s))
Leq

\(\displaystyle \frac{G{\left(s \right)}}{s} + \frac{F{\left(s \right)}}{s^{2}}\)

C.7 Convolution

eq = sympy.integrate(f(tau)*g(t -tau), (tau, 0, t)) +sympy.integrate(f(t -tau)*g(tau), (tau, 0, t))
eq

\(\displaystyle \int\limits_{0}^{t} f{\left(\tau \right)} g{\left(t - \tau \right)}\, d\tau + \int\limits_{0}^{t} f{\left(t - \tau \right)} g{\left(\tau \right)}\, d\tau\)

Leq = subs_(laplace_transform_(eq, t, s), Lf, F(s))
Leq = subs_(Leq, Lg, G(s))
Leq

\(\displaystyle 2 F{\left(s \right)} G{\left(s \right)}\)

C.8 First translation theorem

eq = y(t) *sympy.exp(-a *t)
eq

\(\displaystyle y{\left(t \right)} e^{- a t}\)

Leq = subs_(laplace_transform_(eq, t, s), Ly, Y(s))
Leq

\(\displaystyle Y{\left(a + s \right)}\)

C.9 Second translation theorem

eq = f(t -a) *sympy.Heaviside(t -a)
eq

\(\displaystyle f{\left(- a + t \right)} \theta\left(- a + t\right)\)

Leq = subs_(laplace_transform_(eq, t, s), Lf, F(s))
Leq

\(\displaystyle F{\left(s \right)} e^{- a s}\)

eq = g(t) *sympy.Heaviside(t -a)
eq

\(\displaystyle g{\left(t \right)} \theta\left(- a + t\right)\)

Leq = laplace_transform_(eq, t, s)
Leq

\(\displaystyle \mathcal{L}_{t}\left[g{\left(a + t \right)}\right]\left(s\right) e^{- a s}\)

eq = sympy.cos(t) *sympy.Heaviside(t -pi)
eq

\(\displaystyle \cos{\left(t \right)} \theta\left(t - \pi\right)\)

Leq = laplace_transform_(eq, t, s)
Leq

\(\displaystyle - \frac{s e^{- \pi s}}{s^{2} + 1}\)

C.10 Derivatives of Transforms

eq = 3 *f(t) *t**m *t**n
eq

\(\displaystyle 3 t^{m} t^{n} f{\left(t \right)}\)

Leq = subs_(laplace_transform_(eq, t, s), Lf, F(s))
Leq

\(\displaystyle 3 \left(-1\right)^{m + n} \frac{d^{m + n}}{d s^{m + n}} F{\left(s \right)}\)

eq =  t**n *t**m *f(t)*sympy.exp(-2*t)
eq

\(\displaystyle t^{m} t^{n} f{\left(t \right)} e^{- 2 t}\)

Leq = subs_(laplace_transform_(eq, t, s), Lf, F(s))
Leq

\(\displaystyle \left(-1\right)^{m + n} \left. \frac{d^{m + n}}{d s^{m + n}} F{\left(s \right)} \right|_{\substack{ s=s + 2 }}\)


eq = t**n *sympy.diff(f(t), t, t)
eq

\(\displaystyle t^{n} \frac{d^{2}}{d t^{2}} f{\left(t \right)}\)

Leq = subs_(laplace_transform_(eq, t, s), Lf, F(s))
Leq

\(\displaystyle \left(-1\right)^{n} \frac{d^{n}}{d s^{n}} \left(s^{2} F{\left(s \right)} - s f{\left(0 \right)} - \left. \frac{d}{d t} f{\left(t \right)} \right|_{\substack{ t=0 }}\right)\)

eq = t *sympy.integrate(f(tau), (tau, 0, t))
eq

\(\displaystyle t \int\limits_{0}^{t} f{\left(\tau \right)}\, d\tau\)

Leq = subs_(laplace_transform_(eq, t, s), Lf, F(s))
Leq.doit()

\(\displaystyle - \frac{\frac{d}{d s} F{\left(s \right)}}{s} + \frac{F{\left(s \right)}}{s^{2}}\)


eq = t *f(t) *sympy.exp(-t)
eq

\(\displaystyle t f{\left(t \right)} e^{- t}\)

Leq = subs_(laplace_transform_(eq, t, s), Lf, F(s))
Leq

\(\displaystyle - \left. \frac{d}{d s} F{\left(s \right)} \right|_{\substack{ s=s + 1 }}\)


eq = t *sympy.diff(f(t), t) *sympy.exp(-4*t)
eq

\(\displaystyle t e^{- 4 t} \frac{d}{d t} f{\left(t \right)}\)

Leq = subs_(laplace_transform_(eq, t, s), Lf, F(s))
Leq

\(\displaystyle - \left(s + 4\right) \left. \frac{d}{d s} F{\left(s \right)} \right|_{\substack{ s=s + 4 }} - F{\left(s + 4 \right)}\)

C.11 Various Transform Examples

eq = sympy.exp(-a*t) *sympy.diff(f(t), t, t)
eq

\(\displaystyle e^{- a t} \frac{d^{2}}{d t^{2}} f{\left(t \right)}\)

Leq = subs_(laplace_transform_(eq, t, s), Lf, F(s))
Leq

\(\displaystyle \left(a + s\right)^{2} F{\left(a + s \right)} - \left(a + s\right) f{\left(0 \right)} - \left. \frac{d}{d t} f{\left(t \right)} \right|_{\substack{ t=0 }}\)


eq = sympy.exp(-4*t) *sympy.integrate(f(tau), (tau, 0, t))
eq

\(\displaystyle e^{- 4 t} \int\limits_{0}^{t} f{\left(\tau \right)}\, d\tau\)

Leq = subs_(laplace_transform_(eq, t, s), Lf, F(s))
Leq

\(\displaystyle \frac{F{\left(s + 4 \right)}}{s + 4}\)


eq = f(3*a*t)
eq

\(\displaystyle f{\left(3 a t \right)}\)

Leq = subs_(laplace_transform_(eq, t, s), Lf, F(s))
Leq

\(\displaystyle \frac{F{\left(\frac{s}{3 a} \right)}}{3 a}\)

\(~\)

C.12 Example 1

A technique that can be used to solve certain ODE problems is to Laplace transform the ODE, which for many problems results in an algebraic equation that is easier to solve. The solution to the algebraic equation can then be transformed back to the original domain with an inverse Laplace transform, to obtain the solution to the original problem. For example, consider the following differential equation for a driven harmonic oscillator:

\[ \frac{d^2 y}{dt^2} + 2\frac{dy}{dt} +10 y = 2\sin 3t \]

\(~\)

t = sympy.symbols('t', positive=True)
y = sympy.Function('y')

s = sympy.symbols('s', real=True)
Y = sympy.Function('Y')

Ly = laplace_transform_(y(t), t, s) 
ode = y(t).diff(t, 2) +2 *y(t).diff(t) +10 *y(t) -2 *sympy.sin(3*t)
ode

\(\displaystyle 10 y{\left(t \right)} - 2 \sin{\left(3 t \right)} + 2 \frac{d}{d t} y{\left(t \right)} + \frac{d^{2}}{d t^{2}} y{\left(t \right)}\)

Lode = subs_(laplace_transform_(ode, t, s), Ly, Y(s))
Lode

\(\displaystyle s^{2} Y{\left(s \right)} + 2 s Y{\left(s \right)} - s y{\left(0 \right)} + 10 Y{\left(s \right)} - 2 y{\left(0 \right)} - \left. \frac{d}{d t} y{\left(t \right)} \right|_{\substack{ t=0 }} - \frac{6}{s^{2} + 9}\)

  • At this point, we need to specify the initial conditions for the ODE problem. Here we use \(y(0)=1\) and \(y'(0)=0\), and after creating dictionary that contains these initial conditions, we use it to substitute the values into the Laplace-transformed ODE equation:
ics = {y(0): 1, y(t).diff(t).subs(t, 0): 0}
Lode = Lode.subs(ics)
Lode

\(\displaystyle s^{2} Y{\left(s \right)} + 2 s Y{\left(s \right)} - s + 10 Y{\left(s \right)} - 2 - \frac{6}{s^{2} + 9}\)

  • This is an algebraic equation that can be solved for \(Y(s)\)
Ysol = sympy.solve(Lode, Y(s))
Ysol[0]

\(\displaystyle \frac{s^{3} + 2 s^{2} + 9 s + 24}{s^{4} + 2 s^{3} + 19 s^{2} + 18 s + 90}\)

  • The result is a list of solutions, which in this case contains only one element. Performing the inverse Laplace transformation on this expression gives the solution to the original problem in the time domain:
Yp = sympy.apart(Ysol[0])
Yp

\(\displaystyle - \frac{6 \cdot \left(2 s - 1\right)}{37 \left(s^{2} + 9\right)} + \frac{49 s + 92}{37 \left(s^{2} + 2 s + 10\right)}\)

ysol = sympy.inverse_laplace_transform(Yp.args[0], s, t) +sympy.inverse_laplace_transform(Yp.args[1], s, t)
ysol

\(\displaystyle \frac{2 \sin{\left(3 t \right)}}{37} - \frac{12 \cos{\left(3 t \right)}}{37} + \frac{43 e^{- t} \sin{\left(3 t \right)}}{111} + \frac{49 e^{- t} \cos{\left(3 t \right)}}{37}\)

C.13 Example 2

In some instances, the Laplace transform can be used to solve linear differential equations with variable monomial coefficients

\[ty'' + y' +ty =0, \;\;y(0)=1, \;y'(0)=0\]

\(~\)

s, t = sympy.symbols('s, t', positive=True)

y = sympy.Function('y')
Y  = sympy.Function('Y')
Ly = laplace_transform_(y(t), t, s)

ode = t *y(t).diff(t, 2) +y(t).diff(t) +t *y(t)
ode

\(\displaystyle t y{\left(t \right)} + t \frac{d^{2}}{d t^{2}} y{\left(t \right)} + \frac{d}{d t} y{\left(t \right)}\)

\(~\)

  • Reduce the given differential equation to a linear first-order DE in the transformed function \(Y(s)=\mathcal{L}_t\left[y(t)\right]\)
ics={y(0): 1, y(t).diff(t).subs(t, 0): 0}

Lode = subs_(laplace_transform_(ode, t, s).subs(ics), Ly, Y(s))
Lode.doit().collect(Y(s).diff(s))

\(\displaystyle - s Y{\left(s \right)} + \left(- s^{2} - 1\right) \frac{d}{d s} Y{\left(s \right)}\)

  • Solve the first-order ODE for \(Y(s)\) and then find \(y(t)=\mathcal{L}_t^{-1} \left[Y(s) \right]\)
sol = sympy.dsolve(Lode, Y(s), hint='separable')
sol

\(\displaystyle Y{\left(s \right)} = \frac{C_{1}}{\sqrt{s^{2} + 1}}\)

y = inverse_laplace_transform(sol.rhs, s, t)
y

\(\displaystyle C_{1} J_{0}\left(t\right)\)

c = sympy.Eq(y.subs(t, 0), 1)
c

\(\displaystyle C_{1} = 1\)

y = y.subs(c.lhs, c.rhs)
y

\(\displaystyle J_{0}\left(t\right)\)