/*************************************************************************************************************************************/
/* */
/* 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 */
/* */
}