Conjonctions planétaires – Skyfield

Où l’on traque (et trace) les dates de conjonctions des planètes, avec un script Python et le module Skyfield d’éphémérides astronomiques.

Quand deux astres semblent se rapprocher sur la voûte étoilée, on dit qu’ils sont en conjonction. En traçant la courbe représentant l’écart angulaire entre deux astres, au cours du temps, on peut visualiser les dates de conjonctions.

Ce script Python utilise le module Skyfield permettant d’exploiter les données placées dans un fichier d’éphémérides. Divers fichiers d’éphémérides sont disponibles, couvrant des périodes allant de quelques siècles à plusieurs millénaires. Après avoir choisi deux astres (2 planètes, ou bien une planète et la Lune), on peut donc balayer de longs intervalles de temps puis affiner la recherche progressivement.


En 1563, le jeune Tycho Brahé sait que les conjonctions Jupiter-Saturne se reproduisent tous les 20 ans environ.

Il sait que la prochaine conjonction est attendue pour l’été 1563. Comme on peut le voir ci-dessous, ces deux planètes seront séparées de moins de 0.5 degré début septembre 1563 :

En décembre 1612 et début 1613, Galilée observe Jupiter avec sa lunette. Dans ses notes, il marque les positions de Jupiter et de ses 4 principaux satellites. On peut également voir dans ses croquis un autre point non identifié, dont la position correspond à celle de Neptune ce jour-là : Galilée aurait peut-être vu pour la première fois, sans le savoir, la planète la plus lointaine de notre Système solaire.

La triple conjonction Jupiter – Saturne de 1682-1683 :

Plus près de nous, voici les prochaines conjonctions Vénus – Mars :

et en 2040 :

Rencontre entre Vénus et la Lune :

Attention : toutes les conjonctions prédites avec ce script ne sont pas nécessairement visibles. Si les astres sont également en conjonction avec le Soleil, le rapprochement ne sera pas observable.

Voici le script en détail, suivi du fichier compressé :

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Créé le Apr 19 
@auteur: david ALBERTO
(www.astrolabe-science.fr)
Ce script trace l'évolution de l'angle séparant 2 astres au cours du temps.
Il permet de (pré)voir les conjonctions passées ou à venir.
Sélectionner 2 planètes, ou une planète et la Lune.
Définir la période (couvrant quelques siècles à quelques heures)
Documentation Skyfield : https://rhodesmill.org/skyfield/
"""
import matplotlib.pyplot as plt
import matplotlib.dates as mdates#format des graduations de dates
from skyfield.api import load, utc
import locale# noms des mois en français, sur les graduations
# --------------------------------- REGLAGES UTILISATEUR :
locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')#dates en français
plt.rcParams["font.family"] = "Roboto"              # ou autre police installée sur l'ordinateur
locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')      # dates en français
couleurFond='#c7cef2'                               # couleur d'arrière-plan de la figure
ts = load.timescale()#crée une échelle de dates Skyfield
"""
Définitions d'une série de dates Skyfield :
Format d'une date : ts.utc(année, mois, jour, heure, minute, seconde, microseconde)
Le minimum à fournir est l'année ; dans ce cas les autres paramètres sont définis par défaut.
Pour une SÉRIE de dates :
ts.utc(range(annee1, annee2)) : série d'années
ts.utc(2023, range(4,9)) : série de mois, d'avril à septembre exclu
ts.utc(2023, 2, range(10,50)) : février 2023, série de jours, à compter du 10 et pendant 40 jours
periode = ts.utc(2023, 1, range(10*365)) # 10 ans à partir du 1er janvier 2023
Pour une bonne résolution sur une courte période, il faut des points jour par jour.
"""
# periode = ts.utc(range(1600, 1700)) # exemple : intervalle d'années
periode = ts.utc(1560, range(800)) #
# periode = ts.utc(2023, 4, range(1, 365, 15)) # exemple pour 1 an, tous les 15 jours
NomFichier = "ConjonctionsPlanetaires1560"
angle_max = 10 # écart angulaire maximal en degrés
couleurFond='#c7cef2'
# CHOIX DES PLANETES : voir quelques lignes plus loin
#------------------------------------------------------------------------------
# (Télé)chargement du fichier d'ephémérides de421.bsp (16 MB, période 1849-2050)
# (Télé)chargement du fichier d'ephémérides de430t.bsp (133 MB, période 1550-2650)
# eph = load('../skyfield-ephemerides/de421.bsp')# si le fichier est déjà chargé sur le disque (chemin à adapter).
eph = load('../skyfield-ephemerides/de430t.bsp')# si le fichier est déjà chargé sur le disque (chemin à adapter).
# eph=load('de430t.bsp')# pour télécharger automatiquement le fichier, dans le dossier du fichier Python
terre= eph['earth']
mercure = eph['mercury']
venus = eph['venus']
mars = eph['mars barycenter']
jupiter = eph['jupiter barycenter']
saturne = eph['saturn barycenter']
uranus = eph['uranus barycenter']
neptune = eph['neptune barycenter']
lune = eph['moon']
#-------------------------------------------------------------------
couple_planetes = (jupiter, saturne)# CHOIX DES DEUX PLANETES
planete1, planete2 = couple_planetes
#-------------------------------------------------------------------
def ecart(t, planete1, planete2):
    """Renvoie l'écart angulaire entre 2 planetes, vues depuis la Terre"""
    T = terre.at(t)
    P1 = T.observe(planete1)
    P2 = T.observe(planete2)
    return P1.separation_from(P2).degrees
