/*************************************************************************************************************************************/
/* */
/* 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 F A I S A N T V A R I E R L E T A U X D E C R O I S S A N C E : */
/* */
/* */
/* Author of '$xrk/verhulst.11$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1994??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 20040420233502. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 VALEUR_INITIALE_X0 \
PARE(0.5) \
/* Valeur de X[0]. */
#define TAUX_DE_CROISSANCE_min \
PARE(1.0)
#define TAUX_DE_CROISSANCE_max \
PARE(3.0)
/* Valeurs extremes de 'r', 'r' varie donc implicitement dans [1,3]... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#include xrk/verhulst.11.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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]. */
/* */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
DEFV(Float,INIT(taux_de_croissance_min,TAUX_DE_CROISSANCE_min));
DEFV(Float,INIT(taux_de_croissance_max,TAUX_DE_CROISSANCE_max));
/* Valeurs extremes de 'r', 'r' varie donc implicitement dans [1,3]... */
DEFV(Float,INIT(taux_de_croissance,FLOT__UNDEF));
DEFV(Float,INIT(X0,VALEUR_INITIALE_X0));
/* Valeur de X[0]. */
/*..............................................................................................................................*/
GET_ARGUMENTSi(nombre_d_arguments
,BLOC(GET_ARGUMENT_C("imageR=""R=",nom_imageR);
GET_ARGUMENT_F("min=",taux_de_croissance_min);
GET_ARGUMENT_F("max=",taux_de_croissance_max);
GET_ARGUMENT_F("X0=",X0);
)
);
begin_nouveau_block
Bblock
BDEFV(imageF,iterations);
/* Image flottante dans laquelle on trouve horizontalement la suite des iteres X[n], le */
/* taux de croissance 'r' etant proportionnel a 'Y'... */
CALi(Inoir(ImageR));
begin_colonne
Bblock
begin_ligneQ(DoIn,Xmin,Xmax,pasX)
/* ATTENTION, il est imperatif que 'begin_ligneQ' utilise la fonction 'DoIn(...)', ce qui */
/* signifie que les coordonnees sont traitees de facon croissante (de 'Xmin' a 'Xmax'), car */
/* en effet, cela est exploite ci-apres dans le calcul des iteres successifs... */
Bblock
Test(IFEQ(X,Xmin))
Bblock
storeF_point(X0,iterations,X,Y);
/* Initialisation de l'iteration courante... */
Eblock
ATes
Bblock
DEFV(Float,INIT(Xn,FLOT__UNDEF));
DEFV(Float,INIT(Xn_1,loadF_point(iterations,PREX(X),NEUT(Y))));
/* Definition de l'itere courant en fonction de l'itere precedent... */
DEFV(Float,INIT(coordonnee_Y_normalisee
,DENO(_____cNORMALISE_OY(Y),taux_de_croissance_min,taux_de_croissance_max)
)
);
/* Coordonnee 'Y' normalisee introduite le 20080108132900 a cause de 'USs_GooF(...)' car, */
/* effet, le 'DENO(...)' qui suit contient evidemment des operations arithmetiques */
/* elementaires qu'il ne faut pas etendre... */
USs_GooF(BLOC(
Bblock
ITERATION_DE_VERHULST(Xn
,Xn_1
,coordonnee_Y_normalisee
);
Eblock
)
);
/* Procedure introduite le 20080106095544... */
storeF_point(Xn,iterations,X,Y);
/* Calcul de l'iteration courante... */
Eblock
ETes
Eblock
end_ligneQ(EDoI)
Eblock
end_colonne
CALS(Ifloat_std_avec_renormalisation(ImageR,iterations));
/* Renormalisation de la suite des iteres... */
CALi(Iupdate_image(nom_imageR,ImageR));
EDEFV(imageF,iterations);
/* Image flottante dans laquelle on trouve horizontalement la suite des iteres X[n], le */
/* taux de croissance 'r' etant proportionnel a 'Y'... */
Eblock
end_nouveau_block
RETU_Commande;
Eblock
ECommande