Activité Python : Tracé de courbes
Objectif : Utiliser Python pour faire des tracés de courbes en physique chimie.
Le plus simple pour cette activité est d'utiliser les éditeurs Python en ligne : Labo Python LeLivreScolaire ou Trinket.io
-------------
Nota : Si vous utilisez un IDE téléchargé (Thonny, Sublime Text, Pyzo...), il faudra installer les bibliothèques Matplotlib et Numpy (sauf pour Edupython qui les a déjà) Voir Installer une bibliothèque
--------------
Travail à faire : (seul, ou par groupe de 2,3 ou 4)
Vous créez et rendrez dans Classroom un diaporama Slides (1 par groupe) dans lequel vous mettrez des copies d'écran des résultats graphiques de vos programmes. En 1ère page de ce diaporama, vous écrirez les noms des élèves du groupe.
Vous rendrez dans Classroom 3 programmes différents au format python (avec l’extension .py), tirés du document ci-joint "Python pour la physique-chimie" (aller à la page 22, au paragraphe "3.2 Les graphiques avec Matplotlib")
Ces 3 programmes seront :
un tracé de deux sinusoïdes avec légende (paragraphe 3.2.2.2)
une régression linéaire (paragraphe 3.3.2)
la courbe du § 4.2.2.3 Evolution des quantités de matière
Vos programmes seront des copies personnalisées des exemples donnés dans le document. (personnalisé veut dire changement de titre (en mettant son nom par exemple), de valeurs, changement de couleurs, ...)
Attention les copier-coller de ces programmes sont parfois à reformater et peuvent comporter des erreurs!
Il faut que vos programmes Python fonctionnent!
Bon travail !
# A partir d'une série de coordonnées de points (0 à N), ce programme calcule les vitesses (1 à N-1)
# et trace les vecteurs vitesse
import numpy as np
import matplotlib.pyplot as plt
# Données
dt = 0.0667
x = np.array([0.003, 0.141, 0.275, 0.410, 0.554, 0.686, 0.820, 0.958, 1.089, 1.227, 1.359, 1.490,1.599, 1.705, 1.801])
y = np.array([0.746, 0.990, 1.175, 1.336, 1.432, 1.505, 1.528, 1.505, 1.454, 1.355, 1.207, 1.018,0.797, 0.544, 0.266])
# Calculs des vecteurs vitesses
N = len(x) # Nombre de points de mesures
vx = np.zeros(N) # Initialisation d'un tableau vide
vy = np.zeros(N)# Idem
dvx = np.zeros(N) # vecteur variation de vitesse
dvy = np.zeros(N)
for i in range(1, N-1):
vx[i]=(x[i+1]-x[i-1])/(2*dt)
vy[i]=(y[i+1]-y[i-1])/(2*dt)
for i in range(2, N-2):
dvx[i]=vx[i+1]-vx[i-1]
dvy[i]=vy[i+1]-vy[i-1]
# Calcul des vitesses
v = np.sqrt(vx**2+vy**2)
plt.plot(x, y, '.')
plt.xlabel("x (m)")
plt.xlim(0, 2)
plt.ylabel("y (m)")
plt.ylim(0, 2)
plt.title("Trajectoire d'un ballon")
for i in range(1,N-1):
plt.arrow(x[i], y[i], vx[i]/10, vy[i]/10, head_width=0.025, color='r')
plt.annotate(i, (x[i]-0.05,y[i]-0.15))
print('Point', i, '-> v =', round(v[i],2), " m/s")
for i in range(1,N-1):
plt.arrow(x[i], y[i], dvx[i]/10, dvy[i]/10, head_width=0.025, color='b')
# plt.annotate(i, (x[i]-0.05,y[i]-0.15))
# print('Point', i, '-> v =', round(v[i],2), " m/s")
plt.show()
"""
Ce logiciel récupère les données de pointage d'Atelier Scientifique
Ces données auront été préalablement enregistrées au format texte (en principe Doclab1.txt)
- calcule les vitesses (V[1] à V[N-1])
- trace dans deux fenêtres différentes la trajectoire et les vecteurs vitesse
"""
# modules pour gérer la boîte de dialogue demandant le nom de fichier de données
import os
from tkinter import *
from tkinter.filedialog import *
# modules math et graphiques
import numpy as np
import matplotlib.pyplot as plt
# Initialisation des tableaux de données
t = np.array([])
x = np.array([])
y = np.array([])
# Import des données d'un fichier pointage .TXT
nomFichier=askopenfilename(title="Ouvrir le fichier de pointage", initialdir=os.getcwd(), initialfile="*.txt", filetypes = [("Fichiers Textes","*.txt"),("Tous", "*")])
with open(nomFichier) as f:
data = f.read()
# Nettoyage des données des caractères NULL
# et remplacement des "," par des "."
data=data.replace('\x00','').replace(",",".")
print(data+'\n')
# Remplissage des tableaux t, x, y
lignes=data.split('\n') # les lignes sont séparées par des retours à la ligne
for i in range(2,len(lignes)):
donnee=lignes[i].split('\t') # les données sont séparées par des TAB
if donnee[0]!="" or donnee[1]!="" or donnee[2]!="": # Si les données ne sont pas des chaînes vides
t=np.append(t,float(donnee[0])) # remplissage des tableaux de données
x=np.append(x,float(donnee[1]))
y=np.append(y,float(donnee[2]))
# Calcul de delta t par rapport aux données importées
dt = t[1]-t[0]
print('Delta t = '+str(round(dt,2))+' s \n')
# Calculs des vecteurs vitesses
N = len(t) # Nombre de points de mesures
vx = np.zeros(N) # Initialisation d'un tableau vide
vy = np.zeros(N) # Idem
# Calcul des vx,vy et v comme moyenne entre n-1 et n+1
for i in range(1, N-1):
vx[i]=(x[i+1]-x[i-1])/(2*dt)
vy[i]=(y[i+1]-y[i-1])/(2*dt)
v = np.sqrt(vx**2+vy**2)
# Affichage
EcartTypeX = np.std(x)
EcartTypeY = np.std(y)
print('Ecart type en X =',round(EcartTypeX,2),'m')
print('Ecart type en Y =',round(EcartTypeY,2),'m\n')
plt.figure(1,figsize=(10,6))
plt.plot(x, y, '.')
plt.xlabel("x (m)")
if EcartTypeX<0.02: # Si l'écart type entre les X < 2 cm
plt.xlim(-1, 2) #=> echelle en X entre -1 m et 2m
if EcartTypeY<0.02: # Si l'écart type entre les Y < 2 cm
plt.ylim(-1, 2) #=> echelle en Y entre -1 m et 2m
plt.ylabel("y (m)")
plt.title("Trajectoire")
plt.figure(2, figsize=(10,6))
plt.plot(x, y, '.')
plt.xlabel("x (m)")
if EcartTypeX<0.02:
plt.xlim(-1, 2)
if EcartTypeY<0.02:
plt.ylim(-1, 2)
plt.ylabel("y (m)")
plt.title("Vecteurs vitesse")
for i in range(1,N-1):
plt.quiver(x[i], y[i], vx[i]/35, vy[i]/35,color='r',width=0.003,headwidth=2)
plt.annotate("V"+str(i), (x[i],y[i]))
print('Point', i, '-> v =', round(v[i],2), "m/s")
plt.show()