Courbes paramétrées - Lissajous

Une courbe de Lissajous est une courbe paramétrée $\gamma$ de la forme $$ \gamma(t)=(\cos(at),\sin(bt)), $$ où $a$ et $b$ sont des entiers relatifs non nuls. La courbe de Lissajous la plus simple est bien-sûr le cercle unité. Quelques exemples plus intéressants sont obtenus en prenant $a\neq1$ ou $b\neq1$:

In [19]:
t=var('t')

def lissajous(a,b):
    return (cos(a*t),sin(b*t))

def plot_lissajous(a,b):
    return parametric_plot(lissajous(a,b), (t,0,2*pi), ticks=[1,1])

a=[[plot_lissajous(i,j) for j in range(1,5)] for i in range(1,4)]
graphics_array(a)
Out[19]:

(un bug dans sage ne tient pas compte de l'option ticks pour toutes les graphiques dans la commande parametric_plot mais seulement pour la dernière.) Il est plus parlant de tracer ces lissajous de manière simultanée:

In [26]:
s=var('s')

def plot_lissajous_arc(a,b,s):
    plt=parametric_plot(lissajous(a,b),(t,-0.01,s))
    plt.set_axes_range(-1,1,-1,1)
    return plt

def plot_lissajous_array(m,n,s):
    return graphics_array([[plot_lissajous_arc(i,j,s) for j in range(1,n)] for i in range(1,m)])

q=[plot_lissajous_array(4,5,s) for s in sxrange(0,2*pi,2*pi/100,include_endpoint=True)]
q.extend(50*q[-1:])
a = animate(q)
a.show(delay=10)

Choisissons l'une de ces courbes de lissajous $\gamma$ et etudions-la. Traçons le vecteur tangent à $\gamma$ en un point parcourant $\gamma$:

In [10]:
t=var('t')
a=1
b=2
gamma=vector(lissajous(a,b))
gammad=vector([f.diff() for f in gamma])
gammadt=gamma+gammad
liste_de_plots=[plot_lissajous(a,b)+
                arrow(gamma(s),gammadt(s), arrowsize=1, color="red") 
                for s in sxrange(0,2*pi,2*pi/200,include_endpoint=True)]
for g in liste_de_plots: g.set_axes_range(-3,3,-3,3)
animation=animate(liste_de_plots)
animation.show(delay=10)

On voit que la courbe $\gamma'(t)$ n'est pas de norme $1$, en général. Autrement dit, la courbe $\gamma$ n'est pas paramétrée par la longueur d'arc. On le voit également algébriquement; la norme de $\gamma'(t)$

In [12]:
gammad.norm()
Out[12]:
sqrt(4*abs(cos(2*t))^2 + abs(sin(t))^2)

n'est pas identiquement égale à $1$. Essayons de déterminer la longueur d'arc $\ell=\ell(t)$:

In [14]:
integral(gammad.norm(),t)
Out[14]:
integrate(sqrt(4*cos(2*t)^2 + sin(t)^2), t)

Donc sage ne sait pas primitiver cette fonction...et c'est sans doute une intégrale du style elliptique ou pire... Heureusement, on n'a pas besoin d'une paramétrisation par longueur d'arc $\delta$ afin de déterminer $\delta''$, ni $\delta'$ d'ailleurs!

In [15]:
t=var('t')
tau=1/gammad.norm()*gammad
gammadd=vector([f.diff() for f in gammad])
kappa=matrix([gammad,gammadd]).determinant()/gammad.norm()^3
nu=1/gammad.norm()*vector((-gammad[1],gammad[0]))
deltadd=kappa*nu
liste_de_plots=[plot_lissajous(a,b)+
                arrow(gamma(s),gamma(s)+tau(s), arrowsize=1, color="green")+
                arrow(gamma(s),gamma(s)+deltadd(s), arrowsize=1, color="red") 
                for s in sxrange(0,2*pi,2*pi/200,include_endpoint=True)]
for g in liste_de_plots: g.set_axes_range(-3,3,-3,3)
animation=animate(liste_de_plots)
animation.show(delay=10)

Cela permet également de dessiner les cercles osculateurs:

In [16]:
t=var('t')
gammadd=vector([f.diff() for f in gammad])
kappa=matrix([gammad,gammadd]).determinant()/gammad.norm()^3
nu=1/gammad.norm()*vector((-gammad[1],gammad[0]))
liste_de_plots=[plot_lissajous(a,b)+
                circle(gamma(s)+1/kappa(s)*nu(s), abs(1/kappa(s)), color="red")+
                point(gamma(s), color="red", size=30)
                for s in sxrange(0.01,2*pi+0.01,2*pi/200,include_endpoint=True)]
for g in liste_de_plots: g.set_axes_range(-3,3,-3,3)
animation=animate(liste_de_plots)
animation.show(delay=10)