Le but de cette feuille de calcul est de dessiner la cycloïde et les vecteurs vitesse et accélération. On commence par le cercle unité de centre l'origine, sous forme de courbe paramétrée: $$ \gamma(t)=(\cos(t),\sin(t)) $$ pour $t\in\mathbf R$. Comme $\gamma$ est périodique de période $2\pi$, il suffit de tracer $\gamma$ sur l'intervalle $[0,2\pi]$:
t = var('t') # définition de la variable t
gamma=(cos(t),sin(t)) # définition de la paramétrisation
parametric_plot(gamma, (t, 0, 2*pi)) # tracer la courbe sur l'intervalle en t de 0 à 2pi
On souhaite faire rouler le cercle sur l'axe des abscisses donc on translate $\gamma$ par le vecteur $(0,1)$. Comme sage ne connaît pas les espaces affines, on transforme $\gamma$ en un vecteur et on y rajoute le vecteur $(0,1)$. Puis on trace la courbe image. On y rajoute aussi un point de repère:
gamma=vector(gamma) # transforme gamma en fonction à valeur vectorielles
gamma+=vector([0,1]) # effectue la translation
parametric_plot(gamma, (t,0,2*pi))+\
point(gamma(0), color="red", size=30) # l'addition superpose des dessins
On fait rouler le cercle sur l'axe des abscisses vers la droite sans glissement sur une certaine distance $dist$ avec une certaine nombre de échantillons $ech$. On aura besoin d'une nouvelle variable $s$ qui représente la quantité de déplacement; lorsque $s=0$, le cercle se trouve à la position initiale; lorsque $s=dist$, le cercle se trouve à la position finale. Le cercle initiale est $\gamma$; le cercle final est $\gamma$ translaté par le vecteur $(dist,0)$. Lorsque $s$ est compris entre $0$ et $dist$, le cerce a parcouru une distance de $s$ unités et est donc translaté par le vecteur $(s,0)$. Comme le cercle roule sans glissement, le point de repère a parcouru une distance $s$ sur le cercle dans le sens des aiguilles d'une montre. Cela donne les commandes suivantes. Pour faire l'animation on crée une liste roue
contenant les images succesives du parcours du cercle lorsque $s$ va de $0$ à $dist$.
s=var('s')
dist = 7*pi
ech = 400
roue = [parametric_plot(gamma(t-s)+vector([s,0]), (t,0,2*pi),
ticks=[pi/2,[1,2]], # espacement des nombres sur les axes
tick_formatter=[pi,None], # pour avoir de jolies étiquettes sur l'axe des x
figsize=8)+ # agrandit l'image
point(gamma(-s)+vector([s,0]),
color="red", size=30)
for s in sxrange(0,dist,dist/ech,include_endpoint=True)]
for g in roue: g.set_axes_range(-1.1,dist+1.1,-.1,2.1) # pour afficher toujours la même partie du plan
roue.extend(50*roue[-1:]) # afficher la dernière image plusieures fois
a = animate(roue) # déroule une par une les images dans roue
a.show(delay=2) # et les afficher
C'est plus parlant avec la tracée du point de repère:
roue = [parametric_plot(gamma(t-s)+vector([s,0]), (t,0,2*pi),
ticks=[pi/2,[1,2]],
tick_formatter=[pi,None],
figsize=8)+
parametric_plot(gamma(-t)+vector([t,0]), (t,-.01,s), # 0 au lieu de -.01 donne une erreur car sage ne
color="red", thickness=3) # ne sait pas dessiner une courbe vide!
for s in sxrange(0,dist,dist/ech,include_endpoint=True)]
for g in roue: g.set_axes_range(-1.1,dist+1.1,-.1,2.1)
roue.extend(50*roue[-1:])
a = animate(roue)
a.show(delay=2)
On en extrait la cycloïde:
gamma=gamma(-t)+vector([t,0])
p=parametric_plot(gamma,(t,0,dist),
ticks=[pi/2,[1,2]],
tick_formatter=[pi,None],
figsize=8)
p.set_axes_range(-1.1,dist+1.1,-.1,2.1)
p
Et pour finir la cycloïde avec les vecteurs tangents $\gamma'(t)$ (en rouge) et accélération $\gamma''(t)$ (en vert), translatés par $\gamma(t)$:
gammad=vector([f.diff() for f in gamma])
gammadd=vector([f.diff() for f in gammad])
run=[p+arrow(gamma(t),gamma(t)+gammad(t),
arrowsize=1, color="red")+
arrow(gamma(t),gamma(t)+gammadd(t),
arrowsize=1, color="green")
for t in sxrange(0,dist,dist/ech,include_endpoint=True)]
for g in run: g.set_axes_range(-1.1,dist+1.1,-.3,2.5)
run.extend(50*run[-1:])
a=animate(run)
a.show(delay=2)
On constate que le vecteur vitesse ou tangent s'annule aux cusps, comme il se doit; la cycloïde n'est pas une courbe paramétrée plane régulière. Par contre, le vecteur accélération ne s'annule nulle part! On constate d'ailleurs, que ce dernier n'est pas perpendiculaire au vecteur tangent; la paramétrisation n'en est donc pas une par longueur d'arc!