/*************************************************************************************************************************************/ /* */ /* E T U D E T R I D I M E N S I O N N E L L E D E L A D Y N A M I Q U E D E V E R H U L S T */ /* O U L E S C O O R D O N N E E S { X , Y } C O R R E S P O N D E N T */ /* A X(n) E T A X(n-1) R E S P E C T I V E M E N T : */ /* */ /* */ /* Author of '$xrk/verhulst.21$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1998??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 20040420233617. */ @define PRAGMA_CL_____MODULE_NON_OPTIMISABLE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E B A S E E T U N I V E R S E L L E S : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.11.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 3 */ /* D E F I N I T I O N D E L ' E S P A C E P H Y S I Q U E D A N S R ( D E B U T ) : */ /* */ /* */ /* Nota : */ /* */ /* Les extrema des coordonnees {x,y,z} */ /* ainsi que ceux de leurs differentielles */ /* {dx,dy,dz} sont fixees un peu arbitrairement */ /* et sans etre parametrees. */ /* */ /* */ /*************************************************************************************************************************************/ #define hXmin_ESPACE \ PARE(-1.4) #define hYmin_ESPACE \ PARE(-1.4) #define hZmin_ESPACE \ PARE(-1.4) /* Definition du "coin" inferieur-gauche-arriere de l'espace physique. ATTENTION, il est */ /* evident que logiquement il faudrait prendre {0,0,0} ; ce choix symetrique de celui de */ /* 'h?max_ESPACE' est lie a la visualisation de type "torique" via '?_DU_TORE(...)'. */ #define hXmax_ESPACE \ PARE(1.4) #define hYmax_ESPACE \ PARE(1.4) #define hZmax_ESPACE \ PARE(1.4) /* Definition du "coin" superieur-droite-avant de l'espace physique. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 3 */ /* D E F I N I T I O N D E L ' E S P A C E P H Y S I Q U E D A N S R ( D E B U T ) : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.12.I" #define dXmin_ESPACE \ PARE(-2.00) #define dYmin_ESPACE \ PARE(-2.00) #define dZmin_ESPACE \ PARE(-2.00) /* Definition des minima des differentielles {dx,dy,dz}. */ #define dXmax_ESPACE \ PARE(2.00) #define dYmax_ESPACE \ PARE(2.00) #define dZmax_ESPACE \ PARE(2.00) /* Definition des maxima des differentielles {dx,dy,dz}. */ #include xrk/attractor.1D.I" /* Formules de renormalisation des differentielles dans [0,1] ; elles sont utilisees lorsque */ /* la production d'images en couleurs est demandee (voir 'visualiser_en_RVB'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S D I F F E R E N T S E S P A C E S E T D E L ' E F F E T D E B R U M E : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.13.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A I D E A U C A D R A G E D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.1C.I" DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES /* Definition des extrema des coordonnees et des derivees. On notera bien l'absence de */ /* point-virgule apres 'DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ #include xrv/champs_5.14.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S G E N E R A L E S R E L A T I V E S A L A V I S U A L I S A T I O N : */ /* */ /*************************************************************************************************************************************/ #define DCT \ FRA1(FRA2(FU)) DEFV(Local,DEFV(Float,INIT(dct,DCT))); /* Definition de 'dt'. */ #include xrk/attractor.14.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N D E M E M O R I S A T I O N D U P O I N T C O U R A N T : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.16.I" #define RAYON_DE_VISUALISATION \ FRA4(FRA10(FU)) DEFV(Local,DEFV(Float,INIT(rayon_de_visualisation,RAYON_DE_VISUALISATION))); /* Rayon du disque materialisant une iteration. */ BFonctionI DEFV(Local,DEFV(FonctionI,memorisation_1_point_07(AXf,AYf,AZf,AdXf,AdYf,AdZf,numero_de_l_iteration_courante))) DEFV(Argument,DEFV(Float,AXf)); DEFV(Argument,DEFV(Float,AYf)); DEFV(Argument,DEFV(Float,AZf)); /* Definition de la position {x,y,z} de l'iteration courante. */ DEFV(Argument,DEFV(Float,AdXf)); DEFV(Argument,DEFV(Float,AdYf)); DEFV(Argument,DEFV(Float,AdZf)); /* Definition des differentielles {dx,dy,dz} de la position de l'iteration courante. */ DEFV(Argument,DEFV(Int,numero_de_l_iteration_courante)); /* Numero de l'iteration courante afin d'attenuer eventuellement la luminance des points */ /* materialisant chaque iteration en fonction de leur numero (les premieres iterations etant */ /* plus sombres, et les dernieres etant plus lumineuses). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock #include xrk/attractor.15.I" INIT_ERROR; /*..............................................................................................................................*/ MEMORISATION_DU_POINT_COURANT(X_DERIVEE_DANS_01(AdXf) ,Y_DERIVEE_DANS_01(AdYf) ,Z_DERIVEE_DANS_01(AdZf) ); /* Memorisation du point courant en Noir et Blanc ou en Couleurs, mais uniquement s'il est */ /* visible en fonction des conditions de visualisation... */ RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E V I S U A L I S A T I O N E T D ' I N T E R P O L A T I O N : */ /* */ /*************************************************************************************************************************************/ =define ZOOM_IMPLICITE \ GRO8(FRA10(FU)) #include xrk/attractor.17.I" #include xrv/particule.31.I" #define TAUX_DE_CROISSANCE \ GRO3(FU) dfTRANSFORMAT_31(liste_TAUX_DE_CROISSANCE,fichier_TAUX_DE_CROISSANCE,TAUX_DE_CROISSANCE_IMPLICITE,TAUX_DE_CROISSANCE) /* Definition du fichier de definition du taux de croissance. */ #define sTAUX_DE_CROISSANCE(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_TAUX_DE_CROISSANCE)) /* Formule generale definissant la variation du taux de croissance. */ #define CX0 \ FRA2(FU) dfTRANSFORMAT_31(liste_VALEUR_INITIALE,fichier_VALEUR_INITIALE,VALEUR_INITIALE_IMPLICITE,CX0) /* Definition du fichier de definition de la valeur initiale 'X(0)'. */ #define sVALEUR_INITIALE(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_VALEUR_INITIALE)) /* Formule generale definissant la variation de la valeur initiale 'X(0)'. */ dfTRANSFORMAT_31(liste_PAS_DE_TEMPS_dct,fichier_PAS_DE_TEMPS_dct,PAS_DE_TEMPS_dct_IMPLICITE,DCT) /* Definition du fichier des pas de temps. */ #define sPAS_DE_TEMPS_dct(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_PAS_DE_TEMPS_dct)) /* Formule generale definissant les variations du pas de temps. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N 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. */ /* */ /* */ /*************************************************************************************************************************************/ #include xrk/verhulst.11.I" dfTRANSFORMAT_31(liste_NOMBRE_D_ITERATIONS,fichier_NOMBRE_D_ITERATIONS,NOMBRE_D_ITERATIONS_IMPLICITE,NOMBRE_D_ITERATIONS) /* Definition du fichier des nombres d'iterations. */ #define sNOMBRE_D_ITERATIONS(numero_de_la_periode) \ INTE(sTRANSFORMAT_31(numero_de_la_periode,liste_NOMBRE_D_ITERATIONS)) \ /* Formule generale definissant les variations du nombre d'iterations. */ DEFV(Local,DEFV(Float,INIT(taux_de_croissance,TAUX_DE_CROISSANCE))); /* Definition du taux de croissance. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S T R O I S F O N C T I O N S ' F ' : */ /* */ /*************************************************************************************************************************************/ DEFV(Local,DEFV(Float,INIT(Xn_1,FLOT__UNDEF))); DEFV(Local,DEFV(Float,INIT(Xn,FLOT__UNDEF))); /* Definition de l'iteration courante. */ #define gFx(cx,cy,cz,t) \ Xn_1 \ /* Definition de la fonction F (x,y,z,t). */ \ /* x */ #define gFy(cx,cy,cz,t) \ Xn \ /* Definition de la fonction F (x,y,z,t). */ \ /* y */ #define gFz(cx,cy,cz,t) \ Zcentre_ESPACE \ /* Definition de la fonction F (x,y,z,t). */ \ /* z */ BFonctionF DEFV(Local,DEFV(FonctionF,Fonction_Fx(cx,cy,cz,t))) DEFV(Argument,DEFV(Float,cx)); DEFV(Argument,DEFV(Float,cy)); DEFV(Argument,DEFV(Float,cz)); DEFV(Argument,DEFV(Float,t)); /* Definition des coordonnees spatio-temporelles. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(gFx(cx,cy,cz,t)); Eblock EFonctionF BFonctionF DEFV(Local,DEFV(FonctionF,Fonction_Fy(cx,cy,cz,t))) DEFV(Argument,DEFV(Float,cx)); DEFV(Argument,DEFV(Float,cy)); DEFV(Argument,DEFV(Float,cz)); DEFV(Argument,DEFV(Float,t)); /* Definition des coordonnees spatio-temporelles. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(gFy(cx,cy,cz,t)); Eblock EFonctionF BFonctionF DEFV(Local,DEFV(FonctionF,Fonction_Fz(cx,cy,cz,t))) DEFV(Argument,DEFV(Float,cx)); DEFV(Argument,DEFV(Float,cy)); DEFV(Argument,DEFV(Float,cz)); DEFV(Argument,DEFV(Float,t)); /* Definition des coordonnees spatio-temporelles. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(gFz(cx,cy,cz,t)); Eblock EFonctionF #define Fx(cx,cy,cz,t) \ Fonction_Fx(cx,cy,cz,t) \ /* Definition de la fonction F (x,y,z,t). */ \ /* x */ #define Fy(cx,cy,cz,t) \ Fonction_Fy(cx,cy,cz,t) \ /* Definition de la fonction F (x,y,z,t). */ \ /* y */ #define Fz(cx,cy,cz,t) \ Fonction_Fz(cx,cy,cz,t) \ /* Definition de la fonction F (x,y,z,t). */ \ /* z */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' I N T E G R A T I O N D U S Y S T E M E */ /* D ' E Q U A T I O N S D I F F E R E N T I E L L E S : */ /* */ /*************************************************************************************************************************************/ #include xrk/integr.1B.vv.I" /* Utile uniquement pour definir {cx,cy,cz} et {dcx,dcy,dcz}. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D O N N E E S D E V I S U A L I S A T I O N " T O R I Q U E " : */ /* */ /*************************************************************************************************************************************/ #define R3 \ FRA1(FU) #define I3 \ FZERO #include xrk/fluide_2D.11.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S I N I T I A L I S A T I O N S : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.18.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E T U D E T R I D I M E N S I O N N E L L E D E L A D Y N A M I Q U E D E V E R H U L S T : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ INITIALISATIONS_GENERALES; /* Initialisations generales faites au tout debut... */ iTRANSFORMAT_31(liste_TAUX_DE_CROISSANCE,TAUX_DE_CROISSANCE_IMPLICITE); /* Initialisation du taux de croissance. */ iTRANSFORMAT_31(liste_VALEUR_INITIALE,VALEUR_INITIALE_IMPLICITE); /* Initialisation de la valeur initiale de 'X(0)'. */ iTRANSFORMAT_31(liste_PAS_DE_TEMPS_dct,PAS_DE_TEMPS_dct_IMPLICITE); /* Initialisation du pas de temps. */ iTRANSFORMAT_31(liste_NOMBRE_D_ITERATIONS,NOMBRE_D_ITERATIONS_IMPLICITE); /* Initialisation du nombre d'iterations. */ #include xrv/champs_5.1A.I" GET_ARGUMENTSv(nombre_d_arguments ,BLOC(PROCESS_ARGUMENTS_GEOMETRIQUES; PROCESS_ARGUMENT_FICHIER("TAUX_DE_CROISSANCE=" ,fichier_TAUX_DE_CROISSANCE ,liste_TAUX_DE_CROISSANCE ,TAUX_DE_CROISSANCE_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("VALEUR_INITIALE=" ,fichier_VALEUR_INITIALE ,liste_VALEUR_INITIALE ,VALEUR_INITIALE_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("PAS_DE_TEMPS_dct=" ,fichier_PAS_DE_TEMPS_dct ,liste_PAS_DE_TEMPS_dct ,PAS_DE_TEMPS_dct_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("NOMBRE_D_ITERATIONS=" ,fichier_NOMBRE_D_ITERATIONS ,liste_NOMBRE_D_ITERATIONS ,NOMBRE_D_ITERATIONS_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENTS_DE_VISUALISATION; PROCESS_ARGUMENTS_DE_VISUALISATION_DES_AXES_DE_COORDONNEES; GET_ARGUMENT_I("n=""iterations=",nombre_d_iterations); GET_ARGUMENT_F("dt=""dct=",dct); GET_ARGUMENT_L("tore=",visualiser_sur_un_tore); GET_ARGUMENT_F("gR=",facteur_du_rayon_gR); GET_ARGUMENT_F("pR=",facteur_du_rayon_pR); ) ); #include xrv/champs_5.19.I" /* Pour eviter le message : */ /* */ /* Static function is not referenced. */ /* */ /* sur 'SYSTEME_ES9000_AIX_CC'... */ #include xrk/attractor.19.I" /* Validations et definition de l'espace physique. */ Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation) Bblock RE_INITIALISATION_DE_L_HORLOGE; INITIALISATIONS_RELATIVES_A_CHAQUE_NOUVELLE_IMAGE(numero_de_la_periode_courante); /* Initialisations necessaires avant le calcul et la generation de chaque nouvelle image. */ EGAL(taux_de_croissance,sTAUX_DE_CROISSANCE(numero_de_la_periode_courante)); /* Calcul de la valeur initiale du nombre complexe 'w'. */ EGAL(Xn,sVALEUR_INITIALE(numero_de_la_periode_courante)); /* Initialisation du processus. */ vTRANSFORMAT_31(nombre_d_iterations,sNOMBRE_D_ITERATIONS,numero_de_la_periode_courante,fichier_NOMBRE_D_ITERATIONS); /* Calcul du nombre d'iterations lorsqu'il est variable. */ vTRANSFORMAT_31(dct,sPAS_DE_TEMPS_dct,numero_de_la_periode_courante,fichier_PAS_DE_TEMPS_dct); /* Calcul du pas de temps lorsqu'il est variable. */ Komp(numero_de_l_iteration_courante,nombre_d_iterations) Bblock DEFV(Float,INIT(cx_avant,cx)); DEFV(Float,INIT(cy_avant,cy)); DEFV(Float,INIT(cz_avant,cz)); /* Sauvegarde des coordonnees {cx,cy,cz} avant l'iteration. */ EGAL(Xn_1,Xn); USs_GooF(BLOC( Bblock ITERATION_DE_VERHULST(Xn,Xn_1,taux_de_croissance); /* Iteration. */ Eblock ) ); /* Procedure introduite le 20080106095001... */ EGAL(cx,Fx(cx,cy,cz,temps_courant)); EGAL(cy,Fy(cx,cy,cz,temps_courant)); EGAL(cz,Fz(cx,cy,cz,temps_courant)); /* Calcul des coordonnees. */ Test(IFEQ(numero_de_l_iteration_courante,PREMIERE_ITERATION_D_UN_Komp)) Bblock EGAL(dcx,FZERO); EGAL(dcy,FZERO); EGAL(dcz,FZERO); /* Initialisation des differentielles pour la premiere iteration (on notera que 'FZERO' est */ /* la valeur la plus "logique"...). */ Eblock ATes Bblock EGAL(dcx,SOUS(cx,cx_avant)); EGAL(dcy,SOUS(cy,cy_avant)); EGAL(dcz,SOUS(cz,cz_avant)); /* Calcul des differentielles pour les iterations suivantes... */ Eblock ETes RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; /* On notera que cette recherche n'est pas conditionnee par 'editer_les_extrema', car les */ /* extrema pourraient etre utilises pour la visualisation... */ Test(IFOU(IL_FAUT(visualiser_le_fantome) ,IFGE(numero_de_l_iteration_courante,PREMIERE_ITERATION_VISUALISEE) ) ) Bblock Test(IL_FAUT(visualiser_sur_un_tore)) Bblock CALS(memorisation_1_point_07(X_DU_TORE(cx,cy,cz,temps_courant) ,Y_DU_TORE(cx,cy,cz,temps_courant) ,Z_DU_TORE(cx,cy,cz,temps_courant) ,dcx ,dcy ,dcz ,numero_de_l_iteration_courante ) ); /* Memorisation de l'iteration courante sur un tore.... */ Eblock ATes Bblock CALS(memorisation_1_point_07(ADD2(cx ,NEGA(NEUT(DIVI(ADD2(taux_de_croissance,I) ,GRO2(taux_de_croissance) ) ) ) ) ,ADD2(cy ,NEGA(MOIT(DIVI(EXP2(ADD2(taux_de_croissance,I)) ,GRO4(taux_de_croissance) ) ) ) ) ,NEUT(cz) ,dcx ,dcy ,dcz ,numero_de_l_iteration_courante ) ); /* Memorisation de l'iteration courante dans l'espace "normal". Les translations qui sont */ /* appliquees aux coordonees {x,y} proviennent de l'etude de la parabole : */ /* */ /* 2 */ /* y = (R+1).x - R.x */ /* */ /* dont le sommet a pour coordonnees : */ /* */ /* R+1 */ /* x = ----- */ /* S 2.R */ /* */ /* et : */ /* */ /* 2 */ /* (R+1) */ /* y = -------- */ /* S 4.R */ /* */ /* Les translations sont egales respectivement a 'X(S)' et 'Y(S)/2'... */ Eblock ETes Eblock ATes Bblock Eblock ETes INCREMENTATION_DE_L_HORLOGE(dct); /* Simulation du temps de la simulation... */ Eblock EKom #include xrk/attractor.1A.I" VISUALISATION_DES_AXES_DE_COORDONNEES; /* Visualisation si necessaire des trois axes de coordonnees. */ GENERATION_D_UNE_IMAGE_ET_PASSAGE_A_LA_SUIVANTE(BLOC(VIDE;)); /* Generation de l'image courante... */ Eblock EKom EDITION_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; /* Edition facultative des extrema des coordonnees et des derivees. */ RETU_Commande; Eblock ECommande