/*************************************************************************************************************************************/
/* */
/* 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 S U P E R P O S A N T D E U X P R E C I S I O N S : */
/* */
/* */
/* */
/* r ^ */
/* | . */
/* |*** * *** * * * * . */
/* | * * * *** * * * * ** * * ** . */
/* | * . */
/* | *** ** ** * * * * ** *. */
/* | * * . */
/* | * *** ** * * * * * *. */
/* | * * * ** * * * * * . */
/* | * ** * *** * . */
/* | * * * ** * . */
/* | * * * * * * * . */
/* | * * * * * ** * * ** . */
/* | ** ** ** * * * . */
/* | ** **** * * * . */
/* | * * * * . */
/* | * * * . */
/* | * * . */
/* | * * . */
/* | * * . */
/* | * . */
/* | * . */
/* | * . */
/* | * . */
/* | * . */
/* | * . */
/* | * . */
/* | * . */
/* | * . */
/* | * . */
/* | * . */
/* | . */
/* |-------------------------------------------------------------------------> */
/* 0 1 X[n] */
/* */
/* */
/* Author of '$xrk/verhulst.04$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 20040420233213. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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_1 \
MASQUE_DE_PRECISION_32 \
/* Premier masque utilise, */
#define MASQUE_DE_PRECISION_2 \
MASQUE_DE_PRECISION_31 \
/* Second masque utilise. */
#define NIVEAU_DE_MARQUAGE_0 \
NOIR \
/* Niveau a utiliser pour initialiser les points non atteints, */
#define NIVEAU_DE_MARQUAGE_1 \
GRIS_2 \
/* Niveau a utiliser pour les points atteints par 'MASQUE_DE_PRECISION_1' seul, */
#define NIVEAU_DE_MARQUAGE_2 \
GRIS_3 \
/* Niveau a utiliser pour les points atteints par 'MASQUE_DE_PRECISION_2' seul, */
#define NIVEAU_DE_MARQUAGE_12 \
GRIS_4 \
/* Niveau a utiliser pour les points atteints par 'MASQUE_DE_PRECISION_1' et */ \
/* 'MASQUE_DE_PRECISION_2'. */
#define NOMBRE_D_ITERATIONS_AVEUGLES \
PARE(5000) \
/* Nombre d'iterations a effectuer sans tracer... */
#define NOMBRE_DE_POINTS_A_TRACER \
PARE(32) \
/* Nombre de points a tracer sur chaque ligne (a 'r' constant). */
#define PAS_D_EDITION \
PARE(1) \
/* On editera la valeur de X[n] toutes les 'PAS_D_EDITION' valeurs. */
#define VALEUR_INITIALE_X0 \
PARE(0.5) \
/* Valeur de X[0]. */
#define TAUX_DE_CROISSANCE_min \
PARE(2.0) \
/* Valeur de 'r' minimale. On notera que 'TAUX_DE_CROISSANCE_max' n'est pas defini, mais */ \
/* vaut : */ \
/* */ \
/* ADD2(TAUX_DE_CROISSANCE_min,_____cNORMALISE_OY(Ymax)) */ \
/* */ \
/* 'r' varie donc implicitement dans [2,3]... */
#nodefine NOM_DES_IMAGES \
"images/recherches/chaos/VERHULST.41"
#define NOM_DES_IMAGES \
nom_imageR
/* Nom des images (mise "en conformite" le 20021103121442). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define PRECISION(X) \
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) \
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) \
Bblock \
EGAL(flint_FloaT(manoeuvre_1),ADD2(flint_FloaT(taux_de_croissance),I)); \
PRECISION(manoeuvre_1); \
/* Calcul de : (1 + r). */ \
EGAL(flint_FloaT(manoeuvre_2),MUL2(flint_FloaT(manoeuvre_1),flint_FloaT(Xn))); \
PRECISION(manoeuvre_2); \
/* Calcul de : (1 + r).X[n]. */ \
EGAL(flint_FloaT(manoeuvre_3),EXP2(flint_FloaT(Xn))); \
PRECISION(manoeuvre_3); \
/* 2 */ \
/* calcul de : X[n] . */ \
EGAL(flint_FloaT(manoeuvre_4),MUL2(flint_FloaT(taux_de_croissance),flint_FloaT(manoeuvre_3))); \
PRECISION(manoeuvre_4); \
/* 2 */ \
/* calcul de : r.X[n] . */ \
EGAL(flint_FloaT(manoeuvre_5),SOUS(flint_FloaT(manoeuvre_2),flint_FloaT(manoeuvre_4))); \
PRECISION(manoeuvre_5); \
/* 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 */
/* X[n+1] = (1+r).X[n] - r.X[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 : */
/* */
/* X[n+1] - X[n] */
/* R = ------------- */
/* X[n] */
/* */
/* d'ou : */
/* */
/* X[n+1] = (1+R).X[n] */
/* */
/* le taux de croissance n'est en fait pas */
/* constant, et vaut : */
/* */
/* R = r.(1-X[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 X[0]. */
/* */
/* */
/* 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);
DEFV(flint,Xn);
/* Definition de la recurrence X[n]. */
DEFV(Positive,INIT(precision_des_calculs,UNDEF));
/* 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);
)
);
CALS(Iinitialisation(ImageR,NIVEAU_DE_MARQUAGE_0));
EGAL(precision_des_calculs,MASQUE_DE_PRECISION_1);
begin_colonne
Bblock
EGAL(flint_FloaT(Xn),VALEUR_INITIALE_X0);
/* (re-)initialisation de X[n]. */
EGAL(flint_FloaT(taux_de_croissance),ADD2(TAUX_DE_CROISSANCE_min,_____cNORMALISE_OY(Y)));
Repe(NOMBRE_D_ITERATIONS_AVEUGLES)
Bblock
USs_GooF(BLOC(
Bblock
ITERATION_IMPRECISE(Xn);
/* Calcul aveugle de X[n]. */
Eblock
)
);
/* Procedure introduite le 20080106095958... */
Eblock
ERep
Repe(NOMBRE_DE_POINTS_A_TRACER)
Bblock
Repe(PAS_D_EDITION)
Bblock
USs_GooF(BLOC(
Bblock
ITERATION_IMPRECISE(Xn);
/* Calcul non aveugle de X[n], */
Eblock
)
);
/* Procedure introduite le 20080106095958... */
Eblock
ERep
store_point_valide(NIVEAU_DE_MARQUAGE_1
,ImageR
,_cDENORMALISE_OX(flint_FloaT(Xn)),Y
,FVARIABLE
);
/* Et trace... */
Eblock
ERep
Eblock
end_colonne
EGAL(precision_des_calculs,MASQUE_DE_PRECISION_2);
begin_colonne
Bblock
EGAL(flint_FloaT(Xn),VALEUR_INITIALE_X0);
/* (re-)initialisation de X[n]. */
EGAL(flint_FloaT(taux_de_croissance),ADD2(TAUX_DE_CROISSANCE_min,_____cNORMALISE_OY(Y)));
Repe(NOMBRE_D_ITERATIONS_AVEUGLES)
Bblock
USs_GooF(BLOC(
Bblock
ITERATION_IMPRECISE(Xn);
/* Calcul aveugle de X[n]. */
Eblock
)
);
/* Procedure introduite le 20080106095958... */
Eblock
ERep
Repe(NOMBRE_DE_POINTS_A_TRACER)
Bblock
Repe(PAS_D_EDITION)
Bblock
USs_GooF(BLOC(
Bblock
ITERATION_IMPRECISE(Xn);
/* Calcul non aveugle de X[n], */
Eblock
)
);
/* Procedure introduite le 20080106095958... */
Eblock
ERep
store_point_valide(COND(IFEQ(load_point_valide(ImageR,_cDENORMALISE_OX(flint_FloaT(Xn)),Y),NIVEAU_DE_MARQUAGE_0)
,NIVEAU_DE_MARQUAGE_2
,NIVEAU_DE_MARQUAGE_12
)
,ImageR
,_cDENORMALISE_OX(flint_FloaT(Xn)),Y
,FVARIABLE
);
/* Et trace en distinguant les points deja atteints avec l'etape initiale... */
Eblock
ERep
Eblock
end_colonne
CALi(Iupdate_image(NOM_DES_IMAGES,ImageR));
RETU_Commande;
Eblock
ECommande