Le théorème des valeurs intermédiaires et la table bancale Grand Oral · mathématiques, physique-chimie, HLP Un support de connaissances pour construire sa propre question

← Tous les textes du Grand Oral

MathsPCHLP

À la terrasse d'un café, la table boite. On glisse un sous-bock sous un pied… ou bien on la tourne sur place. Les mathématiques affirment que, sous des hypothèses raisonnables, il existe toujours une position, obtenue en tournant la table d'au plus un quart de tour, où ses quatre pieds touchent le sol. La démonstration tient en quelques lignes, et elle repose sur un théorème du programme de terminale : le théorème des valeurs intermédiaires.

Ce théorème paraît évident : une courbe que l'on trace sans lever le crayon, qui part sous une droite horizontale et finit au-dessus, doit la traverser. Pourtant, il a fallu attendre 1817 pour qu'on le démontre, et la démonstration a obligé à préciser ce qu'est un nombre réel. Il permet aussi de résoudre des énigmes célèbres : le moine qui gravit et redescend la montagne, les deux points opposés de l'équateur à la même température, la crêpe qu'on partage d'un seul coup de couteau.

Ce texte rassemble ces connaissances, avec les mathématiques de terminale : continuité, théorème des valeurs intermédiaires, suites monotones et limites, dérivation, intégrales, géométrie dans l'espace, algorithme de dichotomie. Il ne propose pas de Grand Oral tout fait : à chacun d'y choisir une direction et d'y construire sa question.

Sommaire
  1. Le théorème des valeurs intermédiaires
  2. Pourquoi il a fallu le démontrer
  3. La table bancale
  4. Le moine et la montagne
  5. Deux points opposés à la même température
  6. Couper une crêpe en deux
  7. Le point fixe et la carte « vous êtes ici »
  8. Ce que le théorème ne dit pas
  9. Des directions pour construire sa question
Le théorème des valeurs intermédiaires L'énoncé du programme Théorème des valeurs intermédiaires

Soit $f$ une fonction continue sur un intervalle $[a ; b]$. Pour tout réel $k$ compris entre $f(a)$ et $f(b)$, il existe au moins un réel $c$ de $[a ; b]$ tel que $f(c) = k$.

Autrement dit, une fonction continue sur un intervalle ne « saute » aucune valeur : entre $f(a)$ et $f(b)$, elle prend toutes les valeurs intermédiaires. Graphiquement, toute droite horizontale d'équation $y = k$, avec $k$ entre $f(a)$ et $f(b)$, coupe la courbe au moins une fois au-dessus de $[a ; b]$.

Le cas le plus utilisé est celui où $k = 0$ : si $f$ est continue sur $[a ; b]$ et si $f(a)$ et $f(b)$ sont de signes contraires, alors l'équation $f(x) = 0$ a au moins une solution dans $[a ; b]$. C'est sous cette forme que nous l'utiliserons pour la table.

var opt = {fontSize: 12, useKatex: false, useMathJax: false, parse: false, fixed: true, highlight: false}; var petit = {fontSize: 11, useKatex: false, parse: false, fixed: true, highlight: false}; var ax = {strokeColor: '#455a64', strokeWidth: 1, fixed: true, highlight: false, lastArrow: true}; board.create('segment', [[-2.5, 0], [2.6, 0]], ax); board.create('segment', [[0, -1.6], [0, 4.1]], ax); function f(x) { return x * x * x - 3 * x + 1; } var a = -2, b = 2; board.create('segment', [[a, 0], [a, f(a)]], {strokeColor: '#90a4ae', dash: 2, fixed: true, highlight: false}); board.create('segment', [[b, 0], [b, f(b)]], {strokeColor: '#90a4ae', dash: 2, fixed: true, highlight: false}); board.create('text', [a - 0.1, 0.3, 'a'], opt); board.create('text', [b + 0.06, -0.3, 'b'], opt); for (var u = 1; u <= 3; u++) { board.create('segment', [[0, u], [0.06, u]], {strokeColor: '#455a64', fixed: true, highlight: false}); board.create('text', [0.12, u, String(u)], petit); } board.create('segment', [[0, -1], [-0.06, -1]], {strokeColor: '#455a64', fixed: true, highlight: false}); board.create('text', [0.12, -1, '−1'], petit); board.create('functiongraph', [f, a, b], {strokeColor: '#1565c0', strokeWidth: 2, highlight: false}); var sk = board.create('slider', [[-2.2, -2.15], [0.9, -2.15], [-1, 1.6, 3]], {withLabel: false, snapWidth: 0.05}); board.create('text', [1.15, -2.15, function () { return 'k = ' + sk.Value().toFixed(2).replace('.', ',').replace('-', '−'); }], opt); board.create('line', [[0, function () { return sk.Value(); }], [1, function () { return sk.Value(); }]], {strokeColor: '#c62828', dash: 2, strokeWidth: 1.5, highlight: false, fixed: true}); function racines() { var k = sk.Value(), r = [], n = 4000, x0 = a, y0 = f(a) - k, i, x1, y1; if (Math.abs(y0) < 1e-9) r.push(a); for (i = 1; i <= n; i++) { x1 = a + (b - a) * i / n; y1 = f(x1) - k; if (Math.abs(y1) < 1e-9) { if (r.length === 0 || x1 - r[r.length - 1] > 0.01) r.push(x1); } else if (y0 * y1 < 0) { var lo = x0, hi = x1, j; for (j = 0; j < 40; j++) { var m = (lo + hi) / 2; if ((f(lo) - k) * (f(m) - k) <= 0) hi = m; else lo = m; } r.push((lo + hi) / 2); } x0 = x1; y0 = y1; } return r; } for (var q = 0; q < 3; q++) { (function (q) { board.create('point', [function () { var r = racines(); return r.length > q ? r[q] : 10; }, function () { return sk.Value(); }], {name: '', size: 3, color: '#c62828', fixed: true, highlight: false}); })(q); } board.create('text', [-2.6, 3.95, function () { var n = racines().length; return n + (n > 1 ? ' solutions' : ' solution') + ' de f(x) = k'; }], opt); La courbe de la fonction $f(x) = x^3 - 3x + 1$ sur $[-2 ; 2]$, avec $f(-2) = -1$ et $f(2) = 3$. Le curseur déplace la droite $y = k$ entre $-1$ et $3$ : elle coupe toujours la courbe, une, deux ou trois fois. Le théorème garantit au moins une solution, pas une seule.
Un exemple à la main

