Baniere Saphir Control
http://www.saphir-control.fr/

bar


BACK

Scilab : un logiciel libre pour le calcul scientifique
7e Partie - Introduction à Scicos (1/2)



Tous ces articles en ligne sur Scilab ont été écrits pour LINUX MAGAZINE FRANCE par les développeurs du Scilab Group. Les articles sont sous licence FDL (Free Documentation Licence)

L'article du numéro précédent nous a montré les capacités de Scilab à simuler des systèmes dynamiques. Mais pour cela il fallait représenter le modèle du système à simuler sous forme d'un programme Scilab, C ou fortran. Scicos est une boîte à outils de Scilab contenant un éditeur de type schéma-blocs qui permet de construire ces modèles par simples clics de souris.

Il est toujours possible de construire et de simuler des modèles de systèmes dynamiques dans Scilab en utilisant les fonctions de base comme ode (solveur de systèmes d'équations différentielles). Mais cela nécessite en général beaucoup de programmation en langage Scilab ou C. Ces programmes, en particulier quand le système à simuler contient des composants discrets, sont complexes, difficiles à déboguer et trop particuliers pour conduire à du code ré-utilisable.

L'éditeur graphique de la boîte à outils Scicos permet à l'utilisateur de décrire son système dynamique de façon complètement modulaire. Le modèle ainsi obtenu peut alors être compilé, et le résultat simulé, par le simulateur Scicos. Les systèmes modélisables et simulables par Scicos sont de nature très variée ; ils peuvent comporter des composants évoluant en temps continu, en temps discret, et même des composants événementiels. On les appelle des systèmes hybrides. Dans cet article, on présente l'utilisation de Scicos à travers plusieurs exemples ; pour cela on n'utilisera que des blocs prédéfinis, fournis avec la boîte à outils. Dans le prochain numéro, on abordera le problème de construction de nouveaux blocs.

Un exemple simple
Supposons qu'on veuille simuler le fonctionnement d'un simple intégrateur (un système dont la sortie est l'intégrale de son entrée). En plus de l'intégrateur, il faut une entrée et un affichage graphique pour visualiser la sortie. On commence par lancer l'éditeur Scicos (dans Scilab) avec la commande :

--> scicos();
Cela ouvre la fenêtre principale de l'éditeur Scicos. La fenêtre et le schéma correspondant sont intitulés par défaut Untitled. Le schéma est bien évidemment vide pour le moment.

Toutes les fonctionnalités de Scicos sont disponibles à travers des menus déroulants. On devine assez facilement la fonction de chaque bouton de chaque menu par son nom : Save pour enregistrer un schéma, Load pour le charger, Copy pour copier un bloc, Delete pour le supprimer, Color pour donner une couleur au bloc, etc...

Il existe aussi un bouton Help qui se trouve dans le menu Misc qui permet de consulter l'aide en ligne sur chaque menu. Pour cela, il suffit de cliquer sur Help puis sur le bouton ad hoc. Le bouton help permet aussi d'accéder à l'aide sur les blocs ; il suffit de cliquer sur le bloc après avoir cliqué sur Help.
On commence par chercher les blocs dont on a besoin dans les <<palettes>> Scicos. Une palette est un schéma contenant des blocs que l'on peut utiliser pour construire d'autres schémas. Pour ouvrir une palette, il faut cliquer sur le bouton palette du menu Edit. On voit alors une liste de palettes ; choisissons la palette Linear. On voit alors s'ouvrir la fenêtre graphique qu'on voit dans la figure 1.

{short description of image}

Figure 1: La palette Linear.

L'icone du bloc intégrateur est 1/s. Pour copier ce bloc dans le schéma Untitled, il suffit de placer la souris sur ce bloc et cliquer sur le bouton gauche de la souris, puis placer la souris dans la fenêtre qui contient le schéma Untitled, à l'endroit où on veut placer le bloc, et recliquer. Une copie du bloc 1/s apparait alors dans Untitled.

Il faut maintenant définir une entrée pour l'intégrateur : par exemple un sinus. Pour cela, on va chercher dans la palette Inputs_Outputs le bloc sinusoid_generator. Pour connecter la sortie de sinusoid_generator à l'entrée du bloc 1/s, on clique d'abord près du port de sortie de sinusoid_generator puis près du port d'entrée de 1/s (voir Figure 2).

{short description of image}

Figure 2: Schéma Scicos simulable.

Le schéma ainsi obtenu est simulable mais pas intéressant à simuler car nous ne verrons rien, il faut rajouter de quoi afficher le résultat ! On place donc le bloc MScope (oscilloscope à entrées multiples) dans le schéma et on connecte la sortie de 1/s à sa première entrée et la sortie de sinusoid_generator sur sa deuxième entrée. Comme la sortie de sinusoid_generator est déjà branchée, il faut placer la souris quelque part sur le lien qui sort de sinusoid_generator et cliquer ; cela crée un branchement et débute un lien, puis cliquer sur l'entrée de MScope. Pour obtenir un schéma plus lisible, il est préférable de ne pas créer dans ce dernier cas un lien direct qui passerait par dessus le bloc 1/s, mais de le contourner. Pour cela, après avoir débuté le lien, on peut cliquer sur des points intermédiaires avant de cliquer sur l'entrée de MScope .

Le bloc MScope est un bloc discret qui affiche les valeurs de ses entrées quand il est activé. Pour activer ce bloc, il faut envoyer un événement sur son port d'entrée événement placé en haut du bloc. Dans ce cas on veut envoyer une suite d'événements espacés de manière régulière dans le temps. Pour cela on utilise le bloc horloge d'événement (l'horloge rouge ayant une sortie en bas qui se trouve dans la palette Inputs_Outputs ). Une fois ce bloc placé et branché, le schéma complet doit ressembler a celui de la Figure 3.

{short description of image}

Figure 3: Schéma complet.

Le schéma peut alors être simulé. Cliquer sur le bouton Run du menu Simulate. On observe alors l'ouverture d'une fenêtre graphique fonctionnant comme une oscilloscope. Pour arrêter la simulation il suffit de cliquer sur stop.

{short description of image}

Figure 4: Résultat de la simulation affiché par l'oscilloscope.

On constate alors (voir Figure 4) que les paramètres par défaut de l'oscilloscope ne sont pas bien réglés ici; il faut faire en sorte que la première courbe reste dans la fenêtre graphique. Pour changer les paramètres d'un bloc, il suffit de cliquer sur le bloc, ce qui ouvre un dialogue (voir Figure 5).

{short description of image}

Figure 5: Paramètres par défaut de l'oscilloscope.

On peut régler le problème ici en changeant les premières valeurs de Ymin_vector et Ymax_vector, par exemple on peut remplacer le premier (qui vaut -1) par 0 et le deuxième par 2.

Les requins et les sardines
On est maintenant en mesure de construire des modèles plus compliqués. Prenons par exemple le modèle de la population des requins et des sardines présenté dans l'article précédent : {
x'(t)=a x(t)-b x(t)y(t)      a,b > 0
y'(t)=c x(t)y(t)-d y(t)      c,d > 0
. où x(t) représente le nombre de sardines et y(t) représente le nombre de requins. Ce modèle approché, appelé aussi système de Lotka-Volterra, signifie qu'en l'absence de requins les sardines prolifèrent x'(t)=a x(t), qu'en l'absence de sardines les requins disparaissent y'(t)=-d y(t) et le terme en x(t)y(t), qui représente la rencontre des requins et des sardines, augmente le nombre de requins et diminue le nombre de sardines (car ces dernières sont mangées par les requins).

Le schéma Scicos représentant ce modèle est donné dans la Figure 6. On retrouve les états x et y comme les sorties des deux intégrateurs (un intégrateur pour chaque équation différetielle). Les entrées de ses intégrateurs sont alors x' et y' . Pour réaliser les équations définissant x' et y' dans le schéma, on a utilisé des blocs sommateurs, multiplicateurs et gains (multiplication par constante). On a pris a=2, b=1, c=.3 et d=1.

{short description of image}

Figure 6: Le schéma Scicos correspondant au modèle de la population des requins et des sardines.

Le résultat de la simulation pour x(0)=2 et y(0)=1 est donné dans la Figure 7. On retrouve alors le comportement périodique attendu.

{short description of image}

Figure 7: L'évolution de la population des requins (en haut) et des sardines (en bas).

On constate donc qu'il peut exister une forte variation de la population des sardines ; cela dépend des populations initiales des sardines et des requins (x(0) et y(0)). Si on commence près des populations d'équilibre, les variations sont moins fortes. Les populations d'équilibre xe et ye correspondent à une condition initiale pour laquellle l'état reste constant. Elles vérifient bien entendu le système : {
0=a xe-b xeye
0=c xeye-d ye
. ce qui (à part la solution évidente (0,0)) donne xe=d/c et ye=a/b.

La régulation par la pêche
On peut introduire l'influence de la pêche de sardines dans le modèle précédent en modifiant l'équation de x'(t) comme suit :
x'(t)=a x(t)-b x(t)y(t)+f x(t)      a,b > 0,  f<0,
le coefficient f indique alors l'effort de pêche. Noter que cette modification ne modifie pas le point d'équilibre xe.

Supposons maintenant que les autorités de pêche veuillent réguler la population des sardines. Pour cela ils autorisent la pêche (f<0) si la population des sardines dépasse un certain seuil (x>xmax) et ils interdisent la pêche (f=0) quand cette population passe en dessous d'un autre seuil (x<xmin). Pour modéliser ce <<régulateur>>, on note qu'il faut générer deux événements : ces événements sont alors utilisés pour modifier la valeur de f (voir Figure 8).

{short description of image}

Figure 8: Le modèle de l'évolution de la population des sardines et des requins régulé par la pêche.

Les blocs -to+ et +to- générent des événements quand leur entrées traversent zéro dans le sens négatif vers positif et positif vers négatif, respectivement. Le bloc Selector copie la valeur qui se trouve sur sa première entrée (ici 0) sur sa sortie quand il reçoit un événement sur son premier port d'entrée événement, et il copie la valeur sur sa deuxième entrée (ici 1) quand il reçoit un événement sur l'autre port. Donc quand x-3.4 dépasse 0, f devient -1 et quand x-3.2 passe en dessous de 0, f devient 0. Ces valeurs sont choisies pour pousser x vers sa valeur d'équilibre xe=d/c=3.33. Le bloc Mux permet de concaténer les deux entrées pour former un signal vectoriel. Ce signal est affiché par MScope en superposant les deux valeurs (voir Figure 9). La courbe de dessous indique les périodes d'ouverture et de fermeture de la pêche. On constate qu'après une période transitoire, le système se stabilise au point d'équilibre (xe,ye) où l'on autorise la pêche ; le régulateur n'est alors plus sollicité. Dans la pratique, à cause des phénomènes que nous n'avons pas pris en compte dans notre modèle simpliste, on s'écarte régulièrement du point d'équilibre et donc le régulateur doit rester en place.

{short description of image}

Figure 9: L'évolution des populations dans le cas régulé. En haut, en noir, on a la population des sardines et, en vert, la population des requins. En bas, on trouve les périodes d'ouverture de la pêche (f=-1).

Le système régulé peut, bien évidemment, être simulé directement dans Scilab en utilisant la fonction ode. Mais cela nécessiterait beaucoup de programmation dans le langage Scilab. De plus, le résultat serait difficile à ré-utiliser. Dans l'environnement Scicos, il serait facile de modifier la structure du régulateur, rajouter d'autres populations animales en interaction avec les sardines et les requins, etc... Ce type de modifications, impliqueraient, très souvent, une réécriture complète du programme Scilab.

Super Block
Le Schéma 8 est assez chargé, on aimerait bien utiliser une description hiérarchique pour le simplifier et le rendre plus lisible. Pour cela on peut utiliser un <<Super Block>>, qui ressemble à un bloc normal mais qui peut contenir tout un sous-schéma. Par exemple, pour mettre la partie régulateur dans un <<Super Block>>, on peut cliquer sur le bouton Region_to_SuperBlock du menu Diagram, puis sélectionner la région correspondant au régulateur. Cette région disparait alors et elle est remplacée par un seul bloc de type <<Super Block>> (Fig. 10). Pour accéder au schéma qui se trouve à l'intérieur de ce bloc, il suffit de cliquer dessus, ce qui lance un nouvel éditeur Scicos.

{short description of image}

Figure 10: Mise en Super Block du régulateur.

On peut manipuler un <<Super Block>> comme n'importe quel autre bloc, en particulier on peut le copier et l'utiliser plusieurs fois dans le même schéma. De manière générale, on peut utiliser un nombre illimité de <<Super Block>> par schéma et on peut même placer des <<Super Block>> dans d'autres <<Super Block>>.

Paramètres formels
Il est possible, et souvent souhaitable, de définir les paramètres des blocs Scicos de manière formelle. Par exemple, dans l'exemple précédent, au lieu de rentrer, dans les blocs, les valeurs numériques des paramètres a, b, c, etc..., on peut les définir dans le <<Context>> du schéma comme variables Scilab puis utiliser leur noms comme paramètres de blocs. Le <<Context>> peut être invoqué en cliquant sur le bouton Context du menu Edit (voir Figure 11). On peut mettre n'importe quelle instruction Scilab dans le <<Context>>, le contenu est exécuté comme un script.

{short description of image}

Figure 11: Le Context du schéma Scicos.

Une fois ces variables définies, on peut les utiliser comme paramètres de blocs (voir Figure 12).

{short description of image}

Figure 12: Le modèle régulé avec le Context défini dans la Figure 11 (à comparer à la Figure 8).

Le <<Context>> est sauvé automatiquement avec le schéma et il est évalué à chaque chargement.

Conclusion
Dans cet article on a montré comment on peut construire et simuler un modèle de système dynamique comme un schéma Scicos en utilisant des blocs prédéfinis. On peut ainsi construire beaucoup de modèles mais souvent on a besoin de définir des blocs spécifiques. Cela est bien évidemment possible dans Scicos. Le prochain article sera consacré à cela.

Ramine Nikoukhah
Scilab Group
scilab@inria.fr
http://www-rocq.inria.fr/scilab/


This document was translated from LATEX by HEVEA.