Outils pour utilisateurs

Outils du site


python:une_bibliotheque_pour_modeliser_des_points_experimentaux

Une bibliothèque pour modéliser des points expérimentaux


Présentation


Lors d'une séance de travaux pratiques au lycée, il est souvent nécessaire de réaliser la modélisation de points expérimentaux. Cependant, faire de la modélisation en Python peut s’avérer délicat avec des élèves peu familiarisés avec ce langage.

Je vous propose une bibliothèque, que j'ai appelée “modelisation”. Elle permet de faire de la modélisation très simplement en ajoutant seulement deux lignes de code dans votre programme Python.

Avec cette bibliothèque, vous pourrez :

  • Afficher la courbe modélisée sur le graphique ainsi que son équation.
  • Sélectionner avec le “lasso”, les points expérimentaux à utiliser pour la modélisation.
  • Afficher/masquer un réticule en appuyant sur la touche “espace” du clavier.
  • Afficher/masquer la légende en appuyant sur la touche “m” du clavier.
  • Copier-coller le graphique avec les touches Ctrl+C et Ctrl V.



Installation de la bibliothèque

Cette bibliothèque est disponible sur Pypi.

Pour l'installer, avec le terminal de Windows (ou PowerShell), saisir :

pip install modelisation

Pour l'installer à partir de l'IDE (environnement de développement intégré) Thonny :

  • Menu Outils –> Gérer les paquets…
  • Saisir dans le champ de recherche : “modelisation” puis cliquez sur le bouton “Rechercher sur Pypi”.
  • Sélectionnez “modelisation”, puis cliquez sur le bouton “Installer”.


Cette bibliothèque utilise d'autres bibliothèques : Numpy, Matplotlib, Scypi et Addcopyfighandler.
Elles doivent être installées sur votre configuration.


Un exemple minimaliste

Dans votre programme Python, il faut importer la bibliothèque “modelisation” :

import modelisation

Le code à utiliser pour modéliser les points de listes ou de tableaux (x et y) est le suivant :

modelisation.modele("lineaire",x ,y) # pour un modèle "linéaire"