Montrons que l'équation $x^3 + x - 1 = 0$ a une solution, et une seule, dans $[0 ; 1]$. Posons $f(x) = x^3 + x - 1$.

  • $f$ est un polynôme, donc elle est continue sur $[0 ; 1]$.
  • $f(0) = -1 < 0$ et $f(1) = 1 > 0$.
  • D'après le théorème des valeurs intermédiaires, l'équation $f(x) = 0$ a au moins une solution $\alpha$ dans $[0 ; 1]$.
  • De plus, $f'(x) = 3x^2 + 1 > 0$, donc $f$ est strictement croissante : elle ne peut pas prendre deux fois la valeur $0$. La solution est unique.

Le théorème dit que $\alpha$ existe, mais pas combien il vaut. Pour l'approcher, on coupe l'intervalle en deux et on regarde le signe au milieu : c'est la dichotomie.

intervallemilieu $m$$f(m)$signe
$[0 ; 1]$$0{,}5$$-0{,}375$$-$
$[0{,}5 ; 1]$$0{,}75$$0{,}172$$+$
$[0{,}5 ; 0{,}75]$$0{,}625$$-0{,}131$$-$
$[0{,}625 ; 0{,}75]$$0{,}6875$$0{,}012$$+$

Après quatre étapes, $0{,}625 < \alpha < 0{,}6875$. À chaque étape, la longueur de l'intervalle est divisée par $2$ ; après $n$ étapes, elle vaut $\dfrac{1}{2^n}$. En continuant, on trouve $\alpha \approx 0{,}6823$.

Le cas d'une fonction strictement monotone

L'exemple précédent illustre le corollaire du cours : si $f$ est continue et strictement monotone sur $[a ; b]$, alors pour tout $k$ entre $f(a)$ et $f(b)$, l'équation $f(x) = k$ a une unique solution dans $[a ; b]$. L'existence vient du théorème, l'unicité de la stricte monotonie. On présente souvent ce résultat dans un tableau de variations, avec une flèche qui traverse la valeur $k$.

Sans continuité, le théorème est faux

Les hypothèses comptent. Deux contre-exemples :

  • la fonction partie entière sur $[0 ; 2]$ : elle vaut $0$ en $0$ et $2$ en $2$, mais ne prend jamais la valeur $0{,}5$ : sa courbe fait des sauts ;
  • la fonction qui vaut $-1$ pour $x < 0$ et $1$ pour $x \geqslant 0$ : elle change de signe sur $[-1 ; 1]$ sans jamais s'annuler.

Même une fonction continue peut décevoir si l'on oublie que l'ensemble de départ est un intervalle : la fonction $x \mapsto \dfrac{1}{x}$ est continue sur $[-1 ; 0[ \,\cup\, ]0 ; 1]$, vaut $-1$ en $-1$ et $1$ en $1$, et ne s'annule jamais.

Pourquoi il a fallu le démontrer Bolzano, 1817, et Cauchy, 1821 Portrait en noir et blanc de Bernard Bolzano, homme âgé au visage mince, en habit d'ecclésiastique. Bernard Bolzano (1781-1848). Portrait du XIXe siècle, auteur inconnu, domaine public, Wikimedia Commons.

Pendant le XVIIIe siècle, les savants utilisent ce résultat sans le démontrer : il paraît aller de soi, car on pense une courbe comme le mouvement continu d'un point. En 1817, Bernard Bolzano, prêtre et professeur de philosophie à Prague, publie un mémoire au titre explicite : Démonstration purement analytique du théorème selon lequel, entre deux valeurs qui donnent des résultats de signes opposés, il y a au moins une racine réelle de l'équation. Il refuse les preuves « géométriques », qui s'appuient sur l'intuition du mouvement, et veut une preuve qui ne repose que sur les nombres.

Quatre ans plus tard, en 1821, Augustin-Louis Cauchy donne dans son Cours d'analyse de l'École polytechnique une démonstration par subdivisions successives, très proche de la dichotomie ci-dessous. C'est le moment où l'analyse cherche à se débarrasser des « infiniment petits » au profit de la notion de limite : le texte Les doutes posés par les infinitésimaux raconte cette histoire.

Une démonstration avec les outils de terminale

Le programme de terminale admet le théorème. On peut pourtant le démontrer avec la dichotomie et un résultat du cours sur les suites, à condition d'admettre ce dernier.

