fig, axes = plt.subplots(1, 2, figsize=(11, 5))
t_long = np.linspace(0, 2*np.pi, 400)
t_saddle = np.linspace(0, 1.2, 300)
# --- System 1: x'=y, y'=-4x (ellipses) ---
def sys1(t, s): return [s[1], -4*s[0]]
for ic, color in [((1,0),'steelblue'),((0.5,0),'darkorange'),((1.5,0),'seagreen')]:
sol = solve_ivp(sys1,(0,2*np.pi),list(ic),dense_output=True,max_step=0.01)
t_p = np.linspace(0,2*np.pi,400)
axes[0].plot(sol.sol(t_p)[0], sol.sol(t_p)[1], color=color, lw=2)
# Nullclines
axes[0].axhline(0, color='crimson', lw=1.5, ls='--', label='$x$-nullcline: $y=0$')
axes[0].axvline(0, color='seagreen', lw=1.5, ls='--', label='$y$-nullcline: $x=0$')
axes[0].set_xlim(-2,2); axes[0].set_ylim(-4.5,4.5)
axes[0].set_aspect('equal')
axes[0].set_xlabel('$x$'); axes[0].set_ylabel('$y$')
axes[0].set_title(r"$x'=y$, $y'=-4x$: elliptic orbits (center)")
axes[0].legend(fontsize=8)
# --- System 2: x'=y, y'=4x (saddle) ---
def sys2(t, s): return [s[1], 4*s[0]]
# Multiple ICs
for ic, color in [((0.1,0.3),'steelblue'),((0.5,1.1),'darkorange'),
((-0.1,0.3),'seagreen'),((-0.5,1.1),'purple')]:
for ic, color in [((0.1,0.3),'steelblue'),((0.5,1.1),'darkorange'),
((-0.1,0.3),'seagreen'),((-0.5,1.1),'purple')]:
for sign in [1, -1]:
ic_s = (ic[0]*sign, ic[1]*sign)
def stop_event(t, y):
return 5.0 - np.max(np.abs(y))
stop_event.terminal = True
stop_event.direction = -1
sol = solve_ivp(sys2, (0, 1.5), list(ic_s),
dense_output=True, max_step=0.005,
events=stop_event)
t_p = np.linspace(0, sol.t[-1], 200)
axes[1].plot(sol.sol(t_p)[0], sol.sol(t_p)[1], color=color, lw=1.5)
# IVP solution c1=1/4, c2=-1/4
t_ivp = np.linspace(0,1.2,200)
x_ivp = 0.25*np.exp(2*t_ivp) - 0.25*np.exp(-2*t_ivp)
y_ivp = 0.5*np.exp(2*t_ivp) + 0.5*np.exp(-2*t_ivp)
axes[1].plot(x_ivp, y_ivp, 'k-', lw=3, label='IVP: $x(0)=0$, $y(0)=1$')
axes[1].plot(0, 1, 'ko', markersize=8, zorder=5)
# Eigenvectors (unstable/stable manifolds)
t_ev = np.linspace(-2,2,100)
axes[1].plot(t_ev, 2*t_ev, 'r--', lw=1.5, label='Eigenvector $\\lambda=2$')
axes[1].plot(t_ev,-2*t_ev, 'm--', lw=1.5, label='Eigenvector $\\lambda=-2$')
axes[1].set_xlim(-2,2); axes[1].set_ylim(-4,4)
axes[1].set_xlabel('$x$'); axes[1].set_ylabel('$y$')
axes[1].set_title(r"$x'=y$, $y'=4x$: hyperbolic orbits (saddle)")
axes[1].legend(fontsize=7.5)
plt.tight_layout(); plt.show()