Au module 2, je vous proposais la chute d'une balle. Reprenons cet exercice pour tracer les positions de la balle.
#Conditions initiales:
x = 0.
y = 2.
vx = 3.5
vy = 0.
ax = 0.
ay = -9.81
t = 0.
#pas de temps
dt = 0.001
#Simulation
while y > 0. :
x = x + vx * dt
y = y + vy * dt
vx = vx + ax * dt
vy = vy + ay * dt
t = t + dt
print("La balle touche le sol à t =", t, "s et à la position x =", x, "m")
Tracer le graphique Y en fonction de X de la chute de la balle. Faire apparaitre sur le graphique la distance parcourue par la balle.
Exemple :
On peut également imaginer positionner plusieurs courbes sur un seul graphique pour comparer des critères.
Sauvegarder les positions dans une liste
Il est nécessaire d'enregistrer les coordonnées des points (x;y) pour les afficher.
Créer une liste vide pour les positions x, une autre pour les positions y
Lors de la boucle, ajouter chaque nouvelle valeur de x et y dans la liste
Tracé de la courbe
Importer le module pyplot de matplotlib
Configurer le graphique pour qu'il prenne comme données les listes précédentes
Configurer le graphique (voir par précédente) pour ajouter une légende, la valeur de la position d'arrivée, etc
import matplotlib.pyplot as plt
#Conditions initiales:
x = 0.
y = 2.
vx = 3.5
vy = 0.
ax = 0.
ay = -9.81
t = 0.
#pas de temps
dt = 0.001
#Enregistrement des données
listeX = []
listeY = []
#Simulation
while y > 0. :
x = x + vx * dt
y = y + vy * dt
vx = vx + ax * dt
vy = vy + ay * dt
t = t + dt
listeX.append(x) #A chaque pas, on enregistre la position en x et y
listeY.append(y)
print("La balle touche le sol à t =", t, "s et à la position x =", x, "m")
#Graphique
plt.plot(listeX,listeY,'+',label = "Chute d'un objet")
plt.xlabel("X en (m)")
plt.ylabel("Y en (m)")
plt.legend()
plt.annotate('Distance atteinte :'+str(x)+'m',xy=(x,y),xytext=(x/2,listeY[0]/2),arrowprops=dict(facecolor='black',arrowstyle='->')) #On affiche la distance atteinte (dernière valeur de x connue)
plt.grid()
plt.show()
Exercice 2 : Tracé de la caractéristique d'un dipôle non linéaire
On récupère des données de tensions / intensité (d'une lampe), et on trace la courbe. Cet exercice est faisable sur openoffice. Faisons-le avec python
Remarque : J'ai utilisé un simulateur avec mes élèves, mais les résultats ne correspondent pas aux attentes. Je vous propose une autre version avec des valeurs trouvées sur internet...
En module 5 il sera possible de tester depuis un système d'acquisition de donnée.
A partir des données, tracer le graphique U en fonction de I
Importer le module pyplot de matplotlib
Ajouter les données
Configurer pyplot : les données, le type de graphique, ajouter une légende, tracer le graphique
Pour aller plus loin : Avec une boucle, calculer R pour chaque valeur, sauvegarder chaque valeur de R dans une nouvelle liste, et ajouter la valeur de R en fonction de I sur le même graphique que le précédent.
#Pour calculer le R, on peut aussi utiliser les listes en intension ("comprehension list")
listeR = [listeTension[i]/listeIntensite[i] for i in range(1,len(listeIntensite))] #Divise chaque U par chaque I, sauf pour la première valeur car = 0; Stocke les résultats dans une liste listeR
import matplotlib.pyplot as plt
listeIntensiteA = [0.000,0.018,0.035,0.051,0.058,0.066,0.080,0.089,0.095,0.103,0.108,0.115,0.119,0.124,0.129]
listeTension = [0.000,0.25,0.88,1.72,2.16,2.72,3.76,4.72,5.28,6.08,6.64,7.48,7.88,8.51,9.20]
#Calcul de R
listeR = [listeTension[i]/listeIntensiteA[i] for i in range(1,len(listeIntensiteA))] #Divise chaque U par chaque I, sauf pour la première valeur car = 0; Stocke les résultats dans une liste listeR
#Tracer de la courbe U en fonction de I
fig, ax1 = plt.subplots() #On créer une figure contenant des sous-graphiques, sans indiquer le nb de colonnes/ligne car seront représentés sur une figure
ax2 = ax1.twinx() #Notre graphique 2 aura le même axe des x que le graphique 1
ax1.plot(listeIntensiteA,listeTension,'o:',label = "Caractéristique d'une lampe") #graphique1
ax2.plot(listeIntensiteA[1:],listeR,'ro:',label = "Evolution de R") #graphique2
ax1.set_xlabel("Intensité en (A)")
ax1.set_ylabel("Tension en (V)")
ax2.set_ylabel("Résistance en Ohm")
ax1.legend(loc=0) #On précise l'emplacement de la légende
ax2.legend(loc=1)
plt.grid()
plt.show()
#Ajouter le module pyplot de matplotlib
# Données
listeIntensiteMA = [0,7.58,9.537,11.383,13.188,14.949,16.648,18.255,19.707,20.801]
# On fait une conversion mA -> A
#Création de la liste des valeurs de tension par "range"
#Tracer de la courbe U en fonction de I
#Ajouter le module pyplot de matplotlib
# Données
listeIntensiteMA = [0,7.58,9.537,11.383,13.188,14.949,16.648,18.255,19.707,20.801]
# On fait une conversion mA -> A
listeIntensite = []
for i in listeIntensiteMA: #Pour chaque valeur de la liste en mA
listeIntensite.append(i*10e-3) #Multiplier par 10^-3 cette valeur et l'ajouter à la liste listeIntensité
#Création de la liste des valeurs de tension par "range"
listeTension = list(range(0,10,1))
#Tracer de la courbe U en fonction de I
import matplotlib.pyplot as plt
listeIntensiteMA = [0,7.58,9.537,11.383,13.188,14.949,16.648,18.255,19.707,20.801]
# On fais une conversion mA -> A (méthode débutant)
listeIntensite = []
for i in listeIntensiteMA: #Pour chaque valeur de la liste en mA
listeIntensite.append(i*10e-3) #Multiplier par 10^-3 cette valeur et l'ajouter à la liste listeIntensité
# On fait une conversion mA -> A (méthode avancée). Donne le même résultat que l'étape ci-dessus
listeIntensite2 = [i*10e-3 for i in listeIntensiteMA]
#Création de la liste des valeurs de tension par "range"
listeTension = list(range(0,10,1))
#Tracer de la courbe U en fonction de I
plt.plot(listeIntensite,listeTension,'o:',label = "Caractéristique d'une lampe")
plt.xlabel("Intensité en (A)")
plt.ylabel("Tension en (V)")
plt.legend()
plt.grid()
plt.show()