L'équation du mouvement d'une boussole dans un champ fixe et un champ tournant est :
Voir Boussole chaotique : définition du problème pour plus de précisions.
Pour un paramètre de stochasticité faible, nous avons vu que les résonances autour du champ fixe et du champ tournant sont pratiquement indépendantes l'une de l'autre. Autrement dit, si la boussole oscille autour du champ fixe, son mouvement n'est pas affecté par le champ tournant (et réciproquement).
On étudie à présent le cas particulier :
Le paramètre de stochasticité est donc :
On se limite à l'étude de la résonance centrée sur le champ fixe. Les très petites oscillations autour du champ fixe ont une fréquence de 0.21.
On commence par poser a2=0 (pas de champ tournant). Pour les très petites oscillations, la fréquence est 0.21. Puisque la fréquence d'oscillation décroît quand on s'éloigne du centre de la résonance, il est possible de trouver une condition initiale donnant une fréquence de 0.2.
import dynode.main as dyn import numpy from matplotlib.pyplot import * import math import numpy.fft solver=dyn.CVOde(dyn.OdeBoussole,dyn.OdeAdams,dyn.OdeFunctional) a1=0.21 a2=0 solver.set_cst([(2*math.pi*a1)**2,(2*math.pi*a2)**2]) reltol=1e-5 abstol=1e-6 theta0=0.85 solver.init(0,[theta0,0],reltol,[abstol]) tmax=5000 data=solver.solve(0.1,tmax) t = data[0] theta = data[1] dtheta = data[2] def spectre(theta,tmax): tfd=numpy.fft.fft(theta) n=tfd.size f=numpy.zeros(n) dB=numpy.zeros(n) for k in range(n): f[k] = (k-1)*1.0/tmax dB[k] = 20*math.log10(abs(tfd[k])) figure() plot(f,dB) xlabel('f') ylabel('dB') figure() spectre(theta,tmax) axis([0,1.0,-20,100]) grid()plotA.pdf
On obtient cette fréquence d'oscillation pour un angle initial de 0.85.
On garde un angle initial proche de 0.85 et on ajoute le champ tournant, dont la fréquence est 1, c'est-à-dire 5 fois celle de l'oscillation autour du champ fixe.
def poincare(y0,tmax): global solver,reltol,abstol solver.init(0.0,y0,reltol,[abstol]) data=solver.solve(1,tmax) t = data[0] theta = data[1] dtheta = data[2] plot(theta,dtheta,marker='.',linestyle=" ",markersize=2) a2=a1 solver.set_cst([(2*math.pi*a1)**2,(2*math.pi*a2)**2]) tmax=500 init1 = [[0.86,0],[0.87,0],[0.9,0],[0.95,0]] figure(figsize=(8,8)) xlabel('theta') ylabel('dtheta') for y0 in init1: poincare(y0,tmax)plotB.pdf
Pour un angle initial supérieur ou égal à 0.87, la section de Poincaré change de forme : il apparait 5 îlots qui définissent 5 nouvelles résonances. Ce phénomène est dû au fait que le rapport entre la fréquence du champ tournant et la fréquence d'oscillation autour du champ fixe est rationnel, ici 1/5. On dit qu'il y a accrochage entre le champ tournant et la résonance du champ fixe.
Voyons l'évolution temporelle de l'angle et son spectre dans ce cas :
theta0=0.9 solver.init(0,[theta0,0],reltol,[abstol]) tmax=5000 data=solver.solve(0.1,tmax) t = data[0] theta = data[1] dtheta = data[2] figure(figsize=(12,4)) plot(t,theta) axis([0,500,-3,3]) grid()plotC.pdf
figure() spectre(theta,tmax) axis([0,1.0,-20,100]) grid()plotD.pdf
On considère ici différentes conditions initiales :
init1 = [[0.1,0],[0.2,0],[0.3,0],[0.4,0],[0.5,0],[0.6,0],[0.7,0],[0.8,0],[0.9,0],[1,0],[1.1,0],[1.2,0],[1.3,0],[1.4,0],[1.5,0],[1.6,0],[1.7,0],[1.8,0],[1.9,0],[2,0],[2.1,0],[2.2,0]] tmax=1000 figure(figsize=(8,8)) xlabel('theta') ylabel('dtheta') for y0 in init1: poincare(y0,tmax) axis([-3,3,-3,3])plotE.pdf
Sur cette figure apparaissent d'autres résonances. En particulier, un ensemble de 11 ilôts obtenu pour un angle initial de 1.5. Voyons le spectre pour ce cas :
theta0=1.5 solver.init(0,[theta0,0],reltol,[abstol]) tmax=5000 data=solver.solve(0.1,tmax) t = data[0] theta = data[1] dtheta = data[2] figure() spectre(theta,tmax) axis([0,1.0,-20,100]) grid()plotF.pdf
Cet accrochage correspond probablement au rapport 2/11=0.182. Le suivant (17 ilôts) correspond probablement au rapport 3/17=0.176. Il y a aussi 6 ilôts pour le rapport 1/6=0.167 (angle initial égal à 2). Chacun de ces ilôts forme une résonance autour de laquelle on observe 4 petits ilôts. Il y a probablement des accrochages qui n'apparaissent pas sur la figure en raison de leur structure trop petite.
On constate par ailleurs des trajectoires qui ont une section de Poincaré formant un nuage diffus. Elle sont obtenues pour les angles initiaux de 1.7, 2.1 et 2.2 (mais pas 2.0) :
init1=[[1.7,0],[2.1,0],[2.2,0],[2.3,0]] tmax=1000 figure(figsize=(8,8)) xlabel('theta') ylabel('dtheta') for y0 in init1: poincare(y0,tmax) axis([-3,3,-3,3])plotG.pdf
Voyons l'angle en fonction du temps pour un angle initial de 2.2 :
theta0=2.2 solver.init(0,[theta0,0],reltol,[abstol]) tmax=300 data=solver.solve(0.1,tmax) t = data[0] theta = data[1] dtheta = data[2] figure(figsize=(12,4)) plot(t,theta) xlabel('t') ylabel('theta') grid()plotH.pdf
Il s'agit d'une trajectoire chaotique : il y alternance (non périodique) d'oscillations autour du champ fixe et d'oscillations autour du champ tournant.
Le spectre :
figure() solver.init(0,[theta0,0],reltol,[abstol]) tmax=5000 data=solver.solve(0.01,tmax) t = data[0] theta = data[1] dtheta = data[2] spectre(theta,tmax) axis([0,1.0,60,180]) grid()plotI.pdf
Ce type de mouvement est caractérisé par un spectre continu.