Skip to content

Instantly share code, notes, and snippets.

@tchnmncr
Created December 4, 2020 22:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tchnmncr/fa6b890e6474cc93b32990dfffc89c9a to your computer and use it in GitHub Desktop.
Save tchnmncr/fa6b890e6474cc93b32990dfffc89c9a to your computer and use it in GitHub Desktop.
Lyapunov Exponent (Processing)
/** Lyapunov Exponent
*
* Based on code on pg. 62 of _Chaos in Wonderland_
* by Clifford A. Pickover
*
*/
float calcLyapunovExponent(float a, float b, float c, float d) {
float Lsum = 0;
float n = 0;
float x = 0.1;
float y = 0.1;
float xe = x + 0.000001;
float ye = y;
float xx, yy, xsave, ysave, dLx, dLy, dL2, df, rs, L = 0;
float bigNumber = 2139095039; /* Pickover's algorithm calls
for a long int (1000000000000) here, but I often get NaN returned
when using it in Processing, and I have found that using a
large float returns a value close enough to Pickover's to
be useful. */
for(int i=0; i<10000000; i++) {
xx = sin(y*b) + c*sin(x*b); yy = sin(x*a) + d*sin(y*a);
xsave = xx; ysave = yy; x = xe; y = ye; n++;
xx = sin(y*b) + c*sin(x*b); yy = sin(x*a) + d*sin(y*a);
dLx = xx - xsave; dLy = yy - ysave; dL2 = dLx*dLx + dLy*dLy;
df = bigNumber*dL2; rs = 1/sqrt(df);
xe = xsave + rs*(xx - xsave); ye = ysave + rs*(yy - ysave);
xx = xsave; yy = ysave; Lsum = Lsum + log(df); L = 0.721347*Lsum/n;
x = xx; y = yy;
}
return L;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment