Search code examples
pythonsympynumerical-methodsdifferential-equations

Unexpected result for solving ordinary linear differential equation of second order with SymPy


I am trying to solve this ordinary linear differential equation of second order \ddot{s}+k^2s = 0 with SymPy and get an unexpected result.

import sympy as sym
k, t = sym.symbols('k, t') 
s = sym.Function('s')

diff_eq = sym.Eq(s(t).diff(t, 2) + s(t) * k**2, 0) # everything fine here, when I print this I get what I expected.

solution_diff_eq = sym.dsolve(diff_eq, s(t))  
print(solution_diff_eq)

Which prints

Eq(s(t), C1*exp(-I*k*t) + C2*exp(I*k*t))

However, the solution I expected is s = A \sin{kt} + B \cos{kt}

Any ideas what I have done wrong?


Solution

  • The result prints as

    Eq(s(t), C1*exp(-I*k*t) + C2*exp(I*k*t))
    

    which is correct, as I is the imaginary unit. You might prefer the real form, but sympy was not notified of that and produced the most simple form as sum of exponential terms, especially as it is not clear if k is actually real.

    If you make it explicit that k is a positive real number via

    k = sym.Symbol('k', real=True, positive=True) 
    

    the solution is actually in real form, as you were expecting

    Eq(s(t), C1*sin(k*t) + C2*cos(k*t))