Distance entre l’étoile Polaire et le pôle Nord

Des données astronomiques calculées avec le module Skyfield pour Python.

Les étoiles ont un mouvement apparent de rotation autour de l’axe polaire de la Terre.

Udo Kügel, Public domain, via Wikimedia Commons

L’étoile Polaire se trouve dans la direction de cet axe. Elle semble donc immobile. Cette coïncidence constitue la base de la première technique de navigation astronomique : mesurer la latitude du navire par la mesure de la hauteur de l’étoile Polaire.

Un quadrant du Moyen-Âge sur un timbre portugais. Un marin mesure la hauteur de la Polaire.

Cette technique s’impose dès lors que les navires doivent passer plusieurs semaines sans apercevoir la côte : les portugais dans l’Océan Atlantique, à partir de la fin du XVe siècle, ainsi que les arabes dans l’Océan Indien.

Mais on sait très tôt qu’il existe un écart entre la position de la Polaire et le pôle Nord. De nos jours, cet écart est faible (environ 0.7°), mais il varie dans le temps : en 1500 il était proche de 3.5°.

À l’époque, l’écart est trop important pour être négligé. Aussi, on établit des méthodes (les “regimentos” ou “règlements”) afin de corriger la mesure.

L’écart continuera de diminuer jusqu’en 2100 environ, puis augmentera à nouveau.


La figure précédente a été tracée avec le module Skyfield de Python. Il donne accès à la position de l’étoile Polaire pour une date donnée. La mise en forme des données est réalisée avec le module Matplotlib, avec un graphe (polaire, il va de soi).

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Créé le Fri Apr  8 19:51:49 2022

@auteur: david ALBERTO
(www.astrolabe-science.fr)
"""
import matplotlib.pyplot as plt
import numpy as np
from skyfield.api import Star, load
from skyfield.data import hipparcos
from skyfield.api import Loader #ajuster le fichier de téléchargement d'éphémérides
from matplotlib.ticker import StrMethodFormatter

plt.rcParams["font.family"] = "Roboto"

# -----------------------------------------------

# Identification de l'étoile Polaire dans le catalogue Hipparcos :
with load.open(hipparcos.URL) as f:
    df = hipparcos.load_dataframe(f)

# Rechercher le numéro d'une étoile dans le catalogue Hipparcos :
    # https://vizier.u-strasbg.fr/viz-bin/VizieR?-source=1239/hip_main
# Insérer ce numéro entre crochets :
polaris = Star.from_dataframe(df.loc[11767])

# -----------------------------------
load = Loader('../skyfield-ephemerides')
# planets = load('de440.bsp')# 114MB autre fichier d'éphémérides (1550 à 2650)
planets = load('de422.bsp')# 623MB autre fichier d'éphémérides (-3000 à 3000)
# planets = load('de422_excerpt.bsp')# 22MB autre fichier d'éphémérides (1450 à 1650)

earth = planets['earth']

# -------------------------------

ts = load.timescale()
pas_annee = 50
siecles=range(1400, 2350+pas_annee, pas_annee)
t = ts.utc(siecles,1,1)

equinoxe = ts.J(siecles)# prise en compte de la précession et de la nutation
position = earth.at(t).observe(polaris)
ra, dec, distance = position.radec(equinoxe)
distance_polaire = 90-dec.degrees

# -------------------------------
def angle(annee) :# affecte une position angulaire selon l'année
    return np.radians((annee-min(siecles))/pas_annee*50)# 50 degrés par position

angles = [angle(i) for i in siecles]
# --------------------------------------
# PARAMETRES DU GRAPHIQUE :
fig=plt.figure(figsize=(8,8),tight_layout=True,
               linewidth=10, edgecolor="#04253a")
ax=plt.subplot(111, projection='polar', facecolor='royalblue')
ax.set_title("Distance angulaire entre l'étoile Polaire et le pôle Nord\n au fil des siècles",
             fontsize=14,
             y=1.02)

ax.set_xticks([])
ax.set_rlabel_position(20)#position des graduations des rayons
ax.set_yticks(np.arange(0,4+1,1))
minor_yticks = np.arange(0, 4.5, 0.5)#espaces de la grille
ax.set_yticks(minor_yticks, minor=True)
ax.set_ylim(0,4.5)
ax.yaxis.set_major_formatter(StrMethodFormatter(u"{x:.0f}°"))
ax.grid(which='minor', alpha=0.5, lw=0.5)

ax.plot(0,0,'+', c='orangered')# croix au pôle Nord

ax.plot(angles, distance_polaire, c='k', alpha=0.5, zorder=1)# ligne continue

# Tracé des positions :
ax.scatter(angles, distance_polaire,s=300,marker='*',
           ec='k',
        # c= cmap(norm(siecles)),
        c='w',zorder=2
        )

ax.grid(alpha=1, linewidth=0.7)
ax.set_axisbelow(True)#place la grille sous les points tracés.

fig.text(0.85,0.05,f'Un point tous les {pas_annee} ans',
         c='firebrick',
         fontweight='bold',
         ha='center')

fig.text(0.02,0.04,r'D. \textsc{Alberto} (www.astrolabe-science.fr)',fontsize=8,
         usetex=True, rotation=90)

for N, annee in enumerate(siecles):
    if N%2==0:
        ax.text(angle(siecles[N]),distance_polaire[N]+0.35,
                 str(annee),fontsize=8, c='w',
                 fontweight='bold',
                 ha='center',va='center')

NomFichier="distancePolaire_siecles"
fig.savefig(NomFichier+".png",dpi=300)
fig.savefig(NomFichier+".pdf",dpi=300)

Le code Python :

Soyez le premier à commenter

Laisser un commentaire