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 working to produce educational software that is relevant to the Earth sciences and the study of climate. Here we will look into a stochastic resonance demonstration program, by Allan Erskine and Glyn Adgie. Stochastic resonance, which was originally introduced in a hypothesis about the timing of ice-age cycles, is a widely studied phenomenon, with applications in multiple fields, including the neuronal detection mechanisms of crickets and crayfish. After explaining how to run the program, we’ll explain the math behind the model, and then move on to dissect the program and its algorithm.
The Azimuth models are interactive web pages. Their behavior is responsive, because the code runs right in the browser, as javascript. They make use of a high-level support library (JSXGraph), which allows them to focus logic of the models rather than the presentation mechanisms of the browser.
Start by opening the stochastic resonance model web page. On the same plot it shows a sine wave, called the forcing signal, and a chaotic time-series, called the output signal. There are four sliders, which we’ll call Amplitude, Frequency, Noise and Sample-Path.
• The Amplitude and Frequency sliders control the sine wave. Try them out.
• The output signal depends, in a complex way, on the sine wave. Vary Amplitude and Frequency to see how they affect the output signal.
• The amount of randomization involved in the process is controlled by the Noise slider. Verify this.
• Change the Sample-Path slider to get a different instance of the process.
The program runs a discrete approximation for a “stochastic differential equation” (SDE), which specifies the derivative as a function of time, the current signal value, and a noise process.
The program consists of the following components:
Interactive controls to set parameters
Plot of the forcing signal (sine curve)
Plot of the output signal
A function which defines a particular SDE
A general simulator for SDE’s, based on the Euler method
I would like everyone now to locate the source code, as follows:
• Open the model web page. The code is now downloaded and running in your browser!
• While there, run your browser’s view-source function. For Firefox on the Mac, click Apple-U. For Firefox on the PC click the right mouse or touchpad button and then select “View Page Source” from the drop-down menu.
• You should see the html for the web page itself.
• Note the following lines at the head of the file, which refer to javascript programs on the web:
<script src='http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default'></script> <script src='http://cdnjs.cloudflare.com/ajax/libs/jsxgraph/0.93/jsxgraphcore.js'></script> <script src='./StochasticResonanceEuler.js'></script> <script src='./normals.js'></script>
• Each of these lines causes the browser to load the indicated program into its internal javascript interpreter. 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, and normals.js supplies random numbers to the main calculation.
• Within the view-source window, click on the link for StochasticResonanceEuler.js – and you’re there!
Your next challenge is to scan through StochasticResonanceEuler.js and associate its contents with the Program Inventory listed above. Try to put a blur lens over any items that look obscure – the goal here is only to form rough hypotheses.
Let’s analyze the differential equation used in the model. The deterministic part of the derivative is set to the sum of a time-varying sine wave and a bistable function of the current signal value:
DerivDeterministic(t, x) = SineWave(t, amplitude, frequency) + Bistable(x),
where Bistable(x) = x (1 - x^{2}).
Now let’s analyze the effects of these terms.
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 equilibria. 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 isn’t 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 oscillate between the two basins.
Now, let’s add the noise into the picture. Suppose the sine wave was large enough to periodically pull the system close to zero – but not enough for it to cross over. Then a well-timed noise event could push the system over to the other side. So there will be a phase-dependent probability of the noise triggering a state change. More noise will lead to transitions on more of the cycles. In the flip-flopping between states, we will see a stochastic reflection of the driving sine wave. Further noise will lead to multiple transitions within the cycles, thereby drowning out the signal.
Moral: under the right conditions, the noise may amplify the effect of the input signal.
Stochastic resonance was originally introduced to explain the roughly 100,000 year cycles of the “ice-ages.” There, the climate is modeled as a bistable system, in which one state is a cold, snowball Earth, and the other is a hot, iceless Earth. The snowball Earth is stable because it is white and reflects solar energy, which keeps it cold; the iceless Earth is stable because it is dark and absorbs solar energy, which keeps it hot and melted. The forcing signal was taken to be the Milankovitch astronomical cycles – tilting and precession of the Earth’s axis, and variation in the eccentricity of the Earth’s orbit – which occur with periods measured in tens of thousands of years, and which vary the amount of solar energy received in the northern latitudes. The theory maintained that this signal itself was insufficient to cause the climate to change states, but well-timed noise events could trigger the climate to change state.
But this stochastic resonance hypothesis has not been confirmed.
Since then stochastic resonance has been found to exist in a wide range of natural and artificial systems, including particularly the signal detection mechanisms of neurons. For instance, there are cells in the tails of crayfish which are tuned to respond to certain low-frequency signals in the movement of the water, presumably arising from the motions of predators in the water. But in the absence of noise, these signals are not strong enough to raise the neurons to the firing threshold. But in the presence of ambient noise, these signals do cause the neurons to fire.
Note this is a more generalized notion of stochastic resonance, which does not depend upon the system being bistable. All that is required is that there be a threshold for signal detection, and that a certain level of noise is required to boost the signal across the detection threshold.
For further information, see:
• David Lyttle, Stochastic resonance in neurobiology, May 2008
• Stochastic resonance, Azimuth Library
Besides serving an educational function, such programs also have applications within research: (1) they can be used to perform computational experiments in the pursuit of purely theoretical questions, and (2) they can be used to test empirical theories, by generating their predictions and comparing them to observed and historical data.
For an example of concept exploration, suppose we asked how the effectiveness of a forcing function depends on its frequency. With the current program, we could vary the frequency parameter, and observe how it affects the output. On a more systematic basis, we could write a driver program that varies the parameters and applies measures to the output signal.
For an example of theory testing, one could imagine 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.
Here we see a nice example of scientific programming, in the service of our understanding of the Earth. It is a natural part of the Azimuth project, whose North Star is the idea of science that really matters for human survival.
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 “position curve” in the program). Each curve object is assigned a function that computes the (x,t) values for the time series, which gets called whenever the input parameters change. The function assigned to the forcing curve, which computes the sine wave, reads the amplitude and frequency values from the sliders.
The calculation method for the output signal is set to the function mkSrPlot, which performs the simulation. It begins by defining 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 maps ((t,x), noiseSample) to (t + tStep, x + tStep * Deriv(t,x) + noiseSample).
The simulation loop is then 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 set 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 normally distributed random numbers stored in an array. They get scaled by the noise amplitude when they are used. The array contains more values than are needed. By changing the starting point in the array, different instances of the process are obtained.
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!
First we’ll make a local copy of the program on your local machine, and get it to run there. Open the html file, and paste its contents into a file, say c:/pkg/stochasticResonance.html. Then paste the source code, and normals.js.
Now point your browser to the file, to make sure that you see the contents, and the model runs. To prove that you’re really executing the local copy, make a minor edit to the html text, and check that it shows up when you reload the page. Then make a minor edit to StochasticResonanceEuler.js, say by changing the label text on the slider from “forcing function” to “forcing signal.”
• Change the color of the sine wave.
• Change the exponent in the bistable polynomial to values other than 2, to see how this affects the output.
• Add an integer-valued slider, to control this exponent.
• Modify the program to perform two runs of the process, and show the output signals in different colors.
• Modify it to perform ten runs, and, using the current output format, display the average of the ten signals.
• Add an input slider to control the number of runs.
• Add another plot, which shows the standard deviation of the output signals, at each point in time.
• Replace the precomputed array of normal random variates with a runtime computation that uses a random number generator. Use the Sample-Path slider to seed the random number generator.
• When the sliders are moved, explain the flow of events that causes the recalculation to take place.
I have created the following wiki page for people wish to share any of their code, and notes, related to this article. Just create a section with your name.
What is the impact of the frequency of the forcing signal on its transmission through stochastic resonance?
• Make a hypothesis about the relationship.
• Check your hypothesis by varying the Frequency slider.
• Write a function to measure the strength of the output signal at the forcing frequency. Let sinwave be a discretely sampled sine wave at the forcing frequency, and coswave be a discretely sampled cosine wave. Let sindot = the dot product (sum product) of sinwave and the output signal, and similarly for cosdot. Then the power measure is sindot^{2} + cosdot^{2}.
• Modify the program to perform N trials at each frequency over some specified range of frequency, and measure the average power over all the N trials. Plot the dependence of power on frequency.
• The above plot required you to fix a wave amplitude and noise level. Choose 5 different noise levels, and plot the five curves in one figure. Choose your noise levels in order to explore the range of qualitative behaviors.
• Produce several versions of this five-curve plot, one for each sine amplitude. Again, choose your amplitudes in order to explore the range of qualitative behaviors.
We are starting to prepare for a new round of development at the Azimuth Code Project. Stay tuned, or, better yet, come join us at the Azimuth Forum and help us to work out some specifications for continuation of the work described in this blog article.
Note: here is the followup blog article: The Azimuth Code Project: where we stand today