EDO - NEURO - SEANCE 2 - Modeles Couples
Contents
Modele de Kuramoto
On a vu que le modele de phase le plus simple s'ecrivait
dphi/dt = omega
La variabe phi represente la phase d'une trajectoire sur un cercle de rayon 1. En coordonnees cartesiennes, la trajectoire est (cos(omega*t+phi0),sin(omega*t+phi0)). Le modele de phase est donc un oscillateur, avec une periode T = 2*pi/omega. Le parametre omega est la frequence intrinseque de l'oscillateur. On peut rajouter un terme de forcage:
dphi/dt = omega + I(t)
Si le terme I(i) est suffisament petit, la solution reste oscillante (phi augmente toujours).
On s'interesse maintenant a une population de N oscillateurs de phase couples entre eux. Chaque oscillateur a sa propre frequence intrinseque omega_i, pour i=1,...,N. Chaque oscillateur interagit avec d'autres oscillateurs sinusoidalement, pour donner
Le parametre K est la force de couplage, N le nombre d'oscillateurs.
Le code kuramoto.m permet de simuler le systeme et de tracer les solutions.
Le code de kuramoto.m
Le code est divise en trois parties: initialisation, resolution, analyse. L'entete est classique
function sol = kuramoto % KURAMOTO Systeme d'oscillateurs de phase couples % sol = kuramoto resoud un systeme de N d'oscillateurs de phase couples
Initialisation des varaibles et parametres
% intervalle d'integration
t0 = 0;
tfinal = 500;
% nombre d'oscillateurs
N = 400;
% parametres des equations % frequences intrinseques aleatoires mean_freq = 1.0; std_freq = 0.05; omega = mean_freq + std_freq*randn(N,1);
% conditions initiales aleatoires uniforme sur le cercle
phi0 = 2*pi*rand(N,1);
% on definit la matrice de couplage C = computeCouplingMatrix('local');
Resolution
[t,phi] = solveKuramoto;
Analyse
mean_field = mean(exp(1i*phi),1); order_parameter = abs(mean(exp(1i*phi),1)); angle_parameter = angle(mean_field);
Fonctions imbriquees - solveKuramoto
La fonction solveKuramoto est le coeur du code, et possede elle-meme deux fonctions imbriquees.
function [t,x] = solveKuramoto % SOLVEKURAMOTO resoud le systeme avec Euler
% parametres de simulation
dt = 0.5;
nsteps = (tfinal-t0)/dt+1;
t = t0:dt:tfinal;
x = zeros(N,nsteps); x(:,1) = phi0;
for ii = 1:nsteps-1 % integre avec Euler x(:,ii+1) = x(:,ii) + dt * phaseEq(t(ii),x(:,ii));
% reinitialisation ifire = (x(:,ii+1)>=2*pi); x(ifire,ii+1) = x(ifire,ii+1) - 2*pi; end
function dphidt = phaseEq(t,phi) % PHASEEQ equations du systeme
dphidt = omega + couplingStrength(t)*coupling(phi);
end
function c = coupling(phi) % COUPLING terme de couplage
phase_diff = bsxfun(@minus,phi',phi); c = sum(C.*sin(phase_diff),2);
end
end
Fonctions imbriquees - couplingStrength
function y = couplingStrength(t) % COUPLINGSTRENGTH force de couplage variable
maxK = 0.4; midT = (tfinal-t0)/2; y = maxK/midT*t.*(t<=midT)+(2*maxK-maxK/midT*t).*(t>midT);
end
Fonctions imbriquees - computeCouplingMatrix
function C = computeCouplingMatrix(type) % COMPUTECOUPLINGMATRIX calcule la matrice de couplage % La matrice de couplage est une matrice NxN. L'entree % M(i,j)=1 si l'oscillateur i recoit une connexion de l'oscillateur j. La % matrice M est ensuite normalisee de telle sorte que la somme de chaque % ligne soit 1, si il y a au moins un j non-nul, ou 0 si toute la ligne est % nulle.
switch lower(type) case 'local' % Pour un couplage local, M est une matrice NxN % On dispose les N oscillateurs sur une lattice (prendre N carre) % On connecte deux oscillateurs si ils sont voisins (4 voisins, conditions % de bord periodiques) % xi position en x des oscillateurs; % yi position en y des oscillateurs;
if sqrt(N)~=round(sqrt(N)) error('N doit etre carre'); end sN = sqrt(N); xi = mod((0:(N-1)),sN); yi = reshape(repmat(0:(sN-1),sN,1),N,1); distX = abs(bsxfun(@minus,xi',xi)); distX(distX==(sN-1))=1; distY = abs(bsxfun(@minus,yi',yi)); distY(distY==(sN-1))=1; dist = distX+distY; M = dist<=1 & dist>0; sumM = sum(M,2); C = bsxfun(@rdivide,M,sumM); C(isnan(C))=0;
otherwise % Pour un couplage global (par defaut), M reste % un scalaire: M(i,j) = 1 pour tout i et j. M=1; C=M/N; end
end
Fonctions imbriquees - plotSolution
function plotSolution(type) % PLOTSOLUTION Trace la solution phi
figure(1); clf; n = size(phi,2);
colormap gray;
switch lower(type) case 'local' sN = sqrt(N); for i=1:n subplot(131) m = reshape(sin(phi(:,i)),sN,sN); image((m+1)/2*64)
subplot(132) hold off plot(t(1:i),mean(sin(phi(:,1:i)),1)) hold on plot(t(1:i),order_parameter(1:i),'r')
subplot(133) theta = linspace(0,2*pi,100); circle = exp(1i*theta); hold off plot(circle,'k') hold on plot(exp(1i*phi(:,i)),'o','MarkerFaceColor','b') plot(mean_field(i),'*r'); pause(0.01) end otherwise theta = linspace(0,2*pi,100); circle = exp(1i*theta); for i = 1:n hold off plot(circle,'k') hold on plot(exp(1i*phi(:,i)),'o','MarkerFaceColor','b') hold on plot(mean_field(i),'*r'); pause(0.0001) end end end
Exemples
kuramoto;
