Le principe de cette application est de trouver les paramtres optimaux d'un correcteur PID inclus
dans une boucle d'asservissement.
Cette boucle d'asservissement est reprsente sur la figure suivante: Le bloc PID de xcos est paramtr en utilisant des variables symboliues !P" I et D#. C'est variables symboliues sont pralablement dfinis dans le contexte de $cos !il faut ue les variables symboliues utilises dans $cos existent avant toute utilisation dans un bloc#. Le signal ue l'on va c%erc%er & optimiser est export vers 'cilab au moyen du bloc ( )o *or+space ,. -n exporte la sortie de la boucle d'asservissement ainsi ue la consigne ue l'on fournit & la boucle d'asservissement !la sortie du bloc ( 'uare *ave .enerator ,#. /ous c%erc%erons ensuite & minimiser le carr de la diffrence de ces deux signaux. 0vec les paramtres initiaux fournis & $cos" on obtient le grap%iue suivant: Le signal vert correspond & la consigne et le signal noire & la sortie de la boucle d'asservissement. /ous lan1ons ensuite l'optimisation: exec test2automatic.sce3 Ce script va: c%arger le diagramme: import$cosDiagram!'automatic2test.xcos'#3 lancer une premire simulation pour visualiser le comportement initial: 44 -n redfinit le contexte du sc%ma $cos: 5scicos2context 6 783 5scicos2context.9: 6 9:3 5scicos2context.m 6 m3 5scicos2context.;: 6 ;:3 5scicos2context.P 6 Pfact<x:!=#3 5scicos2context.I 6 Ifact<x:!>#3 44 -n lance la simulation en mode batc% en autorisant $cos & affic%er les diagrammes Info 6 scicos2simulate!scs2m"list!#"5scicos2context#3 -n dfinit la fonction ob?ectif: function 'y 6 f2pid!x# 5scicos2context.9: 6 9:3 5scicos2context.m 6 m3 5scicos2context.;: 6 ;:3 5scicos2context.P 6 x!=#<Pfact3 5scicos2context.I 6 x!>#<Ifact3 Info 6 scicos2simulate!scs2m"list!#"5scicos2context"flag6'n9'#3 y2error 6 mean!abs!!bloc+2output!'values'#!:"=# @ bloc+2output!'values'#!:">####3 y2diff 6 mean!abs!diff!bloc+2output!'values'#!:">####3 y 6 :.A<y2error B :.A<=<y2diff3 endfunction Cette fonction ob?ectif correspond & un compromis entre l'erreur entre les deux signaux !consigne et sortie de la boucle d'asservissement# et la ( drive , de la sortie de la boucle d'asservissement !y2diff#. -n dfinit un 9rapper afin de pouvoir utiliser la fonction ob?ectif avec la fonction optim de 'cilab: function 7f"df"ind8 6 my2optim2pid!x"ind# f 6 f2pid!x#3 df 6 derivative!f2pid"x"%6%2step"order6C#3 endfunction Dans ce 9rapper" on calcule la drive de la fonction ob?ectif via des diffrences finies !en utilisant la fonction 'derivative' de 'cilab#. -n lance ensuite l'optimisation: 7f2opt" x2opt8 6 optim!my2optim2pid"'b'"Lo9er"Dpper" x:"algo6'n'" 'ar'"EaxFvalGunc"EaxFvalGunc"=e@H"=e@H"7=e@H3=e@H8#3 Pour finir" on lance une dernire simulation avec les paramtres trouvs par optim: 5scicos2context.9: 6 9:3 ... 5scicos2context.m 6 m3 ... 5scicos2context.;: 6 ;:3 ... 5scicos2context.P 6 x2opt!=#<Pfact3 5scicos2context.I 6 x2opt!>#<Ifact3 Info 6 scicos2simulate!scs2m"Info"5scicos2context#3 La solution trouve est reprsente sur la figure suivante: Le signal vert correspond & la consigne et le signal noire & la sortie de la boucle d'asservissement.