Vous êtes sur la page 1sur 12

MATLAB et lespace dtat :

Ce petit texte vous montrera comment on peut manipuler les quations dtat avec MATLAB.

Exemple 1 : Systme bi-linaire


Soit le systme reprsent par :
x1 (t ) = x2 (t ) ( x1 (t ) + 1) x2 (t ) = x1 (t ) ( x2 (t ) + 1)

On peut obtenir le point dquilibre (en rgime permanent) vers lequel le systme convergera pour une condition initiale donne en utilisant la fonction fsolve . Premirement, il faut crire une fonction MATLAB reprsentant le systme dquations diffrentielles. Cela se fait avec lditeur de MATLAB. Voici le listing correspondant au systme bi-linraire (sauvegard sous le nom bilin_ss.m) : function f = bilin_ss(x) f=zeros(2,1); % Pour sassurer davoir un vecteur vertical f(1) = x(2)*(x(1)+1); f(2) = x(1)*(x(2)+3); Une fois cette fonction crite et sauvegarde, on peut utiliser dans MATLAB cette fonction comme paramtre de la fonction fsolve pour trouver les points dquilibre. Le premier paramtre de fsolve , cest le nom du fichier .m ou se situe la fonction valuer. Le second paramtre, cest ltat initial du systme. Comme le systme comporte deux tats, le vecteur dtat doit tre un vecteur colonne de dimension 2, par exemple [0;0]. Le troisime paramtre est optionnel, mais permet dliminer la longue liste davertissement qui rsulte de lutilisation de fsolve sur certaines versions de MATLAB. Voici un exemple dutilisation de fsolve : >> fsolve('bilin_ss',[0;0],optimset('fsolve')) Optimization terminated successfully: First-order optimality is less than options.TolFun. ans = 0 0 >> fsolve('bilin_ss',[1;1],optimset('fsolve')) Optimization terminated successfully: First-order optimality is less than options.TolFun.

ans = 1.0e-007 * 0.2956 0.8867 >> fsolve('bilin_ss',[-1;-1],optimset('fsolve')) Optimization terminated successfully: First-order optimality is less than options.TolFun. ans = -1.0000 -3.0000 >> Remarquez que cet outil vous indiquera ou se retrouve le systme lorsque lon part de la condition initiale. Mais, moins de tester toutes les conditions initiales possibles, ce nest pas loutil idal pour trouver les points dquilibre. Il est prfrable de calculer les points dquilibre en solutionnant lquation, car si un point dquilibre est instable, on ny convergera jamais, moins que la condition initiale soit exactement sur le point dquilibre instable. On peut utiliser la fonction solve pour trouver tous les points dquilibre quils soient stables ou non. Seul problme, cette fonction ne tolre pas les index, donc x(1) est reprsent par x et x(2) est reprsent pas y. >> [x1 x2]=solve('y*(x+1)=0','x*(y+3)=0','x','y') x1 = [ 0] [ -1] x2 = [ 0] [ -3] La fonction solve montre quil y a deux points dquilibre, lun [0;0] et le second [-1;-3]. En linarisant chaque point dquilibre, on peut savoir quel genre de point dquilibre on fait face (stable, instable).

Ainsi, x = [0;0], on a :
0 1 A= 3 0

qui donne des valeurs propres de 3 et 3 , ce qui correspond un point dquilibre instable. x = [-1;-3], on a :
1 0 A= 0 3

qui donne des valeurs propres de -1 et -3, ce qui correspond un point dquilibre stable. Pour voir lvolution des tats du systme bi-linaire dans le temps, on peut utiliser la fonction ode45 . Cette fonction permet de reprsenter lvolution du systme dans le temps. Tout comme la fonction solve , il faut crire une fonction MATLAB reprsentant le systme dquations diffrentielles. Cela se fait avec lditeur de MATLAB. Voici le listing correspondant au systme bi-linraire (sauvegard sous le nom bilin_dyn.m) : function f = bilin_dyn(t,x) f=zeros(2,1); % Pour sassurer davoir un vecteur vertical f(1) = x(2)*(x(1)+1); f(2) = x(1)*(x(2)+3); Remarquez la trs forte ressemblance avec la fonction bilin_ss , la seule diffrence tant lajout du paramtre de temps. Une fois cette fonction crite et sauvegarde, on peut utiliser dans MATLAB cette fonction comme paramtre de la fonction ode45 pour trouver la trajectoire suivie par les tats partir de leur condition initiale. Le premier paramtre de ode45 , cest le nom du fichier .m ou se situe la fonction valuer. Le second paramtre, cest la plage de temps de la simulation (ici de t=0 t=20). Le troisime paramtre, cest ltat initial du systme. Voici un exemple dutilisation de ode45 : >> [t,y]=ode45('bilin_dyn',[0 20],[0;-1]); >> plot(y( :,1),y( :,2)) >> grid

Comme il y a deux tats, on peut tracer le comportement dans le diagramme des phases avec la fonction plot , la fonction grid mettant simplement une grille sur le graphique.

Ce qui donne le rsultat suivant :

En utilisant la fonction hold , on peut faire en sorte que MATLAB trace plusieurs courbes sur le mme graphique. Ainsi, on peut obtenir avec cette squence : >> hold Current plot held >> [t,y]=ode45('bilin_dyn',[0 >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0

20],[-1;-1]); 20],[-2;-1]); 20],[-3;-1]); 20],[0;-2]); 20],[0;-3]); 20],[0;-4]); 20],[0;-5]); 20],[0;-6]); 20],[-1;-6]); 20],[-2;-6]); 20],[-3;-6]); 20],[-3;-5]); 20],[-3;-4]);

>> >> >> >> >> >> >>

