/*************************************************************************************************************************************/ /* */ /* I N F L U E N C E D E L ' E X P R E S S I O N I N F O R M A T I Q U E */ /* 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.02$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, AAAAMMJJhhmmss). */ /* */ /*************************************************************************************************************************************/ #define ITER 10000 \ /* Moins d'iterations (1000 par exemple) ne met pas le phenomene en evidence... */ #define PRECIS double \ /* Definition de la precision ('float' ou 'double') des calculs. Le phenomene de la */ \ /* sensibilite a l'ordre des operations ne se manifeste qu'en 'double', a moins d'introduire */ \ /* des variables intermediaires 'v1' et 'v2'... */ #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. Ainsi, 'SYSTEME_FX2800_CONCENTRIX' donne : */ /* */ /* pour 0.01 : */ /* */ /* iterations=10000 x11= -0.35610748 y11= -1.5817687 z11= 20.345352 */ /* */ /* pour (((1.0)/10)/10) : */ /* */ /* iterations=10000 x11= 2.58120100 y11= 4.3784782 z11= 13.494037 */ /* */ /* */ main() { int n; /* ATTENTION, 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... */ PRECIS x11 = X0,dx11; PRECIS y11 = Y0,dy11; PRECIS z11 = Z0,dz11; /* Definition de la premiere forme de l'attracteur. */ PRECIS x12 = X0,dx12; PRECIS y12 = Y0,dy12; PRECIS z12 = Z0,dz12; /* Definition de la deuxieme forme de l'attracteur. */ PRECIS x13 = X0,dx13; PRECIS y13 = Y0,dy13; PRECIS z13 = Z0,dz13; /* Definition de la troisieme forme de l'attracteur. */ PRECIS v1,v2; /* Variables intermediaires rendues necessaires par 'float', car en effet, dans ce cas, */ /* les premiere, deuxieme et troisieme formes de l'attracteur sont identiques... */ PRECIS x21 = X0,dx21; PRECIS y21 = Y0,dy21; PRECIS z21 = Z0,dz21; /* Definition de la quatrieme forme de l'attracteur. */ PRECIS x22 = X0,dx22; PRECIS y22 = Y0,dy22; PRECIS z22 = Z0,dz22; /* Definition de la cinquieme forme de l'attracteur. */ PRECIS x23 = X0,dx23; PRECIS y23 = Y0,dy23; PRECIS z23 = Z0,dz23; /* Definition de la sixieme forme de l'attracteur. */ PRECIS dt = DT; for (n=1 ; n<=ITER ; n++) { /* Resolution par la methode d'Euler : */ dx11 = ((-10.0 * x11) + (10.0 * y11)) * dt; dy11 = ((28.0 * x11) - (y11) - (x11 * z11)) * dt; dz11 = (((-8.0 / 3.0) * z11) + (x11 * y11)) * dt; x11 = x11 + dx11; y11 = y11 + dy11; z11 = z11 + dz11; /* Calcul de la premiere forme de l'attracteur. */ dx12 = ((-10.0 * x12) + (10.0 * y12)) * dt; dy12 = ((28.0 * x12) - (x12 * z12) - (y12)) * dt; dz12 = (((-8.0 / 3.0) * z12) + (x12 * y12)) * dt; x12 = x12 + dx12; y12 = y12 + dy12; z12 = z12 + dz12; /* Calcul de la deuxieme forme de l'attracteur. */ dx13 = ((-10.0 * x13) + (10.0 * y13)) * dt; dy13 = ((28.0 * x13) - ((y13) + (x13 * z13))) * dt; dz13 = (((-8.0 / 3.0) * z13) + (x13 * y13)) * dt; x13 = x13 + dx13; y13 = y13 + dy13; z13 = z13 + dz13; /* Calcul de la troisieme forme de l'attracteur. */ v1 = -10.0 * x21; v2 = 10.0 * y21; dx21 = ((v1) + (v2)) * dt; v1 = 28.0 * x21; v2 = x21 * z21; dy21 = ((v1) - (y21) - (v2)) * dt; v1 = (-8.0 / 3.0) * z21; v2 = x21 * y21; dz21 = ((v1) + (v2)) * dt; x21 = x21 + dx21; y21 = y21 + dy21; z21 = z21 + dz21; /* Calcul de la quatrieme forme de l'attracteur. */ v1 = -10.0 * x22; v2 = 10.0 * y22; dx22 = ((v1) + (v2)) * dt; v1 = 28.0 * x22; v2 = x22 * z22; dy22 = ((v1) - (v2) - (y22)) * dt; v1 = (-8.0 / 3.0) * z22; v2 = x22 * y22; dz22 = ((v1) + (v2)) * dt; x22 = x22 + dx22; y22 = y22 + dy22; z22 = z22 + dz22; /* Calcul de la cinquieme forme de l'attracteur. */ v1 = -10.0 * x23; v2 = 10.0 * y23; dx23 = ((v1) + (v2)) * dt; v1 = 28.0 * x23; v2 = x23 * z23; dy23 = ((v1) - ((y23) + (v2))) * dt; v1 = (-8.0 / 3.0) * z23; v2 = x23 * y23; dz23 = ((v1) + (v2)) * dt; x23 = x23 + dx23; y23 = y23 + dy23; z23 = z23 + dz23; /* Calcul de la sixieme forme de l'attracteur. */ } printf("\n sans variables intermediaires, forme 1 : iterations=%d x11=%12.8g y11=%12.8g z11=%12.8g",n-1,x11,y11,z11); printf("\n sans variables intermediaires, forme 2 : iterations=%d x12=%12.8g y12=%12.8g z12=%12.8g",n-1,x12,y12,z12); printf("\n sans variables intermediaires, forme 3 : iterations=%d x13=%12.8g y13=%12.8g z13=%12.8g",n-1,x13,y13,z13); printf("\n"); printf("\n avec variables intermediaires, forme 1 : iterations=%d x21=%12.8g y21=%12.8g z21=%12.8g",n-1,x21,y21,z21); printf("\n avec variables intermediaires, forme 2 : iterations=%d x22=%12.8g y22=%12.8g z22=%12.8g",n-1,x22,y22,z22); printf("\n avec variables intermediaires, forme 3 : iterations=%d x23=%12.8g y23=%12.8g z23=%12.8g",n-1,x23,y23,z23); /* Ainsi, on obtient sur : */ /* */ /* 1-'SYSTEME_NWS3000_NEWSOS_2CC' : */ /* */ /* 1.1-'double' sans variables intermediaires : */ /* */ /* iterations=10000 x11= -0.35610748 y11= -1.58176870 z11= 20.3453520 */ /* iterations=10000 x12= 3.49507470 y12= 6.22949250 z12= 11.3819710 */ /* iterations=10000 x13= -5.69497100 y13= -4.84669060 z13= 25.0403860 */ /* */ /* 1.2-'double' avec variables intermediaires : */ /* */ /* iterations=10000 x21= -0.35610748 y21= -1.58176870 z21= 20.3453520 */ /* iterations=10000 x22= 3.49507470 y22= 6.22949250 z22= 21.3819710 */ /* iterations=10000 x23= -5.69497100 y23= -4.84669060 z23= 25.0403860 */ /* */ /* 1.3-'float' sans variables intermediaires : */ /* */ /* iterations=10000 x11= -11.8043640 y11= -19.6278400 z11= 19.8101140 */ /* iterations=10000 x12= -11.8043640 y12= -19.6278400 z12= 19.8101140 */ /* iterations=10000 x13= -11.8043640 y13= -19.6278400 z13= 19.8101140 */ /* */ /* 1.4-'float' avec variables intermediaires : */ /* */ /* iterations=10000 x21= -2.06624890 y21= -3.40890240 z21= 17.6267620 */ /* iterations=10000 x22= -2.06624890 y22= -3.40890240 z22= 17.6267620 */ /* iterations=10000 x23= -2.06624890 y23= -3.40890240 z23= 17.6267620 */ /* */ /* */ /* 2-'SYSTEME_ES9000_AIX_CC' : */ /* */ /* 2.1-'double' sans variables intermediaires : */ /* */ /* iterations=10000 x11= -15.569669 y11= -19.461148 z11= 32.848648 */ /* iterations=10000 x12= 3.3604864 y12= 4.8678701 z12= 16.862355 */ /* iterations=10000 x13= 0.81751802 y13= -2.5826302 z13= 25.367577 */ /* */ /* 2.2-'double' avec variables intermediaires : */ /* */ /* iterations=10000 x21= -15.569669 y21= -19.461148 z21= 32.848648 */ /* iterations=10000 x22= 3.3604864 y22= 4.8678701 z22= 16.862355 */ /* iterations=10000 x23= 0.81751802 y23= -2.5826302 z23= 25.367577 */ /* */ /* 2.3-'float' sans variables intermediaires : */ /* */ /* iterations=10000 x11= -0.45632827 y11= -0.12214106 z11= 17.964737 */ /* iterations=10000 x12= -0.45632827 y12= -0.12214106 z12= 17.964737 */ /* iterations=10000 x13= -0.45632827 y13= -0.12214106 z13= 17.964737 */ /* */ /* 2.4-'float' avec variables intermediaires : */ /* */ /* iterations=10000 x21= -7.8980255 y21= -12.769945 z21= 17.277328 */ /* iterations=10000 x22= -7.8980255 y22= -12.769945 z22= 17.277328 */ /* iterations=10000 x23= -7.8980255 y23= -12.769945 z23= 17.277328 */ /* */ /* */ /* 3-'SYSTEME_RS6000_AIX_CC' : */ /* */ /* 3.1-'double' sans variables intermediaires : */ /* */ /* iterations=10000 x11= 2.7007321 y11= 2.317551 z11= 21.191366 */ /* iterations=10000 x12= -8.4516416 y12= -9.5048901 z12= 25.496433 */ /* iterations=10000 x13= 5.9016298 y13= 3.4544601 z13= 27.364426 */ /* */ /* 3.2-'double' avec variables intermediaires : */ /* */ /* iterations=10000 x21= -0.35610748 y21= -1.5817687 z21= 20.345352 */ /* iterations=10000 x22= 3.4950747 y22= 6.2294925 z22= 11.381971 */ /* iterations=10000 x23= -5.694971 y23= -4.8466906 z23= 25.040386 */ /* */ /* 3.3-'float' sans variables intermediaires : */ /* */ /* iterations=10000 x11= -11.804364 y11= -19.62784 z11= 19.810114 */ /* iterations=10000 x12= -11.804364 y12= -19.62784 z12= 19.810114 */ /* iterations=10000 x13= -11.804364 y13= -19.62784 z13= 19.810114 */ /* */ /* 3.4-'float' avec variables intermediaires : */ /* */ /* iterations=10000 x21= -2.0662489 y21= -3.4089024 z21= 17.626762 */ /* iterations=10000 x22= -2.0662489 y22= -3.4089024 z22= 17.626762 */ /* iterations=10000 x23= -2.0662489 y23= -3.4089024 z23= 17.626762 */ /* */ }