3. Rappel sur la cinématique et les trajectoires#
%matplotlib inline
import numpy as np
import sympy as sp
from sympy.plotting import plot
import matplotlib.pyplot as plt
# police des titres
plt.rc('font', family='serif', size='18')
from IPython.core.display import HTML
from IPython.display import display
from metakernel import register_ipython_magics
register_ipython_magics()
from validation.valide_markdown import test_markdown, test_code
from validation.validation import info_etudiant, bib_validation
from IPython.display import display, Markdown, clear_output
3.1. Dérivée d’un vecteur#
soit \(\vec{U}\) un vecteur de \(R^3\), on veut calculer sa dérivée par rapport au temps
On connaît les composantes du vecteur dans un référentiel de base \(\vec{e}_1, \vec{e}_2, \vec{e}_3\) du référentiel $\( \vec{U} = u_1 \vec{e}_1 + u_2 \vec{e}_2 + u_3 \vec{e}_3\)$
%activity /usr/local/commun/ACTIVITY/MGC2028L/questionCinematique
Error in calling magic 'activity' on line:
[Errno 2] No such file or directory: '/usr/local/commun/ACTIVITY/MGC2028L/questionCinematique'
args: ['/usr/local/commun/ACTIVITY/MGC2028L/questionCinematique']
kwargs: {}
Traceback (most recent call last):
File "/home/buffat/venvs/jupyter/lib/python3.10/site-packages/metakernel/magic.py", line 96, in call_magic
func(*args, **kwargs)
File "/home/buffat/venvs/jupyter/lib/python3.10/site-packages/metakernel/magics/activity_magic.py", line 265, in line_activity
activity.load(filename)
File "/home/buffat/venvs/jupyter/lib/python3.10/site-packages/metakernel/magics/activity_magic.py", line 31, in load
with open(self.filename) as fp:
FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/commun/ACTIVITY/MGC2028L/questionCinematique'
%activity FILENAME - run a widget-based activity
(poll, classroom response, clicker-like activity)
This magic will load the JSON in the filename.
Examples:
%activity /home/teacher/activity1
%activity /home/teacher/activity1 new
%activity /home/teacher/activity1 edit
3.2. Trajectoire circulaire:#
rotation de la terre autour de son axe: mouvement d’un point sur la terre
mouvement de la terre/ soleil: modèle simplifié d’une planéte (mouvement héliocentrique de Copernic)
3.2.1. Mise en équations#
cercle de rayon a
mouvement uniforme de taux de rotation \(\omega\)
\[ x(t) = a \cos\omega t \mbox{ et } y(t) = a \sin\omega t \]
%activity /usr/local/commun/ACTIVITY/MGC2028L/questionCinematique1
Error in calling magic 'activity' on line:
[Errno 2] No such file or directory: '/usr/local/commun/ACTIVITY/MGC2028L/questionCinematique1'
args: ['/usr/local/commun/ACTIVITY/MGC2028L/questionCinematique1']
kwargs: {}
Traceback (most recent call last):
File "/home/buffat/venvs/jupyter/lib/python3.10/site-packages/metakernel/magic.py", line 96, in call_magic
func(*args, **kwargs)
File "/home/buffat/venvs/jupyter/lib/python3.10/site-packages/metakernel/magics/activity_magic.py", line 265, in line_activity
activity.load(filename)
File "/home/buffat/venvs/jupyter/lib/python3.10/site-packages/metakernel/magics/activity_magic.py", line 31, in load
with open(self.filename) as fp:
FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/commun/ACTIVITY/MGC2028L/questionCinematique1'
%activity FILENAME - run a widget-based activity
(poll, classroom response, clicker-like activity)
This magic will load the JSON in the filename.
Examples:
%activity /home/teacher/activity1
%activity /home/teacher/activity1 new
%activity /home/teacher/activity1 edit
3.3. Trajectoire elliptique#
Mouvement héliocentrique des planétes de Kepler
a,b axes de l’ellipse x,y coordonnées / centre O
trajectoire = ellipse de rayon \(a,b\) avec \(a>b>0\)
Loi des aires: 2nde loi de Kepler
Les planétes décrivent des ellipses et le soleil se trouve sur un des foyers (périhélie)
Soit \(A(t)\) l’aire de la surface balayée par le rayon vecteur \(r_e\) durant le mouvement d’une planète, alors cette seconde loi stipule que des aires égales sont balayées dans des temps égaux.
La loi des aires impose la variation de l’angle en fonction du rayon par rapport au foyer \(r_e(t)\) et donc du temps
ce qui implique:
%activity /usr/local/commun/ACTIVITY/MGC2028L/questionCinematique2
Error in calling magic 'activity' on line:
[Errno 2] No such file or directory: '/usr/local/commun/ACTIVITY/MGC2028L/questionCinematique2'
args: ['/usr/local/commun/ACTIVITY/MGC2028L/questionCinematique2']
kwargs: {}
Traceback (most recent call last):
File "/home/buffat/venvs/jupyter/lib/python3.10/site-packages/metakernel/magic.py", line 96, in call_magic
func(*args, **kwargs)
File "/home/buffat/venvs/jupyter/lib/python3.10/site-packages/metakernel/magics/activity_magic.py", line 265, in line_activity
activity.load(filename)
File "/home/buffat/venvs/jupyter/lib/python3.10/site-packages/metakernel/magics/activity_magic.py", line 31, in load
with open(self.filename) as fp:
FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/commun/ACTIVITY/MGC2028L/questionCinematique2'
%activity FILENAME - run a widget-based activity
(poll, classroom response, clicker-like activity)
This magic will load the JSON in the filename.
Examples:
%activity /home/teacher/activity1
%activity /home/teacher/activity1 new
%activity /home/teacher/activity1 edit
3.4. Mvt d’un point sur la terre#
%activity /usr/local/commun/ACTIVITY/MGC2028L/questionCinematique3
Error in calling magic 'activity' on line:
[Errno 2] No such file or directory: '/usr/local/commun/ACTIVITY/MGC2028L/questionCinematique3'
args: ['/usr/local/commun/ACTIVITY/MGC2028L/questionCinematique3']
kwargs: {}
Traceback (most recent call last):
File "/home/buffat/venvs/jupyter/lib/python3.10/site-packages/metakernel/magic.py", line 96, in call_magic
func(*args, **kwargs)
File "/home/buffat/venvs/jupyter/lib/python3.10/site-packages/metakernel/magics/activity_magic.py", line 265, in line_activity
activity.load(filename)
File "/home/buffat/venvs/jupyter/lib/python3.10/site-packages/metakernel/magics/activity_magic.py", line 31, in load
with open(self.filename) as fp:
FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/commun/ACTIVITY/MGC2028L/questionCinematique3'
%activity FILENAME - run a widget-based activity
(poll, classroom response, clicker-like activity)
This magic will load the JSON in the filename.
Examples:
%activity /home/teacher/activity1
%activity /home/teacher/activity1 new
%activity /home/teacher/activity1 edit
3.5. Calcul numérique de trajectoires#
Les données de la trajectoire sont dans le fichier trajectoire.txt
qui contient 3 colonnes correspondants au temps (en s.), et aux 2 composantes de la vitesse suivant x et y (en m/s).
bib_validation('cours','MGC2028L')
from Circuit import Circuit,Circuit2,test_vitesse,test_trajectoire,test_acceleration
Circuit("trajectoire.txt",2.,2.);
3.5.1. lecture des données de vitesse#
Dans la cellule suivante:
lire les données à partir du fichier en utilisant la fonction loadtxt et les mettre dans les 3 tableaux T,U,V
déterminer l’amplitude de la vitesse moyenne Umean, de la vitesse min Umin et de la vitesse max Umax en km/h
tracer l’amplitude de la vitesse en fonction du temps et sauvegarder la courbe dans un fichier, que vous devez -inclure ensuite dans votre contre rendu.
On pourra utiliser la fonction matplotlib plt.ylim([ymin,ymax])
pour définir les valeurs min et max de l’axe y (ymin et ymax sont des valeurs numériques à choisir)
T = None
U = None
V = None
Umean = None
Vmin = None
Umax = None
### BEGIN SOLUTION
T,U,V = np.loadtxt('trajectoire.txt',unpack=True)
Um = np.sqrt(U**2 + V**2)*3.600
Umean = Um.mean()
Umax = Um.max()
Umin = Um.min()
plt.figure(figsize=(10,7))
plt.plot(T,Um)
plt.xlabel('t [sec]')
plt.ylabel('U [km/h]')
plt.ylim([40,50])
plt.title("Vitesse moyenne en km/h");
#plt.savefig("vitesse.png")
### END SOLUTION
# test sur les résultats (a executer)
assert((U.size == T.size) and (V.size == T.size))
print("Vitesse moyenne={:.1f}km/h min={:.1f} km/h max={:.1f}km/h".format(Umean,Umin,Umax))
assert(test_vitesse("trajectoire.txt",Umean,Umin,Umax))
Vitesse moyenne=42.0km/h min=42.0 km/h max=42.0km/h
3.5.2. Calcul de la trajectoire#
A partir des composantes de vitesse U et V , calculer la trajectoire en fonction du temps, i.e. la position \(X_i\) et \(Y_i\) pour chacun des temps \(T_i\). Sur chaque intervalle \([T_{i-1},T_i]\), on utilisera la vitesse moyenne pour calculer la position à l’instant \(T_i\) en fonction de la position précédente \(T_{i-1}\), i.e.
Dans la cellule suivante:
calcul la position des points de la trajectoire dans les 2 vecteurs numpy
X
etY
en déduire la longueur de la trajectoire dans la variable
L
vérifier le calcul par comparaison avec la vitesse moyenne précédente
tracer la trajectoire (X,Y) ainsi que la vitesse sur le même graphe et sauvegarder la courbe dans un fichier, que vous devez inclure ensuite dans votre contre rendu.
Expliquer en quelques lignes comment vous avez vérifié votre calcul
On utilisera la fonction plt.quiver(X,Y,U,V)
qui permet de tracer des flèches de longueur U,V aux points X,Y.
Pour éviter de tracer trop de flèches, on pourra prendre un point sur 4 en remplaçant X
par X[::4]
et idem pour les autres arguments.
X = None
Y = None
L = None
### BEGIN SOLUTION
N = T.size
X = np.zeros(N)
Y = np.zeros(N)
for i in range(1,N):
X[i] = X[i-1] + 0.5*(U[i]+U[i-1])*(T[i]-T[i-1])
Y[i] = Y[i-1] + 0.5*(V[i]+V[i-1])*(T[i]-T[i-1])
# calcul longueur
L = 0
for i in range(1,X.size):
L += np.sqrt((X[i]-X[i-1])**2 + (Y[i]-Y[i-1])**2)
# tracer
plt.figure(figsize=(12,8))
plt.plot(X,Y)
plt.quiver(X[::4],Y[::4],U[::4],V[::4])
plt.title("Trajectoire")
plt.axis('equal');
#plt.savefig("trajectoire.png")
### END SOLUTION
3.5.3. Calcul de l’accélération#
Calculer l’accélération tangentielle et normale, i.e. le vecteur accélération projeté dans le référentiel local directe formé par la tangente et la normale en chaque point de la trajectoire.
Dans la cellule suivante:
Calculer les composantes suivant x et y de l’accélération sur chacun des segments \([T_{i},T_{i+1}]\) de la trajectoire, en utilisant l’accroissement de vitesse suivant x et suivant y. On mettra le résultat dans les vecteurs numpy
Gx
etGy
respectivement.
Calculer la composante de l’accélération tangentielle en projetant le résultat suivant la tangente et mettre le résultat dans le vecteur
Gt
avec pour unité le G (i.e. on adimensionne le résultat avec l’accélération de la pesanteur \(g=9.81\)).Faire de même pour l’accélération normale et mettre le résultat dans le vecteur
Gn
En déduire l’angle d’inclinaison \(\theta\) du cycliste pour composer la force centrifuge. On mettra le résultat dans le tableau numpy
THETA
(on calculera l’angle en degré)Tracer les 2 composantes d’accélérations tangentielles et normales en fonction du temps, ainsi que l’angle d’inclinaison du cycliste. On pourra utiliser la fonction numpy
np.rad2deg()
pour convertir des radians en degrés.
Gx = None
Gy = None
Tx = None
Ty = None
Gt = None
Gn = None
THETA = None
### BEGIN SOLUTION
N = X.size
Gx = np.zeros(N-1)
Gy = np.zeros(N-1)
Gn = np.zeros(N-1)
Gt = np.zeros(N-1)
for i in range(0,N-1):
Gx[i] = (U[i+1]-U[i])/(T[i+1]-T[i])
Gy[i] = (V[i+1]-V[i])/(T[i+1]-T[i])
# tangente et normale (sens trigo)
tx = (U[i+1]+U[i])/2
ty = (V[i+1]+V[i])/2
tn = np.sqrt(tx**2+ty**2)
tx = tx / tn
ty = ty / tn
Gt[i] = tx*Gx[i] + ty*Gy[i]
Gn[i] = -ty*Gx[i] + tx*Gy[i]
# normalisation
g = 9.81
Gt /= g
Gn /= g
# calcul de l'angle
THETA = np.rad2deg(np.arctan2(Gn,1.0))
# calcul du temps au milieu de l'intervalle
Tm = (T[0:N-1]+T[1:N])/2.
# tracer
plt.figure(figsize=(14,8))
plt.subplot(1,2,1)
plt.plot(Tm,Gn,label="Gn")
plt.plot(Tm,Gt,label='Gt')
plt.legend()
plt.title("Acceleration en g");
plt.subplot(1,2,2)
plt.plot(Tm,THETA)
plt.ylim(-20,20)
plt.title("inclinaison en degré");
#plt.savefig("acceleration.png")
### END SOLUTION
# test sur les résultats (a executer)
assert((Gx.size == T.size-1) and (Gy.size == T.size-1))
assert((Gn.size == T.size-1) and (Gt.size == T.size-1))
assert(THETA.size == T.size-1)
assert(test_acceleration("trajectoire.txt",Gt,Gn,THETA))