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



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.