def nom_planete(planete):
    """À partir d'un astre Skyfield, renvoie le nom en string."""
    if planete == mercure: return "Mercure"
    elif planete == venus:return "Vénus"
    elif planete == mars:return "Mars"
    elif planete == jupiter:return "Jupiter"
    elif planete == saturne:return "Saturne"
    elif planete == uranus:return "Uranus"
    elif planete == neptune:return "Neptune"
    elif planete == lune:return "Lune"
#------------------------------------------------------------------------------
nomplanete1 = nom_planete(couple_planetes[0])
nomplanete2 = nom_planete(couple_planetes[1])
date_debut = periode[0]
date_fin = periode[-1]
#------------------------------------------------------------------------------
#création de la figure et du graphique :
fig, ax=plt.subplots(tight_layout=True, facecolor=couleurFond)
ax.invert_yaxis()#inversion du sens de l'axe y (dates descendantes)
ax.set_xlabel("Écart angulaire (degrés)")
fig.set_size_inches(21/2.54, 29.7/2.54)#dimensions de la figure
ax.set_xlim(0, angle_max)
# ax.set_xticks(np.arange(-180, 180+20, 20))
ax.set_axisbelow(True)#place la grille sous les points tracés.
ax.grid(which='minor', alpha=0.5)# grille secondaire estompée
ax.grid(which='major', color='gray')
# limites de l'échelle de dates sur le graphe
ymin = date_debut.astimezone(utc)
ymax = date_fin.astimezone(utc)
ax.set_ylim(ymax,ymin)
#Mise en forme des graduations de dates en y :
locator1 = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator1)
jours=mdates.DayLocator(bymonthday=(1,5, 10,15,20,25, 30))#graduation secondaire tous les 10 jours
# mois=mdates.MonthLocator(bymonth=(1))# 1 graduation par an (en janvier)
mois=mdates.MonthLocator(bymonth=(range(1,13)))# 1 graduation par mois
ax.yaxis.set_major_locator(locator1)
# ax.yaxis.set_minor_locator(jours)
# ax.yaxis.set_minor_locator(mois)
ax.yaxis.set_major_formatter(formatter)
ax.set_title(f"Conjonctions {nomplanete1} - {nomplanete2}", fontsize=18)
#------------------------------------------------------------------------------
# tracé de la courbe :
x = ecart(periode, planete1, planete2)
y = periode.astimezone(utc)
ax.plot(x,y, color='firebrick', linewidth=1)
fig.text(0.05,0.015,"D. Alberto (www.astrolabe-science.fr)",fontsize=6)
fig.savefig(NomFichier+nomplanete1+nomplanete2+".png", dpi=200)
fig.savefig(NomFichier+nomplanete1+nomplanete2+".pdf")

Ajout mai 2023 :

Une version du programme qui trace, pour un mois calendaire, les écarts angulaires de toutes les planètes avec la Lune. Les dates sont en temps universel. Pour ce script, les angles sont calculés depuis un point à la surface de la Terre, dont les coordonnées sont à rentrer. Dans les réglages de personnalisation, au début du script, on indique la latitude et la longitude du lieu d’observation (son altitude aussi, éventuellement).

Le script Python :

Soyez le premier à commenter

Laisser un commentaire