Comment le GPS vous situe : sphères et plans Grand Oral · mathématiques, physique-chimie, NSI, HGGSP Un support de connaissances pour construire sa propre question

← Tous les textes du Grand Oral

MathsPCNSIHGGSP

Un téléphone affiche sa position à quelques mètres près, partout sur la Terre, sans rien envoyer à personne. Il se contente d'écouter des satellites qui tournent à plus de $20\,000$ km d'altitude, et de mesurer des durées. Tout le reste est un calcul de géométrie dans l'espace : des sphères, des plans, une droite et une équation du second degré.

Ce texte explique ce calcul avec les mathématiques de terminale : distance dans un repère orthonormé, produit scalaire, équation cartésienne d'un plan, représentation paramétrique d'une droite, second degré, trigonométrie et algorithmique. Il ne propose pas de Grand Oral tout fait : à chacun d'y choisir une direction et d'y construire sa question.

Sommaire
  1. Mesurer une distance avec une horloge
  2. D'abord dans le plan : trois cercles
  3. Dans l'espace : des sphères et des plans
  4. Trois sphères, deux points
  5. Le quatrième satellite et l'horloge du récepteur
  6. Précision, relativité et position des satellites
  7. Le calcul en Python
  8. GPS, Galileo et les autres
  9. Des directions pour construire sa question
Mesurer une distance avec une horloge

Chaque satellite GPS porte des horloges atomiques et envoie en permanence un message qui dit, en substance : « je suis tel satellite, voici ma position, et il est exactement telle heure ». Le récepteur note l'heure à laquelle il reçoit ce message. Le signal voyage à la vitesse de la lumière, $c \approx 299\,792$ km/s, donc la distance $d$ entre le satellite et le récepteur vaut

$$d = c \times \Delta t,$$

où $\Delta t$ est la durée du trajet du signal.

Un exemple à la main. Si le signal met $\Delta t = 0{,}07$ s pour arriver, alors

$$d \approx 299\,792 \times 0{,}07 \approx 20\,986 \text{ km}.$$

Cette seule mesure ne donne pas la position : elle dit seulement que le récepteur se trouve à $20\,986$ km du satellite, c'est-à-dire quelque part sur une sphère de centre le satellite et de rayon $20\,986$ km. Il faut donc plusieurs satellites, et le problème devient géométrique : trouver le point commun à plusieurs sphères.

Dans un repère orthonormé de l'espace, la distance entre deux points $A(x_A ; y_A ; z_A)$ et $M(x ; y ; z)$ est donnée par le cours. En notant $X = x - x_A$, $Y = y - y_A$ et $Z = z - z_A$,

$$AM = \sqrt{X^2 + Y^2 + Z^2}.$$

Un point $M$ est donc sur la sphère de centre $A$ et de rayon $r$ si et seulement si

$$(x - x_A)^2 + (y - y_A)^2 + (z - z_A)^2 = r^2.$$

C'est l'équation de la sphère. On a élevé au carré, ce qui est permis car une distance et un rayon sont positifs.

D'abord dans le plan : trois cercles

Pour comprendre la méthode, commençons dans le plan, avec des cercles. Imaginons trois émetteurs aux points $A(0 ; 0)$, $B(8 ; 0)$ et $C(4 ; 8)$, et un récepteur qui mesure une distance de $5$ à chacun des trois.

Deux cercles

Le récepteur $M(x ; y)$ est sur le cercle de centre $A$ et de rayon $5$, et sur celui de centre $B$ et de rayon $5$ :

$$x^2 + y^2 = 25$$

et

$$(x - 8)^2 + y^2 = 25.$$

Ce système n'est pas linéaire, à cause des carrés. L'astuce est de soustraire les deux équations : les termes $x^2$ et $y^2$ disparaissent. En développant $(x - 8)^2 = x^2 - 16x + 64$, on obtient

$$x^2 - (x^2 - 16x + 64) = 0,$$

soit $16x - 64 = 0$, donc $x = 4$. En reportant dans la première équation, $16 + y^2 = 25$, donc $y^2 = 9$ : $y = 3$ ou $y = -3$. Deux cercles qui se coupent ont deux points communs, ici $(4 ; 3)$ et $(4 ; -3)$.

Le troisième cercle tranche

