12

Click here to load reader

Diagrammes Etat Et Matlab

Embed Size (px)

Citation preview

Page 1: Diagrammes Etat Et Matlab

MATLAB® et l’espace d’état : Ce petit texte vous montrera comment on peut manipuler les équations d’état avec MATLAB®.

Exemple 1 : Système bi-linéaire

Soit le système représenté par : ( )( )

1 2 1

2 1 2

( ) ( ) ( ) 1

( ) ( ) ( ) 1

x t x t x t

x t x t x t

= +

= +

On peut obtenir le point d’équilibre (en régime permanent) vers lequel le système convergera pour une condition initiale donnée en utilisant la fonction « fsolve ». Premièrement, il faut écrire une fonction MATLAB® représentant le système d’équations différentielles. Cela se fait avec l’éditeur de MATLAB®. Voici le listing correspondant au système bi-linéraire (sauvegardé sous le nom bilin_ss.m) : function f = bilin_ss(x) f=zeros(2,1); % Pour s’assurer d’avoir un vecteur vertical f(1) = x(2)*(x(1)+1); f(2) = x(1)*(x(2)+3); Une fois cette fonction écrite et sauvegardée, on peut utiliser dans MATLAB® cette fonction comme paramètre de la fonction « fsolve » pour trouver les points d’équilibre. Le premier paramètre de « fsolve », c’est le nom du fichier « .m » ou se situe la fonction à évaluer. Le second paramètre, c’est l’état initial du système. Comme le système comporte deux états, le vecteur d’état doit être un vecteur colonne de dimension 2, par exemple [0;0]. Le troisième paramètre est optionnel, mais permet d’éliminer la longue liste d’avertissement qui résulte de l’utilisation de « fsolve » sur certaines versions de MATLAB®. Voici un exemple d’utilisation 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.

Page 2: Diagrammes Etat Et Matlab

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 système lorsque l’on part de la condition initiale. Mais, à moins de tester toutes les conditions initiales possibles, ce n’est pas l’outil idéal pour trouver les points d’équilibre. Il est préférable de calculer les points d’équilibre en solutionnant l’équation, car si un point d’équilibre est instable, on n’y convergera jamais, à moins que la condition initiale soit exactement sur le point d’équilibre instable. On peut utiliser la fonction « solve » pour trouver tous les points d’équilibre qu’ils soient stables ou non. Seul problème, cette fonction ne tolère pas les index, donc x(1) est représenté par x et x(2) est représenté 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 qu’il y a deux points d’équilibre, l’un à [0;0] et le second à [-1;-3]. En linéarisant à chaque point d’équilibre, on peut savoir à quel genre de point d’équilibre on fait face (stable, instable).

Page 3: Diagrammes Etat Et Matlab

Ainsi, à x = [0;0], on a :

0 13 0

A ⎡ ⎤= ⎢ ⎥⎣ ⎦

qui donne des valeurs propres de 3 et 3− , ce qui correspond à un point d’équilibre instable. À x = [-1;-3], on a :

1 00 3

A−⎡ ⎤

= ⎢ ⎥−⎣ ⎦

qui donne des valeurs propres de -1 et -3, ce qui correspond à un point d’équilibre stable. Pour voir l’évolution des états du système bi-linéaire dans le temps, on peut utiliser la fonction « ode45 ». Cette fonction permet de représenter l’évolution du système dans le temps. Tout comme la fonction « solve », il faut écrire une fonction MATLAB® représentant le système d’équations différentielles. Cela se fait avec l’éditeur de MATLAB®. Voici le listing correspondant au système bi-linéraire (sauvegardé sous le nom bilin_dyn.m) : function f = bilin_dyn(t,x) f=zeros(2,1); % Pour s’assurer d’avoir un vecteur vertical f(1) = x(2)*(x(1)+1); f(2) = x(1)*(x(2)+3); Remarquez la très forte ressemblance avec la fonction « bilin_ss », la seule différence étant l’ajout du paramètre de temps. Une fois cette fonction écrite et sauvegardée, on peut utiliser dans MATLAB® cette fonction comme paramètre de la fonction « ode45 » pour trouver la trajectoire suivie par les états à partir de leur condition initiale. Le premier paramètre de « ode45 », c’est le nom du fichier « .m » ou se situe la fonction à évaluer. Le second paramètre, c’est la plage de temps de la simulation (ici de t=0 à t=20). Le troisième paramètre, c’est l’état initial du système. Voici un exemple d’utilisation 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.

