Introduction
Nonlinear and chaotic systems are often governed by seemingly simple rules, yet produce astonishingly rich behavior. The Lorenz system is a classic example. It originated from Edward Lorenz’s simplified model of atmospheric convection and was pioneering work in the development of chaos theory. It has always captivated me and many others.
I recall seeing an analog circuit that implemented the Lorenz system at an APS conference some years back, and I have always wanted to replicate it ever since. I finally did. I’d like to share details about the build and design for others who want to build one for themselves. Other tutorials I found online didn’t go into sufficient detail about how the circuit worked, from equations to components.
Hopefully this will help others who want to understand in depth why it works, rather than just following a given circuit diagram on faith. I hope the reader will take away from this article not just an understanding of this particular implementation, but a framework that generalizes and allows them to apply it to other differential equations of interest. If you’re interested in dynamical systems, analog computing, and electronics, this is a really fun and simple build, and it’s so satisfying to see the Lorenz attractor come to life on an oscilloscope.
I learned a lot from this book: A Concise Guide to Chaotic Electronic Circuits by Arturo Buscarino et al. I followed its methodology of systematically going from equation to circuit. The book does cover the Lorenz system and comes up with a circuit diagram. However, I decided on a simpler circuit design based on one from Paul Horowitz at Harvard University, discussed in this video and the associated article. My build differs in its choice of resistor values (scaled by a constant factor that doesn’t affect the dynamics) based on the resistors I had on hand. I also used different multiplier and op-amp components, but they are functionally the same.
The Lorenz system is governed by this set of differential equations:
and the standard parameter choice which demonstrates chaos is
What makes this system especially interesting in hardware is that the equations map naturally onto analog computing blocks. Voltages represent the state variables , , and . Op-amp integrators and summing stages implement the linear pieces of the dynamics, while analog multipliers generate the nonlinear and terms. With the right scaling, the circuit continuously solves the differential equations in real time.
From dimensionless equations to voltages and seconds
The Lorenz equations above are dimensionless — , , , and are all pure numbers. To map them onto an analog circuit we need to give the state variables units of voltage and time units of seconds. We do this with the following change of variables.
Let , , (in volts) and (in seconds) be the dimensionful counterparts, related to the dimensionless variables by
Here , , are voltage scale factors and is a rate with units of . Equivalently : one unit of dimensionless time corresponds to seconds of real time.
For this build I take
With the standard parameters the dimensionless states stay roughly within and , so and — comfortably inside the supply rails of the op-amps and multipliers, with enough headroom to avoid clipping.
Substituting , , , and into the dimensionless equations and tidying up gives the dimensionful system:
A quick units check: every term on the right-hand side works out to volts per second, as it must for the derivative of a voltage. The linear terms carry one factor of (with units ), and the bilinear terms carry which has units of — exactly what is needed for a product like or (volts²) to come out in volts per second.
Two separate design choices live in these equations:
- sets the speed. It will be set by the integrator time constant in the next section. Smaller slows the attractor down; larger speeds it up. Choosing in the range of – produces an attractor that evolves on a millisecond-to-tenths-of-a-second timescale — slow enough to watch unfold on a scope, fast enough to look continuous.
- sets the amplitude. The choice keeps the state voltages in the few-volt range, well within rail. It is also chosen to line up with the AD633 analog multiplier’s built-in scale factor (in the denominator of its transfer function), which keeps the product-term resistors clean — as we’ll see when we wire up those terms.
The building block: a summing integrator
Every one of the three equations is built from the same circuit: an op-amp with several input resistors feeding its inverting input, a capacitor in the feedback path, and the non-inverting input grounded. With an ideal op-amp the inverting input sits at a virtual ground, so the current through each input resistor is simply — independent of all the others. Since no current flows into the op-amp itself, every bit of it has to flow through the capacitor. That single node equation is the entire device:
To turn this relation into actual resistor values, it helps to write it a second way. Multiply both sides by for some reference resistance . The rate we defined earlier is exactly , so that prefactor is just :
Now the entire time scale sits in the single on the left, and every coefficient on the right is a pure resistance ratio . Sizing a stage becomes almost mechanical: write the equation it has to implement in this same form, and whatever number multiplies an input is that input’s ratio . I’ll fix the reference at throughout, so each resistor follows from .
The three stages
Each Lorenz equation becomes one integrator stage. For each, I take its dimensionful equation from above, multiply through by to expose the resistance ratios, and read off the resistors. The signs work out so that the stages output , , and — exactly the polarities their neighbors need, with no standalone inverters.
The X stage
Multiplying by and putting in :
The two inputs are and the fed-back output . Both coefficients are , so both want :
The Y stage
Multiplying by , with :
The first two terms read off directly: gives , and gives . The product term needs one extra step, because the AD633 returns not but . Rewriting against that actual input, with :
So the multiplier path carries coefficient , and . Choosing to line up with the multiplier’s built-in is what lands this path on a clean .
The Z stage
Multiplying by , with :
The product path repeats the -stage trick, so . The decay term gives , so
Notice the pattern: every resistor came out as divided by a Lorenz coefficient, so across the board. The odd-looking and are just and in disguise. Only the product is pinned down, through : with and a watchable , the integrating capacitor is .
The multipliers
Each product term comes from an AD633 analog multiplier. The AD633 computes the following in an analog fashion: , where is a summing input added straight to the output — grounding it () leaves a clean scaled product. Choosing which difference input carries the negative sign, one multiplier forms for the stage and a second forms for the stage:
Putting it all together
That is the whole design — there is no separate master schematic to untangle. Each block was built to expose exactly the signals its neighbors need, so the complete circuit is just these stages and multipliers with their outputs wired to the matching inputs. The only feedback already drawn in the stage diagrams is each integrator’s capacitor; the resistive connections — including each stage’s own output looping back through its input resistor, which forms the linear decay term — still have to be wired. Each output goes to:
- → the stage, the stage, and both multipliers
- → the stage, the stage, and the multiplier
- → the stage and the multiplier
- → the stage
- → the stage
Because each stage outputs the sign its consumers need, no separate inverting amplifiers are required anywhere. Wire those connections together and the loop solves the Lorenz equations on its own.
The Build
The whole thing is a short parts list. The two product terms run through a pair of AD633 analog multipliers, and the three integrators share a single TL084CN, a quad op-amp. The multipliers are the most expensive component at around $18 each; everything else is standard resistors, capacitors, and that one op-amp chip. It’s remarkable how few components it takes to continuously solve the Lorenz equations in real time.
For power, I used two 12V DC adapters wired in series: I connected the negative terminal of one adapter to the positive terminal of the other, and that junction becomes the common ground (0V). This gives the three voltage levels needed for the op-amp and multiplier rails — the free positive terminal sits at +12V and the free negative terminal at −12V relative to that ground.
Oscilloscope Capture
Once the circuit is wired correctly, the nicest view is the oscilloscope in XY mode, with X on one channel and Z on the other. That X–Z projection gives the familiar butterfly shape of the Lorenz attractor:
I captured the three state voltages on my Rigol DHO804 via its rear USB port using pyvisa to pull the raw waveform data, then plotted them directly as a rotating 3D reconstruction of the attractor. Enjoy!