Courbe d’Aston (python)

Où l’on met en forme des données isotopiques pour tracer la courbe d’Aston des nucléides.

Chaque noyau est caractérisé par son énergie de liaison par nucléon : c’est un paramètre qui contribue à estimer la stabilité de ce noyau.

La courbe d’Aston est le tracé de l’énergie de liaison par nucléon en fonction du nombre de masse A (nombre de protons et de neutrons dans le noyau).

Pour tracer ce graphique, on a besoin des données expérimentales d’énergies de liaison par nucléon (il existe une formule semi-empirique pour la calculer, mais elle laisse de côté des paramètres décisifs, comme la notion de nombre magique). J’ai trouvé de telles données sur ce site de l’Australian National University, qui propose une visualisation des données sous forme de diagramme N-Z, et permet de plus de les télécharger sous forme de fichier csv.

Dans le menu à gauche, le lien “data” permet de choisir les données à télécharger (‘Binding energy per nucleon’).

Le fichier csv obtenu est fourni en téléchargement ci-dessous, avec le script Python. Il contient des milliers de nucléides, stables et radioactifs.

Premières lignes du fichier csv téléchargé.

Après un premier essai de graphique, j’ai constaté qu’il est intéressant de distinguer les noyaux stables ; sur la plupart des courbes d’Aston fournies dans les ouvrages, seuls les noyaux stables sont représentés.

Il me fallait donc un moyen de distinguer les noyaux stables, dans les données téléchargées. Or je dispose par ailleurs d’un fichier csv contenant les nombres Z et N des noyaux stables (je pense avoir produit ce fichier grâce à la bibliothèque mendeleev). Puisque les deux fichiers contiennent les nombres Z et N, les noyaux peuvent être identifiés sans ambiguité.

Les bibliothèques utilisées dans le script sont : matplotlib (graphiques), numpy (gestion de séries de données), et pandas (gestion de tableaux de données).

La partie du script qui importe les données des 2 fichiers csv :

# Lecture du fichier des énergies de liaison par nucléon:
donnees = pd.read_csv("data_binding_energy_per_nucleon.csv",
                    skiprows=26,
                    sep="\t",
                    usecols=[1,2,4],
                    names=['A','Z', 'E_liaison']
                    )
donnees = donnees.loc[donnees['E_liaison'] >= 0] #élimine les valeurs négatives
effectif = len(donnees)

# import des données d'identification des noyaux stables :
data_stables = pd.read_csv('noyaux_stables.csv', sep=';')

Une fonction qui renvoie un booléen “True” si le nucléide passé en argument est stable (contenu dans le fichier des nucléides stables), et sinon “False” :

def est_stable(Z,A):
    """
    Parameters
    ----------
    Z : TYPE : (entier) : numéro atomique
    A : TYPE : (entier) : nombre de masse
    Returns
    -------
    renvoie True si le nucléide est stable, False si radioactif.
    """
    N = A - Z
    stable = False
    for i in range(len(data_stables)):
        if data_stables.Z[i] == Z and data_stables.N[i] == N:
            stable = True
    return stable

Une fonction qui ajoute une colonne intitulée “stable” dans le tableau des énergies de liaisons par nucléon :

def colonne_stabilite(df):
    """
    df : (DataFrame) : tableau de données isotopiques
    Returns
    -------
    ajoute une colonne dans le tableau df, indiquant "True" si le noyau
    est stable, "False" sinon.
    """
    stable = []
    for i in range(len(df)):
        Z = df.iloc[i].Z
        A = df.iloc[i].A
        if est_stable(Z, A):
            stable.append(True)
        else:
            stable.append(False)
    df2 = df
    df2['stable'] = stable
    return df2

Il est maintenant facile de filtrer les nucléides à représenter, avec une mise en forme différente pour les noyaux stables et radioactifs.

# tracé des noyaux stables :
A_stables = tableau.loc[tableau.stable == True, 'A']
E_liaison_stables = tableau.loc[tableau.stable == True, 'E_liaison']
ax.scatter(A_stables,E_liaison_stables, **prop_stables)
ax.plot(A_stables,E_liaison_stables, c=couleur_stables,alpha=0.8, label='stables')

# tracé des noyaux instables :
A_instables = tableau.loc[tableau.stable == False, 'A']
E_liaison_instables = tableau.loc[tableau.stable == False, 'E_liaison']
ax.scatter(A_instables,E_liaison_instables, **prop_instables,
           label='radioactifs')

J’en profite pour rechercher le nucléide ayant l’énergie de liaison par nucléon la plus élevée du tableau de données. Grâce aux performances de la bibliothèque pandas, on peut éviter de parcourir le tableau entier avec une boucle for. Beaucoup de gens pensent qu’il s’agit du fer-56 (il semble que les physiciens l’aient longtemps cru), mais il s’agit en réalité du nickel-62 (la différence est infime). Le nickel-62 l’emporte d’une courte tête, aidé en cela par son numéro atomique Z=28, un nombre magique lui fournissant un surcroît de stabilité.

#Récupération du nombre de masse ayant l'énergie maximale :
Emax = max(E_liaison)
Amax = tableau.loc[tableau['E_liaison'] == Emax, 'A'].values[0]

Comme il restait de la place, j’ai inséré un second graphique, qui focalise sur les premiers nucléides stables. J’ai repéré quelques nucléides légers particulièrement stables.

Le fichier zip suivant inclut le script python et les deux fichiers csv nécessaires.


Quelques commentaires sur la courbe obtenue :

  • les nucléides très légers présentent des variations très importantes de leur énergie de liaison par nucléon.
  • Il apparaît clairement que cette énergie à elle seule ne suffit pas à décider de la stabilité d’un nucléide : à énergie égale, certains nucléides sont stables et d’autres radioactifs. La stabilité va dépendre de la possibilité du noyau de se transformer en noyau plus stable ; ceci est dépendant des modes de désintégration nucléaires disponibles, et du voisinage du nucléide : s’il existe un noyau plus stable et accessible via un mode de désintégration, le nucléide sera instable. C’est le cas de l’hélium-5 et du lithium-5 (qui suivent l’hélium-4 sur la courbe), qui sont relativement stables mais peuvent se transformer en hélium-4 nettement plus stable.

Soyez le premier à commenter

Laisser un commentaire