Le point $(4 ; 3)$ est à la distance $\sqrt{0^2 + 5^2} = 5$ de $C$, mais le point $(4 ; -3)$ est à la distance $\sqrt{0^2 + 11^2} = 11$. Comme le récepteur a mesuré $5$, il est en $M(4 ; 3)$.

On peut aussi le retrouver par une deuxième soustraction. L'équation du cercle de centre $C$ et de rayon $5$ est $(x - 4)^2 + (y - 8)^2 = 25$, soit en développant

$$x^2 - 8x + 16 + y^2 - 16y + 64 = 25.$$

En la soustrayant de $x^2 + y^2 = 25$, on obtient $8x - 16 + 16y - 64 = 0$, soit $x + 2y = 10$. Avec $x = 4$, on trouve $y = 3$. Les deux soustractions ont transformé le problème en un système de deux équations de droites, que l'on sait résoudre.

var opt = {fontSize: 12, useKatex: false, useMathJax: false, parse: false, fixed: true, highlight: false}; var pt = {size: 3, withLabel: true, fixed: true, highlight: false, label: {fontSize: 12, useKatex: false, parse: false, offset: [6, 8]}}; var A = board.create('point', [0, 0], Object.assign({name: 'A', color: '#1565c0'}, pt)); A.label.setAttribute({offset: [-16, 8]}); var B = board.create('point', [8, 0], Object.assign({name: 'B', color: '#2e7d32'}, pt)); B.label.setAttribute({offset: [8, -14]}); var C = board.create('point', [4, 8], Object.assign({name: 'C', color: '#8d5524'}, pt)); var M = board.create('point', [4, 3], {name: 'M', withLabel: false, size: 4, color: '#c62828', highlight: false}); M.on('drag', function () { var x = Math.min(5, Math.max(3, M.X())), y = Math.min(4, Math.max(2, M.Y())); if (x !== M.X() || y !== M.Y()) { M.moveTo([x, y]); } }); var se = board.create('slider', [[-7, -9.6], [2.5, -9.6], [-1.5, 0, 1.5]], {withLabel: false, snapWidth: 0.1}); function r(P) { return Math.sqrt((P.X() - M.X()) * (P.X() - M.X()) + (P.Y() - M.Y()) * (P.Y() - M.Y())) + se.Value(); } board.create('circle', [A, function () { return r(A); }], {strokeColor: '#1565c0', strokeWidth: 2, fixed: true, highlight: false}); board.create('circle', [B, function () { return r(B); }], {strokeColor: '#2e7d32', strokeWidth: 2, fixed: true, highlight: false}); board.create('circle', [C, function () { return r(C); }], {strokeColor: '#8d5524', strokeWidth: 2, fixed: true, highlight: false}); function nb(x) { return x.toFixed(1).replace('.', ','); } board.create('text', [3.8, -9.6, function () { return 'erreur = ' + nb(se.Value()); }], opt); board.create('text', [-7.8, -11.4, function () { return Math.abs(se.Value()) < 0.05 ? 'Les trois cercles passent par le point rouge.' : 'Les trois cercles ne se coupent plus en un même point.'; }], opt); Les trois cercles sont centrés sur les émetteurs $A$, $B$ et $C$ et passent par le récepteur $M$ (le point rouge), que l'on peut déplacer. Le curseur ajoute la même erreur à chacune des trois distances, comme le ferait une horloge de récepteur mal réglée : dès que l'erreur n'est plus nulle, les trois cercles n'ont plus de point commun.
Dans l'espace : des sphères et des plans

Dans l'espace, la même soustraction transforme deux équations de sphères en une équation de plan. C'est le cœur mathématique du GPS, et on peut le démontrer avec le produit scalaire.

Soit $A$ et $B$ deux points distincts, $I$ le milieu de $[AB]$, et $r_A$, $r_B$ deux réels positifs. Si un point $M$ vérifie $AM = r_A$ et $BM = r_B$, alors $M$ appartient au plan orthogonal à $(AB)$ formé des points $M$ tels que $\overrightarrow{AB} \cdot \overrightarrow{IM} = \dfrac{r_A^2 - r_B^2}{2}$.

