#include "Vector.hh" #include "Matrix.hh" #include #include #include #include "lorenz.hh" #include "lorenz1.hh" #include "lorenz3.hh" #include "PeriodicOrbit.hh" static int LARGENUM=1000000; //used by findmin(), findMinDist() static double returnNormalizingFactor(int n, double T){ double lambda = 0.905; lambda = pow(2.71828182845905, lambda); return pow(lambda, T/n); } //po(input) = 3xn matrix //T(input) = its period //return value is its top Lyapunov exponent double returnLyap(Matrix& po, double T){ assert(po.getm()==3); int n = po.getn(); Matrix A(9, n); ComputeLinearization(po, A, lorenzJ); A.scale(T/(2*PI)); //forgot to do this initially! Matrix Y(9, n); FindFundSolnB(A, Y); Matrix m(3,3); Matrix mm; int i, j; for(i=0; i < 3; i++) for(j=0; j < 3; j++) m(i,j) = (i==j)?1:0; double factor = returnNormalizingFactor(n, T); for(i=0; i < n; i++){ mm.shadow(Y.getColumn(i), 3, 3); mult(mm, m); m.scale(1/factor); } Vector er(3), ei(3); eig(m, er, ei); assert(fabs(ei(0))+fabs(ei(1))+fabs(ei(2))<1e-10); double ee; ee = fabs(er(0)); if(fabs(er(1)) > ee) ee = fabs(er(1)); if(fabs(er(2)) > ee) ee = fabs(er(2)); double lyap; lyap = log(ee) + n*log(factor); lyap /= T; return lyap; } //dir(input) = directory //N(input) = index of po in directory //return values is its Lyapunov exponents double returnLyap(char *dir, int N){ char s1[100] = "orbit"; char s2[100] = "T"; char s3[100] = "n"; char tempstr[100]; strcpy(tempstr, dir); strcat(tempstr, s1); strcpy(s1, tempstr); strcpy(tempstr, dir); strcat(tempstr, s2); strcpy(s2, tempstr); strcpy(tempstr, dir); strcat(tempstr, s3); strcpy(s3, tempstr); char s[50]; sprintf(s, "%d.dat", N); strcat(s1, s); strcat(s2, s); strcat(s3, s); Matrix tt(1,1); tt.input(s2); double T = tt(0,0); tt.input(s3); int n = tt(0,0); Matrix po(3,n); po.input(s1); return returnLyap(po, T); } //dir = directory //L exponents of all pos with indices from m(input) to //n(input) are computed and saved void saveLyap(char *dir, int m, int n){ char fname[100]; int i; for(i=m; i <= n; i++){ double lyap = returnLyap(dir, i); sprintf(fname, "%slyap%d.dat",dir, i); Matrix tt(1,1); tt(0,0) = lyap; cout<<"saving "<=0)); if(!flag) continue; flag = (v(i)< min[SCAN-1]); if(!flag) continue; indx[SCAN-1] = i; min[SCAN-1] = v(i); int j; int k=0; for(j=0; j < SCAN; j++) if(min[j] > min[k]) k = j; int tempindx; double tempmin; tempmin = min[k]; min[k] = min[SCAN-1]; min[SCAN-1] = tempmin;//largest min is at SCAN-1 tempindx = indx[k]; indx[k] = indx[SCAN-1]; indx[SCAN-1] = tempindx; } for(i=0; i < SCAN; i++) if(min[i] < LARGENUM/2.0) findLocalMin(v, indx[i], shft[i], min[i]); double mmin; int k=0; for(i=0; i < SCAN; i++) if(min[i] < min[k]) k = i; mmin = min[k]; iindx = indx[k]; sshft = shft[k]; //cout<<"index: "<