Loading [MathJax]/jax/output/CommonHTML/jax.js
Back
Close

Recueil d'exercices pour apprendre Python au lycée

M_C
186.8K views

La suite logistique

Difficulté : de Facile à Difficile
Prérequis : Les listes

La suite est très intéressante à étudier car c'est un des exemples les plus simples qui permettent d'observer ce que l'on appelle le chaos. C'est l'équivalent en physique du double pendule : un phénomène simple et pourtant imprévisible. On pourra lire Wikipédia pour plus d'information sur la théorie du Chaos.

Le but de cette page est donc de présenter la suite logistique et toucher du doigt son coté chaotique.

Définition de la suite

Difficulté : Facile

On appelle suite logistique la suite définie pour un réel μ>0 par un+1=μun(1un).

Créer une fonction u(mu,u0,n) qui prend en entrée le paramètre μ (mu), le premier terme u0 et un entier n et renvoie en sortie la liste des termes de la suite de u0 jusqu'à un.

Définition des suites
def u(mu,u0,n):
# Ne pas toucher ce qui précède
# Les valeurs pour les variables en entrée seront automatiquement données
# Ecrire ci-dessous en n'oubliant pas d'indenter et d'utiliser return pour renvoyer un résultat
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Représentation graphique I

Difficulté : Facile

Une première façon de représenter notre suite est de manière classique c'est à dire n selon les abscisses et un selon les ordonnées.

Créer une fonction dessiner(mu,u0,n) qui affiche avec matplotlib les points associés à la suite allant de u0 jusqu'à un. On pourra utiliser la fonction plt.plot(X,Y,".-",linewidth=1) pour afficher les points et les relier. Le résultat devra ressembler à image

Remarques : Il n'y a pas de vérificateur car c'est une fonction graphique.
Ne pas oublier de copier coller votre fonction u(mu,u0,n).
Pour la dernière courbe affichée, on peut voir que plus la valeur de μ augmente, plus la suite devient chaotique dans le sens où il devient difficile de prédire la valeur de un alors que pour μ=1,6, c'est très facile vu qu'elle se "stabilise" autour d'une seule valeur.

Représentation graphique 1
import matplotlib.pyplot as plt
# Copier coller ci dessous votre fonction u(mu,u0,n)
def dessiner(mu,u0,n):
# Les valeurs pour les variables en entrée seront automatiquement données
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Représentation graphique II

Difficulté : Difficile

Nous allons à présent représenter notre suite par sa représentation dite "en escalier". Cela ressemble à ceci pour mu=2.8 et u0=0.9 : figure2

On y représente la fonction f(x)=μx(1x) ainsi que la droite y=x. Pour dessiner cette représentation, voici la démarche :
On part de x=u0, pour obtenir graphiquement la valeur de u1, il suffit de regarder sur l'axe des ordonnées la valeur de f(u0). Le problème est que pouvoir refaire la même opération, il faudrait pouvoir situer u1 sur l'axe des abscisses. Un première façon serait de prendre un compas et reporter la longueur mais on peut faire plus simple avec simplement une règle : On reporte horizontalement la valeur de u1 sur la droite y=x (puisque les points de cette droite on même abscisse et ordonnée) puis on redescend vertivalement sur l'axe des abscisses pour avoir notre valeur u1 sur l'axe des abscisses.
On recommence ainsi de suite pour calculer u2, u3...

Dans la pratique, comme sur la figure ci-dessus, on enchaine directement les traits sans aller aux axes. Cela donne à chaque fois les deux étapes :

  • On joint verticalement le point (ui,ui) au point (ui,ui+1).
  • On joint horizontalement le point (ui,ui+1) au point (ui+1,ui+1).

A vous maintenant de compléter la fonction dessiner(mu,u0,n) pour qu'elle affiche la représentation en escalier de la suite logistique c'est à dire dessiner la foncion f, la droite y=x et "les escaliers" formés par les termes de la suite selon la description précédente.

Remarques : On peut observer que pour les deux premiers graphiques, la suite converge vers un point, pour les deux suivantes, elle devient plus complexe et oscille entre plusieurs points. Enfin, pour la dernière, on peut voir qu'elle ne se rapproche de plus aucun point en particulier mais au contraire, s'étale sur tout un intervalle de valeurs.

Représentation graphique 2
import matplotlib.pyplot as plt
import numpy as np
# Copier coller votre fonction u(mu,u0,n) ci-dessous
# La fonction à compléter :
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Sensibilité aux conditions initiales

Difficulté : Moyenne