Étape 1 : écrire la différence des carrés. On a $AM^2 - BM^2 = r_A^2 - r_B^2$. Or le carré d'une distance est le carré scalaire d'un vecteur : $AM^2 = \overrightarrow{AM} \cdot \overrightarrow{AM}$. Comme pour les nombres, on factorise une différence de deux carrés :

$$\begin{aligned} &AM^2 - BM^2 \\ &= \left(\overrightarrow{AM} - \overrightarrow{BM}\right) \cdot \left(\overrightarrow{AM} + \overrightarrow{BM}\right). \end{aligned}$$

Étape 2 : le premier facteur. D'après la relation de Chasles, $\overrightarrow{AM} = \overrightarrow{AB} + \overrightarrow{BM}$, donc $\overrightarrow{AM} - \overrightarrow{BM} = \overrightarrow{AB}$.

Étape 3 : le second facteur. Comme $I$ est le milieu de $[AB]$, on a $\overrightarrow{IA} + \overrightarrow{IB} = \vec{0}$. Avec Chasles,

$$\begin{aligned} \overrightarrow{AM} + \overrightarrow{BM} &= \overrightarrow{AI} + \overrightarrow{IM} + \overrightarrow{BI} + \overrightarrow{IM} \\ &= 2\,\overrightarrow{IM}. \end{aligned}$$

Étape 4 : conclure. Finalement $AM^2 - BM^2 = 2\,\overrightarrow{AB} \cdot \overrightarrow{IM}$, donc

$$\overrightarrow{AB} \cdot \overrightarrow{IM} = \frac{r_A^2 - r_B^2}{2}.$$

Notons $H$ le point de la droite $(AB)$ tel que $\overrightarrow{AB} \cdot \overrightarrow{IH}$ soit égal à ce nombre (il existe, car $\overrightarrow{AB} \neq \vec{0}$). En soustrayant, la condition s'écrit $\overrightarrow{AB} \cdot \overrightarrow{HM} = 0$ : le point $M$ appartient au plan passant par $H$ et de vecteur normal $\overrightarrow{AB}$.

En coordonnées, on retrouve la même chose en développant et en soustrayant les deux équations de sphères : les termes $x^2$, $y^2$ et $z^2$ disparaissent, et il reste une équation de la forme

$$ax + by + cz + d = 0,$$

avec $(a ; b ; c)$ proportionnel aux coordonnées de $\overrightarrow{AB}$. C'est l'équation cartésienne d'un plan, au programme de terminale.

Géométriquement, deux sphères qui se coupent ont pour intersection un cercle, et ce cercle est contenu dans le plan que l'on vient de trouver. Dans le plan, c'était la même chose une dimension plus bas : deux cercles se coupent en deux points, situés sur une droite perpendiculaire à $(AB)$.

Trois sphères, deux points

Avec trois satellites $A$, $B$ et $C$ qui ne sont pas alignés, on obtient deux plans : l'un de vecteur normal $\overrightarrow{AB}$, l'autre de vecteur normal $\overrightarrow{AC}$. Ces vecteurs ne sont pas colinéaires, donc les deux plans se coupent selon une droite. Il reste à couper cette droite par l'une des sphères, ce qui conduit à une équation du second degré : deux solutions au plus.

Un exemple à la main

Prenons des unités choisies pour que les calculs soient simples. La Terre est une boule de centre $O(0 ; 0 ; 0)$ et de rayon $\sqrt{3} \approx 1{,}73$. Trois satellites sont aux points $A(5 ; 0 ; 0)$, $B(0 ; 5 ; 0)$ et $C(0 ; 0 ; 5)$, et le récepteur mesure à chacun la même distance $\sqrt{18}$. Il est donc sur les trois sphères :

$$(x - 5)^2 + y^2 + z^2 = 18,$$ $$x^2 + (y - 5)^2 + z^2 = 18,$$ $$x^2 + y^2 + (z - 5)^2 = 18.$$

Étape 1 : deux plans. La première équation moins la deuxième donne, après développement, $-10x + 25 + 10y - 25 = 0$, soit $y = x$. De même, la première moins la troisième donne $z = x$.

Étape 2 : la droite. Les points qui vérifient $y = x$ et $z = x$ forment la droite de représentation paramétrique

$$\begin{cases} x = t \\ y = t \\ z = t \end{cases} \qquad t \in \mathbb{R},$$

