Sympy Second Order Opera

I have a homogeneous solution of a simple second-order ODE, which, when I try to solve the initial values ​​with Sympy, returns the same solution. It should substitute y (0) and y '(0) and give a solution without constants, but this is not so. Here is the code for setting the equation (this is the balance equation of spring, k = spring constant and m = mass). Some redundant characters that I use elsewhere, sorry.

%matplotlib inline from sympy import * m,k, x,t,s,T, omega,A,B = symbols('mkxts T omega A B',float=True) a = symbols('a', positive=True) f,y,g,H,delta,S=symbols('fyg H delta S',cls=Function) Eq1 = Eq(m*diff(y(t),t,2)+k*y(t)) Eq1 

Result (correct): $ y {\ left (t \ right)} = C_ {1} e ^ {- t \ sqrt {- \ frac {k} {m}}} + C_ {2} e ^ {t \ sqrt {- \ frac {k} {t}}} $

y (t) = C1e ^ (- t√ (-k / m)) + C2e ^ (t√ (-km)), which also has y_n = c1.cos (√ (-k / m) t) + c2 .sin (√ (-k / m) t).

When this equation is solved analytically and converted into a solution using sines and cosines with omega = sqrt (-k / m), then c1 = y (0) and c2 = y '(0) / omega. So, although the solution is partially related to complex numbers, of course, dsolve simply returns the original homogeneous equation, as indicated above. My code for evaluating ODE with y (0) and y '(0):

 Eq1_soln_IVP =dsolve(Eq1,y(t),x0=0, ics={y(0): a, y(t).diff(t).subs(t, 0): a}) 

I understand that dsolve simply cannot handle this IVP analytically, but I would be surprised if it were based on its other ability. Any help regarding how this problem and, therefore, other analytical problems of the second order can be solved, would be highly appreciated. The question is:

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

So, the solution I tried, confirmed by Dietrich, was:

  #Create IVP for y(0) expr = Eq(Eq1_soln_IVP.rhs.subs(sqrt(-k/m),I*omega),y(0)) #Create IVP for y'(0) expr2 = Eq(diff(y(t),t).subs(t,0),expr.lhs.diff(t)) #Maps all free variables and solves for each where t = 0. solve([expr.subs(t,0),expr2.subs(t,0)]) 

Although this is an β€œa” solution, it seems like a very confusing way to find y (t) = y (0) cos (omega * t - phi) ... which answers the implicit question about some of the limitations of this solver and the direct question about how enabled by ics arg. Thank you

+6
source share
1 answer

The ics parameter in dsolve() does not work ( Issue 4720 ), so you need to do the replacements manually. You can try:

 from IPython.display import display import sympy as sy sy.init_printing() # LaTeX-like pretty printing for IPython t = sy.Symbol("t", real=True) m, k = sy.symbols('m k', real=True) # gives C_1 Exp() + C_2 Exp() solution # m, k = sy.symbols('m k', positive=True) # gives C_1 sin() + C_2 cos() sol. a0, b0 = sy.symbols('a0, b0', real=True) y = sy.Function('y') Eq1 = sy.Eq(m*sy.diff(y(t), t, 2) + k*y(t)) print("ODE:") display(Eq1) print("Generic solution:") y_sl0 = sy.dsolve(Eq1, y(t)).rhs # take only right hand side display(sy.Eq(y(t), y_sl0)) # Initial conditions: cnd0 = sy.Eq(y_sl0.subs(t, 0), a0) # y(0) = a0 cnd1 = sy.Eq(y_sl0.diff(t).subs(t, 0), b0) # y'(0) = b0 # Solve for C1, C2: C1, C2 = sy.symbols("C1, C2") # generic constants C1C2_sl = sy.solve([cnd0, cnd1], (C1, C2)) # Substitute back into solution: y_sl1 = sy.simplify(y_sl0.subs(C1C2_sl)) print("Solution with initial conditions:") display(sy.Eq(y(t), y_sl1)) 
+4
source

All Articles