/*************************************************************************************************************************************/
/* */
/* E T U D E D E L A D Y N A M I Q U E D E V E R H U L S T */
/* E N M O D I F I A N T B I T A B I T L A P R E C I S I O N */
/* D E S C A L C U L S E F F E C T U E S A V E C G E N E R A T I O N */
/* D ' U N E I M A G E D O N T L E S D E U X C O O R D O N N E E S */
/* S O N T A S S O C I E E S A U X D E U X P R E C I S I O N S : */
/* */
/* */
/* */
/* Y[n] ^ */
/* | . */
/* 1 |............................................................... */
/* |***** * * * * * * * * * ** * . */
/* |* * * * . */
/* |* * * * * * * * *. */
/* |**** * ** ** ** ** ** * ** . */
/* |**** * * * * * ** . */
/* |**** * * * . */
/* | . */
/* |* * * * * * * * ** . */
/* |** * * * * * * . */
/* |**** * * * * * * . */
/* |**** * * ** * * * ** . */
/* |**** * * * * * * * ** *. */
/* |** ** * * ** * * * **. */
/* |** * * * * * * . */
/* |* * * * * *. */
/* |*** * * * . */
/* |***** * * ** * ** * * * * . */
/* |***** * * ** * ** * * ** * ** **. */
/* |**** * * * * ** ** ** . */
/* |**** * * * * * * * * *. */
/* |** *** * * ** * * * * **. */
/* |***** * * * * * * * * . */
/* |**** * * * * * * * * * ** *. */
/* | . */
/* |** *** * * ** * * * **. */
/* |****** * * ** * * * * * **. */
/* |**** * ** ** * * * ** . */
/* |***** * ** * * * * * ** * * ** * . */
/* |***** * * * * ** * * ** * . */
/* |* * * * * * ** *. */
/* |****** * ** ** ** * ** * ** * * ** **. */
/* |****** * ** ** ** ** ** * ** * * ** **. */
/* |-------------------------------------------------------------------------> */
/* 0 1 X[n] */
/* */
/* */
/* Author of '$xrk/verhulst.05$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1988??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N T E R F A C E ' listG ' : */
/* */
/* */
/* :Debut_listG: */
/* :Fin_listG: */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */
/* */
/*************************************************************************************************************************************/
#define PRAGMA_CPP_____AUTORISER_LE_GooF
/* Ceci est essentiel puisque l'on souhaite etudier l'influence de la syntaxe sur les */
/* resultats obtenus. Ceci manquait et a ete introduit le 20040420233353. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F I C H I E R S D ' I N C L U D E S : */
/* */
/*************************************************************************************************************************************/
#include INCLUDES_BASE
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A R A M E T R E S : */
/* */
/*************************************************************************************************************************************/
#define MASQUE_DE_PRECISION_32 \
PAR1(MMOT) \
/* Masque avec toute la precision, */
#define MASQUE_DE_PRECISION_31 \
PAR0(MMOT) \
/* Masque avec toute la precision moins 1 bit. */
#define MASQUE_DE_PRECISION_X \
MASQUE_DE_PRECISION_32 \
/* Premier masque utilise, */
#define MASQUE_DE_PRECISION_Y \
MASQUE_DE_PRECISION_31 \
/* Second masque utilise. */
#define NOMBRE_D_ITERATIONS_AVEUGLES \
PARE(5000) \
/* Nombre d'iterations a effectuer sans tracer... */
#define NOMBRE_DE_POINTS_A_TRACER \
PARE(250000) \
/* Nombre de points a tracer. */
#define PAS_D_EDITION \
PARE(1) \
/* On editera la valeur de X[n] et Y[n] toutes les 'PAS_D_EDITION' valeurs. */
#define VALEUR_INITIALE_X0 \
PARE(0.5) \
/* Valeur de X[0], */
#define VALEUR_INITIALE_Y0 \
PARE(0.5) \
/* Valeur de Y[0]. */
#define TAUX_DE_CROISSANCE_X \
PARE(3.0) \
/* Valeur de 'r' pour X[n], */
#define TAUX_DE_CROISSANCE_Y \
PARE(3.0) \
/* Valeur de 'r' pour Y[n]. */
#define NIVEAU_DE_MARQUAGE_XY \
MAX2(NIVA(SCAL(numero_du_point_courant \
,NOMBRE_DE_POINTS_A_TRACER \
,NIVR(BLANC) \
) \
) \
,NOIR_PLANCHER \
) \
/* Comment marquer les points... */
#nodefine NOM_DES_IMAGES \
"images/recherches/chaos/VERHULST.51"
#define NOM_DES_IMAGES \
nom_imageR
/* Nom des images (mise "en conformite" le 20021103114309). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define PRECISION(X,precision_des_calculs) \
Bblock \
EGAL(flint_InT(X),ETLO(flint_InT(X),precision_des_calculs)); \
Eblock \
/* Pour eliminer des bits dans la representation flottante... */
#define ITERATION_PRECISE(Xn,precision_des_calculs,taux_de_croissance) \
Bblock \
EGAL(flint_FloaT(Xn) \
,SOUS(MUL2(ADD2(flint_FloaT(taux_de_croissance),I) \
,flint_FloaT(Xn) \
) \
,MUL2(flint_FloaT(taux_de_croissance) \
,EXP2(flint_FloaT(Xn)) \
) \
) \
); \
/* Nota important : le code genere correspond a : */ \
/* */ \
/* 2 */ \
/* ((1+r).X[n]) - (r.(X[n] )) */ \
/* */ \
/* qui ne donne pas du tout les memes resultats numeriques que : */ \
/* */ \
/* 2 */ \
/* ((1+r).X[n]) - (r.X[n] ) */ \
/* */ \
/* ce qui est dans la logique du chaos deterministe... */ \
Eblock \
/* Iteration avec toute la precision possible. */
#define ITERATION_IMPRECISE(Xn,precision_des_calculs,taux_de_croissance) \
Bblock \
EGAL(flint_FloaT(manoeuvre_1),ADD2(flint_FloaT(taux_de_croissance),I)); \
PRECISION(manoeuvre_1,precision_des_calculs); \
/* Calcul de : (1 + r). */ \
EGAL(flint_FloaT(manoeuvre_2),MUL2(flint_FloaT(manoeuvre_1),flint_FloaT(Xn))); \
PRECISION(manoeuvre_2,precision_des_calculs); \
/* Calcul de : (1 + r).X[n]. */ \
EGAL(flint_FloaT(manoeuvre_3),EXP2(flint_FloaT(Xn))); \
PRECISION(manoeuvre_3,precision_des_calculs); \
/* 2 */ \
/* calcul de : X[n] . */ \
EGAL(flint_FloaT(manoeuvre_4),MUL2(flint_FloaT(taux_de_croissance),flint_FloaT(manoeuvre_3))); \
PRECISION(manoeuvre_4,precision_des_calculs); \
/* 2 */ \
/* calcul de : r.X[n] . */ \
EGAL(flint_FloaT(manoeuvre_5),SOUS(flint_FloaT(manoeuvre_2),flint_FloaT(manoeuvre_4))); \
PRECISION(manoeuvre_5,precision_des_calculs); \
/* 2 */ \
/* calcul de : (1+r).X[n] - r.X[n] . */ \
EGAL(flint_FloaT(Xn),flint_FloaT(manoeuvre_5)); \
Eblock \
/* Iteration avec la precision definie par 'precision_des_calculs'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* E T U D E D E L A D Y N A M I Q U E D E V E R H U L S T : */
/* */
/* */
/* Definition : */
/* */
/* Considerons la relation de recurrence */
/* suivante : */
/* */
/* 2 */
/* Z[n+1] = (1+r).Z[n] - r.Z[n] */
/* */
/* Cette relation correspond par exemple */
/* a la population annuelle d'une colonie */
/* animale, dont le taux de croissance est R ; */
/* par definition, on a : */
/* */
/* Z[n+1] - Z[n] */
/* R = ------------- */
/* Z[n] */
/* */
/* d'ou : */
/* */
/* Z[n+1] = (1+R).Z[n] */
/* */
/* le taux de croissance n'est en fait pas */
/* constant, et vaut : */
/* */
/* R = r.(1-Z[n]) */
/* */
/* d'ou la premiere formule. */
/* */
/* Celle-ci, bien que strictement deterministe */
/* pour des valeurs de 'r' superieures a 2.57, */
/* donnent pour des grandes valeurs 'N' de 'n' */
/* des series de valeurs completement chaotiques */
/* et qui sont completement sensibles a la valeur */
/* initiale Z[0]. */
/* */
/* Par la suite, on utilisera deux suites */
/* Z[n] notees respectivement X[n] et Y[n] */
/* pour rappeler les coordonnees 'X' et 'y' */
/* du plan auxquelles elles sont associees. */
/* */
/* */
/* Objectif : */
/* */
/* montrer que les resultats changent du */
/* tout au tout soit en changeant d'ordinateur, */
/* soit plus simplement en changeant la precision */
/* des calculs (ce qui est previsible, puisque */
/* cette iteration chaotique depend de tous les */
/* bits, et donc de la representation interne */
/* des nombres flottants)... */
/* */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
DEFV(flint,taux_de_croissance_X);
DEFV(flint,taux_de_croissance_Y);
DEFV(flint,Xn);
DEFV(flint,Yn);
/* Definition de la recurrence X[n] et Y[n]. */
DEFV(Positive,INIT(precision_des_calculs_X,MASQUE_DE_PRECISION_X));
DEFV(Positive,INIT(precision_des_calculs_Y,MASQUE_DE_PRECISION_Y));
/* Definition de la precision des calculs sous la forme d'une masque. */
DEFV(flint,manoeuvre_1);
DEFV(flint,manoeuvre_2);
DEFV(flint,manoeuvre_3);
DEFV(flint,manoeuvre_4);
DEFV(flint,manoeuvre_5);
/* Variables de manoeuvre... */
/*..............................................................................................................................*/
GET_ARGUMENTSi(nombre_d_arguments
,BLOC(GET_ARGUMENT_C("imageR=""R=",nom_imageR);
)
);
CALi(Inoir(ImageR));
EGAL(flint_FloaT(taux_de_croissance_X),TAUX_DE_CROISSANCE_X);
EGAL(flint_FloaT(taux_de_croissance_Y),TAUX_DE_CROISSANCE_Y);
EGAL(flint_FloaT(Xn),VALEUR_INITIALE_X0);
EGAL(flint_FloaT(Yn),VALEUR_INITIALE_Y0);
/* Initialisation des recurrences [n] et Y[n]. */
Repe(NOMBRE_D_ITERATIONS_AVEUGLES)
Bblock
USs_GooF(BLOC(
Bblock
ITERATION_IMPRECISE(Xn,precision_des_calculs_X,taux_de_croissance_X);
ITERATION_IMPRECISE(Yn,precision_des_calculs_Y,taux_de_croissance_Y);
/* Calcul aveugle de X[n] et Y[n]. */
Eblock
)
);
/* Procedure introduite le 20080106095128... */
Eblock
ERep
Komp(numero_du_point_courant,NOMBRE_DE_POINTS_A_TRACER)
Bblock
Repe(PAS_D_EDITION)
Bblock
USs_GooF(BLOC(
Bblock
ITERATION_IMPRECISE(Xn,precision_des_calculs_X,taux_de_croissance_X);
ITERATION_IMPRECISE(Yn,precision_des_calculs_Y,taux_de_croissance_Y);
/* Calcul non aveugle de X[n] et Y[n], */
Eblock
)
);
/* Procedure introduite le 20080106095128... */
Eblock
ERep
store_point_valide(NIVEAU_DE_MARQUAGE_XY
,ImageR
,_cDENORMALISE_OX(flint_FloaT(Xn)),_cDENORMALISE_OY(flint_FloaT(Yn))
,FVARIABLE
);
/* Et trace... */
Eblock
EKom
CALi(Iupdate_image(NOM_DES_IMAGES,ImageR));
RETU_Commande;
Eblock
ECommande