plot(y(:,1),y(:,2)) [t,y]=ode45('bilin_dyn',[0 20],[-3;-3]); plot(y(:,1),y(:,2)) [t,y]=ode45('bilin_dyn',[0 20],[-3;-2]); plot(y(:,1),y(:,2)) xlabel('x_1'); ylabel('x_2');

ce diagramme dtat :

Exemple 2 :
0 1 0 x(t ) = 0 0 1 x(t ) 1 2 3

Soit le systme reprsent par :

Voici le listing correspondant au systme (sauvegard sous le nom test_dyn.m) : function f = test_dyn(t,x) A = [0 1 0; 0 0 1; -1 -2 -3]; f = A*x;

Normalement, pour ce systme, le point dquilibre est [0;0;0], ce que confirme la fonction solve : >> [x1 x2 x3]=solve('y=0','z=0','-z-2*y-3*z=0','x','y','z') x1 = 0 x2 = 0 x3 = 0 Pour voir comment les tats voluent, on peut utiliser ode45 : >> >> >> >> [t,y]=ode45('test_dyn',[0 20],[1;1;2]); figure plot3(y( :,1),y( :,2),y( :,3)) grid

Puisquil y a trois tats, on fait le trac sur un graphique 3D. Le graphique est obtenu avec la fonction plot3 . Ce qui donne comme rsultat :

On peut voir un comportement en 3D prsentant une spirale.

En changeant lorientation du graphique, on peut mieux voir lvolution du systme :

Pour plusieurs conditions initiales, on obtient cette figure ou lon voit bien les spirales :

Et en changeant lorientation, on peut voir ces spirales par la tranche :

La dynamique sexplique assez bien en regardant les valeurs propres de la matrice A. >> A = [0 1 0; 0 0 1; -1 -2 -3]; >> eig(A) ans = -2.3247 -0.3376 + 0.5623i -0.3376 - 0.5623i Lune des valeurs propres est -2.3247 et explique la dynamique de convergence vers le plan ou se situe la spirale (dynamique que lon voit sur le graphique en haut page). Les deux ples complexes conjugus expliquent la dynamique de la spirale. Comme lamplitude des valeurs propres complexes est infrieure la valeur propre -2.32, cela indique que la dynamique de la spirale est plus lente la dynamique convergente vers le plan de la spirale. Les vecteurs propres sont obtenus avec : >> [V,S]=eig(A) V = 0.1676 -0.3896 0.9056 0.7868 -0.2657 + 0.4424i -0.1591 - 0.2988i 0.7868 -0.2657 - 0.4424i -0.1591 + 0.2988i

S = -2.3247 0 0 0 -0.3376 + 0.5623i 0 0 0 -0.3376 - 0.5623i

Le vecteur propre correspondant la valeur propre est reprsent par la premire colonne de V. Et supposons que lon choisisse une condition initiale qui est un multiple du vecteur propre correspondant -2.3247 : >> [t,y]=ode45('test_dyn',[0 20],2*V(:,1)); >> plot3(y(:,1),y(:,2),y(:,3),'r') Le comportement observ sera :

Et comme on peut le voir, la ligne rouge correspondant la dernire trajectoire gnre converge directement vers [0;0;0]. Cela montre que lon peut avoir certaines conditions initiales qui nous exemptent davoir des oscillations dans le systme, i,e., celle qui correspondent au vecteur propre de la valeur propre relle prsente dans notre systme.

Voici lvolution dans le temps de deux des trajectoires :

On peut voir la convergence rapide et sans oscillations du systme dont la condition initiale est un multiple du vecteur ltat de la valeur propre -2.3247. Ce dernier graphique a t obtenu avec : >> [t,y]=ode45('test_dyn',[0 20],[1;1;-2]); >> plot(t,y(:,1),'r',t,y(:,2),'r--',t,y(:,3),'r-.') >> grid >> hold Current plot held >> [t,y]=ode45('test_dyn',[0 20],2*V(:,1)); >> plot(t,y(:,1),'b',t,y(:,2),'b--',t,y(:,3),'b-.') >> xlabel('Temps'); >> ylabel('tats'); >> legend('x_1','x_2','x_3',0)

Exemple 3 : quations de Lorenz (chaos)


x1 (t ) = 10 ( x2 (t ) x1 (t ) )

Soit le systme reprsent par : x2 (t ) = 28 x1 (t ) x2 (t ) x1 (t ) x3 (t )


x3 (t ) = 8 x3 (t ) + x1 (t ) x2 (t ) 3

Ce systme est chaotique, i.e., il est impossible de reproduire le comportement exact mme si les deux conditions initiales sont quasiment identiques plusieurs dcimales prs. On comprend donc pourquoi les prvisions mto deviennent mauvaises au bout de quelques jours. Une dmo de lquation de Lorenz est disponible dans MATLAB avec

la fonction lorenz que vous pouvez appeler. Vous pouvez faire aussi votre propre fonction et utiliser ode45 . Voici un exemple possible de rsultat (x(0) = [0;-1;0]):

Dans le domaine du temps :

On note bien la nature difficilement prvisible de ltat. On notera aussi la sensibilit aux changements de condition initiale. La courbe en bleu comme condition initiale [0;-1;0] et la courbe en rouge [0;-0.99999;0]. Pour un systme non chaotique, mme non-linaire,

les courbes seraient continuellement proches lune de lautre. Le systme reste prvisible. Sur la courbe ci-dessous, on remarque que les deux courbes deviennent soudainement bien diffrentes, mme avec un trs faible cart de condition initiale. Cest un comportement caractristique dun systme chaotique.

Guy Gauthier 23 mai 2006.

Vous aimerez peut-être aussi