Bautin bifurcation


Author: GC

Date: July 20, 2016

Previous SI model

Next Three-body problem


The normal form of the Bautin bifurcation is given by the following system: \[ \begin{cases} \dot{\rho} = \rho (\beta_1 + \beta_2 \rho ^2 - \rho^4 ) \\ \dot{\varphi} = 1 \end{cases}, \] where $(\rho, \varphi)$ denote the polar coordinates of a generic point in $\mathbb{R}^2$. We plot its phase portrait for each value of the parameters $\beta_1$ and $\beta_2$ along the unit circle in the $(\beta_1,~\beta_2)$ plane, given by the parametrization: \[ \begin{cases} \beta_1 = \cos(\tau) \\ \beta_2 = \sin(\tau) \end{cases}, \] with $\tau \in I = [0,~2\pi]$. There exists a small interval $J \subset I$ (just after $\frac{\pi}{2}$) for which the system admits two limit cycles.



Bautin bifurcation




Source code

#!/usr/bin/env python3

"""
Bautin bifurcation
"""

# scientific libraries
from matplotlib import pyplot as plt
from random import randint, random
import numpy as np
from scipy.integrate import odeint

# system
def bautin(X, t):
    rho, phi = X
    drho = rho*(b1 + b2*rho**2 - rho**4)
    dphi = 1
    return [drho, dphi]


# parameters
time = np.arange(0, 200, 0.01)
X0 = [[rho0, 0] for rho0 in np.arange(0.0, 1.2, 0.1)]

# figure
plt.figure(figsize=(8,8))
ax = plt.subplot(projection='polar')
ax.set_rlim(0, 1.2)
for tau in np.arange(0, 2*np.pi, 0.1):
    b1 = np.cos(tau)
    b2 = np.sin(tau)
    for x0 in X0:
        # numerical integration
        orbit = odeint(bautin, x0, time)
        rho, phi = orbit.T
        ax.plot(phi, rho, 'magenta', linewidth=0.2)
        ax.set_axis_off()
        plt.suptitle(r"$\tau = \,"+str(tau)+r"$")
        num = int(100*tau)
        if num < 10:
            plt.savefig('img00'+str(num)+'.png')
        elif num < 100:
            plt.savefig('img0'+str(num)+'.png')
        else:
            plt.savefig('img'+str(num)+'.png')
    plt.pause(1)
    ax.clear()


Previous SI model

Next Three-body problem