Outils pour utilisateurs

Outils du site


nsi:tds:chaos_logistique

Suite logistique et chaos

Page très détaillée sur 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 Ntels 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.

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 !

nsi/tds/chaos_logistique.txt · Dernière modification : de goupillwiki