Obtenir une modélisation plus ou moins complexe avec curve_fit de la bibliothèque scipy

MéthodePrincipe général

La fonction curve_fit du module scipy présente l'intérêt de pouvoir établir des modélisations plus complexes que des fonctions affines ou polynomiales.

L'utilisation de curve_fit nécessite deux étapes :

  1. définir la relation à modéliser sous forme d'une fonction python qui prend comme arguments les coefficients du modèle à déterminer et la valeur en abscisse.

  2. Utiliser la fonction curve_fit avec comme arguments la fonction modèle définie en 1., la série en abscisse et la série en ordonnée.

ExempleExemple sur une modélisation simple : relation linéaire

On suppose qu'on a mesuré les tensions de seuils de différentes DEL, ainsi que la fréquence de la lumière émise.

Les valeurs sont stockées dans deux listes Python.

Tension de seuil et fréquence sont reliées par : \(U_{seuil}=\dfrac{h}{e}\cdot \nu\).

On veut obtenir la valeur du coefficient directeur \(\dfrac{h}{e}\).

Vous pouvez reconstituer le programme complet par des copier/coller des différentes zones de code commentées ci-dessous.

On commence par importer les bibliothèques nécessaires.

1
"""Importation des bibliothèques et fonctions nécessaires"""
2
import matplotlib.pyplot as plt  # Bibliothèque graphique pour tracer les courbes et placer les points de mesure
3
from scipy.optimize import curve_fit  # Importation de la fonction de recherche du modèle.

Ci-dessous, la déclaration des deux listes.

1
"""On entre les deux listes f et Useuil, respectivement fréquence du photon émis et tension de seuil de la DEL"""
2
f = [4.74e14, 4.54e14, 5.25e14, 6.55e14, 6.56e14, 4.62e14, 5.39e14, 5.09e14, 4.78e14, 6.58e14, 4.58e14, 4.74e14, 4.76e14, 4.54e14, 5.12e14, 5.10e14, 4.61e14, 5.09e14, 5.27e14, 4.96e14, 4.54e14, 4.59e14, 6.64e14, 6.61e14]
3
Useuil = [1.744, 1.7, 1.922, 2.815, 2.77, 1.83, 1.84, 1.82, 1.746, 2.789, 1.702, 1.75, 1.72, 1.668, 1.898, 1.865, 1.91, 1.889, 1.866, 1.843, 1.686, 1.711, 2.837, 2.759]

On définit dans la cellule suivante la fonction fontion_modele à partir de la relation entre la tension de seuil et la fréquence.

Une étude théorique du problème a montré la proportionnalité entre la tension de seuil et la fréquence du photon émis.

1
"""Définition du modèle : fonction linéaire, dont le seul paramètre est le coefficient directeur"""
2
def fonction_modele(coeffDir, frequence):
3
    U = coeffDir * frequence
4
    return(U)
5
"""Cette fonction renvoie la valeur de la tension de seuil quand on fournit le coefficient directeur et la fréquence"""

On obtient les coefficients intervenant dans un modèle ainsi que la covariance en utilisant la fonction curve_fit avec la syntaxe suivante :

coefficients, covar= curve_fit(fonction_modele, série en X, série en Y)

coefficients est une liste contenant les valeurs des paramètres utilisés dans la fonction modèle et covar la matrice des covariances. Ici, il n'y a qu'un seul paramètre : le coefficient directeur.

1
"""Obtention des paramètres de la modélisation"""
2
coefficients, covar = curve_fit(fonction_modele, f, Useuil)  # On reprend pour les séries en X et en Y les noms des listes utilisées pour la fréquence et la tension de seuil.
3
k = coefficients[0]  # On stocke dans une variable k la valeur du coefficient directeur, premier terme de la liste coefficients.
4
print(k)

On peut maintenant placer sur un même graphique les points de mesure et la modélisation.

On stocke les valeurs issues du modèle dans la liste modeleUseuil.

1
modeleUseuil = [fonction_modele(k, valeur_f) for valeur_f in f]  # Cette méthode de construction de liste est appelée liste en compréhension.
2
#print(modeleUseuil)  # Décommentez cette ligne si vous souhaitez afficher le résultat pour vérification.

Construction de la représentation graphique :

1
plt.figure(1)  # Définition du graphique n°1
2
plt.scatter(f, Useuil, color="blue", marker = "+", label = "Points expérimentaux")  # On place les points (scatter) expérimentaux, avec des + rouges.
3
plt.plot(f, modeleUseuil, color = "red", label = f"Modélisation : Useuil = {k:.3e} x f")  # On trace la fonction modèle, son étiquette est l'équation de la droite
4
plt.xlabel("f (Hz)")  # Étiquette de l'axe des abscisses
5
plt.ylabel("Useuil")  # Étiquette de l'axe des ordonnées
6
plt.legend()  # Pour afficher la légende (les 'label')
7
plt.grid()  # Affichage du quadrillage
8
plt.show()  # Affichage du graphique