Si $f$ est continue sur $[a ; b]$ et si $f(a) < k < f(b)$, il existe $c$ dans $[a ; b]$ tel que $f(c) = k$

Étape 1 : construire deux suites. On pose $a_0 = a$ et $b_0 = b$. Si $a_n$ et $b_n$ sont construits, on note $m = \dfrac{a_n + b_n}{2}$. Si $f(m) \leqslant k$, on pose $a_{n+1} = m$ et $b_{n+1} = b_n$ ; sinon, on pose $a_{n+1} = a_n$ et $b_{n+1} = m$.

Étape 2 : une propriété qui se transmet. Montrons par récurrence que, pour tout $n$, $f(a_n) \leqslant k \leqslant f(b_n)$. C'est vrai pour $n = 0$. Si c'est vrai au rang $n$ : dans le premier cas, $f(a_{n+1}) = f(m) \leqslant k$ et $b_{n+1} = b_n$ ; dans le second, $f(b_{n+1}) = f(m) > k$ et $a_{n+1} = a_n$. Dans les deux cas, la propriété est vraie au rang $n + 1$.

Étape 3 : les deux suites se rejoignent. Par construction, $(a_n)$ est croissante, $(b_n)$ est décroissante, et la longueur de l'intervalle est divisée par $2$ à chaque étape :

$$b_n - a_n = \frac{b - a}{2^n}.$$

La suite $(a_n)$ est croissante et majorée par $b$ : d'après le théorème de convergence monotone, elle converge vers un réel $c$, qui est dans $[a ; b]$. Comme $\dfrac{b - a}{2^n}$ tend vers $0$, $b_n = a_n + \dfrac{b - a}{2^n}$ converge aussi vers $c$.

Étape 4 : passer à la limite. La fonction $f$ est continue en $c$, donc $f(a_n)$ et $f(b_n)$ tendent vers $f(c)$. Par passage à la limite dans les inégalités $f(a_n) \leqslant k$ et $k \leqslant f(b_n)$, on obtient $f(c) \leqslant k$ et $k \leqslant f(c)$, donc $f(c) = k$.

Le cas $f(a) > k > f(b)$ se traite de même (ou en appliquant ce résultat à $-f$), et les cas $k = f(a)$ ou $k = f(b)$ sont évidents.

Où se cachent les nombres réels

Toute la démonstration repose sur l'étape 3 : « une suite croissante et majorée converge ». Ce résultat, admis en terminale, est vrai pour les nombres réels, mais faux pour les fractions. Les valeurs approchées décimales de $\sqrt{2}$ ($1$ ; $1{,}4$ ; $1{,}41$ ; $1{,}414$ ; …) forment une suite croissante de fractions, majorée par $2$, qui n'a aucune limite parmi les fractions, puisque $\sqrt{2}$ est irrationnel.

Le théorème des valeurs intermédiaires est donc faux si l'on ne travaille qu'avec des fractions : la fonction $x \mapsto x^2 - 2$ vaut $-1$ en $1$ et $2$ en $2$, mais ne s'annule en aucune fraction. Ce qui semblait « évident » dépend en réalité d'une propriété profonde de l'ensemble $\mathbb{R}$ : il n'a pas de « trous ». Il faudra attendre les années 1870, avec Richard Dedekind et Georg Cantor, pour que les nombres réels soient construits rigoureusement, et que cette propriété devienne un théorème.

C'est une question qui intéresse aussi la philosophie : qu'est-ce qu'une évidence en mathématiques, et pourquoi démontrer ce que tout le monde « voit » ?

La table bancale Le modèle et ses hypothèses

Pour transformer le problème du café en problème mathématique, il faut faire des hypothèses, et les dire honnêtement :

  • les quatre pieds ont la même longueur, et leurs extrémités forment un carré ;
  • le sol est décrit par une fonction continue : au point de coordonnées horizontales $(u ; v)$, sa hauteur est $g(u ; v)$ ; il peut être bosselé, mais il n'a ni marche ni fissure ;
  • le sol est peu incliné : quand la table penche un peu, on néglige le léger déplacement horizontal de ses pieds.

On tourne la table autour de son centre, d'un angle $\theta$. Notons $A$, $B$, $C$, $D$ les positions horizontales des quatre pieds, dans cet ordre autour du carré, et $z_A$, $z_B$, $z_C$, $z_D$ les hauteurs du sol sous ces pieds. Elles dépendent de $\theta$. On pose

$$f(\theta) = (z_A + z_C) - (z_B + z_D),$$

la différence entre les sommes des hauteurs du sol sous les deux diagonales du carré.

Pourquoi $f(\theta) = 0$ suffit : un peu de géométrie dans l'espace

Notons $A'$, $B'$, $C'$, $D'$ les points du sol situés sous les pieds. Le milieu $I$ de $[A'C']$ est à la verticale du centre de la table, à la hauteur $\dfrac{z_A + z_C}{2}$ ; le milieu $J$ de $[B'D']$ est sur la même verticale, à la hauteur $\dfrac{z_B + z_D}{2}$.

Si $f(\theta) = 0$, les quatre points $A'$, $B'$, $C'$, $D'$ sont dans un même plan

Étape 1. Si $f(\theta) = 0$, alors $z_A + z_C = z_B + z_D$, donc $I$ et $J$ ont la même hauteur. Comme ils sont sur la même verticale, $I = J$.

