#!/usr/bin/env python # coding: utf-8 # In[1]: get_ipython().run_line_magic('matplotlib', 'notebook') # In[2]: import numpy as np from sympy import * import matplotlib.pyplot as plt # In[3]: init_printing() u = Function('u') t, eps= symbols('t epsilon') omega = symbols('omega', positive=True) #
# # **Note:** This notebook requires SymPy 1.5 to work. #
# # Consider the following system # # $$\ddot{u} + 4 u + \varepsilon u^2 \ddot{u} = 0 \enspace .$$ # # This system can be rewritten as # $$(1 + \varepsilon u^2)\ddot u + 4u = 0 \enspace ,$$ # or # $$\ddot u + \frac{4u}{1 + \varepsilon u^2} = 0 \enspace .$$ # As a first order system it reads # $$\begin{pmatrix} # \dot u \\ # \dot v # \end{pmatrix} = \begin{pmatrix} # v \\ # -\frac{4u}{1 + \varepsilon u^2} # \end{pmatrix} \enspace ,$$ # with Jacobian matrix # $$J(u,v) = \begin{bmatrix} # 0 & 1 \\ # -\frac{4(1 - \varepsilon u^2)}{(1+ \varepsilon u^2)^2} & 0 # \end{bmatrix} \enspace .$$ # This system has a fixed point in $(0,0)$, with eigenvalues # $$\lambda_1 = -2i,\quad \lambda_2 = 2i \enspace ,$$ # and we can conclude that this fixed point is a center. # In[4]: eq = (1 + eps*u(t)**2)*diff(u(t), t, 2) + omega**2*u(t) eq # In[5]: ode_order(eq, u) # ## Straightforward expansion # # Let's take $u = u_0 +\varepsilon u_1 + \cdots$. Replacing this in the equation we obtain # In[6]: u0 = Function('u0') u1 = Function('u1') subs = [(u(t), u0(t) + eps*u1(t))] # In[7]: aux = eq.subs(subs) aux.doit().expand() # In[8]: poly = Poly(aux.doit(), eps) # In[9]: coefs = poly.coeffs() coefs # In[10]: sol0 = dsolve(coefs[-1], u0(t)).rhs sol0 # In[11]: aux = (u0(t)**2*u0(t).diff(t, 2)).subs(u0(t), sol0).doit() aux # In[12]: dsolve(u1(t).diff(t, 2) + omega**2*u1(t) + aux) # In[13]: eq_aux = expand(coefs[-2].subs(u0(t), sol0)) eq_aux.doit() # In[14]: sol1 = dsolve(eq_aux, u1(t)).rhs sol1 # In[15]: C1, C2, C3, C4 = symbols("C1 C2 C3 C4") # In[16]: print(sol1.subs({C1: 0, C2: 1, C3: 0, C4: -S(1)/4})) # In[ ]: # In[17]: u_app = sol0 + eps*sol1 # In[18]: aux_eqs = [ sol0.subs(t, 0)-1, sol1.subs(t, 0), diff(sol0, t).subs(t, 0), diff(sol1, t).subs(t, 0)] aux_eqs # In[19]: coef = u_app.free_symbols - eq.free_symbols coef # In[20]: subs_sol = solve(aux_eqs, coef) subs_sol # In[21]: u_app2 = u_app.subs(subs_sol) trigsimp(u_app2) # In[22]: print(u_app2) # In[23]: final_sol = trigsimp(u_app2).subs(omega, 2).expand() final_sol # In[24]: trigsimp(final_sol).expand() # In[25]: sol = (1 - 5*eps/32)*cos(2*t) + eps/32*(6*cos(2*t) - cos(6*t) + 24*t*sin(2*t)) sol # In[26]: plot((sol - final_sol).subs(eps, 1)) # In[27]: from scipy.integrate import odeint def fun(x, t=0, eps=0.1): x0, x1 = x return [x1, -4*x0/(1 + eps*x0**2)] t_vec = np.linspace(0, 100, 1000) x = odeint(fun, [1, 0], t_vec, args=(0.1,)) # In[28]: lam_sol = lambdify((t, eps), final_sol, "numpy") uu = lam_sol(t_vec, 0.1) # In[30]: plt.figure() plt.plot(t_vec, x[:,0]) plt.plot(t_vec, uu, '--r') plt.show() # In[ ]: