Skip to content

Note

Click here to download the full example code

Mirollo-Strogatz

Fireflies that flash when charged and nudge the others at every flash end up flashing in unison: each flash pushes the nearly charged oscillators over the threshold, they join the group that fired, and the groups merge until one remains.

Five oscillators charge as x' = S - gamma x from random levels and fire at 1, kicking the others up by ε = 0.1. The default blueprint shows the five charges, whose sawtooth curves merge one by one into a single tooth.

import matplotlib.pyplot as plt
import numpy as np

from skcomplex.engine.runtime import Simulation
from skcomplex.engine.viz import RerunObserver
from skcomplex.models import create

MODEL = 'mirollo_strogatz'

system = create(MODEL, n_oscillators=5, S=2.0, gamma=1.0, epsilon=0.1, seed=0)
observer = RerunObserver(MODEL, save_path=f'{MODEL}.rrd', blueprint='default', interval=1)
simulation = Simulation(system, dt=0.1, observers=[observer]).check().prepare().run(until=20)

plot mirollo strogatz

Open the recording in the Rerun viewer

Absorption into ever fewer groups

Oscillators that fire together keep equal charges forever, so the number of distinct charges counts the groups. For a larger population the count should only ever fall, step by step at absorptions, down to one group firing in sync.

fig, ax = plt.subplots(figsize=(6, 4))
for seed in range(3):
    run = Simulation(create(MODEL, n_oscillators=30, epsilon=0.1, seed=seed), dt=0.1).check().prepare().run(until=60)
    charges = np.asarray(run.trajectory_.values('oscillators.x'))
    groups = [len(np.unique(np.round(frame, 6))) for frame in charges]
    ax.step(run.trajectory_.times, groups, where='post', label=f'seed {seed}')
ax.set_xlabel('time')
ax.set_ylabel('number of groups')
ax.set_title('30 pulse-coupled oscillators merge into one group')
ax.legend()
plt.show()

30 pulse-coupled oscillators merge into one group

About the model

Integrate-and-fire oscillators coupled by pulses, which end up firing in unison.

References

  • Mirollo and Strogatz 1990
  • Arenas et al. 2008

Total running time of the script: ( 0 minutes 1.962 seconds)

Download Python source code: plot_mirollo_strogatz.py

Download Jupyter notebook: plot_mirollo_strogatz.ipynb

Gallery generated by mkdocs-gallery