Étape 2. Les segments $[A'C']$ et $[B'D']$ ont donc le même milieu. Les droites $(A'C')$ et $(B'D')$ sont sécantes en $I$, et elles sont distinctes : elles définissent un plan, qui contient les quatre points.

Étape 3. De plus, $\overrightarrow{A'B'} = \overrightarrow{A'I} + \overrightarrow{IB'} = \overrightarrow{IC'} + \overrightarrow{D'I}$, donc $\overrightarrow{A'B'} = \overrightarrow{D'C'}$ : $A'B'C'D'$ est un parallélogramme.

Le plateau de la table, incliné parallèlement à ce plan, repose alors sur ses quatre pieds : la table ne boite plus (dans l'approximation d'un sol peu incliné). Il reste à trouver un angle $\theta$ tel que $f(\theta) = 0$.

Un quart de tour change le signe

Quand on tourne la table d'un quart de tour, chaque pied prend la place du suivant : $A$ va en $B$, $B$ en $C$, $C$ en $D$, $D$ en $A$. Les deux diagonales échangent leurs rôles, donc

$$\begin{aligned} f(\theta + 90^\circ) &= (z_B + z_D) - (z_C + z_A) \\ &= -f(\theta). \end{aligned}$$

Un exemple à la main. Dans la figure ci-dessous, le sol est décrit par une fonction inventée pour l'exemple. Pour $\theta = 0^\circ$, les hauteurs du sol sous les pieds sont, en millimètres :

angle$z_A$$z_B$$z_C$$z_D$$f(\theta)$
$0^\circ$$6{,}69$$-0{,}24$$0{,}11$$3{,}04$$6{,}80 - 2{,}80 = 4{,}00$
$90^\circ$$-0{,}24$$0{,}11$$3{,}04$$6{,}69$$2{,}80 - 6{,}80 = -4{,}00$

Après un quart de tour, on retrouve les mêmes quatre hauteurs, décalées d'une colonne : $f$ a changé de signe.

Il existe un angle $\theta$ entre $0^\circ$ et $90^\circ$ pour lequel la table ne boite pas

Étape 1 : continuité. Quand $\theta$ varie, les pieds se déplacent continûment sur un cercle et le sol est continu, donc $z_A$, $z_B$, $z_C$, $z_D$ sont des fonctions continues de $\theta$, et $f$ aussi, comme somme et différence de fonctions continues.

Étape 2 : les signes. Si $f(0) = 0$, l'angle $\theta = 0$ convient. Sinon, $f(90^\circ) = -f(0)$ est de signe contraire à $f(0)$.

Étape 3 : conclure. D'après le théorème des valeurs intermédiaires appliqué à $f$ sur $[0^\circ ; 90^\circ]$, il existe $\theta_0$ dans cet intervalle tel que $f(\theta_0) = 0$. Pour cet angle, les quatre points du sol sont dans un même plan, et la table repose sur ses quatre pieds.

