Table des matières Python

Boussole chaotique : accrochage de fréquences

1. Introduction

L'équation du mouvement d'une boussole dans un champ fixe et un champ tournant est :

dθdt=ududt=-ω12sinθ-ω22sin(θ-φ)dφdt=Ω

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 :

a1=a2=0.21

Le paramètre de stochasticité est donc :

s=2(a1+a2)=0.84

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.

2. Oscillation de fréquence 0.2

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()
        
plotAplotA.pdf

On obtient cette fréquence d'oscillation pour un angle initial de 0.85.

3. Accrochage de fréquences

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)
        
plotBplotB.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()
        
plotCplotC.pdf
figure()
spectre(theta,tmax)
axis([0,1.0,-20,100])
grid()
        
plotDplotD.pdf

4. Autres accrochages et mouvement chaotique

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])
            
plotEplotE.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()
        
plotFplotF.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])
            
plotGplotG.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()
            
plotHplotH.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()
        
plotIplotI.pdf

Ce type de mouvement est caractérisé par un spectre continu.

Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.