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