Maintenant, nous allons nous intéresser au caractère chaotique de cette suite. On a pu voir grâce aux représentations précédentes que la suite devient de moins en moins stable au fur et à mesure que mu augmente. Pour de faibles valeurs, elle converge vers une limite, puis lorsque μ augmente entre 3 et 3,5, elle commence à osciller entre plusieurs points pour finalement se répartir sur tout un intervalle lorsque mu devient trop grand. Ce n'est pourtant pas en ce sens que l'on emploie le terme chaotique pour cette suite (même si cela y contribue).

En effet, un suite est dite chaotique lorsqu'elle est sensible aux conditions initiales. Concrètement, cela signifie que si on part de deux conditions initiale très proches u0 et u0+ϵ, on ne sera pas forcément proche (voir même très éloignées) pour des valeurs suivantes de (un).

Prenons un exemple non chaotique : je considère la suite dont la relation de récurrence est un+1=0.9un4.
Si je commence avec u0=3 alors u50=39.77838766608525.
Si je commence avec u0=2.9999999999 alors u50=39.778387666085756.
La différence n'est pas flagrante...

Pour notre suite : Pour μ=4 Si je commence avec u0=0.9 alors u50=0.5600367632223772.
Si je commence avec u0=0.89999999999 alors u50=0.2903856953167539.
On est parti de nombres extrêmement proches et pourtant les résultats sont très éloignés. C'est pour cela qu'on dit que cette suite est chaotique.
Cela pose un problème concret pour le calcul : Si vous faites ces calculs avec votre calculatrice, vous ne trouverez pas les mêmes résultats. En effet, la calculatrice n'ayant pas les mêmes chiffres significatifs que python, vous aurez des résultats fondamentalement différents.

Modifier votre fonction dessiner(mu,u0,n)précédente (la seconde si possible mais ça peut être la première si vous n'avez pas réussi à écrire la seconde) pour qu'elle affiche la suite commençant par u0 et d'une autre couleur la suite commençant par u0+1013.

Remarque : Pour l'affichage, on a pris différentes valeurs de μ pour voir s'accentuer au fur et à mesure de son augmentation le côté chaotique de la suite. En effet, pour de petites valeurs, on ne distingue pas les deux suites alors que lorsque μ se rapproche de 4, on les distingue bien.
Pour encore mieux voir le phénomène, vous pouvez modifier encore votre fonction pour n'afficher que les 30 dernieres valeurs de la suite pour bien voir que l'évolution est très différentes.

Sensibilité aux conditions initiales
import matplotlib.pyplot as plt
import numpy as np
# Copier coller votre fonction u(mu,u0,n)
# Copier coller votre fonction dessiner(mu,u0,n) puis la modifier pour afficher les deux cas demandés
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Diagramme de bifurcation

Difficulté : Difficile

On a vu sur les représentations précédentes que plus mu augmente, plus les valeurs que prend la suite s'étalent sur l'intervalle [0;1] : Pour mu=1,6 ou mu=2.8, elle converge, pour mu=3.2 elle oscille autour de deux valeurs, pour mu=3.5 elle oscille autour de 4 valeurs et pour mu=4, elle semble osciller entre toutes les valeurs.

Pour avoir une idée de l'évolution lorsque mu augmente, on pourrait tracer toutes les représentations graphiques et en faire un film mais plus simplement, on va tracer ce qu'on appelle le diagramme de bifurcation selon le protocole suivant :

En abscisse, on fait varier mu entre 2 et 4 avec un pas de 0.001, et pour chaque μ, on affiche les 100 termes u201,u202,...,u300 arrondis à 0.001 près.

Pour μ entre 2 et 3.56, on obtient le début de diagramme suivant : bifurcation

Compléter le programme suivant pour qu'il affiche le diagramme de bifurcation entre 2 et 4.

Sensibilité aux conditions initiales
import matplotlib.pyplot as plt
# Copier Coller votre fonction u(mu,u0,n) ci dessous
mu=2
while mu < ... :
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Prolongements possibles

On pourra observer les comportements d'autres suites comme par exemple un+1=μsin(un) ou un+1=μu2n.

Un prolongement possible est aussi l'étude de la fonction logistique f(x)=μx(1x) mais sur l'ensemble des nombres complexes. On obtient alors l'ensemble de Mandelbrot.

Create your playground on Tech.io
This playground was created on Tech.io, our hands-on, knowledge-sharing platform for developers.
Go to tech.io
codingame x discord
Join the CodinGame community on Discord to chat about puzzle contributions, challenges, streams, blog articles - all that good stuff!
JOIN US ON DISCORD
Online Participants