aboutsummaryrefslogtreecommitdiff
path: root/lyapunov.c
diff options
context:
space:
mode:
authorHans-Christoph Steiner <eighthave@users.sourceforge.net>2011-10-20 04:37:06 +0000
committerHans-Christoph Steiner <eighthave@users.sourceforge.net>2011-10-20 04:37:06 +0000
commit9ed18c7064226e1edc06f5a51fd569083971d448 (patch)
tree1069dc91e062bd557c61e43cbdac5d611a42a018 /lyapunov.c
parent56e77e8ed1b5dba873991b114d55cb1d399d47f5 (diff)
ported chaos to the Library Template, now with libchaos support
svn path=/trunk/externals/bbogart/chaos/; revision=15625
Diffstat (limited to 'lyapunov.c')
-rw-r--r--lyapunov.c90
1 files changed, 0 insertions, 90 deletions
diff --git a/lyapunov.c b/lyapunov.c
deleted file mode 100644
index 04153ba..0000000
--- a/lyapunov.c
+++ /dev/null
@@ -1,90 +0,0 @@
-#include <stdio.h>
-#include <math.h>
-#include "lyapunov.h"
-
-#define LY_ITERATIONS 50000
-
-//#define LY_ABERATION 1e-6
-#define LY_ABERATION 10e-15
-
-/**
- * this expects the fractal to already be stable (ie iterate it a few hundred/thousand times).
-
- Steps as described by Julian Sprott
- 1. Start with any initial condition in the basin of attraction
- 2. Iterate until the orbit is on the attractor
- 3. Select (almost any) nearby point (separated by d0)
- 4. Advancce both orbits one iteration and calculate the new separation d1
- 5. Evaluate log(d1/d0) in any convienient base
- 6. Readjust one orbit so its separation is d0 in the same direction as d1
- 7. Repeat steps 4-6 many times and calculate the average of step 5
- */
-double lyapunov_eval(void *fractal, t_gotfn calc, int var_count, double *vars, double *test) {
- int i, j;
- double exponent = 0.0, sum = 0.0, d2, df, rs;
- double diff[MAX_VARS];
-
- for(i = 0; i < LY_ITERATIONS; i++) {
- // 4. iterate each set
- calc(fractal, vars);
- calc(fractal, test);
- // 5. Evaluate
- d2 = 0.0;
- for(j = 0; j < var_count; j++) {
- diff[j] = test[j] - vars[j];
- //fprintf(stderr, "vars[%d] = %0.30f\n test[%d] = %0.30f\n diff[%d] = %0.30f\n",
- // j, vars[j], j, test[j], j, diff[j]);
- d2 += diff[j] * diff[j];
- }
- df = 1000000000000.0 * d2;
- rs = 1.0 / sqrt(df);
- sum += log(df);
- exponent = 0.721347 * sum / i;
- //fprintf(stderr, "%d\n d2 = %0.30f\n df = %0.30f\n rs = %0.30f\n sum = %0.30f\nexponent = %0.30f\n\n",
- // i, d2, df, rs, sum, exponent);
- // 6. adjust the orbit under test
- for(j = 0; j < var_count; j++) {
- test[j] = vars[j] + (rs * (test[j] - vars[j]));
- }
- }
- return exponent;
-}
-
-double lyapunov(void *fractal, t_gotfn calc, int var_count, double *vars) {
- int i;
- double test[MAX_VARS];
-
- // 1. + 2. 'vars' is expected to be ready to start computing
- // 3. create a test set of variables
- test[0] = vars[0] + LY_ABERATION;
- for(i = 1; i < var_count; i++) { test[i] = vars[i]; }
-
- return lyapunov_eval(fractal, calc, var_count, vars, test);
-}
-
-double *lyapunov_full(void *fractal, t_gotfn calc, int var_count, double *vars, double *results) {
- int i, j;
- double initial[MAX_VARS];
- double test[MAX_VARS];
-
- // save the starting values
- for(i = 0; i < var_count; i++) {
- initial[i] = vars[i];
- }
- for(i = 0; i < var_count; i++) {
- // aberate each variable in turn
- for(j = 0; j < var_count; j++) {
- if (j == i) {
- test[j] = vars[j] + LY_ABERATION;
- } else {
- test[j] = vars[j];
- }
- }
- results[i] = lyapunov_eval(fractal, calc, var_count, vars, test);
- // set the vars back the initial values
- for(j = 0; j < var_count; j++) {
- vars[j] = initial[j];
- }
- }
- return results;
-}