/*************************************************************************************************************************************/ /* */ /* R E C H E R C H E D E S E X T R E M A */ /* D E L ' A T T R A C T E U R D E L O R E N Z : */ /* */ /* */ /* Author of '$xtc/lorenz.01$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, AAAAMMJJhhmmss). */ /* */ /*************************************************************************************************************************************/ #define ITER 10000 #define PRECIS double \ /* Permet de travailler en 'double' ou en 'float'. */ #define DT 0.01 #define X0 0.01 #define Y0 0.01 #define Z0 0.01 /* ATTENTION, les ecritures : */ /* */ /* 0.01 */ /* */ /* et */ /* */ /* (((1.0)/10)/10) */ /* */ /* ne sont pas equivalentes sur 'SYSTEME_FX2800_CONCENTRIX' ; c'est cette difference qui */ /* est responsable de la divergence des resultats avec 'SYSTEME_NWS3000_NEWSOS'. Par contre */ /* sur 'SYSTEME_VAX9000_ULTRIX' cela ne joue pas, et la divergence est causee par les */ /* differences au niveau du calcul arithmetique. */ #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #define MAX(a,b) (((a) > (b)) ? (a) : (b)) main() { int n; PRECIS x = X0,dx; PRECIS y = Y0,dy; PRECIS z = Z0,dz; PRECIS dt = DT; PRECIS mx = 1e30,Mx = -1e30; PRECIS my = 1e30,My = -1e30; PRECIS mz = 1e30,Mz = -1e30; PRECIS mdx = 1e30,Mdx = -1e30; PRECIS mdy = 1e30,Mdy = -1e30; PRECIS mdz = 1e30,Mdz = -1e30; int print=1; for (n=1 ; n<=ITER ; n++) { mx = MIN(x,mx);Mx = MAX(x,Mx); my = MIN(y,my);My = MAX(y,My); mz = MIN(z,mz);Mz = MAX(z,Mz); if (print == 0) { printf("\n x=%12.8g y=%12.8g z=%12.8g",x,y,z); } else { } dx = ((-10.0 * x) + (10.0 * y)) * dt; dy = ((28.0 * x) - (y) - (x * z)) * dt; /* Les ecritures : */ /* */ /* dy = ((28.0 * x) - (y) - (x * z)) * dt; */ /* dy = ((28.0 * x) - (x * z) - (y)) * dt; */ /* dy = ((28.0 * x) - ((y) + (x * z))) * dt; */ /* */ /* ne sont pas equivalentes, sauf s'il y a peu d'iterations (1000 ou moins...), mais pour */ /* 10000 et plus... */ dz = (((-8.0 / 3.0) * z) + (x * y)) * dt; mdx = MIN(dx,mdx);Mdx = MAX(dx,Mdx); mdy = MIN(dy,mdy);Mdy = MAX(dy,Mdy); mdz = MIN(dz,mdz);Mdz = MAX(dz,Mdz); if (print == 0) { printf(" --> dx=%12.8g dy=%12.8g dz=%12.8g (dt=%12.8g)",dx,dy,dz,dt); } else { } x = x + dx; y = y + dy; z = z + dz; } printf("\n iterations=%d x=%12.8g y=%12.8g z=%12.8g\n",n-1,x,y,z); printf("\n min(x)=%12.8g max(x)=%12.8g",mx,Mx); printf("\n min(y)=%12.8g max(y)=%12.8g",my,My); printf("\n min(z)=%12.8g max(z)=%12.8g",mz,Mz); printf("\n min(dx)=%12.8g max(dx)=%12.8g",mdx,Mdx); printf("\n min(dy)=%12.8g max(dy)=%12.8g",mdy,Mdy); printf("\n min(dz)=%12.8g max(dz)=%12.8g",mdz,Mdz); }