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



Copyright © Jean-François Colonna, 2021-2023.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2021-2023.