qui passe par $O$ et a pour vecteur directeur $\vec{u}(1 ; 1 ; 1)$.

Étape 3 : couper par une sphère. On remplace dans la première équation :

$$(t - 5)^2 + t^2 + t^2 = 18,$$

soit, en développant,

$$3t^2 - 10t + 7 = 0.$$

Le discriminant vaut $\Delta = 100 - 84 = 16$, donc il y a deux solutions, $t = \dfrac{10 - 4}{6} = 1$ et $t = \dfrac{10 + 4}{6} = \dfrac{7}{3}$. On obtient deux points :

$$M_1(1 ; 1 ; 1) \qquad \text{et} \qquad M_2\left(\tfrac{7}{3} ; \tfrac{7}{3} ; \tfrac{7}{3}\right).$$

Étape 4 : choisir. On a $OM_1 = \sqrt{3}$ : le point $M_1$ est à la surface de la Terre. Mais $OM_2 = \frac{7}{3}\sqrt{3} \approx 4{,}04$ : le point $M_2$ est loin dans l'espace, plus haut que les satellites eux-mêmes (qui sont à la distance $5$ de $O$). Le récepteur est donc en $M_1$.

Pourquoi deux points, et pourquoi on garde le bon

Les deux points $M_1$ et $M_2$ sont symétriques par rapport au plan $(ABC)$, qui a pour équation $x + y + z = 5$ : leur milieu $\left(\frac{5}{3} ; \frac{5}{3} ; \frac{5}{3}\right)$ est dans ce plan, et $\overrightarrow{M_1M_2}$ est colinéaire au vecteur normal $(1 ; 1 ; 1)$. Trois sphères centrées dans un même plan ne peuvent pas distinguer un point de son symétrique : c'est toujours vrai, pas seulement dans cet exemple.

Pour un vrai récepteur, les satellites sont tous dans le ciel, au-dessus de lui. Le point symétrique est alors de l'autre côté du plan des satellites, à des dizaines de milliers de kilomètres de la Terre, ou bien à une vitesse absurde : le récepteur l'écarte sans hésiter.

Le quatrième satellite et l'horloge du récepteur

Tout ce qui précède suppose que le récepteur connaît l'heure exacte. Or les satellites portent des horloges atomiques, mais un téléphone n'a qu'une horloge à quartz, beaucoup moins précise. Si l'horloge du récepteur est décalée d'une durée $\delta$, toutes les durées mesurées sont fausses de $\delta$, et toutes les distances sont fausses de la même quantité :

$$c \times \delta.$$

Pour $\delta = 1$ µs, c'est-à-dire un millionième de seconde, l'erreur vaut déjà $299\,792 \times 10^{-6} \approx 0{,}3$ km, soit $300$ mètres. Les distances mesurées ne sont donc pas les vraies distances : on les appelle des pseudo-distances. La figure du plan l'a montré : avec une même erreur sur chaque distance, les cercles n'ont plus de point commun.

La solution est de considérer le décalage $\delta$ comme une inconnue de plus. Le récepteur cherche alors quatre nombres, $x$, $y$, $z$ et $\delta$, qui vérifient pour chaque satellite $S_i$ :

$$S_iM = \rho_i - c\,\delta,$$

où $S_iM$ s'exprime avec $x$, $y$ et $z$ par la formule de la distance, et où $\rho_i$ est la pseudo-distance mesurée. Quatre inconnues demandent quatre équations : il faut quatre satellites. C'est pour cela qu'un GPS a besoin d'en voir au moins quatre, et qu'il en utilise davantage quand il le peut. En échange, un simple quartz suffit dans le téléphone : le calcul retrouve l'heure exacte en même temps que la position.

Ce système n'est plus aussi simple à résoudre à la main. Les récepteurs le résolvent par approximations successives : on part d'une position grossière, on remplace chaque équation par une approximation affine (comme une tangente), on résout le système linéaire obtenu, et l'on recommence. C'est une méthode de Newton à plusieurs inconnues, qui converge en quelques étapes ; le programme Python plus bas la met en œuvre.

Précision, relativité et position des satellites La relativité dans votre poche

