Programmation Python pour modélisation, calculs ou acquisition

2ndePhysique-ChimieCompétences scientifiquesProgrammation Python pour modélisation, calculs ou acquisition~9 min de lecture

Programmation Python pour la modélisation, les calculs et l'acquisition

En physique-chimie, Python sert de calculatrice infatigable : il fait les calculs répétitifs, trace les graphiques des mesures, trouve le modèle qui les décrit et peut même enregistrer les mesures d'un capteur.

Objectifs

  • Lire et compléter un court programme Python : variables, listes, boucle for, fonction.
  • Faire calculer une grandeur physique (vitesse, masse volumique…) pour toute une série de mesures.
  • Tracer un graphique avec matplotlib et modéliser des mesures par une droite.
  • Comprendre le principe d'une acquisition de mesures avec un capteur et une carte programmable.

1. Les briques de base de Python

Variables et calculs

Une variable reçoit une valeur avec le signe = (affectation). Les opérations s'écrivent + - * / et la puissance **.

m = 27.0        # masse en g
V = 10.0        # volume en mL
rho = m / V     # masse volumique en g/mL
print("masse volumique :", rho, "g/mL")

Le programme affiche masse volumique : 2.7 g/mL. On reconnaît la relation \( \rho = \dfrac{m}{V} \) : ici \( \rho = \dfrac{27{,}0}{10{,}0} = 2{,}7 \ \text{g/mL} \) (valeur de l'aluminium). Le texte après # est un commentaire, ignoré par Python.

Listes et boucles

Une liste range plusieurs valeurs : t = [0, 0.5, 1.0, 1.5]. On accède à un élément par son indice, qui commence à 0 : t[0] vaut 0, t[2] vaut 1.0. La fonction len(t) donne le nombre d'éléments (ici 4).

La boucle for répète des instructions. range(n) produit les entiers de 0 à \( n - 1 \).

for i in range(3):
    print(i)

Ce programme affiche 0, puis 1, puis 2. Les instructions répétées sont décalées (indentation) : c'est ce décalage qui indique à Python ce qui est dans la boucle.

Fonctions

def vitesse(d, t):
    return d / t

print(vitesse(100, 12.5))   # affiche 8.0

Une fonction regroupe un calcul qu'on réutilise. Ici \( v = \dfrac{d}{t} = \dfrac{100}{12{,}5} = 8{,}0 \ \text{m/s} \) pour un coureur qui parcourt 100 m en 12,5 s.

Avec x = [3, 5, 8, 13], que vaut x[1] ?

  1. 3
  2. 5
  3. 8
Les indices commencent à 0 : x[0] vaut 3 et x[1] vaut 5.

2. Faire des calculs sur une série de mesures

Exemple résolu

Mesures : t = [0, 0.5, 1.0, 1.5] (en s) et x = [0, 1.2, 2.4, 3.6] (en m). On veut la vitesse moyenne entre deux relevés successifs : \[ v_i = \frac{x_{i+1} - x_i}{t_{i+1} - t_i}. \] Cherche d'abord ce que le programme va afficher.

t = [0, 0.5, 1.0, 1.5]
x = [0, 1.2, 2.4, 3.6]
for i in range(len(t) - 1):
    v = (x[i+1] - x[i]) / (t[i+1] - t[i])
    print("v =", round(v, 2), "m/s")
Étape 1 : len(t) - 1 vaut 3, donc i prend les valeurs 0, 1, 2 (trois intervalles entre quatre mesures).
Étape 2 : pour i = 0, \( v = \dfrac{1{,}2 - 0}{0{,}5 - 0} = 2{,}4 \ \text{m/s} \).
Étape 3 : pour i = 1 et i = 2, on obtient aussi \( \dfrac{1{,}2}{0{,}5} = 2{,}4 \ \text{m/s} \).
Étape 4 : le programme affiche trois fois v = 2.4 m/s : la vitesse est constante, le mouvement est rectiligne uniforme.

Combien de fois la ligne print s'exécute-t-elle dans for i in range(5): print(i), et quelle est la dernière valeur affichée ?

  1. 5 fois, dernière valeur 5
  2. 4 fois, dernière valeur 4
  3. 5 fois, dernière valeur 4
range(5) donne 0, 1, 2, 3, 4 : cinq valeurs, la dernière est 4.

3. Tracer un graphique et modéliser

Modéliser, c'est trouver une relation mathématique simple (ici une droite) qui décrit au mieux les points de mesure. Pour une droite \( U = aI + b \), Python calcule \( a \) et \( b \) avec la fonction polyfit de la bibliothèque numpy (le « 1 » signifie : polynôme de degré 1, une droite).

Exemple résolu

import numpy as np
import matplotlib.pyplot as plt

I = [0, 0.01, 0.02, 0.03, 0.04]   # intensité en A
U = [0, 1.0, 2.0, 3.1, 4.0]       # tension en V

a, b = np.polyfit(I, U, 1)        # modèle U = a*I + b
print("a =", round(a), "b =", round(b, 2))

plt.plot(I, U, "o", label="mesures")
plt.plot(I, [a*i + b for i in I], label="modèle")
plt.xlabel("I (A)")
plt.ylabel("U (V)")
plt.legend()
plt.show()

Cherche d'abord : à quoi ressemble le graphique et que représente \( a \) ?

Voir la solution

Le programme affiche a = 101 b = 0.0 : les points sont presque alignés sur une droite qui passe par l'origine. Le modèle est \( U \approx 101 \times I \).

On reconnaît la loi d'Ohm \( U = R \times I \) : le coefficient directeur \( a \) est la résistance, \( R \approx 101 \ \Omega \) (environ 100 Ω, aux incertitudes de mesure près).

Vérification sur un point : pour \( I = 0{,}02 \ \text{A} \), \( U = 101 \times 0{,}02 = 2{,}02 \ \text{V} \), proche de la mesure 2,0 V.

Joue avec le modèle : fais varier \( R \) et observe la pente de la droite \( U = R \times I \) (ici \( I \) en ampères sur l'axe horizontal).

Dans a, b = np.polyfit(I, U, 1), que représente a pour un résistor ?

  1. Sa résistance \( R \), coefficient directeur de la droite
  2. L'intensité maximale
  3. La tension quand \( I = 0 \)
Le modèle est \( U = aI + b \) ; avec la loi d'Ohm \( U = RI \), le coefficient directeur \( a \) est la résistance. La tension pour \( I = 0 \) est \( b \).

4. L'acquisition de mesures

Une chaîne d'acquisition comprend :

  • un capteur (température, lumière, tension…) qui transforme une grandeur physique en signal électrique ;
  • une carte programmable (microcontrôleur) qui lit ce signal à intervalles réguliers et le convertit en nombre ;
  • un programme qui enregistre les valeurs dans des listes, puis les affiche ou les trace.
flowchart LR
  A[Grandeur physique] --> B[Capteur]
  B --> C[Carte programmable]
  C --> D[Programme Python]
  D --> E[Listes de mesures]
  E --> F[Graphique et modele]

Exemple résolu

Voici la structure d'une boucle d'acquisition. La fonction lire_capteur() est un nom choisi pour l'exemple : elle dépend de la carte utilisée et renvoie la mesure du capteur.

import time

temps = []
temperatures = []
for k in range(60):                  # 60 mesures
    temps.append(k * 10)             # une mesure toutes les 10 s
    temperatures.append(lire_capteur())
    time.sleep(10)                   # attendre 10 s
Étape 1 : on crée deux listes vides pour ranger les dates et les mesures.
Étape 2 : à chaque tour, append ajoute une valeur à la fin de chaque liste.
Étape 3 : time.sleep(10) fait attendre 10 s entre deux mesures.
Étape 4 : durée totale : \( 60 \times 10 = 600 \ \text{s} \), soit 10 minutes. On peut ensuite tracer temperatures en fonction de temps.

Dans une chaîne d'acquisition, quel élément transforme la grandeur physique en signal électrique ?

  1. Le programme Python
  2. Le capteur
  3. Le graphique
C'est le capteur ; la carte convertit ensuite ce signal en nombres que le programme enregistre.

Erreurs fréquentes

  • Écrire une virgule décimale (2,7) au lieu d'un point (2.7).
  • Oublier que les indices d'une liste commencent à 0.
  • Oublier l'indentation dans une boucle ou une fonction.
  • Sortir de la liste dans une boucle (IndexError).
  • Tracer un graphique sans noms d'axes ni unités.

Récapitulatif

  • Variables, listes, boucles for et fonctions suffisent pour faire tous les calculs répétitifs d'un TP.
  • matplotlib trace les mesures ; np.polyfit(x, y, 1) donne la droite modèle \( y = ax + b \).
  • Le coefficient du modèle a un sens physique (résistance, vitesse…) et une unité.
  • Une acquisition associe capteur, carte programmable et programme qui range les mesures dans des listes.
Variable
Nom qui désigne une valeur, affectée avec le signe égal (ex. m = 27.0).
Liste
Suite de valeurs entre crochets ; indices à partir de 0 ; len donne la taille.
Boucle for
Répète des instructions indentées ; range(n) donne 0 à n − 1.
Modélisation
Trouver une relation simple (droite y = ax + b avec polyfit) qui décrit les mesures.
Acquisition
Capteur + carte programmable + programme qui enregistre les mesures automatiquement.

Teste tes connaissances sur ce cours

Crée ton compte gratuitement pour accéder aux quiz associés et suivre ta progression.