The Azimuth Project
Blog - The stochastic resonance program (part 1) (Rev #27)

This page is a blog article in progress, written by David Tanzer. To see discussions of this article while it was being written, visit the Azimuth Forum. Please remember that blog articles need HTML, not Markdown.

guest post by David Tanzer</i>

At the Azimuth Code Project, we are aiming to produce educational software that is relevant to the Earth sciences and the study of climate. Here we will look into the stochastic resonance demonstration program, by Allan Erskine and Glyn Adgie. Stochastic resonance is a widely studied phenomenon, which has an application to the theory of ice-age cycles.

Here we will see how to run the program, then explain the idea of stochastic resonance and its relevance to a hypothesis about the ice-age cycles. Then we give an anatomical description of the program and the algorithm it implements. We conclude with some challenges for extending the program.

The Azimuth models are interactive web pages. Their behavior is responsive, because they are programmed in javascript, which runs right in the browser. As we shall see, they are programmed using a high-level support library support, which allows them to focus primarily on the rogic of the models themselves, rather than upon the presentation mechanisms of the browser.

A test drive of the model

Start by opening the stochastic resonance model web page. It displays a sine wave, called the forcing signal, alongside a chaotic time-series, called the output signal. There are four sliders, labelled A, B, C and D.

  • One slider controls the frequency of the sine wave, and another controls its amplitude. Try them.

  • The output signal depends, through a complex “mechanism” of stochastic resonance, on the sine wave. Change the amplitude and frequency sliders to see how they affect the output signal.

  • The amount of randomization involved in the process is controlled by the noise slider. Use it to get the output to range from completely smooth to completely chaotic.

  • Change the Sample-Path parameter to get a different instance of the random process.

Inventory of the program

The program runs a discrete simulation for a “stochastic differential equation” (SDE), which is a specification for the derivative of the output signal as a function of time, the current signal value, and a noise process.

Here are the functional components of the program:

  1. Interactive controls to set parameters

  2. Plot of the forcing signal (the sine curve)

  3. Plot of the output signal

  4. A function which defines a particular SDE. Stochastic resonance is a characteristic of the solutions to this equation.

  5. A general simulator for SDE’s, based on the Euler method

Going to the source

I would like everyone now to locate the source code, as follows:

  • Open the web page for the model. The code is now downloaded and running in your browser!

  • While there, run your browser’s view-source function. For Firefox on the Mac, it’s Apple-U, for Firefox on the PC it’s click the right mouse or touchpad button then select “View Page Source” from the drop-down menu.

  • You should see the html for the web page itself.

  • See the following header lines, which load javascript programs from various locations on the web into the browser’s internal javascript interpreter:

   <script src=''></script>
    <script src=''></script>
    <script src='./StochasticResonanceEuler.js'></script>
    <script src='./normals.js'></script>

  • Here’s what each line does. MathJax is an open-source formula rendering engine. JSXGraph is a cross-platform library for interactive graphics, function plotting, and data visualization. StochchasticResonanceEuler.js is the main code for the model, and normals.js has a table of random numbers which is used in the main program.

  • Now, click on the link for StochasticResonance.js – and you’ve reached the source!

Your next challenge is to scan through StochasticResonance.js and look for associations with the program inventory listed in the preceding section. Try to put a blur lens over any items that look obscure – the goal here is only to form rough hypotheses about what might be going on.

The concept of stochastic resonance

Now let’s analyze the differential equation that is used in the model. It sets the deterministic part of the derivative to the sum of a time-varying sine wave and a bistable function of the current signal value:

DerivNonrandom(t, x) = SineWave(t, amplitude, frequency) + Bistable(x),

where Bistable(x) = x * (1 - x^2).

Let’s analyze the effects of these terms, both separately and together.

Alone, the sine wave would cause the output signal to vary sinusoidally.

The bistable polynomial has roots at -1, 0 and 1. The root at 0 is an unstable equilibrium, and -1 and 1 are stable. The basin of attraction for -1 is all the negative numbers, the basin for 1 is the positive numbers, and the point of unstable equilibrium separates the basins.

We will view each basin as one of the states of a bistable system.

Now let’s put the sine wave and the bistable polynomial together. If the wave amplitude is not too large, the system will gravitate towards one of the attractors, and then continue to oscillate around it thereafter – it never leaves the basin. But if the wave is large enough, the system will be pulled back and forth between the two basins – the state will resonate with the driving signal.

Now, let’s complete the picture by adding in the noise. Suppose the sine wave was large enough to periodically pull the system close to zero – but not enough to cross it over to the other basin. If we add in some noise, then a well-timed random event could push the system over to the other side. So the noise may trigger state changes, and this will occur with higher probability at certain phases of the sine wave. More noise will lead to transitions on more of the cycles. So the flip-flopping between states will contain a “stochastic reflection” of the driving sine wave. Further noise will cause transitions across a wider range of phases, and enough of it will completely drown out the input signal.

Moral: under the right conditions, the noise may amplify the effect of the input signal.

Relevance of stochastic resonance to the theory of ice ages

The theory of the timing of the ice ages is a fascinating, challenging and open problem in science.

Note: what is informally called an “ice age” is technically known as a glacial maximum, and the term Ice Age refers to a huge period of time that spans thousands of such “ice ages” and the warm periods between them. There have only been four Ice Ages in the history of the Earth, each of which is characterized by a different pattern for the glacial cycles that it contains.

A current hypothesis for the glacial cycling uses a stochastic resonance model. Here, the climate is modeled as a multistable system, and the forcing results from certain slowly varying, cyclical changes in astronomical variables such as the tilt of the Earth’s axis. These are known as Milankovitch cycles, and their periods are on the scale of 10,000 to 100,000 years. That at least puts them in the same ballpark as the intervals between the “ice ages.”

Here we sketch out the hypothesis – not for the purpose of asserting it, but only to suggest how programs like this can play a role in the enterprise of science.

In the very simplest model, the climate has two stable states: a cold, snowball Earth, and a hot, iceless Earth. Each state is self-reinforcing. A frozen Earth is white, so it doesn’t absorb much solar energy, which keeps it cold and frozen. A hot Earth is dark, so it absorbs a lot of solar energy, which keeps it hot and melted. Included in the model is the fact that the glaciers are concentrated in the northern latitudes – and hence the northern temperatures can trigger a change in the state of the climate.

There are three astronomical cycles that contribute to the forcing function:

  • Changing of the eccentricity (ovalness) of the Earth’s orbit, with a period of 100 thousand years

  • Changing of the obliquity (tilt) of the Earth’s axis, with a period of 41 thousand years

  • Precession (rotary wobbling) of the Earth’s axis, with a period of 23 thousand years

These effects sum to produce a multi-frequency variation in the amount of solar energy received in the northern latitudes. The induced temperature changes, however, are not large enough to trigger a state change. According to the stochastic resonance hypothesis, it is other, random variations in the heat received up north that may trigger the climate to change states. One such source of variation may be changes in the amount of heat-trapping gases in the atmosphere.

Regarding the interaction of the greenhouse gases with the cycling of the ice-ages, see the following interesting interchange which took place on the Azimuth blog:

Arrow said, on 4 December, 2012:

Hopefully the extra CO2 is enough to avert the next ice age.

John Baez replied, on 4 December, 2012:

There’s been a lot of work on this, discussed very nicely here:

• Andrew Revkin, The next age and the Anthropocene, Dot Earth, 8 January 2012.

The consensus seems to be that we have put enough CO2 into the air to postpone the next glacial period, perhaps for the next 100,000 years. And this paper:

• Gary Schaffer, Long time management of fossil fuel resources to limit global warming and avoid ice age onsets, Geophys. Res. Lett. 36 (2009), L03704.

suggests that we if we save our remaining fossil fuels, we could head off the next few glacial cycles by burning them at appropriately chosen times. Another possibility would be to deliberately release more potent greenhouse gases than CO2 whenever a glacial period was imminent.

If we were smart, we might be able to manage the Earth’s temperature for quite a while, avoiding glacial periods without turning up the heat full blast as we’re doing now.

For further information, see:

Milankovitch cycle

Stochastic resonance

Purposes of a stochastic modeling program

Our program serves an educational function, which is to show the concept of stochastic resonance, and allow you to interactively explore its behavior. But this type of software also has research applications.

Such programs can be used to experimentally explore certain theoretical questions. Suppose we asked how the effectiveness of a forcing function depends on its frequency. This can be explored, with the current program, by manually varying the frequency parameter, and observing the generated results. On a more systematic basis, we could write a driver program that varies the parameters and applies measures to the output signal.

Such software can also be used to test theories, by generating their predictions and comparing them to actual measurement data. One could imagine, for example, a program that implements a model of the Milankovitch astronomical cycles, then outputs this signal into the state changing model of a particular theory of climate, and then finally compares the output signal of the climate model with historical data.

This is a good example of scientific programming, being used in the service of our understanding of the Earth. It is Azimuth programming.

Implementation of the algorithm

Our scientific program consists of seven functions. The top-level function is initCharts. It dispatches to initControls, which builds the sliders, and initSrBoard, which builds the curve objects for the forcing function and the output signal (called the “position curve” in the program). Each curve object has a method that is responsible for computing the (x,t) values for the displayed time series. These calculation methods get called whenever the defining input parameters are changed. The calculation method for the forcing curve is set to a function that computes the sine wave time series. This function reads the amplitude and frequency values from the sliders.

The calculation method for the output signal is set to the function mkSrPlot, which carries out the actual work of the simulation. Its first action is to define a function for the deterministic part of the derivative:

deriv = Deriv(t,x) = SineCurve(t) + BiStable(x),

Then it constructs a “stepper” function, through the call Euler(deriv, tStep). In general, a stepper function maps the current point (t,x) and a noise sample to the next point (t’,x’). The Euler stepper, in particular, maps ((t,x), noiseSample) to (t + tStep, x + tStep * Deriv(t,x) + noiseSample).

The simulation loop is performed by the function sdeLoop, which is given:

  • The stepper function

  • The noise amplitude (“dither”)

  • The initial point (t0,x0)

  • A randomization offset

  • The number of points to generate

The current point is initialized to (t0,x0), and then the stepper is repeatedly applied to the current point and the current noise sample. The output returned is the sequence of (t,x) values.

The noise samples are read from an array normals[i] and scaled by the noise amplitude. The contains many more data points than are needed by the calculation. The randomization offset controls the starting point in the array, which leads to different instances of the random process.

Changing the program

Now that we’ve tried out the program, downloaded its source code, and understood how it works, it’s time to roll up our sleeves and start tweaking it to do new things!

We’ll proceed by a series of “baby steps.” First let’s get a local copy of the program to run on your machine. Copy the html file and the main java script to a folder on your local machine. I’ll suppose that you’ve stored them into the following folder on your machine: c:\pkg\webmodels.

Now check that the html file is active, by

(TODO: finish this section)

Problems and challenges

(TODO: rewrite for clarity)

  • Effect of frequency

  • Design a study of the effectiveness of signal transmission, as a function of noise amplitude and signal frequency. How you define the effectiveness measure?

  • How would you restructure the code for general, statistical studies of the output time series?

  • When the sliders are moved, an event must be fired, which causes the recalculation to take place. How is this mechanism implemented in the javascript / JSXGraph application library?

  • Modify to add an exponent slider

  • Modify to show graph of expected value (add slider for nTrials) (Not enough random numbers.)

  • Add a standard deviation plot

  • If you are a climate scientist, let us know of next steps

  • Begin to study this book —-, and think of how to write programs for some of the models. Simplify! The hierarchy of models. All models that you post here will be considered as candidates for the Azimuth Code Project page. This may be a way for programmers, ultimately, to give back to the Earth.

Open invitation to the Azimuth Code Project

We’re just beginning to organize for a new round of development. Programmers, we would welcome your participation, on many levels:

  • Discussion and planning on the forum

  • Writing specs for new modelling programs

  • Coding

  • Testing

  • Documentation and blogging

Check out the forum. If you’re interested in participating, just send a request to John Baez for a login. No earnest request will be denied!

(TODO: scale this back just a bit. We’re more in a brainstorming phase, so e.g. there is no testing to be done.)

category: blog