I provide a procedure, download StoNormForm.zip, to construct a normal form system for a specified system of slow/fast/hyperbolic non-autonomous ordinary differential equations or stochastic differential equations. Thus the procedure may be used to construct and prove stochastic invariant manifolds, and their foliation, and thus analyse bifurcations or complex behaviour in the stochastic/non-autonomous system.

The procedure uses computer algebra, the package Reduce, to construct approximations to the invariant manifolds.

  1. So download and install Reduce, and then download StoNormForm.zip.
  2. Start-up Reduce in the unzipped  StoNormForm  folder.
  3. Execute  in_tex "StoNormForm.tex"$  to load the procedure.
  4. Test by executing  examplenormalform();  and confirm the output is as in  stoNormForm.pdf 
  5. See examples in  manyExamples.pdf  and then try for systems of your interest.
Maybe use the web service  Alternatively, click this link to expand this page. Then via the web form below you obtain a normal form of any supplied stochastic differential equation (SDE), or deterministic, autonomous or non-autonomous, ODE, when the SDE has fast and slow modes. The normal form decouples the slow modes from the fast and so supplies you with a faithful large time model of the stochastic dynamics. Being a coordinate transform you are assured that the dynamics are attractive over some finite domain and apply for all time.

For example, the web form could help you analyse the stochastic bifurcation in the Stratonovich stochastic system \[\begin{array}{l} \frac{dx}{dt}=a x-xy, \\ \frac{dy}{dt}=-y+x^2-2y^2+w(t) \end{array}\] where near the origin \(x(t)\) evolves slowly, \(y(t)\) decays quickly to some quasi-equilibrium, but the white noise\(~w(t)\) `kicks' the system around. As parameter\(~a\) crosses zero, a stochastic bifurcation occurs. A stochastic, near identity, coordinate transform, \(x=X(t)+\cdots\) and \(y=Y(t)+\cdots\), decouples the fast/slow dynamics in the new variables\(~X(t)\) and\(~Y(t)\) so you are empowered to deduce the true slow/fast dynamics in the bifurcation. Just click on the Submit button to see.

The source code is now available for collaborative development via the folder StochasticNormalForm of a Github repository

Submit your SDE/ODE for analysis

Fill in the fields below for your SDE system:
  • your m slow variables must be denoted x(1),...,x(m);
  • your ny fast stable variables must be denoted y(1),...,y(ny);
  • your nz fast unstable variables must be denoted z(1),...,z(nz);
  • the fast variables must be linearly decoupled, that is, the linear dynamics have been diagonalised; each of the linear decay/growth rates of the fast variables must be a positive number;
  • any number of Stratonovich white noises (derivatives of Wiener processes) or non-autonomous time dependent factors may be present, they must be denoted w(any) where `any' denotes almost any label of your choice---numeric labels are usual;
  • the noises w() must occur linearly in the RHSs of the SDEs, but may be multiplied by fast or slow variables;
  • simply omit all w()s to analyse an autonomous system of ODEs;
  • for the moment, the SDEs must be either multinomial in form or a rational multinomial---if the latter, then multiply through by a common denominator transfer to the RHS the nonlinear terms involving time derivatives, to end up with a multinomial RHS that includes nonlinear terms with a time derivative factor;
  • Use the syntax of Reduce for the algebraic expressions
More interesting examples are listed at the end of this web page, and many more are listed in the Github repository.

Enter the magic word "g a l a h" into

