Physique-chimie · 2de · Pour aller plus loin n°3

Peser le trou noir
au cœur de la Voie lactée.

Au centre de notre galaxie orbite un trou noir supermassif, la source Sagittaire A*. Une étoile appelée S2 tourne autour de lui en 15,2 ans à peine. En exploitant les positions successives de cette étoile, tu vas retrouver exactement les mêmes outils Python que dans les fiches précédentes — et, avec la loi de Kepler, estimer la masse de ce monstre invisible.

sgr_a_star.py — aperçut = 0.00 s

Objectif de la fiche : exploiter les positions successives de l'étoile S2 en orbite autour du trou noir supermassif Sagittaire A*, pour en tracer les vecteurs vitesse puis les vecteurs variation de vitesse, et enfin estimer la masse du trou noir grâce à la loi de Kepler.

Cette fiche est autonome : tu n'as besoin d'aucun autre document, les données sont recopiées directement dans le script. Elle est présentée comme un petit projet, avec moins de scripts tout prêts que les fiches précédentes : à toi de réutiliser ce que tu as appris jusqu'ici (boucle for, plt.arrow, np.polyfit) pour avancer. Chaque étape reste néanmoins guidée par une consigne précise, à compléter puis à copier-coller dans Thonny (ou dans la console Basthon tout en bas de la page).

00

L'étoile S2 et Sagittaire A*

Présentation
  • Un trou noir supermassif est un trou noir dont la masse dépasse le million de masses solaires. On pense aujourd'hui que la plupart des grandes galaxies en abritent un en leur centre.
  • Celui de notre galaxie, la Voie lactée, correspond à la source radio Sagittaire A* (Sgr A*). Une équipe internationale d'astronomes, notamment de l'Institut Max-Planck, a suivi pendant plus de dix ans une étoile appelée S2 en orbite très rapprochée autour de cet objet invisible.
  • La trajectoire observée est une ellipse quasiment complète en un peu plus de 15 ans : une durée extrêmement courte à l'échelle astronomique, qui a permis de mesurer cette orbite avec une précision remarquable.

Caractéristiques de l'orbite (mesurées)

grandeurPériodeInclinaisonExcentricitéDemi-grand axe
valeur15,2 an46°0,870,119″

Le demi-grand axe est ici donné en secondes d'arc (″), l'unité angulaire utilisée pour mesurer de très petites distances apparentes dans le ciel — l'étoile S2 est bien trop loin pour qu'on exprime directement sa position en mètres.

Positions successives de l'étoile S2 (valeurs approchées)

Les astronomes pointent la position de l'étoile sur des images du ciel, année après année, exactement comme tu as pointé les positions d'une bille sur une chronophotographie dans les premières fiches. Le tableau ci-dessous reprend, sous une forme simplifiée à but pédagogique, l'allure de la trajectoire réellement publiée : une ellipse presque bouclée, avec un passage très rapproché du trou noir (le périastre) autour de l'année 2002.

année 1992,231994,321995,531996,251997,541998,361999,472000,472001,502002,252002,502002,66
x (″) 0,0450,010−0,010−0,025−0,048−0,055−0,058−0,052−0,040−0,0100,0050,012
y (″) 0,1480,1600,1630,1580,1320,1100,0820,0500,0240,0040,0010,003

Remarque : contrairement aux fiches précédentes, les intervalles de temps entre deux mesures ne sont pas constants (parfois plus de 2 ans, parfois quelques mois) : c'est une contrainte réelle de l'observation astronomique, dont il faudra tenir compte dans le calcul des vitesses.

etape0_donnees.py
import numpy as np
import matplotlib.pyplot as plt

# Dates des observations (années, au centième près)
t = np.array([1992.23, 1994.32, 1995.53, 1996.25, 1997.54, 1998.36,
        1999.47, 2000.47, 2001.50, 2002.25, 2002.50, 2002.66])

# Position de l'étoile S2 (secondes d'arc)
x = np.array([0.045, 0.010, -0.010, -0.025, -0.048, -0.055,
        -0.058, -0.052, -0.040, -0.010, 0.005, 0.012])
y = np.array([0.148, 0.160, 0.163, 0.158, 0.132, 0.110,
        0.082, 0.050, 0.024, 0.004, 0.001, 0.003])
01

Tracer la trajectoire de S2

Consigne
  • Trace y en fonction de x, en ronds noirs ('ko'), reliés par une ligne fine pour mieux voir l'ordre chronologique : ajoute '-' au style, soit 'ko-'.
  • Ajoute les étiquettes "ascension droite (\")" et "déclinaison (\")", la grille et le titre "Trajectoire de l'étoile S2".
etape1_trajectoire.py
# TODO : trace y en fonction de x, points noirs reliés
plt.plot(__, __, '____')
plt.xlabel("____________________")
plt.ylabel("________________")
plt.grid()
plt.title("________________________")
plt.show()
Résultat attendu

Une courbe qui se referme presque sur elle-même, en forme de boucle allongée : le début de l'ellipse décrite par S2 autour de Sagittaire A*, avec les points les plus rapprochés (2002) concentrés près de l'origine.

02

Calculer et tracer les vecteurs vitesse

Consigne
  • Comme les intervalles de temps ne sont pas constants ici, calcule les composantes de la vitesse avec np.diff divisé par np.diff(t) (et non par une durée fixe comme dans les fiches précédentes) : vx = np.diff(x) / np.diff(t), et de même pour vy.
  • Dans une boucle for i in np.arange(len(vx)) :, trace chaque vecteur vitesse avec plt.arrow(x[i], y[i], vx[i], vy[i], head_width=0.005) : la flèche part de la position i et représente la vitesse à cet instant.
etape2_vecteurs_vitesse.py
# TODO : composantes de la vitesse, en tenant compte des durées variables
vx = np.diff(__) / np.diff(__)
vy = np.diff(__) / np.diff(__)

# TODO : trace chaque vecteur vitesse depuis la position correspondante
for i in np.arange(len(__)) :
    plt.arrow(x[__], y[__], vx[__], vy[__], head_width=0.005)

plt.grid()
plt.title("______________")
plt.show()
Indice

vx et vy contiennent chacun 11 valeurs (une de moins que x, y et t, qui en ont 12) : la boucle doit donc parcourir les indices de vx, pas ceux de x.

Résultat attendu

Des flèches courtes au début et à la fin de la trajectoire (l'étoile va lentement, loin du trou noir) et des flèches nettement plus longues autour de 2002 (l'étoile va très vite, tout près du trou noir) : c'est la signature d'une orbite très excentrique, comme l'indiquait l'excentricité de 0,87.

03

Vecteurs « variation de vitesse »

Consigne
  • De la même façon que tu viens de calculer vx et vy à partir de x et y, calcule maintenant dvx et dvy, les variations de vitesse, à partir de vx et vy : dvx = np.diff(vx) (pas besoin de diviser par le temps ici, on veut juste la direction de la variation).
  • Trace ces vecteurs depuis les positions intermédiaires x[1:-1], y[1:-1] (qui excluent le tout premier et le tout dernier point), avec un facteur d'échelle de 5 pour que les flèches restent visibles : plt.arrow(x[1:-1][i], y[1:-1][i], 5*dvx[i], 5*dvy[i], head_width=0.005, fc="r", ec="r").
etape3_variation_vitesse.py
# TODO : variations de vitesse successives
dvx = np.diff(__)
dvy = np.diff(__)

xm = x[1:-1]
ym = y[1:-1]

# TODO : trace chaque vecteur variation de vitesse (en rouge, facteur 5)
for i in np.arange(len(___)) :
    plt.arrow(xm[i], ym[i], _*dvx[i], _*dvy[i], head_width=0.005, fc="r", ec="r")

plt.grid()
plt.show()
Résultat attendu

Des flèches rouges qui pointent globalement vers l'origine du graphe, c'est-à-dire vers Sagittaire A* : la variation de vitesse indique la direction de la force subie par l'étoile, ici la force gravitationnelle exercée par le trou noir. Retrouver cette direction confirme que S2 est bien en orbite autour d'un objet massif situé à cet endroit précis — même si cet objet est invisible.

04

Peser Sagittaire A*

Consigne
  • Comme dans la fiche « Loi de la gravitation », la troisième loi de Kepler donne M = 4π²a³ / (G T²), avec ici T = 15,2 ans et a = 0,119″ (voir le tableau de l'étape 0).
  • Il faut d'abord convertir le demi-grand axe, exprimé en secondes d'arc, en une distance réelle en mètres. Pour un petit angle, la formule est : a (m) = a (″) / 206265 × distance, où 206265 est le nombre de secondes d'arc dans un radian, et distance la distance qui nous sépare du centre de la Voie lactée, environ 8000 parsecs (1 parsec ≈ 3,086×10¹⁶ m).
  • Convertis aussi la période en secondes (15.2*365*24*3600), puis calcule la masse avec la même formule qu'à l'étape 4 de la fiche « Loi de la gravitation ».
  • Termine en exprimant cette masse en masses solaires, en la divisant par 1.989e30 kg.
etape4_masse_trou_noir.py
G = 6.67e-11
distance = 8000 * 3.086e16   # distance au centre de la Voie lactée, en m

# TODO : conversion du demi-grand axe (secondes d'arc -> mètres)
a_m = (0.119 / ______) * ________

# TODO : conversion de la période (années -> secondes)
T_s = ____ * 365 * 24 * 3600

# TODO : masse de Sagittaire A*, avec la même relation de Kepler
Mtrounoir = 4 * np.pi**_ * a_m**_ / (G * T_s**_)
print('Masse de Sagittaire A* (kg) :', Mtrounoir)

# TODO : la même masse, exprimée en masses solaires
print('Masse de Sagittaire A* (masses solaires) :', Mtrounoir / ________)
Indice

Le calcul de a_m suit exactement le principe rappelé dans la consigne : diviser l'angle en secondes d'arc par 206265 donne l'angle en radians, puis multiplier par la distance donne une vraie longueur, en mètres.

Résultat attendu

Une masse de l'ordre de quelques millions de masses solaires concentrées dans un volume minuscule à l'échelle astronomique : c'est précisément la signature attendue d'un trou noir supermassif, et un résultat cohérent avec les valeurs publiées pour Sagittaire A*.

Pense-bête — durées variables et petits angles

np.diff(x)/np.diff(t)vitesse quand Δt n'est pas constant
x[1:-1]tous les éléments sauf le premier et le dernier
len(vx)une valeur de moins que len(x)
1 rad≈ 206 265 secondes d'arc (″)
1 parsec≈ 3,086×10¹⁶ m
Msoleil≈ 1,989×10³⁰ kg

Pas de Thonny sous la main ? Utilise Basthon

Ouvrir dans un nouvel onglet ↗
Basthon est une console Python qui tourne directement dans le navigateur, sans rien installer. Colle ici (avec Ctrl+V ou Cmd+V) le code copié avec les boutons « Copier le code » ci-dessus, puis appuie sur Entrée pour l'exécuter.