42 lines
1.9 KiB
Org Mode
42 lines
1.9 KiB
Org Mode
---
|
|
title: "Randomness and Uncertainty: from random noise to predictable oscillations via differential equations"
|
|
date: 2023-10-20
|
|
tags: diffeq
|
|
toc: false
|
|
---
|
|
|
|
This [[https://www.lms.ac.uk/sites/default/files/inline-files/NLMS_505_for%20web.pdf#page=24][article (PDF)]] by Nick Trefethen in the [[https://www.lms.ac.uk/publications/lms-newsletter][/London Mathematical
|
|
Society Newsletter/]] demonstrates an interesting relationship between
|
|
what we perceive as "randomness" and what we perceive as "certainty".
|
|
|
|
There are many ways to generate pseudo-random numbers that look
|
|
perfectly "random" but are actually the output of fully deterministic
|
|
processes. Trefethen gives an example of a chaotic system based on a
|
|
logistic equation.
|
|
|
|
But more interesting (to me) and more original may be the other way
|
|
around: how to get certainty from randomness. There are ordinary
|
|
differential equations that can take random noise as input, and whose
|
|
solution is very stable, oscillating between two possible
|
|
values. Given a function $f$ approximating random white noise, the
|
|
solution to the ODE
|
|
\[ y' = y - y^3 + Cf(t) \]
|
|
is "bistable" and remains always around -1 and 1. The parameter $C$
|
|
allows to control the half-life of the transitions.
|
|
|
|
To explore this behaviour, I replicated Trefethen's experiments in
|
|
Python with the [[https://docs.kidger.site/diffrax/][Diffrax]] library (a differential equations solver based
|
|
on [[https://jax.readthedocs.io/][JAX]]). The full code is [[https://gist.github.com/dlozeve/4924e71097e1d86933e8d5528cd2f6b4][in this Gist]].
|
|
|
|
It suffices to define a simple function for the vector field and to
|
|
give it to a solver:
|
|
#+begin_src python
|
|
def f(t, y, args):
|
|
return y - y**3 + 0.4 * args[t.astype(int)]
|
|
#+end_src
|
|
where ~args~ will be the input, as a simple array of
|
|
normally-distributed random values. $C$ is hardcoded as 0.4 as in the
|
|
article, but could be passed through ~args~ as well (it can be a
|
|
dictionary).
|
|
|
|
[[../images/randomness_uncertainty.png]]
|