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
- Le théorème des valeurs intermédiaires
- Pourquoi il a fallu le démontrer
- La table bancale
- Le moine et la montagne
- Deux points opposés à la même température
- Couper une crêpe en deux
- Le point fixe et la carte « vous êtes ici »
- Ce que le théorème ne dit pas
- 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.
| intervalle | milieu $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
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)$ :
- $h(7) = 0 - L = -L < 0$ ;
- $h(17) = L - 0 = L > 0$.
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 :
- 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 ;
- 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)$ ;
- 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
- Il affirme qu'une solution existe, sans la donner : pour la calculer, il faut un algorithme, comme la dichotomie.
Certains mathématiciens du XXe siècle, dits « constructivistes », dont Brouwer lui-même, se méfiaient de ces preuves
d'existence qui ne construisent rien.
- Il ne dit pas que la solution est unique : il faut une hypothèse de plus, comme la stricte monotonie.
- Il ne s'applique qu'à des fonctions continues sur un intervalle : une marche dans le sol, une coupure
dans le chemin du moine, et la conclusion peut être fausse.
- Appliqué à la table, il repose sur un modèle : pieds de même longueur, sol continu et peu incliné. Un vrai café a
des joints de carrelage et des tables aux pieds inégaux.
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 :
- Mathématiques : le théorème des valeurs intermédiaires et ses hypothèses ; la démonstration par
dichotomie et le rôle des nombres réels ; la table bancale et le plan défini par deux droites sécantes ; la symétrie
$f(\theta + 90^\circ) = -f(\theta)$ ; l'aire par une intégrale et le partage d'une forme en deux ; le point
fixe et les suites récurrentes.
- Physique-chimie : les grandeurs qui varient continûment (température, pression) ; la
modélisation d'un problème concret et le choix des hypothèses ; le moine et les diagrammes horaires.
- Philosophie (HLP) : qu'est-ce qu'une évidence, et pourquoi démontrer ce que l'on « voit » ; les
démonstrations d'existence qui ne construisent rien ; le continu et le discontinu, de Zénon à Dedekind.
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