Les satellites GPS se déplacent à près de $4$ km/s et sont loin de la Terre, là où la pesanteur est plus faible. La théorie de la relativité prévoit deux effets sur leurs horloges : la vitesse les fait retarder (de l'ordre de $7$ µs par jour), la pesanteur plus faible les fait avancer (de l'ordre de $45$ µs par jour). Au total, elles avancent d'environ $38$ µs par jour par rapport à une horloge au sol. Sans correction, l'erreur sur les distances grandirait chaque jour d'environ

$$299\,792 \times 38 \times 10^{-6} \approx 11 \text{ km}.$$

Les horloges des satellites sont donc réglées pour compenser cet effet. Le texte sur la mesure du temps raconte l'histoire des horloges, du cadran solaire aux horloges atomiques.

Les autres sources d'erreur
  • En traversant l'ionosphère et l'atmosphère, le signal est un peu ralenti : la distance calculée avec $c$ est trop longue.
  • En ville, le signal peut se réfléchir sur les façades avant d'arriver : le trajet est plus long que la ligne droite.
  • Les positions des satellites annoncées dans leurs messages sont elles-mêmes connues avec une petite incertitude.

À ciel ouvert, un téléphone obtient couramment une précision de quelques mètres ; des corrections envoyées par des stations au sol permettent de descendre bien plus bas, jusqu'au centimètre pour les géomètres.

La position des satellites dans le ciel compte

Chaque distance n'est connue qu'à une erreur $e$ près. Dans le plan, le récepteur n'est donc pas sur un cercle, mais dans un anneau de largeur $2e$. Près du récepteur, cet anneau ressemble à une bande. Deux bandes de largeur $2e$ qui se coupent forment un losange : c'est la zone où peut se trouver le récepteur.

Si les directions des deux satellites font un angle $\theta$ vu du récepteur, avec $0 < \theta < 180°$, la zone d'incertitude est un losange dont la plus grande demi-diagonale vaut $\dfrac{e}{\sin(\theta/2)}$ ou $\dfrac{e}{\cos(\theta/2)}$.

Étape 1. Chaque bande est perpendiculaire à la direction de son satellite. L'angle entre les deux bandes est donc aussi $\theta$, et leur intersection est un parallélogramme dont les deux hauteurs valent $2e$ : c'est un losange, de centre le récepteur.

Étape 2. Le côté de ce losange vaut $\dfrac{2e}{\sin\theta}$ : dans le triangle rectangle formé par un côté et une hauteur, la hauteur $2e$ est le côté opposé à l'angle $\theta$.

Étape 3. Les diagonales d'un losange sont ses bissectrices et se coupent à angle droit. Une demi-diagonale est donc le côté adjacent à l'angle $\theta/2$ dans un triangle rectangle d'hypoténuse le côté du losange :

$$\begin{aligned} &\frac{2e}{\sin\theta} \times \cos\left(\frac{\theta}{2}\right) \\ &= \frac{2e \cos(\theta/2)}{2\sin(\theta/2)\cos(\theta/2)} \\ &= \frac{e}{\sin(\theta/2)}, \end{aligned}$$

en utilisant $\sin\theta = 2\sin(\theta/2)\cos(\theta/2)$. Le même raisonnement avec l'angle supplémentaire donne l'autre demi-diagonale, $\dfrac{e}{\cos(\theta/2)}$.

Pour deux satellites vus à angle droit $(\theta = 90°)$, les deux demi-diagonales valent $\frac{e}{\sin 45°} \approx 1{,}41\,e$ : la zone est un petit carré. Mais pour deux satellites presque dans la même direction, par exemple $\theta = 20°$, la grande demi-diagonale vaut $\frac{e}{\sin 10°} \approx 5{,}8\,e$ : la position est quatre fois moins précise, avec les mêmes mesures. Il en va de même pour deux satellites dans des directions presque opposées $(\theta$ proche de $180°)$. Les spécialistes appellent ce phénomène la dilution de précision : un récepteur préfère des satellites bien répartis dans le ciel.