Description Specify your SDE/ODE
Slow modes: the RHS of each of the m S/ODEs dx(1)/dt,...,dx(m)/dt separated by commas. Use w(any) to denote noise/non-autonomous terms.
Fast stable modes the RHS of the ny S/ODEs dy(1)/dt,...,dy(ny)/dt each separated by commas. Use w(any) to denote noise/non-autonomous terms.
Fast unstable modes the RHS of the nz S/ODEs dz(1)/dt,...,dz(nz)/dt each separated by commas. Use w(any) to denote noise/non-autonomous terms.
Order of error of the analysis in the `nonlinear' terms on the RHS.
Choose manifold: csuman = entire state space normal form (default); cman = centre (slow) manifold; sman = stable manifold; uman = unstable manifold; csman = slow-stable manifold; cuman = slow-unstable manifold.
Print expressions with the following variables factored---this does not affect the analysis, but must not be empty. I auto-label all noise terms with variable sig.

Wait a minute or two

The analysis may take minutes after submitting. Be patient. Read the following. Please inform me of any problems.

In the results

  • Each xx(i) denotes the new true slow variable \(X_i\) where the original \(x_i=X_i+(\text{modifications})\), each yy(i) denotes the new fast stable variable \(Y_i\) where the original \(y_i=Y_i+(\text{modifications})\), and each zz(i) denotes the new fast unstable variable \(Z_i\) where the original \(z_i=Z_i+(\text{modifications})\),
  • ou(w,tt,r) denotes Ornstein--Uhlenbeck convolution over the non-autonomous forcing/Stratonovich process \(w(t)\) (not Ito): ou(w,tt,r)\({}=\exp(rt)\star w(t)\) where the star * denotes convolution which is done over the past history of the process \(w(t)\) when \(r<0\), and done over the future (!) of the process \(w(t)\) when \(r>0\).
  • For explanations and relevant theory, see
  • Although this service is phrased in terms of Stratonovich interpretation of noise processes, I conjecture that the results of this service also apply to \(w(t)\) representing Poisson processes, Levy flights, or jump processes. The reason is that the Marcus interpretation of the calculus of such systems "enjoys all the properties one would expect from the Stratonovich integration rule, namely, the conventional change of variables formula and the validity of the coloured noise approximations" ( Chechkin and Pavlyukevich, 2014). These rules of calculus are what we need for the constructed coordinate change.

Levy area contraction

Another example system (adapted from Greg Pavliotis) is \[\begin{array}{l} \frac{dx_1}{dt}=\epsilon y_1,\\ \frac{dx_2}{dt}=\epsilon y_2,\\ \frac{dx_3}{dt}=\epsilon (x_1y_2-x_2y_1),\\ \frac{dy_1}{dt}=-2y_1-ay_2+w_1(t),\\ \frac{dy_2}{dt}=-3y_2+ay_1+w_2(t). \end{array}\] Copy and paste the following into the above form.
Description Specify your SDE/ODE
Slow modes: small*y(1), small*y(2), small*(x(1)*y(2)-x(2)*y(1))
Fast stable modes -2*y(1)-a*y(2)+w(1), -3*y(2)+a*y(1)+w(2)
Fast unstable modes
Order of error 4
Print sig,small
To cope with the off-diagonal terms, the algorithm modifies the system to \( \dot x_{1}=\varepsilon ^{2} y_{1}\,,\quad\) \( \dot x_{2}=\varepsilon ^{2} y_{2}\,,\quad\) \( \dot x_{3}=\varepsilon ^{2} \big(-x_{2} y_{1}+x_{1} y_{2}\big)\,,\quad\) \( \dot y_{1}=\sigma w_{1}-\varepsilon y_{2} a-2 y_{1}\,,\quad\) \( \dot y_{2}=\sigma w_{2}+\varepsilon y_{1} a-3 y_{2}\,,\) and computes the following results in which the new slow and fast variables have been nonlinearly separated by the time dependent coordinate transform.

Near identity, time dependent coordinate transform

\( y_{1}\approx \sigma \varepsilon \big(-{e^{-2t}\star}w_{2}\, a+{e^{-3t}\star}w_{2}\, a\big)+\sigma {e^{-2t}\star}w_{1}\,+\varepsilon Y_{2} a+Y_{1}\,,\quad\) \( y_{2}\approx \sigma \varepsilon \big({e^{-2t}\star}w_{1}\, a-{e^{-3t}\star}w_{1}\, a\big)+\sigma {e^{-3t}\star}w_{2}\,+\varepsilon Y_{1} a+Y_{2}\,,\quad\) \( x_{1}\approx -1/2 \sigma \varepsilon ^{2} {e^{-2t}\star}w_{1}\,-1/2 \varepsilon ^{2} Y_{1}+X_{1}\,,\quad\) \( x_{2}\approx -1/3 \sigma \varepsilon ^{2} {e^{-3t}\star}w_{2}\,-1/3 \varepsilon ^{2} Y_{2}+X_{2}\,,\quad\) \( x_{3}\approx \sigma \varepsilon ^{2} \big(-1/3 {e^{-3t}\star}w_{2}\, X_{1}+1/2 {e^{-2t}\star}w_{1}\, X_{2}\big)+\varepsilon ^{2} \big(1/2 X_{2} Y_{1}-1/3 X_{1} Y_{2}\big)+X_{3}\,.\)

Resultant normal form S/ODEs

\( \dot Y_{1}\approx -\varepsilon ^{2} Y_{1} a^{2}-2 Y_{1}\,,\quad\) \( \dot Y_{2}\approx \varepsilon ^{2} Y_{2} a^{2}-3 Y_{2}\,,\quad\) \( \dot X_{1}\approx -1/6 \sigma \varepsilon ^{3} w_{2} a+1/2 \sigma \varepsilon ^{2} w_{1}\,,\quad\) \( \dot X_{2}\approx 1/6 \sigma \varepsilon ^{3} w_{1} a+1/3 \sigma \varepsilon ^{2} w_{2}\,,\quad\) \( \dot X_{3}\approx \sigma \varepsilon ^{3} \big(1/6 w_{2} X_{2} a+1/6 w_{1} X_{1} a\big)+\sigma \varepsilon ^{2} \big(1/3 w_{2} X_{1}-1/2 w_{1} X_{2}\big).\)

Travelling waves in fluctuating kdV example

Potzsche and Rasmussen (2006) [Example 5.4] sought travelling wave solutions, \(u(x-c^2t)\) with wave speed\(~c^2\), of a modified KdV equation. This leads to the system \(\dot u_1=u_2\), \(\dot u_2=u_3\), \(\dot u_3=c^2u_2-a(t)u_1^2u_2\). For simplicity I set \(c^2=1\). A transform to diagonalise the linear part into slow variable\(~x\), stable\(~y\) and unstable\(~z\) is then that \(u_1 = x+y+z\), \(u_2 = z - y\) and \(u_3 = z + y\).

Using w(a) to denote the variable coefficient\(~a(t)\) (represented in the output by\(~\sigma w_a\)), copy and paste the following into the above form.

Description Specify your SDE/ODE
Slow modes: w(a)*(x(1)+y(1)+z(1))^2*(z(1)-y(1))
Fast stable modes -y(1)-w(a)*(x(1)+y(1)+z(1))^2*(z(1)-y(1))/2
Fast unstable modes +z(1)-w(a)*(x(1)+y(1)+z(1))^2*(z(1)-y(1))/2
Order of error 3
Print sig,small
Putting \(Z_1 = 0\) into the resulting coordinate transform gives the centre-stable manifold; conversely, putting \(Y_1 = 0\) gives the centre-unstable manifold. The expressions have the same convolutions as those of Potzsche and Rasmussen (2006).

If you like this web page, please link to it so others can find it more easily.