var opt = {fontSize: 12, useKatex: false, useMathJax: false, parse: false, fixed: true, highlight: false}; var petit = {fontSize: 11, useKatex: false, parse: false, fixed: true, highlight: false}; var ax = {strokeColor: '#455a64', strokeWidth: 1, fixed: true, highlight: false, lastArrow: true}; var S = 6; function sol(u, v) { return 4 * Math.sin(1.1 * u + 0.5) + 3 * Math.cos(1.7 * v - 0.3) + 2 * u * v; } function hauteurs(t) { var h = [], k; for (k = 0; k < 4; k++) { var w = t + Math.PI / 4 + k * Math.PI / 2; h.push(sol(Math.cos(w), Math.sin(w))); } return h; } function F(t) { var h = hauteurs(t); return h[0] + h[2] - h[1] - h[3]; } function nb(x) { return x.toFixed(1).replace('.', ',').replace('-', '−'); } board.create('segment', [[0, 0], [3.3, 0]], ax); board.create('segment', [[0, -1.05], [0, 1.15]], ax); var lab = ['0°', '45°', '90°', '135°', '180°']; for (var i = 0; i <= 4; i++) { var xx = i * Math.PI / 4; board.create('segment', [[xx, 0], [xx, -0.05]], {strokeColor: '#455a64', fixed: true, highlight: false}); board.create('text', [xx - 0.12, -0.17, lab[i]], petit); } board.create('segment', [[0, 1], [-0.05, 1]], {strokeColor: '#455a64', fixed: true, highlight: false}); board.create('segment', [[0, -1], [-0.05, -1]], {strokeColor: '#455a64', fixed: true, highlight: false}); board.create('text', [-0.27, 1, '6'], petit); board.create('text', [-0.4, -1, '−6'], petit); board.create('text', [0.06, 1.3, 'f(θ) en mm'], petit); board.create('functiongraph', [function (t) { return F(t) / S; }, 0, Math.PI], {strokeColor: '#1565c0', strokeWidth: 2, highlight: false}); var st = board.create('slider', [[0.2, -1.22], [2.3, -1.22], [0, 0, 180]], {withLabel: false, snapWidth: 1}); function th() { return st.Value() * Math.PI / 180; } board.create('segment', [[function () { return th(); }, 0], [function () { return th(); }, function () { return F(th()) / S; }]], {strokeColor: '#c62828', dash: 2, highlight: false, fixed: true}); board.create('point', [function () { return th(); }, function () { return F(th()) / S; }], {name: '', size: 3, color: '#c62828', fixed: true, highlight: false}); board.create('text', [2.4, -1.22, function () { return 'θ = ' + Math.round(st.Value()) + '°'; }], opt); var cx = 1.62, cy = 2.45, R = 0.62; function pied(k, d) { var w = th() + Math.PI / 4 + k * Math.PI / 2; return [cx + d * R * Math.cos(w), cy + d * R * Math.sin(w)]; } board.create('polygon', [[function () { return pied(0, 1)[0]; }, function () { return pied(0, 1)[1]; }], [function () { return pied(1, 1)[0]; }, function () { return pied(1, 1)[1]; }], [function () { return pied(2, 1)[0]; }, function () { return pied(2, 1)[1]; }], [function () { return pied(3, 1)[0]; }, function () { return pied(3, 1)[1]; }]], {fillColor: '#d7ccc8', fillOpacity: 0.6, borders: {strokeColor: '#6d4c41', strokeWidth: 2, highlight: false}, vertices: {visible: false}, highlight: false, fixed: true}); board.create('point', [cx, cy], {name: '', size: 1, color: '#6d4c41', fixed: true, highlight: false}); var noms = ['A', 'B', 'C', 'D']; for (var k = 0; k < 4; k++) { (function (k) { board.create('point', [function () { return pied(k, 1)[0]; }, function () { return pied(k, 1)[1]; }], {name: '', size: 3, color: (k % 2 === 0) ? '#1565c0' : '#ef6c00', fixed: true, highlight: false}); board.create('text', [function () { var p = pied(k, 1.32); var w = th() + Math.PI / 4 + k * Math.PI / 2; return p[0] - (Math.cos(w) < -0.3 ? 0.62 : (Math.cos(w) > 0.3 ? 0 : 0.3)); }, function () { return pied(k, 1.32)[1]; }, function () { return noms[k] + ' : ' + nb(hauteurs(th())[k]); }], petit); })(k); } board.create('text', [-0.4, 3.4, function () { return 'f(θ) = ' + nb(F(th())) + ' mm'; }], {fontSize: 12, useKatex: false, parse: false, fixed: true, highlight: false, color: '#c62828'}); En haut, la table vue de dessus, tournée d'un angle $\theta$ : à côté de chaque pied, la hauteur du sol en millimètres (sol inventé pour l'exemple). Les pieds bleus forment une diagonale, les orange l'autre. En bas, la courbe de $f(\theta)$ : elle change de signe entre $0^\circ$ et $90^\circ$, et la table ne boite plus pour $\theta \approx 21^\circ$. On voit aussi que la courbe se reproduit retournée tous les $90^\circ$.
Trouver l'angle par dichotomie

Le théorème dit qu'un angle convient, sans dire lequel. Avec la fonction du sol de la figure, la dichotomie le trouve en quelques dizaines d'étapes :

from math import sin, cos, pi def sol(u, v): # hauteur du sol en mm (inventée pour l'exemple) return 4 * sin(1.1 * u + 0.5) + 3 * cos(1.7 * v - 0.3) + 2 * u * v def f(theta): # theta en degrés z = [] for k in range(4): w = (theta + 45 + 90 * k) * pi / 180 z.append(sol(cos(w), sin(w))) return (z[0] + z[2]) - (z[1] + z[3]) a, b = 0, 90 # f(0) et f(90) sont de signes contraires print("f(0) =", round(f(0), 2), " f(90) =", round(f(90), 2)) while b - a > 0.01: m = (a + b) / 2 if f(a) * f(m) <= 0: b = m else: a = m print("la table ne boite plus pour un angle d'environ", round(a, 2), "degrés")
Ce que disent les mathématiciens

L'argument ci-dessus est la version simplifiée, et classique, du problème. Une démonstration complète doit tenir compte du fait que les pieds se déplacent un peu horizontalement quand la table s'incline. Plusieurs articles l'ont fait, notamment celui du physicien André Martin (2005) et celui de Bill Baritompa, Rainer Löwen, Burkard Polster et Marty Ross (2007). Selon ces travaux, le résultat reste vrai pour une table carrée si la pente du sol ne dépasse pas une certaine valeur, de l'ordre de $35^\circ$ : aucune terrasse de café n'est aussi pentue. Pour une table rectangulaire, le raisonnement par quart de tour ne marche plus tel quel, car les pieds ne prennent pas la place les uns des autres ; ces articles montrent qu'on peut encore s'en sortir, au prix d'un raisonnement plus délicat.

En pratique, le conseil est simple : si la table boite, tournez-la doucement, d'au plus un quart de tour. Et si le sol a une marche, une rainure ou un trou, aucune hypothèse n'est vérifiée et le théorème ne promet rien.

Le moine et la montagne

Une énigme classique : un moine part du pied d'une montagne à 7 h et arrive au sommet à 17 h, en marchant à son rythme, avec des pauses. Le lendemain, il repart du sommet à 7 h et redescend par le même chemin, arrivant en bas à 17 h. Existe-t-il un endroit du chemin où il se trouve à la même heure les deux jours ?

Notons $m(t)$ la distance parcourue sur le chemin depuis le bas à l'heure $t$ le premier jour, et $d(t)$ la même distance le second jour, et $L$ la longueur du chemin. Ces fonctions sont continues (le moine ne se téléporte pas). Posons $h(t) = m(t) - d(t)$ :