Page 4: Diagrammes Etat Et Matlab

Ce qui donne le résultat suivant :

En utilisant la fonction « hold », on peut faire en sorte que MATLAB® trace plusieurs courbes sur le même graphique. Ainsi, on peut obtenir avec cette séquence : >> hold Current plot held >> [t,y]=ode45('bilin_dyn',[0 20],[-1;-1]); >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 20],[-2;-1]); >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 20],[-3;-1]); >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 20],[0;-2]); >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 20],[0;-3]); >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 20],[0;-4]); >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 20],[0;-5]); >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 20],[0;-6]); >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 20],[-1;-6]); >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 20],[-2;-6]); >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 20],[-3;-6]); >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 20],[-3;-5]); >> plot(y(:,1),y(:,2)) >> [t,y]=ode45('bilin_dyn',[0 20],[-3;-4]);

Page 5: Diagrammes Etat Et Matlab

>> 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 d’état :

Exemple 2 :

Soit le système représenté par : 0 1 0

( ) 0 0 1 ( )1 2 3

x t x t⎡ ⎤⎢ ⎥= ⎢ ⎥⎢ ⎥− − −⎣ ⎦

Voici le listing correspondant au système (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;

Page 6: Diagrammes Etat Et Matlab

Normalement, pour ce système, le point d’équilibre 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 Puisqu’il y a trois états, on fait le tracé sur un graphique 3D. Le graphique est obtenu avec la fonction « plot3 ». Ce qui donne comme résultat :

On peut voir un comportement en 3D présentant une spirale.

Page 7: Diagrammes Etat Et Matlab

En changeant l’orientation du graphique, on peut mieux voir l’évolution du système :

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

Page 8: Diagrammes Etat Et Matlab

Et en changeant l’orientation, on peut voir ces spirales par la tranche :

La dynamique s’explique 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 L’une des valeurs propres est -2.3247 et explique la dynamique de convergence vers le plan ou se situe la spirale (dynamique que l’on voit sur le graphique en haut page). Les deux pôles complexes conjugués expliquent la dynamique de la spirale. Comme l’amplitude des valeurs propres complexes est inférieure à 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.7868 0.7868 -0.3896 -0.2657 + 0.4424i -0.2657 - 0.4424i 0.9056 -0.1591 - 0.2988i -0.1591 + 0.2988i

Page 9: Diagrammes Etat Et Matlab

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 représenté par la première colonne de V. Et supposons que l’on 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 dernière trajectoire générée converge directement vers [0;0;0]. Cela montre que l’on peut avoir certaines conditions initiales qui nous exemptent d’avoir des oscillations dans le système, i,e., celle qui correspondent au vecteur propre de la valeur propre réelle présente dans notre système.

Page 10: Diagrammes Etat Et Matlab

Voici l’évolution dans le temps de deux des trajectoires :

On peut voir la convergence rapide et sans oscillations du système dont la condition initiale est un multiple du vecteur l’état 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)

Soit le système représenté par : ( )1 2 1

2 1 2 1 38

3 3 1 23

( ) 10 ( ) ( )( ) 28 ( ) ( ) ( ) ( )( ) ( ) ( ) ( )

x t x t x tx t x t x t x t x tx t x t x t x t

= −

= − −

= − +

Ce système est chaotique, i.e., il est impossible de reproduire le comportement exact même si les deux conditions initiales sont quasiment identiques à plusieurs décimales près. On comprend donc pourquoi les prévisions météo deviennent mauvaises au bout de quelques jours. Une démo de l’équation de Lorenz est disponible dans MATLAB® avec

Page 11: Diagrammes Etat Et Matlab

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

Dans le domaine du temps :

On note bien la nature difficilement prévisible de l’état. 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 système non chaotique, même non-linéaire,

Page 12: Diagrammes Etat Et Matlab

les courbes seraient continuellement proches l’une de l’autre. Le système reste prévisible. Sur la courbe ci-dessous, on remarque que les deux courbes deviennent soudainement bien différentes, même avec un très faible écart de condition initiale. C’est un comportement caractéristique d’un système chaotique.

Guy Gauthier 23 mai 2006.