Pendule en référentiel non galiléen

publicité
Frédéric Legrand
Licence Creative Commons
1
Pendule en référentiel non galiléen
1.
Référentiel en translation horizontale
1.a. Système mécanique
Le pendule pesant est en liaison pivot avec un chariot, lequel glisse en translation
rectiligne sur un bâti. On suppose que le bâti constitue un référentiel galiléen. Le moteur
lié au bâti entraîne en rotation une roue. Le chariot est lié à cette roue par une bielle.
On a ainsi un système de type manivelle-bielle qui permet de convertir le mouvement de
rotation du moteur en mouvement de translation du chariot.
g
Bielle
a
b
Chariot
Moteur
Bâti
L
y
θ
A
α
O
x
β
G
B
On note L la distance entre le centre de gravité du pendule et son axe de rotation, θ son
angle avec la direction verticale. Soit un point O sur l'axe de rotation du moteur. On
note a = OA la longueur de la manivelle et b = AB la longueur de la bielle. L'extrémité
B de celle-ci (liaison pivot avec le chariot) a pour coordonnées (x, h).
L'angle que fait la manivelle avec l'axe horizontal Ox est α = ωt, où ω est la vitesse angulaire de rotation du moteur. L'angle que fait la bielle avec cet axe est β . En
−→ −→
décomposant les vecteurs OA et AB sur la base orthonormée, on obtient :
x = a cos α + b cos β
h = a sin α + b sin β
Remarque : sur la gure ci-dessus, h est négatif.
En éliminant l'angle β de ces équations on obtient :
(1)
(2)
Frédéric Legrand
Licence Creative Commons
x = a cos α +
2
(3)
p
b2 − (h − a sin α)2
Voici deux exemples de courbe x(t) :
import numpy
from matplotlib.pyplot import *
def position(a,b,h,t):
alpha = 2*numpy.pi*t
return a*numpy.cos(alpha)+numpy.sqrt(b**2-numpy.power(h-a*numpy.sin(alpha),2))
figure()
N = 500
t = numpy.arange(N)*2.0/N
a=10
b=40
plot(t,position(a,b,0,t),label="h=0")
plot(t,position(a,b,-10,t),label="h=-10")
xlabel("t")
ylabel("x")
legend(loc="lower right")
grid()
50
45
x
40
35
30
25
0.0
h=0
h=-10
0.5
1.0
t
1.5
2.0
Lorsque h = 0 et b2 a2 , la courbe est très proche d'une sinusoïde. On a en eet
l'expression approchée suivante :
Frédéric Legrand
Licence Creative Commons
x = b + a cos α = b + a cos(ω t)
3
(4)
On utilisera cette expression pour la modélisation du pendule.
1.b. Équation diérentielle du mouvement
Le référentiel lié au chariot est non galiléen. L'accélération d'entraînement dans ce
référentiel est :
d2 x
= −aω 2 cos(ω t)
(5)
2
dt
Les forces de pesanteur s'appliquent au centre de gravité G du pendule. Il en est de même
des forces d'inertie d'entraînement (pour un référentiel en translation). Soit m la masse
du pendule et J son moment d'inertie par rapport à son axe de rotation. Le théorème du
ae =
moment cinétique appliqué, dans le référentiel du chariot, par rapport à l'axe de rotation,
conduit à l'équation diérentielle suivante :
J
dθ
d2 θ
+ ν + mgL sin θ = Lmaω 2 cos θ cos(ωt)
2
dt
dt
(6)
On a introduit un frottement proportionnel à la vitesse angulaire, avec un coecient ν .
Il faut ajouter à cette équation deux conditions initiales : θ(0) et θ̇(0).
L'équation diérentielle est non linéaire. Il est toutefois possible d'obtenir une équation linéaire en supposant que l'angle reste petit :
J
dθ
d2 θ
+ ν + mgLθ = Lmaω 2 cos(ωt)
2
dt
dt
(7)
La solution analytique exacte de cette équation est connue. En revanche, l'équation
complète non linéaire ne peut être résolue que par des calculs numériques, par exemple
avec la méthode d'Euler.
Pour simplier l'étude on divise l'équation par J et on pose :
r
ω0 =
mgL
J
(8)
Il s'agit de la pulsation propre du pendule linéaire (petits angles), c'est-à-dire sa pulsation
d'oscillation lorsque le chariot est immobile (ω = 0). Soit T la période correspondante.
Il est intéressant de faire le changement de variable suivant pour le temps :
t0 =
t
ω0
=
t
T
2π
(9)
Le temps t0 est sans dimensions. Pour faire le changement de variable, on utilise les
identités suivantes :
1
ω0 1
=
dt
2π dt0
ω 2 1
1
0
=
2
dt
2π dt02
On obtient ainsi l'équation diérentielle
(10)
(11)
Frédéric Legrand
Licence Creative Commons
d2 θ 2πν dθ
Lma
+
+ (2π)2 sin θ =
02
0
dt
Jω0 dt
J
2πω
ω0
2
4
cos θ cos
ω
2π t0
ω0
(12)
Cette équation est adimensionnée, car les variables θ et t0 sont sans dimensions. Lorsqu'on
résout numériquement une équation du mouvement, on a toujours intérêt à la mettre
sous forme adimensionnée. La période des petites oscillations libres est T 0 = 1. On voit
apparaître trois paramètres sans dimensions :
2πν
Jω0
Lma
A=
J
ω
f=
ω0
γ=
(13)
(14)
(15)
Voici nalement l'équation diérentielle à étudier :
d2 θ
dθ
+ γ 0 + (2π)2 sin θ = A(2π)2 f 2 cos θ cos (2π f t0 )
02
dt
dt
(16)
1.c. Intégration numérique
Pour résoudre numériquement cette équation avec les deux conditions initiales, il
faut la mettre sous la forme d'un système diérentiel du premier ordre, en introduisant
la vitesse angule du pendule, que l'on notera va :
dθ
= va
dt0
dva
= −γva − (2π)2 sin θ − A(2π)2 f 2 cos θ cos(2π f t)
0
dt
(17)
(18)
Le système est déni par une fonction (on étudie tout d'abord un système sans frottement) :
import math
import scipy.integrate
gamma = 0.0
A = 0.3
f = 1.0
w02 = (2*math.pi)**2
def systeme(Y,t):
return [Y[1],-w02*math.sin(Y[0])-gamma*Y[1]-A*w02*f**2*math.cos(Y[0])*math.cos(2*m
On xe une condition initiale :
Yi = [math.pi*0.5,0.0]
Frédéric Legrand
Licence Creative Commons
On calcule les instants pour lesquels on veut les valeurs approchées :
T = 100.0
t = numpy.arange(start=0,stop=T,step=0.01)
On xe la tolérance absolue et la tolérance relative :
atol=1e-8
rtol=1e-8
On fait l'intégration numérique :
tab_y = scipy.integrate.odeint(systeme,Yi,t,rtol=rtol,atol=atol)
yt = tab_y.transpose()
theta = yt[0]
va = yt[1]
figure()
plot(t,theta)
xlabel("t")
ylabel("theta")
axis([0,20,-2,2])
grid()
Pour analyser le mouvement, on peut faire une analyse spectrale :
5
Frédéric Legrand
Licence Creative Commons
6
import numpy.fft
tfd = numpy.fft.fft(theta)
N = theta.size
spectre = numpy.absolute(tfd)/N
freq = numpy.arange(N)*1.0/T
figure()
plot(freq,spectre)
xlabel("freq")
ylabel("theta")
axis([0,5,0,spectre.max()])
On peut aussi représenter la trajectoire dans l'espace des phases. La dimension de l'espace
des phases est égale au nombre de degrés de libertés du système (au sens de système du
premier ordre). Ici, il y a trois degrés de liberté (θ, va , α).
On peut écrire le système en faisant apparaître explicitement le degré de liberté
correspondant à la rotation de la manivelle :
dθ
= va
dt0
dα
= 2πf
dt0
dva
= −γva − (2π)2 sin θ − A(2π)2 f 2 cos θ cos(α)
0
dt
(19)
(20)
(21)
Frédéric Legrand
Licence Creative Commons
7
La représentation graphique (à deux dimensions) de la trajectoire dans l'espace des
phases à 3 dimensions n'est pas faisable. Une première solution est de représenter la
projection sur le plan (θ, va ) :
figure()
plot(theta,va)
xlabel("theta")
ylabel("va")
grid()
Une représentation simpliée est possible en remarquant que la variable α est de période
2π . En trace alors dans le plan de projection seulement les points pour lesquels α est
multiple de 2π . Cette représentation est appelée section de Poincaré.
t = numpy.arange(start=0,stop=T,step=1.0/f)
tab_y = scipy.integrate.odeint(systeme,Yi,t,rtol=rtol,atol=atol)
yt = tab_y.transpose()
theta = yt[0]
va = yt[1]
figure()
plot(theta,va,".")
xlabel('theta')
ylabel('va')
grid()
Frédéric Legrand
Licence Creative Commons
8
Les points se répartissent sur une courbe fermée, et remplissent cette courbe lorsque t
tend vers l'inni. Il s'agit d'un mouvement quasipériodique.
Voyons ce qu'il se passe si l'on augmente l'amplitude A. Pour cela, il faut augmenter
la longueur de la manivelle.
A = 2.0
T = 100.0
t = numpy.arange(start=0,stop=T,step=0.01)
Yi = [math.pi*0.5,0.0]
tab_y = scipy.integrate.odeint(systeme,Yi,t,rtol=rtol,atol=atol)
yt = tab_y.transpose()
theta = yt[0]
va = yt[1]
figure()
plot(t,theta)
xlabel("t")
ylabel("theta")
grid()
Frédéric Legrand
Licence Creative Commons
9
On obtient un mouvement chaotique, au cours duquel le pendule fait des tours complets,
dans un sens puis dans l'autre. Une caractéristique importante d'un mouvement chaotique est la très grande sensibilité aux conditions initiales. Refaisons le calcul avec un
angle initial légèrement diérent :
A = 2.0
T = 100.0
t = numpy.arange(start=0,stop=T,step=0.01)
Yi = [math.pi*0.5+1e-3,0.0]
tab_y = scipy.integrate.odeint(systeme,Yi,t,rtol=rtol,atol=atol)
yt = tab_y.transpose()
theta = yt[0]
va = yt[1]
plot(t,theta)
xlabel("t")
ylabel("theta")
grid()
Frédéric Legrand
Licence Creative Commons
10
Au début, les deux mouvements sont très proches, mais l'écart grandit très vite. On obient
nalement deux trajectoires complètement diérentes. En ce sens, l'évolution d'un système chaotique n'est pas prévisible bien que son équation diérentielle soit déterministe.
Il faudrait une précision innie sur la condition initiale pour prévoir l'état du système à
un instant t quelconque, ce qui est impossible en pratique.
Voyons l'analyse spectrale de ce mouvement chaotique :
tfd = numpy.fft.fft(theta)
N = theta.size
spectre = numpy.absolute(tfd)/N
freq = numpy.arange(N)*1.0/T
figure()
plot(freq,spectre)
xlabel("freq")
ylabel("theta")
axis([0,1,0,spectre.max()])
Frédéric Legrand
Licence Creative Commons
Un mouvement chaotique a un spectre continu. Voyons la section de Poincaré :
t = numpy.arange(start=0,stop=T,step=1.0/f)
tab_y = scipy.integrate.odeint(systeme,Yi,t,rtol=rtol,atol=atol)
yt = tab_y.transpose()
theta = yt[0]%(2*math.pi)-math.pi
va = yt[1]
figure()
plot(theta,va,".")
xlabel('theta')
ylabel('va')
grid()
11
Frédéric Legrand
Licence Creative Commons
12
Pour un mouvement chaotique, les points de la section de Poincaré se répartissent sur
une surface, et non pas sur une courbe.
Téléchargement