D'après le théorème des valeurs intermédiaires, il existe une heure $t_0$ entre 7 h et 17 h telle que $h(t_0) = 0$, c'est-à-dire $m(t_0) = d(t_0)$ : à cette heure-là, le moine est au même endroit les deux jours. On peut aussi imaginer deux moines partant le même jour, l'un d'en bas, l'autre d'en haut : ils se croisent forcément.

var opt = {fontSize: 12, useKatex: false, useMathJax: false, parse: false, fixed: true, highlight: false}; var petit = {fontSize: 11, useKatex: false, parse: false, fixed: true, highlight: false}; var ax = {strokeColor: '#455a64', strokeWidth: 1, fixed: true, highlight: false, lastArrow: true}; board.create('segment', [[7, 0], [17.6, 0]], ax); board.create('segment', [[7, 0], [7, 11.3]], ax); for (var t = 9; t <= 17; t += 2) { board.create('segment', [[t, 0], [t, -0.2]], {strokeColor: '#455a64', fixed: true, highlight: false}); board.create('text', [t - 0.45, -0.75, t + ' h'], petit); } board.create('text', [6.6, -0.75, '7 h'], petit); for (var u = 2; u <= 10; u += 2) { board.create('segment', [[7, u], [6.85, u]], {strokeColor: '#455a64', fixed: true, highlight: false}); board.create('text', [6.0, u, String(u)], petit); } board.create('text', [7.15, 11.7, 'distance depuis le bas (km)'], petit); function m(t) { var x = (t - 7) / 10; if (x < 0.35) return 10 * (0.9 * x); if (x < 0.5) return 10 * 0.315; return 10 * (0.315 + (x - 0.5) * 1.37); } function d(t) { var x = (t - 7) / 10; return 10 * (1 - Math.pow(x, 0.7)); } board.create('functiongraph', [m, 7, 17], {strokeColor: '#2e7d32', strokeWidth: 2, highlight: false}); board.create('functiongraph', [d, 7, 17], {strokeColor: '#ef6c00', strokeWidth: 2, highlight: false}); board.create('text', [15.2, 5.0, 'montée'], {fontSize: 12, useKatex: false, parse: false, fixed: true, highlight: false, color: '#2e7d32'}); board.create('text', [8.3, 9.3, 'descente'], {fontSize: 12, useKatex: false, parse: false, fixed: true, highlight: false, color: '#ef6c00'}); var s = board.create('slider', [[7.5, -2.3], [13.6, -2.3], [7, 8, 17]], {withLabel: false, snapWidth: 0.05}); board.create('segment', [[function () { return s.Value(); }, function () { return m(s.Value()); }], [function () { return s.Value(); }, function () { return d(s.Value()); }]], {strokeColor: '#c62828', strokeWidth: 2, dash: 2, highlight: false, fixed: true}); board.create('point', [function () { return s.Value(); }, function () { return m(s.Value()); }], {name: '', size: 3, color: '#2e7d32', fixed: true, highlight: false}); board.create('point', [function () { return s.Value(); }, function () { return d(s.Value()); }], {name: '', size: 3, color: '#ef6c00', fixed: true, highlight: false}); function heure(x) { var h = Math.floor(x), mn = Math.round((x - h) * 60); if (mn === 60) { h++; mn = 0; } return h + ' h ' + (mn < 10 ? '0' : '') + mn; } board.create('text', [13.8, -2.3, function () { return heure(s.Value()); }], opt); board.create('text', [8.6, 11.0, function () { var h = m(s.Value()) - d(s.Value()); return 'h(t) = ' + h.toFixed(1).replace('.', ',').replace('-', '−') + ' km'; }], {fontSize: 12, useKatex: false, parse: false, fixed: true, highlight: false, color: '#c62828'}); Les deux journées du moine sur un chemin de $10$ km (allures inventées, avec une pause à la montée). Le curseur choisit une heure : le segment rouge mesure l'écart $h(t)$, négatif le matin, positif le soir. Les deux courbes se croisent forcément.

L'intérêt de l'énigme est qu'on ne peut pas dire où ni quand sans connaître les allures, mais qu'on peut affirmer avec certitude que cet endroit existe. C'est typique des théorèmes d'existence.

Deux points opposés à la même température

À un instant donné, la température varie continûment le long de l'équateur. Notons $T(\theta)$ la température au point de longitude $\theta$. Le point diamétralement opposé, l'antipode, a pour longitude $\theta + 180^\circ$. Existe-t-il deux points opposés de l'équateur à la même température ?

On pose $f(\theta) = T(\theta) - T(\theta + 180^\circ)$. Comme faire un tour complet ramène au même point, $T(\theta + 360^\circ) = T(\theta)$, donc

$$\begin{aligned} f(\theta + 180^\circ) &= T(\theta + 180^\circ) - T(\theta) \\ &= -f(\theta). \end{aligned}$$

C'est exactement la situation de la table, avec un demi-tour au lieu d'un quart de tour : si $f(0) \neq 0$, alors $f(0)$ et $f(180^\circ)$ sont de signes contraires, et le théorème des valeurs intermédiaires donne un angle $\theta_0$ tel que $f(\theta_0) = 0$ : les points de longitudes $\theta_0$ et $\theta_0 + 180^\circ$ ont la même température.

