Belousov–Zhabotinsky reaction, made using self-written Java program (source code)


Source image A Belousov–Zhabotinsky reaction is a nonlinear chemical oscillator: a fascinating phenomenon where a chemical reaction does not achieve equilibrium but instead oscillates between different states. These reactions can be simulated using a two-dimensional cellular automaton similar to the Game of Life. This implementation is based on the work of Nitori Kawashiro, and uses a dynamic image to visualize the state of the simulation.

Belousov-Zhabotinsky reaction is a class of chemical reactions occurring in an oscillatory mode, in which some parameters of the reaction (color, concentration of components, temperature, etc.) change periodically, forming a complex space-time structure of the reaction medium.

Under certain conditions, these systems can demonstrate very complex forms of behavior from regular periodic to chaotic oscillations and are an important object of investigation of universal regularities of nonlinear systems. In particular, it was in the Belousov-Jabotinsky reaction that the first experimental strange attractor in chemical systems was observed and its theoretically predicted properties were experimentally tested.

History of discovery of oscillatory reaction B. P. Belousov, experimental study of its and numerous analogues, study of mechanism, mathematical modeling, historical significance are given in the collective monograph.

Interesting facts

The Belousov-Jabotinskin reaction, or BZ reaction, is an oscillating reaction, first demonstrated in 1950 by the Russian chemist Boris Pavlovitch Belousov.


Fortuitous discovery by Belooussov.

In the early 1950s, biochemist Boris Pavlovitch Belooussov, who worked in the Biophysics Laboratory of the USSR Ministry of Health, was trying to develop an inorganic cycle similar to the Krebs cycle, a metabolic process in which citric acid is a reaction intermediate. In the course of this research, he thought of reacting bromate ions BrO3- on citric acid in the presence of ceric ions Ce4+, which would act as a catalyst. Belooussov hoped to reduce cerium (IV) to cerium (III), which would cause the solution to discolor, losing its yellow color. However, when the chemist performed the experiment, his observations were quite different, since he observed a periodic succession of colorations and discolorations of the reaction medium: Belooussov had just discovered by chance the first oscillating reaction, which was relatively easy to observe.

Belooussov tried to explain the colored oscillations he witnessed with the help of a reaction mechanism he had developed.

He wrote a paper that he submitted to a first journal, but the reporter refused, stating that his experiment was contrary to the second principle of thermodynamics, despite the photographs of the different phases of the reaction, which Belousov added. Although Belooussov was refused a second publication in another periodical six months later, he managed to share his work in the report of a conference he gave in 1958.

Study of the reaction by Jabotinski

In spite of the lack of recognition of the discovery, Belooussov’s reaction interested researchers in a few laboratories around Moscow, so much so that in 1961, Anathol Jabotinski, a young biophysicist, chose to study it during his thesis. He resumed the experiment carried out by Belooussov, while modifying certain reagents: citric acid was replaced by malonic acid, and a redox indicator, ferrous orthophenanthroline, was added to the reaction medium. Jabotinsky in turn observed the oscillations reported by Belooussov. The latter, who was informed by letter, died in 1970 without having agreed to meet the biophysicist. Nevertheless, in 1980, they were jointly awarded the Lenin Prize for their discovery, and the name “Belousov-Jabotinsky reaction” now pays tribute to them.


View of a pattern consisting of a succession of blue and red waves obtained during the reaction. Pattern obtained in a Petri dish. By mixing five common compounds in water, at room temperature, the state of equilibrium is not directly reached: the solution then oscillates between two states, with great regularity and this, during nearly a hundred cycles, until exhaustion of one of the reagents. Classically, this oscillating reaction is carried out in a Petri dish where concentration waves appear on the surface and evolve periodically.

Source code, and uses a dynamic image to visualize the state:

    <link type="text/css" rel="stylesheet" href="ex.css?3.2"/>
    <script type="text/javascript" src="../protovis-r3.2.js"></script>
    <script type="text/javascript" src="bzr.js"></script>
    <style type="text/css">

body {
  background: #222;

#fig {
  width: 300px;
  height: 300px;

  <body><div id="center"><div id="fig">
    <script type="text/javascript+protovis">

var vis = new pv.Panel()
    .width(bzr.size * 3)
    .height(bzr.size * 3);

    .def("init", function() bzr.update())
    .event("click", function() bzr.reset());


setInterval(function() vis.render(), 42);



 * Simulation of a Belousov-Zhabotinsky reaction using a two-dimensional
 * cellular automaton. This algorithm is based on the work of Nitori Kawashiro;
 * see

var bzr = {};

bzr.color = function(x, y) {
  var p = y * bzr.size + x;
  return {r: bzr.a[p] * 255, g: bzr.b[p] * 255, b: bzr.c[p] * 255, a: 255};

bzr.reset = function(n) {
  if (!arguments.length) n = bzr.size;
  var a = bzr.a = [],
      b = bzr.b = [],
      c = bzr.c = [];
  bzr.size = n;
  for (var y = 0, p = 0; y < n; y++) {
    for (var x = 0; x < n; x++, p++) {
      a[p] = Math.random();
      b[p] = Math.random();
      c[p] = Math.random();

bzr.update = function() {
  var a = bzr.a.slice(),
      b = bzr.b.slice(),
      c = bzr.c.slice(),
      n = bzr.size;
  for (var y = 0, p = 0; y < n; y++) {
    for (var x = 0; x < n; x++, p++) {

      /* Compute neighbor averages, with wrap-around. */
      var sa = 0, sb = 0, sc = 0;
      for (var j = y - 1; j < y + 2; j++) {
        for (var i = x - 1; i < x + 2; i++) {
          var q = (j < 0 ? j + n : j >= n ? j - n : j) * n
                + (i < 0 ? i + n : i >= n ? i - n : i);
          sa += a[q];
          sb += b[q];
          sc += c[q];
      sa /= 9;
      sb /= 9;
      sc /= 9;

      var ta = sa + sa * (sb - sc);
      var tb = sb + sb * (sc - sa);
      var tc = sc + sc * (sa - sb);
      bzr.a[p] = ta < 1 ? ta : 1;
      bzr.b[p] = tb < 1 ? tb : 1;
      bzr.c[p] = tc < 1 ? tc : 1;