====== Suite logistique et chaos ====== //Page très détaillée sur [[https://fr.wikipedia.org/wiki/Suite_logistique|Wikipedia]].// ===== Analogie avec population de lapins ===== Imaginons une île sur laquelle on trouve une population importante de lapins. Soit $u_n$ le nombre de lapins, exprimé en millions -- donc si $u_n = 0,495$, cela signifie qu'il y a 495 000 lapins -- sur l'île l'année n. On souhaite modéliser l'évolution de la population de lapins au cours du temps. ==== Premier modèle ==== On peut supposer que //en moyenne// chaque lapin donnera naissance à k lapins de sorte que $u_{n+1} = k\,u_n$. Il s'agit d'une suite géométrique dont le comportement n'est pas très intéressant : * si k > 1, la population de lapins va croître indéfiniment, * si 0 < k < 1, la population de lapins va décroître jusqu'à tendre vers 0 ==== Deuxième modèle ==== Il paraît raisonnable de supposer que le nombre de lapins ne peut croître indéfiniment. Quand les lapins deviennent trop nombreux, ils ont plus de mal à se nourrir et donc à se reproduire. On ajoute un facteur à notre modèle pour traduire cet effet. $$u_{n+1} = k\,u_n\,(1 - u_n)$$ En conséquence, il faudra que $u_n \leqslant 1$ ce qui amène à la contrainte $k \leqslant 4$. On résume donc ce modèle qui nous servira dans la suite : * $0 < u_0 < 1$ que l'on pourra choisir -- on pourra se demander si ce choix a de l'importance * $0 < k < 4$ est un facteur représentant la fertilité des lapins * $u_{n+1} = k\,u_n\,(1 - u_n)$ ==== Le simple génère le complexe ==== Ce modèle est très simple, il ne contient aucun calcul compliqué et il est entièrement déterminé -- dès lors que l'on s'est fixé k et $u_0$ -- et pourtant, il apporte de grandes surprises et notamment le **chaos**. ===== Simulation ===== Fichier de base : ==== Fonction calculant l'historique ==== Écrire une fonction ''historique'' qui reçoit les arguments ''u0'', ''k'' et ''N''tels que : * ''u0'' et ''k'' sont les deux paramètres précédemment évoqués, * ''N'' est le nombre d'année de simulations demandées. On veut calculer jusque $u_{N-1}$. * la fonction renvoie un tableau $\left[u_0, u_1, \cdots, u_{N-1}\right]$ ==== Arrondir ==== Pour les besoins de ce qui suit, on souhaite pouvoir produire une version arrondie des résultats obtenus. Écrire une fonction ''arrondir'' recevant en argument un tableau ''T'' contenant des nombres et renvoyant un tableau contenant les mêmes nombres mais arrondis à 3 chiffres après la virgule. ''round(x,3)'' permet de faire l'arrondi. ==== Affichage ==== Pour les besoins de l'affichage, écrire une fonction ''affichage'' recevant * un tableau ''T'' de nombres, * un entier positif ''nb'' avec ''nb < len(T)'' et qui affiche les ''nb'' dernières valeurs de ''T'', arrondies à 3 chiffres après la virgule. ''T[-nb:]'' permet d'extraire directement les ''nb'' dernières valeurs de ''T''. ==== Quelques tests ==== === Cas k < 1 === Faites une série de tests avec ''u0 = 0.85'' et ''N = 10000'' et à chaque fois visualisez les 10 derniers éléments de la réponse -- correspond aux 10 dernières années. Si ''h = historique(u0, k, N)'' alors ''h[-10:]'' me donne directement la liste des 10 derniers éléments. * Faites l'essai pour ''k = 0.5'', ''k = 0.8''. Quelle différence ? * Refaites l'essai en changeant pour ''u0 = 0.1''. Quelle différence ? Ce cas n'est pas très intéressant et n'est pas chaotique : l'évolution se stabilise vite et ne dépend pas beaucoup de la valeur initiale. === Cas 1 < k < 3 === Faites le même travail en testant les valeurs ''k = 1.5'' et ''k = 2.5''. Là encore, cas non chaotique mais néanmoins un peu plus intéressant : La valeur à laquelle se stabilise la population est fonction de k. === Cas 3 < k < 3.57 === Faites le même travail en testant les valeurs ''k = 3.2'', ''k = 3.5'', ''k = 3.545''. Il se passe quelque chose de surprenant : la population se stabilise sur quelque chose de périodique. Le comportement devient plus compliqué. La valeur initiale ''u0'' n'a toujours pas d'incidence sur ce qui se passe à la long terme. === Cas 3.57 < k === Vous pouvez essayer ''k = 3.6''. Cette fois non seulement aucune période n'est visible, mais de plus la valeur de ''u0'' a une grande importance. On parle de //dépendance aux conditions initiales// ce qui est un signe distinctif de ce qu'on appelle //chaos// dans le cadre de la théorie mathématique du même nom. ===== Rechercher la période ===== Vous avez visuellement constaté que le tableau obtenu en fin de simulation pouvait présenter une période. Parfois 2, parfois 4... On souhaite détecter automatiquement la présence d'une période. === Vérifier si une période convient === Écrire une fonction ''has_period'', * entrée ''T'', un tableau de nombres, * entier strictement positif ''P'', la période testée * renvoie ''True'' si ''T'' présente deux répétitions identiques de ''P'' éléments à partir de la fin. La suite $\left(u_n\right)$ n'est jamais vraiment périodique. Elle peut devenir //asymptotiquement// périodique, c'est à dire pour $n \to +\infty$. Nous ne pouvons bien sûr pas simuler jusqu'à $+\infty$ alors nous simulons jusque ''N = 10000'' et nous approximons les valeurs obtenues. Vérifier que ''h = arrondir(historique(0.85, 3.5, 10000))'' a bien une période de 4. === Détecter automatiquement la période === Écrire une fonction ''detect_period'' recevant un tableau ''T'' et qui renvoie la valeur de la plus petite période possible ou ''False'' s'il n'y en a pas. Vérifier que pour le tableau précédent, ''detect_period(h)'' renvoie bien 4. ==== Affichage des périodes ==== En parcourant les valeurs de ''k'' vous pouvez découvrir que * pour k = 3.5, la période est de 4, * pour k = 3.545, la période est de 8, * pour k = 3.565, la période est de 16, * pour k = 3.569, la période est de 32, * pour k = 3.5698, la période est de 64, * pour k = 3.5699, la période est de 128, * ... * pour k = 3.57, il n'y a plus de période. * De façon surprenante, un semblant d'ordre revient parfois. Par exemple, pour k = 3.82843, la période est de 3. Ces résultats sont résumés par ce graphique. En ordonnée, x représente les valeurs prises asymptotiquement par $u_n$ et en abscisse, r est le facteur k. {{ logisticmap_bifurcationdiagram.png?direct&400 |}} Vous pouvez voir l'explosion de la période à partir de 3.5, et aussi des petits moments d'ordre vers 3.8. Produire cette image est un problème intéressant !