La suite logistique a été popularisée en 1976 afin de modéliser l’évolution d’une population d’une année sur l’autre, sous contrainte de ressources limitées. Sa richesse tient à un paradoxe apparent : une règle de récurrence d’une grande simplicité entraîne, selon la valeur d’un seul paramètre, des comportements bien différents. Cette suite est donc richesse d’enseignement pour s’entraîner sur les notions les plus techniques sur ce chapitre de prépa. Dans cet article, nous allons étudier mathématiquement la suite logistique en détail, analyser la stabilité de ses points fixes et l’apparition des cycles, puis explorer visuellement son comportement en Python.
Définition et premières propriétés
Définition et domaine d’études
Soit \(r > 0\) un paramètre réel et \(x_0 \in ]0, 1[\) une condition initiale. On définit la suite logistique par la relation de récurrence :
\[x_{n+1} = f(x_n) \quad \text{avec} \quad f(x) = rx(1-x)\]
La fonction \(f\) est une parabole sur \(\mathbb{R}\), symétrique par rapport à \(x = \frac{1}{2}\), de maximum \(\frac{r}{4}\) atteint en \(x = \frac{1}{2}\). Pour que \(f\) envoie \([0,1]\) dans \([0,1]\), condition nécessaire pour que la suite reste dans l’intervalle, il faut que \(\sup_{x \in [0,1]} f(x) \leq 1\), soit \(\frac{r}{4} \leq 1\), d’où \(r \leq 4\). On se place donc dans le cas \(0 < r \leq 4\) pour toute la suite de cet article.
Stabilité de l’intervalle \([0,1]\)
Montrons que si \(x_0 \in ]0,1[\) et \(0 < r \leq 4\), alors \(x_n \in ]0,1[\) pour tout \(n \geq 0\) par récurrence. Cette question est ultra-classique et déjà tombée aux concours en Maths I.
Notons que l’initialisation est immédiate d’abord. Ensuite, si \(x_n \in ]0,1[\), alors \(x_n > 0\) et \(1 – x_n > 0\), donc \(f(x_n) = rx_n(1-x_n) > 0\). De plus, par l’inégalité arithmético-géométrique :
\[x_n(1-x_n) \leq \left(\frac{x_n + (1-x_n)}{2}\right)^2 = \frac{1}{4}\]
donc \(f(x_n) = rx_n(1-x_n) \leq \frac{r}{4} \leq 1\). L’intervalle \(]0,1[\) est donc stable par \(f\).
Points fixes
Un point fixe de \(f\) est un réel \(x^*\) tel que \(f(x^*) = x^*\), c’est-à-dire \(rx^*(1-x^*) = x^*\). On développe :
\[rx^* – rx^{*2} – x^* = 0\]
\[x^*\bigl((r-1) – rx^*\bigr) = 0\]
On obtient deux solutions :
\[x^* = 0 \quad \text{et} \quad x^* = \frac{r-1}{r}\]
Le second point fixe vérifie \(x^* = 1 – \frac{1}{r} \in ]0,1[\) si et seulement si \(r > 1\). Pour \(r \leq 1\), le seul point fixe dans \([0,1]\) est \(0\).
Étude de la stabilité
Critère de stabilité locale
Un point fixe \(x^*\) est localement stable si toute suite partant d’un point suffisamment proche de \(x^*\) converge vers \(x^*\). Le critère de stabilité pour une suite récurrente \(x_{n+1} = f(x_n)\) est donné par la dérivée de \(f\) (\(f'(x) = r – 2rx = r(1 – 2x)\)) en \(x^*\) :
\[\vert f'(x^*) \vert < 1 \Rightarrow x^* \text{ est stable}\]
\[\vert f'(x^*) \vert > 1 \Rightarrow x^* \text{ est instable}\]
Ce résultat se justifie par un développement de Taylor au voisinage de \(x^*\) (indice : en posant \(\varepsilon_n = x_n – x^*\)). Nous ne développerons pas le détail de cette démonstration un peu longue et très technique par rapport au programme vu en ECG.
Le critère \(\vert f'(x^*) \vert < 1\) s’explique intuitivement : \(f'(x^*)\) mesure la « pente » de \(f\) en \(x^*\). Si cette pente est inférieure à 1 en valeur absolue, \(f\) « compresse » localement les distances autour de \(x^*\), donc deux points proches de \(x^*\) ont des images encore plus proches. La suite se rapproche donc inexorablement de \(x^*\). Si la pente dépasse 1, à l’inverse, \(f\) « étire » les distances, et la suite s’échappe.
Stabilité du point fixe \(x^* = 0\)
On calcule \(f'(0) = r\). Le critère de stabilité donne :
\[\vert f'(0) \vert < 1 \iff r < 1\]
Donc, \(x^* = 0\) est stable si et seulement si \(0 < r < 1\). Pour \(r > 1\), ce point fixe devient instable : toute suite partant de \(]0,1[\) s’éloigne de \(0\). Nous illustrerons ce résultat avec Python dans la partie suivante.
Stabilité du point fixe \(x^* = \frac{r-1}{r}\)
On calcule :
\[f’\!\left(\frac{r-1}{r}\right) = r\left(1 – 2 \cdot \frac{r-1}{r}\right) = r \cdot \frac{r – 2(r-1)}{r} = r – 2(r-1) = 2 – r\]
Le critère de stabilité donne :
\[\vert f'(x^*) \vert < 1 \iff \vert 2 – r \vert < 1 \iff -1 < 2 – r < 1 \iff 1 < r < 3\]
Donc, \(x^* = \frac{r-1}{r}\) est stable si et seulement si \(1 < r < 3\). En \(r = 3\), on a \(f'(x^*) = -1\) : le point fixe perd sa stabilité, ce qui annonce une bifurcation que nous étudierons également dans la troisième partie de cet article.
Étude en Python
Convergence pour différentes valeurs de \(r\)
Voici une proposition de script pour obtenir les valeurs de la suite logistique en fonction de \(x_0\), \(r\) et le nombre de valeurs souhaité \(N\).
Dans ce script, on initialise la liste avec (x_0), puis la boucle ‘for’ calcule à chaque itération le terme suivant via \(x_{n+1} = rx_n(1-x_n)\) en utilisant x[-1], qui désigne toujours le dernier élément de la liste et l’ajoute avec ‘append’. Le script renvoie in fine la liste complète des (N) termes.
On trace la suite pour \(r = 0{,}5\) (convergence vers \(0\)), \(r = 2{,}8\) (convergence vers \(\frac{r-1}{r} = \frac{1{,}8}{2{,}8} \approx 0{,}643\)) et \(r = 3{,}5\) (oscillations entre deux valeurs).
On obtient alors le graphique suivant :
Le graphique confirme exactement les résultats de la deuxième partie :
Pour \(r = 0{,}5\), la suite converge vers \(0\) : c’est cohérent avec notre calcul de notre deuxième partie qui montre que \(x^* = 0\) est stable pour \(r < 1\). Avec \(r = 2{,}8\), la suite converge vers \(x^* = \frac{r-1}{r} = \frac{1{,}8}{2{,}8} \approx 0{,}643\) : c’est le point fixe non trivial, stable pour \(1 < r < 3\), comme établi en fin de deuxième partie.
Pour \(r = 3{,}5\), la suite n’atteint aucun point fixe, mais oscille entre deux valeurs.
La toile d’araignée
La toile d’araignée illustre graphiquement les itérations de \(f\) : on trace \(y = f(x)\) et la diagonale \(y = x\), puis pour chaque itération, on trace un segment vertical de \((x_n, x_n)\) à \((x_n, f(x_n))\) suivi d’un segment horizontal de \((x_n, f(x_n))\) à \((f(x_n), f(x_n))\). Les points fixes apparaissent aux intersections de \(f\) et de la diagonale (tu vérifieras d’ailleurs grâce aux graphiques suivant que les points fixes sont bien ceux calculés plus haut).
Ce script est certes un peu long, mais pas de panique, analysons-le et tu verras qu’il est plus abordable qu’il n’y paraît.
On trace d’abord la parabole (y = f(x)) et la diagonale (y = x) en pointillés (aux lignes 6 et 7), dont les intersections sont exactement les points fixes calculés en première partie.
La boucle construit ensuite la toile pas à pas : pour chaque itération, on calcule (f(x_n)), on trace un segment vertical de ((x_n, x_n)) à ((x_n, f(x_n))), puis un segment horizontal de ((x_n, f(x_n))) à ((f(x_n), f(x_n))). Ces deux segments forment un « L » qui matérialise une itération, et on passe au terme suivant avec x=fx.
Pas la peine de s’attarder sur les lignes 14 et 15 qui ne servent qu’à paramétrer le graph en sortie, mais qu’il est inutile de maîtriser pour les concours.
Pour \(r = 2{,}8\), la toile spirale vers le point fixe stable \(x^* \approx 0{,}643\), conformément à notre calcul de la deuxième partie. Pour \(r = 3{,}7\), la toile remplit densément une région de \([0,1]^2\) sans jamais se stabiliser : c’est la signature visuelle du chaos.
On obtient alors les graphiques suivants :
Le diagramme de bifurcation
Pour chaque valeur de \(r\) entre \(1\) et \(4\), on laisse la suite converger en éliminant les 300 premiers termes transitoires, puis on affiche les 200 valeurs suivantes. On obtient ainsi une carte complète des comportements en fonction de \(r\).
Analysons ce script
On balaie 3 000 valeurs de \(r\) entre \(1\) et \(4\) avec la fonction ‘np.linspace’ dont on aura pris le soin d’importer la librairie numpy avant. Pour chaque valeur, on effectue d’abord 300 itérations sans rien afficher pour éliminer le régime transitoire et laisser la suite atteindre son comportement permanent, puis on affiche 200 valeurs en régime permanent. On affiche ensuite le graph obtenu.
On obtient alors le graphique suivant :
Pour \(1 < r < 3\), la courbe est une branche unique : pour chaque valeur de \(r\), la suite converge vers un seul point en régime permanent, qui est le point fixe stable \(x^* = \frac{r-1}{r}\) établi en deuxième partie. Plus \(r\) augmente, plus ce point fixe se déplace vers le haut.
En \(r = 3\), la branche se dédouble brutalement : le point fixe perd sa stabilité comme montré en deuxième partie, et la suite commence à osciller entre deux valeurs distinctes. C’est la première bifurcation.
Entre \(r = 3\) et \(r \approx 3{,}57\), de nouveaux doublements apparaissent de plus en plus rapidement : la suite oscille entre 2 valeurs, puis 4, puis 8, etc. Ces doublements successifs sont visibles comme des nouvelles divisions des branches sur le diagramme.
Pour \(r > 3{,}57\) environ, le diagramme devient dense : la suite ne converge plus vers aucun cycle et son comportement devient imprévisible.
Conclusion
En définitive, la suite logistique est un formidable outil pour vérifier ta compréhension fine des enjeux autour des suites en préparation des sujets les plus complexes les abordant. Cette notion est donc super utile pour t’entraîner en vue des écrits de Parisiennes ou des oraux.
Il n’y a plus qu’à croiser les doigts pour qu’un tel thème tombe aux concours !
Tu peux retrouver ici le méga-répertoire qui contient toutes les annales de concours et les corrigés. Tu peux également accéder ici à toutes nos autres ressources mathématiques !