D'autres modèles sont disponibles :

  • lineaire
  • affine
  • parabole
  • exp_croissante (exponentielle croissante)
  • exp_decroissante (exponentielle décroissante)
  • double_affine (deux droites affines lors d'un titrage en conductimétrie par exemple)

Le code complet est donc le suivant :

import matplotlib.pyplot as plt      
import modelisation                
 
x = [1, 2, 3, 4]  #  saisir les valeurs expérimentales de la grandeur en abscisse
y = [1.2e-5, 2.1e-5, 3.0e-5, 4.3e-5]  #  saisir les valeurs de la grandeur en ordonnée
 
plt.plot(x,y, color='red', marker='+', linestyle='none')  # Afficher les points
 
modelisation.modele("lineaire",x ,y) # Afficher la modélisation
 
plt.show()

Ce programme affichera :

Une fois le graphique affiché, il est possible de sélectionner au “lasso” les points à utiliser pour la modélisation. Il faut déplacer la souris avec le bouton gauche enfoncé et entourer les points à conserver.
Pour supprimer la modélisation, il suffit d'appuyer sur la touche “Suppr” ou “Delete” selon le clavier.

Personnaliser la modélisation

Depuis la version 1.0, il est possible de personnaliser la modélisation. Des paramètres facultatifs peuvent être ajoutés.

Exemple :

modelisation.modele("affine", x, y, color = "red", linestyle = 'solid', linewidth = 2.5)
  • color = '#FF0000' ou color = 'red' –> permet de définir la couleur de la modélisation (par défaut : color = 'black' et color = 'mediumblue' pour le modèle 'double_affine')
  • color2 = 'blue' –> permet de définir la couleur de la modélisation pour la 2ème droite affine lorsqu'on utilise le modèle “double_affine” (par défaut : color2 = 'green').
  • linestyle –> permet de définir le style de la modélisation. 4 choix sont possibles : “solid”, “dotted”, “dashed” et “dashdot”. (par défaut : linestyle = 'dashed').
    • 'solid' –> ligne continue ( ________ )
    • 'dotted' –> ligne constituée de points ( .......... )
    • 'dashed' –> ligne constituée de traits ( ----------)
    • 'dashdot' –> ligne alternant un point et un trait ( -.-.-.-.- )
  • linewidth = 2 –> épaisseur du trait de la modélisation (par défaut : linewidth = 1.5).


Obtenir les paramètres de la modélisation

Depuis la version 1.0, il est possible de récupérer les paramètres de la modélisation dans le programme Python.

Exemple avec le modèle linéaire : y = ax

a = modelisation.modele("lineaire", x, y)
  • la variable 'a' contient le coefficient directeur ;


Exemple avec le modèle affine : y = ax + b

a, b = modelisation.modele("affine", x, y)
  • la variable 'a' contient le coefficient directeur ;
  • la variable 'b' contient l'ordonnée à l'origine.


Exemple avec le modèle parabolique : y = ax² + bx + c

a, b, c = modelisation.modele("parabole", x, y)


Exemple avec le modèle exponentielle croissante : y = a(1 - exp(-bx))

a, b = modelisation.modele("exp_croissante", x, y)


Exemple avec le modèle exponentielle décroissante : y = a exp(-bx)

a, b = modelisation.modele("exp_decroissante", x, y)

Il n'est pas possible de récupérer les données de modélisation pour le modèle 'double_affine'.
La fonction 'lasso', ne met pas à jour les données de modélisation dans le programme Python


Utilisation d'un modèle pour créer un fichier Python à destination des élèves

L'exemple précédent du programme python peut être amélioré en ajoutant un titre, des légendes, un quadrillage etc…

Pour répondre au mieux au besoin de chacun, je vous propose un programme Python, largement commenté, qui vous servira de modèle de départ.

Il suffit alors de commenter/décommenter ou éventuellement d'effacer certaines parties du programme.

Je vous mets à disposition ce modèle : Graphique.zip, version du 05/07/2024.

Exemple : si l'élève doit saisir ses mesures dans une liste alors il est possible de supprimer les lignes correspondantes aux tableaux et au fichier CSV.

#-------Importation des bibliothèques -----------
 
import matplotlib.pyplot as plt     # importation d'un sous module (pyplot) de la bibliothèque matplotlib sous le nom plt
import numpy as np                  # Importation du module numpy afin de lire le contenu du fichier csv et d'utiliser des tableaux
import modelisation                 # pour faire de la modélisation 
 
 
# ------- Saisir les mesures expérimentales dans des listes -------
 
x = [0, 1e-3, 2e-3, 3e-3, 4e-3, 5e-3, 6e-3, 7e-3]         #  saisir les valeurs de la grandeur en abscisse
y = [0, 0.221, 0.440, 0.665, 1.250, 1.105, 1.327, 1.550]  #  saisir les valeurs de la grandeur en ordonnée
 
 
# ------ Saisir les mesures expérimentales dans un tableau numpy ------
'''
x = np.array([0, 1e-3, 2e-3, 3e-3, 4e-3, 5e-3, 6e-3, 7e-3])          #  saisir les valeurs de la grandeur en abscisse
y = np.array([0, 0.221, 0.440, 0.665, 1.250, 1.105, 1.327, 1.550])   #  saisir les valeurs de la grandeur en abscisse
'''
 
# --- Importation des mesures à partir d'un fichier CSV ---
'''
x, y = np.loadtxt("mesures.csv", delimiter =',', skiprows = 2, unpack = True)
'''
    # Dans cet exemple, les données sont séparées par des "," . On commence à lire à partir de la troisième ligne (skiprows=2)
    # Les données se retrouveront dans deux tableaux Numpy (x et y)
    # Si on préfère utiliser des listes plutôt que des tableaux Numpy, il suffit de les convertir : 
    #    x = x.tolist()     
    #    y = y.tolist()
 
 
#---------- Caractéristiques du graphique -------
 
plt.plot(x, y, color='red', marker='+', linestyle = 'none', markersize = 15, markeredgewidth = 2) # Affiche des points aux coordonnées x, y : linestyle = 'none' --> ne pas relier les points par une ligne : markersize --> taille d'un point : markeredgewidth = 2 --> épaisseur du trait         
plt.xlabel("Grandeur en abscisse (unité)", fontsize = 12, fontweight = 'bold', labelpad = 15)     # Nommer l'axe des abscisses
plt.ylabel("Grandeur en ordonnée (unité)", fontsize = 12, fontweight = 'bold', labelpad = 15)     # Nommer l'axe des ordonnées
plt.title("Titre du graphique", color = "black", fontsize = 20, fontweight = 'bold', pad = 20)    # fontsize = 20 --> taille caractères : fontweight = 'bold' --> en gras
 
#---------- Paramètres facultatifs du graphique ----------
 
plt.grid()  # Afficher un quadrillage
plt.xlim(0) # fixe la plus petite graduation sur x
plt.ylim(0) # fixe la plus petite graduation sur y
#plt.axis([Xmin, Xmax, Ymin, Ymax])  # limites du graphique
#plt.gca().yaxis.set_ticks_position('right') # placer l'axe des ordonnés à droite
#plt.axis('equal') # pour avoir un repère orthonormé
 
#--------------- Modélisation ------------------
 
modelisation.modele("lineaire",x ,y) # modèles disponibles : "lineaire", "affine", "parabole", "exp_croissante", "exp_decroissante", "double_affine"
 
 
#----------- Afficher le graphique ------------
plt.show()



Quelques remarques

Les commentaires en Python

En Python, les lignes de code commençant par “#“ sont des commentaires.
Pour mettre en commentaire un paragraphe de plusieurs lignes, il suffit de placer trois apostrophes (''') en début et trois autres en fin de paragraphe. (Voir un exemple dans le programme précédent)

Importer les mesures à partir d'un fichier CSV

Attention, si les mesures sont importées à partir d'un fichier CSV, sachez qu'il existe différents formats CSV.

Dans l'exemple ci-dessus, les données du fichier CSV sont séparées par une virgule. Parfois elles peuvent être séparées par un point-virgule, dans ce cas vous devez modifier la variable 'delimiter'.

x, y = np.loadtxt("affine.csv", delimiter=';', skiprows=2, unpack=True)

Parfois les premières lignes d'un fichier CSV contiennent des informations autres que des mesures (nom des variables, unités…).
Il faut alors faire attention de ne pas importer ces lignes.
C'est la but de l'instruction “skiprows = 2” dans le code précédent pour ne pas lire les deux premières lignes.

Astuce : Pour connaitre le format CSV utilisé, ouvrir votre fichier CSV dans le bloc-notes de Windows.




Statistiques du site

  • Cette page a été consultée par 2 visiteurs aujourd'hui.
  • Cette page a été consultée par 458 visiteurs depuis le 26/01/2024.
python/une_bibliotheque_pour_modeliser_des_points_experimentaux.txt · Dernière modification : 07/07/2024 11:54 de Stéphane LAURENT

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki