Évolution des étoiles : trois couleurs et un diagramme

Lectures

  • Wikipedia : L'évolution d'une étoile, ou évolution stellaire, désigne l'ensemble des phénomènes allant de la formation à la "mort" d'une étoile. Elle peut être décomposée en plusieurs phases principales dont la formation de l'étoile, son séjour sur la séquence principale et sa phase finale.
  • Cours de l'université de Strasbourg : Un document de 32 pages sur l'évolution stellaire et le diagramme HR. (en français).

Catalogue utilisé

Le catalogue Hipparcos.

  • V/137D
  • Description standard utile, si l'on lit l'anglais.

  • Utilisation du langage d'interrogation de la base de données pour extraire les champs : Type spectral, Fe-H, B-V, VMag (magnitude absolue).

  • Enregistrement dans un fichier au format CSV (extension tsv ici).
  • En-tête éliminé à la main via un éditeur de texte.
  • Le fichier contient 99999 lignes (une par étoile), mais certaines lignes sont incomplètes et il va falloir les éliminer avant de poursuivre le travail.

Comment aborder ce catalogue avec Python ?

1. Charger les données dans une liste de listess

In [5]:
import csv
import numpy as np
import matplotlib.pyplot as plt
# V/137D Hipparchos
SpType, Fe_H, B_V, VMag = 0, 1, 2, 3
tout = []
with open('hip99999.tsv', newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=';')
    for ligne in spamreader:
        tout.append(ligne)

2. Une liste pour chacun des champs SpType, B-V, VMag

Remarque : emploi du trait de soulignement à la place du signe moins.

  • Élimination des lignes incomplètes.
  • chargement des trois listes dédiées.
In [6]:
spectre = [] # listes des types spectraux
b_v     = [] # liste des indices de couleur
vmag    = [] # liste des magnitudes absolues
maxi = 80000  # on limite à 80000 étoiles
for i in range(maxi):
    ligne = tout[i]
    if (len(ligne[0].strip()) > 0) and (len(ligne[1].strip()) > 0) and len(ligne[2].strip()) > 0 and  len(ligne[3].strip()) > 0:
        spectre.append(ligne[0].strip())
        b_v.append(float(ligne[2]))
        vmag.append(float(ligne[3]))

3. isoler les enregistrements qui correspondent à trois couleurs

  • Pour le jaune, on prendra les étoiles de type G.
  • Pour le rouge, celles de types K et M.
  • Pour le bleu, celles de types O et B.

Remarque : le code Python a été ici optimisé pour la facilité de lecture. Le fait de réaliser trois boucles au lieu d'une n'est pas idéal sur le plan de la consommation des ressources.

In [7]:
bvjaune, vmagjaune = [], [] # listes pour positionner les étoiles jaunes
bvrouge, vmagrouge = [], [] # listes pour positionner les étoiles rouges
bvbleu,  vmagbleu  = [], [] # listes pour positionner les étoiles bleues

for i in range(len(spectre)):
    if "G" in spectre[i]:
        bvjaune.append(b_v[i])
        vmagjaune.append(vmag[i])

for i in range(len(spectre)):
    if "K" in spectre[i] or "M" in spectre[i]:
        bvrouge.append(b_v[i])
        vmagrouge.append(vmag[i])

for i in range(len(spectre)):
    if "O" in spectre[i] or "B" in spectre[i]:
        bvbleu.append(b_v[i])
        vmagbleu.append(vmag[i])

4. Tracer le diagramme

Utilisation de matplotlib.

Dans l'ordre :

  • Toutes les étoiles ont été marquées d'un point noir.
  • les étoiles de type G (comme le Soleil) ont été marquées d'un point jaune plus petit (ce qui donne un point jaune sur fond noir).
  • les étoiles de type K ou M ont été marquées d'un point rouge.
  • les étoiles de type O ou B ont été marquées d'une croix bleue.

Les étoiles des types spectraux _autres que O,B,G,K,M sont restées en noir.

In [8]:
fig = plt.figure(1, figsize=(10,12)) # dimensions du cadre
plt.plot(b_v, vmag, linestyle='none', marker = 'o', c = 'black', markersize = 2)

plt.plot(bvjaune, vmagjaune, linestyle='none', marker = 'o', c = 'yellow', markersize = 1)
plt.plot(bvrouge, vmagrouge, linestyle='none', marker = 'o', c = 'red', markersize = 1)
plt.plot(bvbleu, vmagbleu, linestyle='none', marker = '+', c = 'blue', markersize = 4)
axes = plt.gca()
axes.set_xlabel("Couleur : B-V")
axes.set_ylabel("Magnitudes")
axes.invert_yaxis()

5. Commentaires sur ce diagramme

Ce diagramme m'étonne :

  • certaines étoiles ont des indices de couleur inattendus (vers la droite du graphique).
  • des étoiles bleues dans des endroits inattendus...
  • des "jaunes" avec des magnitudes absolues surprenantes.
  • une discontinuité dans "les rouges" : il y a deux paquets. Pourquoi ?

Conclusions

  • Le fait d'utiliser des couleurs différentes montre que, selon leur type spectral, les étoiles ne se placent pas n'importe où sur le diagramme HR.
  • Découverte et expérimentation de certains outils Python.

Extensions possibles :

  • Explorer les lettres qui suivent le type spectral principal (par exemple le code IV dans G1 IV) et tracer d'autres diagrammes colorés.
  • Identifier les étoiles placées à des endroits inattendus. Cela suppose que l'on introduise le numéro HIP (numéro dans le catalogue Hipparcos) au moment de la sélection et que l'on fasse la recherche individuelle des étoiles via la bibliothèque astroquery.vizier