Chapitre 15

Activités Python

Gravitation et lois de Kepler

Activité

Tester les lois de Kepler

Consigne

Ouvrez la page des scripts du chapitre pour consulter le code et télécharger les fichiers .py.

Le script Ch15_kepler.py (dossier scripts/) teste successivement les deuxième et troisième lois. Il calcule d’abord les aires des triangles qui approchent les secteurs balayés par Mercure, puis modélise T2T^{2} en fonction de a3a^{3} par une régression affine (M2, M3) et pèse le Soleil avec la pente. Il s’exécute tel quel, à deux lignes près (# À COMPLÉTER).

(La suite — moyenne et écart-type des aires, incertitude-type de l’ordonnée à l’origine, conversion de la pente en unités SI, pesée du Soleil et tracés — est fournie et n’est pas à modifier.)

Questions :

  1. Dans la première boucle, expliquer pourquoi la formule de S est l’aire d’un triangle et pourquoi cette aire approche celle du secteur balayé par le segment Soleil-Mercure.
  2. Comparer les 18 aires affichées à leur moyenne et à leur écart-type. La deuxième loi est-elle vérifiée compte tenu de la précision des données ?
  3. Compléter les deux lignes (a3a^{3} et T2T^{2}).
  4. Exécuter : les six T2/a3T^{2}/a^{3} sont-ils rigoureusement égaux ? Quelle planète s’écarte le plus, et de combien ?
  5. La valeur du tableau est aMercure=0,39a_{\text{Mercure}} = 0{,}39 u.a. ; la valeur précise est 0,3870{,}387. Recalculer T2/a3T^{2}/a^{3} pour Mercure avec la valeur précise : que devient l’écart ? Quelle leçon sur les chiffres significatifs (fiche O3), sachant que aa intervient au cube ?
  6. Le script affiche l’ajustement T2=ka3+bT^{2}=k\,a^{3}+b ainsi que b±u(b)b\pm u(b). Vérifier que bb est compatible avec zéro, puis conclure sur la proportionnalité à l’aide de la fiche M3.
  7. Le script affiche la masse du Soleil obtenue par la pente : commenter l’accord avec la valeur admise (1,989×10301{,}989\times 10^{30} kg).

Fiche O5 - Python, fiche M2 - régression, fiche M3 - proportionnalité, fiche O3 - chiffres significatifs, et fiche O4 - incertitudes : tout y est rappelé.

Script élève

# -*- coding: utf-8 -*-
# Chapitre 15 — Tester les deuxième et troisième lois de Kepler
# Mercure : aires balayées pendant des durées égales.
# Six planètes : régression affine de T^2 en fonction de a^3.

import math
import matplotlib.pyplot as plt
from scipy.stats import linregress

# --- deuxième loi : Mercure, une position tous les 5 jours ---
r = [0.3075, 0.315, 0.336, 0.363, 0.392, 0.418, 0.440, 0.455,
     0.464, 0.467, 0.462, 0.450, 0.432, 0.408, 0.381, 0.352,
     0.326, 0.310, 0.309]                       # u.a.
theta = [0, 31, 60, 85, 106, 124, 140, 155, 169, 183, 197, 211,
         227, 244, 263, 286, 312, 342, 13]       # degrés

aires = []
for i in range(len(r) - 1):
    dtheta = theta[i + 1] - theta[i]
    if dtheta < 0:
        dtheta = dtheta + 360
    S = 0.5 * r[i] * r[i + 1] * math.sin(math.radians(dtheta))
    aires.append(S)

somme_aires = 0.0
for S in aires:
    somme_aires = somme_aires + S
aire_moyenne = somme_aires / len(aires)
somme_ecarts = 0.0
for S in aires:
    somme_ecarts = somme_ecarts + (S - aire_moyenne) ** 2
ecart_type = math.sqrt(somme_ecarts / len(aires))

print("DEUXIEME LOI — aires balayees en 5 jours")
for i in range(len(aires)):
    print("S", i + 1, "=", aires[i], "ua2")
print("moyenne =", aire_moyenne, "ua2")
print("ecart-type relatif =", 100 * ecart_type / aire_moyenne, "%")

# --- troisième loi : six planètes ---
noms = ["Mercure", "Vénus", "Terre", "Mars", "Jupiter", "Saturne"]
a = [0.39, 0.72, 1.00, 1.52, 5.2, 9.52]      # u.a.
T = [87.9, 224.7, 365.25, 687.0, 4331.0, 10751.0]  # jours

G  = 6.674e-11
UA = 1.496e11    # m
JOUR = 86400.0   # s

# --- les deux listes de la régression ---
x = []
y = []
for i in range(len(a)):
    x.append(0)   # a au cube  # À COMPLÉTER
    y.append(0)   # T au carré  # À COMPLÉTER

# --- régression linéaire avec la méthode de la fiche M2 ---
reg = linregress(x, y)
pente = reg.slope          # en j2/ua3
ordonnee = reg.intercept   # en j2
n = len(x)
sx = 0.0
for valeur in x:
    sx = sx + valeur

# incertitude-type estimée de l'ordonnée à l'origine
x_moyen = sx / n
Sxx = 0.0
residus = []
for i in range(n):
    Sxx = Sxx + (x[i] - x_moyen) ** 2
    residus.append(y[i] - (pente * x[i] + ordonnee))
somme_residus = 0.0
for e_residu in residus:
    somme_residus = somme_residus + e_residu ** 2
ecart_residuel = math.sqrt(somme_residus / (n - 2))
u_ordonnee = ecart_residuel * math.sqrt(1 / n + x_moyen ** 2 / Sxx)

print("\nTROISIEME LOI — regression affine")
print("T2 =", pente, "a3 +", ordonnee)
print("b =", ordonnee, "+/-", u_ordonnee, "j2")
print("zero appartient a [b-u(b) ; b+u(b)] :",
      ordonnee - u_ordonnee <= 0 <= ordonnee + u_ordonnee)
for i in range(len(a)):
    print(noms[i], ": T2/a3 =", y[i] / x[i])

# la pente pèse le Soleil : k = 4 pi^2 / (G M), en unités SI
k_SI = pente * JOUR**2 / UA**3
M = 4 * math.pi**2 / (G * k_SI)
print("M_Soleil =", M, "kg   (valeur admise : 1,989e30 kg)")

plt.figure()
plt.plot(range(1, len(aires) + 1), aires, "o-", color="teal")
plt.axhline(aire_moyenne, color="orange", label="aire moyenne")
plt.xlabel("intervalle de 5 jours")
plt.ylabel("aire du triangle (u.a.2)")
plt.title("Deuxième loi de Kepler")
plt.grid(True)
plt.legend()
plt.show()

plt.figure()
plt.scatter(x, y, color="orange", zorder=3, label="planètes")
xs = [0, x[len(x) - 1] * 1.05]
ys = []
for valeur in xs:
    ys.append(pente * valeur + ordonnee)
plt.plot(xs, ys, color="teal", label="modèle T2 = k a3 + b")
plt.xlabel("a3 (u.a.3)")
plt.ylabel("T2 (jours2)")
plt.title("Troisième loi de Kepler")
plt.grid(True)
plt.legend()
plt.show()

← Retour au portail du chapitre