Le même raisonnement s'applique à n'importe quelle grandeur qui varie continûment le long d'un cercle : l'altitude, la pression, la salinité. Sur toute la surface de la Terre, un théorème plus fort, démontré par Karol Borsuk en 1933 et souvent appelé théorème de Borsuk-Ulam, affirme qu'il existe à chaque instant deux points antipodaux ayant à la fois la même température et la même pression. Sa démonstration dépasse le programme, mais l'idée de départ est celle-ci.

Couper une crêpe en deux Un seul coup de couteau vertical

On veut couper une crêpe (une forme plane quelconque) en deux parts de même aire, par un trait vertical. Prenons pour « crêpe » la région comprise entre l'axe des abscisses et la courbe de $p(x) = 3x^2 - x^3$ sur $[0 ; 3]$. La fonction $p$ est positive sur cet intervalle, donc l'aire à gauche du trait d'abscisse $c$ est une intégrale :

$$\begin{aligned} A(c) &= \int_0^c \left(3x^2 - x^3\right)\mathrm{d}x \\ &= \left[x^3 - \frac{x^4}{4}\right]_0^c \\ &= c^3 - \frac{c^4}{4}. \end{aligned}$$

L'aire totale est $A(3) = 27 - \dfrac{81}{4} = \dfrac{27}{4} = 6{,}75$, et l'on cherche $c$ tel que $A(c) = 3{,}375$.

  • $A$ est un polynôme, donc continue sur $[0 ; 3]$ ; $A(0) = 0$ et $A(3) = 6{,}75$.
  • $3{,}375$ est compris entre $0$ et $6{,}75$ : le théorème des valeurs intermédiaires donne un $c$ qui convient.
  • $A'(c) = p(c) > 0$ sur $]0 ; 3[$, donc $A$ est strictement croissante et ce $c$ est unique.

À la main : $A(1{,}8) \approx 3{,}21$ et $A(1{,}9) \approx 3{,}60$, donc $1{,}8 < c < 1{,}9$. La dichotomie donne $c \approx 1{,}843$. Le trait n'est pas au milieu de l'intervalle, en $1{,}5$ : la crêpe est plus épaisse à droite.

var opt = {fontSize: 12, useKatex: false, useMathJax: false, parse: false, fixed: true, highlight: false}; var petit = {fontSize: 11, useKatex: false, parse: false, fixed: true, highlight: false}; var ax = {strokeColor: '#455a64', strokeWidth: 1, fixed: true, highlight: false, lastArrow: true}; board.create('segment', [[-0.2, 0], [3.3, 0]], ax); board.create('segment', [[0, -0.3], [0, 4.6]], ax); for (var t = 1; t <= 3; t++) { board.create('segment', [[t, 0], [t, -0.1]], {strokeColor: '#455a64', fixed: true, highlight: false}); board.create('text', [t - 0.05, -0.32, String(t)], petit); } for (var u = 2; u <= 4; u += 2) { board.create('segment', [[0, u], [-0.05, u]], {strokeColor: '#455a64', fixed: true, highlight: false}); board.create('text', [-0.25, u, String(u)], petit); } function p(x) { return 3 * x * x - x * x * x; } function A(c) { return c * c * c - c * c * c * c / 4; } var sc = board.create('slider', [[0.1, -1.2], [2.1, -1.2], [0, 1, 3]], {withLabel: false, snapWidth: 0.01}); var gauche = board.create('curve', [[0], [0]], {fillColor: '#ffcc80', fillOpacity: 0.8, strokeWidth: 0, highlight: false}); gauche.updateDataArray = function () { var c = sc.Value(), X = [0], Y = [0], i, n = 60; for (i = 0; i <= n; i++) { var x = c * i / n; X.push(x); Y.push(p(x)); } X.push(c); Y.push(0); this.dataX = X; this.dataY = Y; }; var droite = board.create('curve', [[0], [0]], {fillColor: '#ffe0b2', fillOpacity: 0.6, strokeWidth: 0, highlight: false}); droite.updateDataArray = function () { var c = sc.Value(), X = [c], Y = [0], i, n = 60; for (i = 0; i <= n; i++) { var x = c + (3 - c) * i / n; X.push(x); Y.push(p(x)); } X.push(3); Y.push(0); this.dataX = X; this.dataY = Y; }; board.create('functiongraph', [p, 0, 3], {strokeColor: '#bf6c00', strokeWidth: 2, highlight: false}); board.create('segment', [[function () { return sc.Value(); }, 0], [function () { return sc.Value(); }, function () { return Math.max(p(sc.Value()), 0.15); }]], {strokeColor: '#c62828', strokeWidth: 2, highlight: false, fixed: true}); board.create('text', [2.28, -1.2, function () { return 'c = ' + sc.Value().toFixed(2).replace('.', ','); }], opt); board.create('text', [-0.4, 5.0, function () { return 'à gauche : ' + A(sc.Value()).toFixed(3).replace('.', ',') + ' moitié : 3,375'; }], opt); La « crêpe » sous la courbe de $p(x) = 3x^2 - x^3$, d'aire totale $6{,}75$. Le curseur déplace le trait de couteau ; l'aire à gauche, $A(c) = c^3 - \frac{c^4}{4}$, augmente continûment de $0$ à $6{,}75$, et passe par la moitié pour $c \approx 1{,}84$.
Deux crêpes d'un seul coup : le sandwich au jambon