var opt = {fontSize: 12, useKatex: false, useMathJax: false, parse: false, fixed: true, highlight: false}; var st = board.create('slider', [[-5.5, -7.0], [1.6, -7.0], [10, 90, 170]], {withLabel: false, snapWidth: 1}); var e = 1, L = 20, YMIN = -6.2; function coupe(P) { // garde la partie du polygone située au-dessus de y = YMIN, pour laisser la place aux textes var R = [], k, a, b, t; for (k = 0; k < P.length; k++) { a = P[k]; b = P[(k + 1) % P.length]; if (a[1] >= YMIN) { R.push(a); } if ((a[1] >= YMIN) !== (b[1] >= YMIN)) { t = (YMIN - a[1]) / (b[1] - a[1]); R.push([a[0] + t * (b[0] - a[0]), YMIN]); } } return R; } function dir(s) { var a = (90 + s * st.Value() / 2) * Math.PI / 180; return [Math.cos(a), Math.sin(a)]; } function bande(s) { return function () { var n = dir(s), t = [-n[1], n[0]]; return [[e * n[0] + L * t[0], e * n[1] + L * t[1]], [e * n[0] - L * t[0], e * n[1] - L * t[1]], [-e * n[0] - L * t[0], -e * n[1] - L * t[1]], [-e * n[0] + L * t[0], -e * n[1] + L * t[1]]]; }; } function poly(f, coul) { var c = board.create('curve', [[0], [0]], {strokeColor: coul, strokeWidth: 1, fillColor: coul, fillOpacity: 0.18, highlight: false}); c.updateDataArray = function () { var P = coupe(f()), X = [], Y = [], k; for (k = 0; k <= P.length; k++) { X.push(P[k % P.length][0]); Y.push(P[k % P.length][1]); } this.dataX = X; this.dataY = Y; }; return c; } poly(bande(1), '#1565c0'); poly(bande(-1), '#2e7d32'); var los = board.create('curve', [[0], [0]], {strokeColor: '#c62828', strokeWidth: 2, fillColor: '#c62828', fillOpacity: 0.35, highlight: false}); los.updateDataArray = function () { var a = dir(1), b = dir(-1), P = [], s = [[1, 1], [1, -1], [-1, -1], [-1, 1]], k, det = a[0] * b[1] - a[1] * b[0], X = [], Y = []; for (k = 0; k < 4; k++) { var p = s[k][0] * e, q = s[k][1] * e; P.push([(p * b[1] - q * a[1]) / det, (a[0] * q - b[0] * p) / det]); } P = coupe(P); for (k = 0; k <= P.length; k++) { X.push(P[k % P.length][0]); Y.push(P[k % P.length][1]); } this.dataX = X; this.dataY = Y; }; var fl = {strokeColor: '#455a64', strokeWidth: 2, lastArrow: true, fixed: true, highlight: false}; board.create('segment', [[0, 0], [function () { return 5.3 * dir(1)[0]; }, function () { return 5.3 * dir(1)[1]; }]], fl); board.create('segment', [[0, 0], [function () { return 5.3 * dir(-1)[0]; }, function () { return 5.3 * dir(-1)[1]; }]], fl); board.create('text', [function () { return 5.9 * dir(1)[0]; }, function () { return 5.9 * dir(1)[1]; }, 'S1'], {fontSize: 12, useKatex: false, parse: false, fixed: true, highlight: false, anchorX: 'middle', anchorY: 'middle'}); board.create('text', [function () { return 5.9 * dir(-1)[0]; }, function () { return 5.9 * dir(-1)[1]; }, 'S2'], {fontSize: 12, useKatex: false, parse: false, fixed: true, highlight: false, anchorX: 'middle', anchorY: 'middle'}); board.create('point', [0, 0], {name: '', size: 2, color: '#000', fixed: true, highlight: false}); function nb(x, d) { return x.toFixed(d).replace('.', ','); } board.create('text', [2.6, -7.0, function () { return 'θ = ' + Math.round(st.Value()) + '°'; }], opt); board.create('text', [-6.2, -8.0, function () { var h = st.Value() * Math.PI / 360, g = Math.max(1 / Math.sin(h), 1 / Math.cos(h)); return 'plus grande demi-diagonale : ' + nb(g, 2) + ' × e'; }], opt); Le récepteur est au centre. Chaque bande colorée est la zone permise par la mesure d'un satellite (largeur $2e$, perpendiculaire à la direction du satellite). Leur intersection, en rouge, est la zone d'incertitude. Le curseur règle l'angle $\theta$ entre les deux satellites : la zone est la plus petite à 90° et s'allonge beaucoup quand les satellites sont presque alignés avec le récepteur.
Le calcul en Python Trois sphères : la méthode de ce texte

Le premier programme suit exactement la méthode expliquée plus haut : deux soustractions donnent deux plans, on trouve un point et un vecteur directeur de leur droite d'intersection, puis on résout l'équation du second degré. Il redonne les deux points de l'exemple à la main.

from math import sqrt def plan(S, T, rS, rT): # sphère de centre S moins sphère de centre T : un plan a x + b y + c z = d a = 2 * (T[0] - S[0]) b = 2 * (T[1] - S[1]) c = 2 * (T[2] - S[2]) d = rS**2 - rT**2 + (T[0]**2 + T[1]**2 + T[2]**2) - (S[0]**2 + S[1]**2 + S[2]**2) return [a, b, c, d] def trois_spheres(S1, S2, S3, r1, r2, r3): P = plan(S1, S2, r1, r2) Q = plan(S1, S3, r1, r3) # un vecteur u orthogonal aux deux vecteurs normaux dirige la droite u = [P[1]*Q[2] - P[2]*Q[1], P[2]*Q[0] - P[0]*Q[2], P[0]*Q[1] - P[1]*Q[0]] # un point A de la droite : on fixe à 0 la coordonnée où u est le plus grand k = 0 for m in range(3): if abs(u[m]) > abs(u[k]): k = m i, j = [m for m in range(3) if m != k] det = P[i]*Q[j] - P[j]*Q[i] A = [0, 0, 0] A[i] = (P[3]*Q[j] - P[j]*Q[3]) / det A[j] = (P[i]*Q[3] - P[3]*Q[i]) / det # on remplace (x ; y ; z) = A + t u dans l'équation de la première sphère w = [A[m] - S1[m] for m in range(3)] a = u[0]**2 + u[1]**2 + u[2]**2 b = 2 * (w[0]*u[0] + w[1]*u[1] + w[2]*u[2]) c = w[0]**2 + w[1]**2 + w[2]**2 - r1**2 delta = b*b - 4*a*c t1 = (-b - sqrt(delta)) / (2*a) t2 = (-b + sqrt(delta)) / (2*a) return [[A[m] + t1*u[m] for m in range(3)], [A[m] + t2*u[m] for m in range(3)]] for M in trois_spheres([5, 0, 0], [0, 5, 0], [0, 0, 5], sqrt(18), sqrt(18), sqrt(18)): OM = sqrt(M[0]**2 + M[1]**2 + M[2]**2) print("point", [round(x, 4) for x in M], " distance au centre de la Terre :", round(OM, 4))
Quatre satellites et une horloge fausse

Le second programme place un récepteur à Paris et quatre satellites à $26\,560$ km du centre de la Terre (des positions choisies pour l'exemple, toutes au-dessus de l'horizon de Paris). L'horloge du récepteur avance de $0{,}1$ ms : chaque pseudo-distance est trop longue de $30$ km. Le programme part du centre de la Terre et corrige sa position à chaque étape par la méthode de Newton ; il retrouve Paris et le décalage de l'horloge.

from math import sin, cos, radians, sqrt c = 299792.458 # vitesse de la lumière, en km/s R = 6371.0 # rayon de la Terre, en km (Terre supposée sphérique) def point(lat, lon, r): # coordonnées dans un repère orthonormé centré au centre de la Terre la, lo = radians(lat), radians(lon) return [r*cos(la)*cos(lo), r*cos(la)*sin(lo), r*sin(la)] def dist(A, B): return sqrt((A[0]-B[0])**2 + (A[1]-B[1])**2 + (A[2]-B[2])**2) M = point(48.85, 2.35, R) # Paris sats = [point(60, -20, 26560), point(30, 10, 26560), point(55, 40, 26560), point(10, -15, 26560)] erreur = 0.0001 # l'horloge du récepteur avance de 0,1 ms rho = [dist(S, M) + c*erreur for S in sats] print("erreur sur chaque distance :", round(c*erreur, 1), "km") def resoudre(A, B): # résout le système linéaire A X = B par la méthode du pivot de Gauss n = len(B) T = [A[i][:] + [B[i]] for i in range(n)] for k in range(n): p = k for i in range(k+1, n): if abs(T[i][k]) > abs(T[p][k]): p = i T[k], T[p] = T[p], T[k] for i in range(k+1, n): f = T[i][k] / T[k][k] for j in range(k, n+1): T[i][j] = T[i][j] - f * T[k][j] X = [0]*n for i in range(n-1, -1, -1): s = T[i][n] for j in range(i+1, n): s = s - T[i][j]*X[j] X[i] = s / T[i][i] return X # inconnues : x, y, z et b = c x (décalage de l'horloge) ; départ : centre de la Terre, b = 0 x = [0.0, 0.0, 0.0, 0.0] for etape in range(1, 7): lignes, seconds = [], [] for k in range(4): S = sats[k] d = dist(S, x) lignes.append([(x[0]-S[0])/d, (x[1]-S[1])/d, (x[2]-S[2])/d, 1.0]) seconds.append(rho[k] - (d + x[3])) dx = resoudre(lignes, seconds) x = [x[i] + dx[i] for i in range(4)] print("étape", etape, ": à", "%.3f" % dist(x, M), "km de Paris ; décalage trouvé :", "%.2f" % (x[3]/c*1e6), "µs")

En quatre ou cinq étapes, la position est retrouvée au millimètre près et le décalage de l'horloge vaut bien $100$ µs. Les vrais récepteurs font ce calcul plusieurs fois par seconde, avec plus de quatre satellites, en tenant compte de l'aplatissement de la Terre et de toutes les corrections décrites plus haut.

GPS, Galileo et les autres Vue d'artiste d'un satellite GPS doré aux deux grands panneaux solaires, en orbite au-dessus de la Terre. Vue d'artiste d'un satellite GPS en orbite. NASA, domaine public, Wikimedia Commons.

Le GPS (Global Positioning System) a été conçu par l'armée américaine. Les premiers satellites ont été lancés à partir de 1978, et le système a été déclaré pleinement opérationnel au milieu des années 1990. Jusqu'en mai 2000, la précision offerte aux civils était volontairement dégradée ; sa suppression a ouvert la voie aux usages actuels.

Une trentaine de satellites GPS sont en service. Ils tournent à environ $20\,200$ km d'altitude, sur six plans d'orbite, et font le tour de la Terre en un peu moins de $12$ heures. Leur répartition est choisie pour qu'en tout point de la Terre, à tout instant, au moins quatre satellites soient au-dessus de l'horizon, et en général bien davantage.

Animation : la Terre au centre, entourée des orbites des satellites GPS ; les satellites visibles depuis un point de la Terre sont reliés à lui par des traits verts, et leur nombre est affiché. La constellation GPS en mouvement : les satellites visibles depuis un point de la Terre sont reliés à lui. El pak, domaine public, Wikimedia Commons.

D'autres systèmes fonctionnent sur le même principe : GLONASS (Russie), BeiDou (Chine) et Galileo (Union européenne), dont les services ont commencé en 2016, avec des satellites à environ $23\,200$ km d'altitude. Un téléphone récent combine souvent plusieurs systèmes : il voit plus de satellites, mieux répartis dans le ciel, et la dilution de précision diminue.

L'enjeu n'est pas seulement technique. Dépendre d'un système contrôlé par un autre pays, pour les transports, l'agriculture, les réseaux électriques ou la synchronisation des transactions bancaires, est une question de souveraineté : c'est l'une des raisons d'être de Galileo. Les signaux, très faibles une fois arrivés au sol, peuvent aussi être brouillés ou imités, ce qui en fait un enjeu dans les conflits.

Enfin, un récepteur GPS ne fait que recevoir : les satellites ne savent pas qui les écoute, et c'est le téléphone lui-même qui calcule sa position. La question de la vie privée vient des applications qui transmettent ensuite cette position.

Les limites des modèles 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 géométrie repérée de l'espace et la distance dans un repère orthonormé ; le produit scalaire dans l'espace et l'orthogonalité ; le vecteur normal et l'équation cartésienne d'un plan ; la représentation paramétrique d'une droite et l'intersection d'une droite et d'un plan ; les équations du second degré et le discriminant ; la trigonométrie ; les boucles et les fonctions en Python.

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

Pour aller plus loin