Skip to content

Note

Click here to download the full example code

Brusselator

In a well-mixed reactor with b = 3 > 1 + a^2, the Brusselator leaves its unstable fixed point and settles on a limit cycle: the concentrations u and v oscillate out of phase with a fixed amplitude, whatever the initial state.

The model is created by name from the catalog with a = 1 and b = 3, starting at u = v = 1, and runs for about seven periods. The default blueprint shows both concentrations in one time series view.

import matplotlib.pyplot as plt

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

MODEL = 'brusselator_ode'

system = create(MODEL)
observer = RerunObserver(MODEL, save_path=f'{MODEL}.rrd', blueprint='default', interval=2)
simulation = Simulation(system, dt=0.1, observers=[observer]).check().prepare().run(until=50)

plot brusselator ode

Open the recording in the Rerun viewer

One limit cycle from every initial state

The fixed point (a, b / a) = (1, 3) is unstable for b > 1 + a^2. Runs started inside and outside the cycle should all wind onto the same closed orbit, the one the run above reaches.

fig, ax = plt.subplots(figsize=(6, 5))
for u0, v0 in [(1.0, 3.2), (0.5, 0.5), (4.0, 1.0), (3.0, 5.0)]:
    run = Simulation(create(MODEL, u=u0, v=v0), dt=0.05).check().prepare().run(until=100).trajectory_
    ax.plot(run.values('reactor.u'), run.values('reactor.v'), linewidth=0.8, alpha=0.7)
    ax.plot(u0, v0, 'o', color='gray', markersize=4)
trajectory = simulation.trajectory_
late = trajectory.times > 30
ax.plot(
    trajectory.values('reactor.u')[late],
    trajectory.values('reactor.v')[late],
    color='black',
    linewidth=2,
    label='limit cycle',
)
ax.plot(1.0, 3.0, 'x', color='red', markersize=10, label='unstable fixed point')
ax.set_xlabel('u')
ax.set_ylabel('v')
ax.set_title('All initial states converge to the limit cycle')
ax.legend()
plt.show()

All initial states converge to the limit cycle

About the model

The well-mixed Brusselator, which oscillates on a limit cycle when b > 1 + a**2.

References

  • Prigogine and Lefever 1968
  • Datseris and Parlitz 2022
  • Trzaska 2023

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

Download Python source code: plot_brusselator_ode.py

Download Jupyter notebook: plot_brusselator_ode.ipynb

Gallery generated by mkdocs-gallery