Plus surprenant : deux crêpes posées n'importe comment sur une table peuvent toujours être coupées chacune en deux parts égales par un seul trait droit. L'idée utilise deux fois le théorème des valeurs intermédiaires :

  1. pour chaque direction $\theta$, on fait glisser un trait de cette direction : comme pour la crêpe ci-dessus, il existe une position qui partage la première crêpe en deux parts égales ;
  2. on note $f(\theta)$ l'aire de la seconde crêpe située « à gauche » de ce trait, moins la moitié de son aire. Tourner la direction d'un demi-tour échange la gauche et la droite, donc $f(\theta + 180^\circ) = -f(\theta)$ ;
  3. comme pour les antipodes, $f$ s'annule pour une direction $\theta_0$ : ce trait coupe les deux crêpes en deux.

Pour être complet, il faudrait justifier que $f$ est continue, ce qui demande un peu plus de travail. En dimension trois, le résultat correspondant est connu sous le nom de théorème du sandwich au jambon, attribué à Hugo Steinhaus et Stefan Banach vers 1938 : un seul coup de couteau plan peut partager en deux parts égales le pain, le jambon et le fromage, où qu'ils soient.

La dichotomie en Python

Le même algorithme sert pour la crêpe. On pourrait aussi résoudre directement l'équation $c^3 - \frac{c^4}{4} = 3{,}375$, mais aucune formule simple ne la résout : la dichotomie, elle, marche toujours. Le texte Approcher les solutions d'une équation la compare à d'autres méthodes.

def A(c): # aire de la crêpe à gauche du trait d'abscisse c return c**3 - c**4 / 4 moitie = A(3) / 2 a, b = 0, 3 etapes = 0 while b - a > 0.0001: m = (a + b) / 2 if A(m) < moitie: a = m else: b = m etapes = etapes + 1 print("aire totale :", A(3), " moitié :", moitie) print("couper en c =", round(a, 4), "après", etapes, "étapes")
Le point fixe et la carte « vous êtes ici » Un point fixe en dimension un

Un réel $c$ est un point fixe d'une fonction $f$ si $f(c) = c$. Graphiquement, c'est un point où la courbe coupe la droite d'équation $y = x$.

Toute fonction continue $f$ de $[0 ; 1]$ dans $[0 ; 1]$ a au moins un point fixe

Étape 1. On pose $g(x) = f(x) - x$, continue sur $[0 ; 1]$ comme différence de fonctions continues.

Étape 2. Comme $f$ prend ses valeurs dans $[0 ; 1]$ : $g(0) = f(0) \geqslant 0$ et $g(1) = f(1) - 1 \leqslant 0$.

Étape 3. $0$ est compris entre $g(1)$ et $g(0)$ : d'après le théorème des valeurs intermédiaires, il existe $c$ dans $[0 ; 1]$ tel que $g(c) = 0$, c'est-à-dire $f(c) = c$.

Un exemple à la calculatrice. La fonction cosinus envoie $[0 ; 1]$ dans $[\cos 1 ; 1] \subset [0 ; 1]$, donc elle a un point fixe. En mode radian, tapez $0$ puis appuyez sur la touche « cos » encore et encore : les résultats se stabilisent vers $0{,}739$, l'unique solution de $\cos x = x$. On calcule ainsi les termes de la suite $u_{n+1} = \cos(u_n)$, et l'on retrouve une propriété du cours : si une suite définie par $u_{n+1} = f(u_n)$ converge vers $\ell$, avec $f$ continue, alors $f(\ell) = \ell$. Le texte Approcher les solutions d'une équation développe cette méthode.

Brouwer et la carte du quartier

Le mathématicien néerlandais Luitzen Brouwer a démontré vers 1910-1912 la version de ce résultat en dimensions supérieures : toute application continue d'un disque dans lui-même (ou d'une boule dans elle-même) a un point fixe. Deux illustrations courantes :

  • posez par terre, dans une ville, un plan de cette ville : il existe un point du plan exactement au-dessus de l'endroit qu'il représente. C'est le point « vous êtes ici » des plans affichés dans les rues ;
  • prenez deux feuilles identiques superposées, froissez celle du dessus sans la déchirer et reposez-la sur l'autre sans qu'elle dépasse : au moins un point de la feuille froissée est exactement au-dessus du point correspondant de l'autre.

La démonstration de Brouwer dépasse le programme, mais en dimension un, c'est exactement le théorème des valeurs intermédiaires. Ces théorèmes de point fixe ont pris une grande importance au XXe siècle : l'existence de l'équilibre de Nash, par exemple, repose sur un théorème de ce type (voir L'équilibre de Nash).

Ce que le théorème ne dit pas Des directions pour construire sa question

Ce texte n'est pas un Grand Oral. Il rassemble des connaissances dans lesquelles chacun peut choisir une direction, la creuser et formuler sa propre question. Quelques directions possibles :

Pour l'échange avec le jury : les notions du cours à maîtriser

Le jury peut interroger sur les chapitres de spécialité mobilisés. Avec ce thème, il est utile de connaître parfaitement : la continuité et le théorème des valeurs intermédiaires, avec le cas des fonctions strictement monotones ; les tableaux de variations ; la dérivation ; les suites monotones, le théorème de convergence monotone et le raisonnement par récurrence ; la composée d'une suite par une fonction continue et les suites $u_{n+1} = f(u_n)$ ; les primitives et le calcul d'aire par une intégrale ; les vecteurs, les plans et les droites de l'espace ; l'algorithme de dichotomie en Python.

Pour réviser ces chapitres, l'application Maths FlashBac reprend tout le cours de spécialité en cartes.

Pour aller plus loin