With the latest version of python (3.11), sympy's laplace_transform function gives me initial conditions.
from sympy import symbols, Function, laplace_transform
t = symbols('t',real=True)
s = symbols('s',complex=True)
y = Function('y')(t)
laplace_transform(y.diff(t,2)+2*y.diff(t,1)+3*y,t,s)
returns
s**2*LaplaceTransform(y(t), t, s) + 2*s*LaplaceTransform(y(t), t, s) - s*y(0) + LaplaceTransform(y(t), t, s) - 2*y(0) - Subs(Derivative(y(t), t), t, 0)
How do I substitute for y(0)
, Subs(Derivative(y(t),t),t,0)
(the initial conditions)?
Thanks to @Davide_sd and this post github.com/sympy/sympy/issues/7219 (Eric Weiser, Adeak) , I have code that works: calliope.us/Classes/Mechatronics/laplace_dif_eq_S24_class.py.
code snippet:
from sympy import symbols, Function, laplace_transform
def apply_initial_conditions(L,ic):
wf = Wild('f')
lw = LaplaceTransform(wf,t,s)
ll=L.find(lw)
for l in ll:
lz=l.match(lw)[wf]
newL = L
icl = [lz.diff(t,i).subs(t,0) for i in range(0,len(ic))]
for i in range(0,len(ic)):
newL = newL.replace(icl[i],ic[i])
return(newL)
t = symbols('t',real=True)
s = symbols('s',complex=True)
y = Function('y')(t)
Y = laplace_transform(y.diff(t,2)+2*y.diff(t,1)+3*y,t,s)
Y = apply_initial_conditions(Y,[0,0])
from sympy import symbols, Function, laplace_transform
t = symbols('t',real=True)
s = symbols('s',complex=True)
y = Function('y')(t)
r = laplace_transform(y.diff(t,2)+2*y.diff(t,1)+3*y,t,s)[0]
# substitution dictionary with zero-initial condition
sd = {y.diff(t, i).subs(t, 0): 0 for i in range(2)}
r.subs(sd)
# s**2*LaplaceTransform(y(t), t, s) + 2*s*LaplaceTransform(y(t), t, s) + 3*LaplaceTransform(y(t), t, s)
Here, I created a substitution dictionary where I applied zero-initial conditions. Note that I used range(2)
. "Two" is the maximum order of the derivative.