lorenz
A spiking implementation of the Lorenz chaotic attractor. The canonical demonstration that spiking ensembles can sustain non-trivial nonlinear dynamics — and visually striking when watched in NengoGUI.
Description
A single 3D Nengo ensemble (600 spiking neurons) implements the Lorenz system with parameters σ=10, β=8/3, ρ=28. Recurrent connections compute the right-hand side of the differential equations, producing the characteristic two-lobe "butterfly" trajectory. The equations are slightly transformed from the standard Lorenz form to centre the attractor on the origin — see Eliasmith (2005) for the derivation.
This is a GUI-first submission: the canonical artifact is the NengoGUI-runnable script. Open it in NengoGUI to watch the spiking neurons trace the attractor in real time across three XY plots.
Run it
We recommend a fresh virtual environment to avoid Nengo/NumPy version conflicts with your global Python install:
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
In NengoGUI:
pip install nengo-gui
nengo lorenz.py
Headless (e.g. to dump a trajectory for offline analysis):
python -c "import nengo; \
from importlib import import_module; \
m = __import__('lorenz').model; \
sim = nengo.Simulator(m); sim.run(5); print(sim.data)"
How it works
The Lorenz system, in the slightly recentered form used here:
dx0/dt = -σ·x0 + σ·x1
dx1/dt = -x0·x2 - x1
dx2/dt = x0·x1 - β·(x2 + ρ) - ρ
A single 3D ensemble x (radius 30, 600 spiking neurons) feeds back into itself through a lorenz(x) function that computes the synapse-corrected update:
out[i] = synapse · dx_i/dt + x[i]
with synapse = 0.1. The ensemble's recurrent connection (with that same synaptic time constant) closes the loop. The result: a stable chaotic attractor implemented entirely in spikes.
Citation
@article{eliasmith2005attractor,
author = {Eliasmith, Chris},
title = {A unified approach to building and controlling spiking attractor networks},
journal = {Neural Computation},
volume = {7},
number = {6},
pages = {1276--1314},
year = {2005}
}
License
GPLv2 (see LICENSE).