Systèmes du premier ordre/Utiliser SCILAB pour les calculs

Début de la boite de navigation du chapitre

Scilab est un logiciel de calculs numériques. Parmi les choses qu’il sait très bien faire se trouve le calcul sur les fonctions de transfert. Il possède son Wikibook intitulé Scilab que nous vous encourageons à parcourir pour apprendre à l’utiliser. En effet nous n'aborderons pas sa présentation générale ici, mais simplement le cas très particulier des fonctions de transfert du premier ordre.

Utiliser SCILAB pour les calculs
Icône de la faculté
Chapitre no 9
Leçon : Systèmes du premier ordre
Chap. préc. :Discrétisation d'un système du premier ordre
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « Systèmes du premier ordre : Utiliser SCILAB pour les calculs
Systèmes du premier ordre/Utiliser SCILAB pour les calculs
 », n'a pu être restituée correctement ci-dessus.

Nous n'allons pas détailler l’utilisation de Scilab dans ce chapitre. Reportez-vous au Wikibook intitulé Scilab pour cela. La seule chose que nous rappelons est que l'ajout d'un point virgule en fin de ligne n’est pas obligatoire et a comme objet simplement de supprimer l’affichage des valeurs calculées. Si au contraire vous voulez afficher, retirer le point virgule.

Comment décrire une fonction de transfert en Scilab

modifier

À ce point seuls les fonctions de transfert du premier ordre sont connues. Nous avons vu qu’elles sont constituées par un quotient de deux polynômes du premier ordre. Commençons donc par détailler ce qu'est un polynôme en Scilab.

Construire un polynôme en Scilab

modifier

Pour construire un polynôme on utilise la fonction "poly" de scilab. Il existe au moins trois façons de faire cela :

  • polyn=poly([1 2],'p','c') qui affiche polyn=1+2p On voit que le premier paramètre est une matrice qui contient les coefficients (d'où la présence de 'c' parmi les paramètres). Le deuxième paramètre est le nom de la variable du polynôme.
  • polyn=poly([-0.5],'p') qui affiche polyn=0.5+p. Le seul paramètre qui est passé dans la matrice est la racine du polynôme.
  • utiliser les opérations normales à partir d'un polynôme de départ : p=poly(0,'p');polyn=2*p+1

Voir aide sur poly.

S'il est possible de diviser un polynôme par un autre pour réaliser une fonction de transfert, il faut plutôt utiliser une fonction pour construire la fonction de transfert.

Construire la fonction de transfert

modifier

La construction de la fonction de transfert se fait avec syslin.

Voici un petit programme qui réalise numériquement cette fonction de transfert :

num = 10; // numérateur de la fonction de transfert
den = poly([1 2],'p','c'); // denominateur de la fonction de transfert
H_p = syslin('c',num,den);// voilà c’est fait

Chacun aura reconnu la fonction de transfert   qui sera affichée  . La notation anglo-saxonne est donc utilisée même si vous prenez soin de définir vos polynômes en p.

Notez que le premier 'c' du programme a la signification "coefficient" alors que le deuxième a la signification "continu".

Voici un style interactif pour bâtir la fonction de transfert et qui procède différemment :

// tiré de autoencour.pdf
tau = input('Donner une valeur a tau :')
k=input('Donner une valeur a K :');
s=%s;den=1+tau*s;num=k;fr=num/den;
sys=syslin('c',fr);

Évaluer la fonction de transfert pour certaines fréquences

modifier

Il nous faut utiliser la primitive freq. Nous allons chercher à évaluer la fonction de transfert pour la fréquence 200 Hz. Le script Scilab suivant fait ce travail.

num = 10; // numérateur de la fonction de transfert
den = poly([1 2],'p','c'); // denominateur de la fonction de transfert
H_w = freq(num,den,%i*200*2*%pi);// car on évalue pour f={{unité|200|Hz}}

On a évalué, bien sûr, pour  . Vous aurez aussi besoin de abs pour trouver le module correspondant. Pour le module et la phase voir phasemag.

Tracer les diagrammes de Bode

modifier

Le tracé des diagrammes de Bode se fait avec la fonction bode. Le diagramme de Bode déjà présenté dans le chapitre correspondant est rappelé ci-dessous :

 
Le lieu de bode d'un filtre passif de premier ordre

peut être obtenu à partir du programme suivant :

num = 1; // numérateur de la fonction de transfert
den = poly([1 0.005],'p','c'); // denominateur de la fonction de transfert
H_s = syslin('c',num,den)// voilà c’est fait
clf();bode(H_s,10,10000,'H')
  Le diagramme de Bode réalisé par Scilab ne donnera pas tout à fait le même résultat car l'axe horizontal est la fréquence en Hz et non la pulsation !
  • Comment avons-nous trouvé K = 1 (au numérateur) ? En regardant le diagramme de Bode original on voit que l'asymptote horizontale est à 0 dB ce qui correspond à un gain de 1.
  • Comment avons-nous trouvé la valeur 0.005 qui apparaît dans le dénominateur ? Le diagramme de Bode original nous montre un   soit un  .

Il est aussi possible de tracer le diagramme de Bode asymptotique en remplaçant la dernière ligne par la suivante :

clf(); bode(H_s,0.1,10000,'H','rad'); bode_asymp(H_s); // Noter l'ajout de l'argument 'rad' dans la fonction bode
  La fonction bode_asymp trace les asymptotes en fonction de la pulsation (rad/s) et non de la fréquence (s-1). Pour un graphique cohérent, il faut donc indiquer à la fonction bode de tracer les courbes selon la pulsation via l'argument rad.

On obtient alors le graphique suivant :

 
Diagrammes de Bode du premier ordre avec asymptotes obtenues avec le script précédent

Tracer d'autres diagrammes

modifier

Le diagramme de Nyquist

modifier

Le diagramme de Nyquist se fait avec nyquist.

Le diagramme de Nichols

modifier

Le diagramme de Nicols se fait avec chart ou avec nicolschart.

Le diagramme de Black-Nichols

modifier

Le diagramme de Black-Nichols se fait avec black.

Tracer les réponses impulsionnelles et indicielles

modifier

La réponse indicielle

modifier

La réponse indicielle peut facilement se faire avec csim.

Voici un exemple :

num = 10; // numérateur de la fonction de transfert
den = poly([1 2],'p','c'); // denominateur de la fonction de transfert
H_s = syslin('c',num,den);// voilà la fonction de transfert
temps=linspace(0,10,51);
h=csim('step',temps,H_s);
plot(temps,h);

La commande "temps=linspace(0,10,51);" demande de réaliser 51 valeurs réparties entre 0 et 10 et de les mettre dans la variable temps. La commande :

-->size(temps)
 ans  =
 
    1.    51.  

vous montre que les 51 valeurs sont rangées dans une seule ligne et dans 51 colonnes.

La réponse impulsionnelle

modifier

La réponse impulsionnelle peut facilement se faire avec csim.

Voici un exemple :

num = 10; // numérateur de la fonction de transfert
den = poly([1 2],'p','c'); // denominateur de la fonction de transfert
H_s = syslin('c',num,den);// voilà la fonction de transfert
temps=linspace(0,10,51);
h=csim('imp',temps,H_s);
plot2d(temps,h);

où l’on a utilisé "plot2d" pour grapher plutôt que "plot".


Retrouver une représentation d'état

modifier

Une primitive permet de passer de la fonction de transfert à la représentation d'état (voir tf2ss)

num = 1; // numérateur de la fonction de transfert
den = poly([1 0.005],'p','c'); // dénominateur de la fonction de transfert
H_s = syslin('c',num,den);// Fonction de transfert
Sys=tf2ss(H_s);// conversion
[A,B,C,D]=abcd(Sys); // voilà c’est fait

Si l’on répète la dernière commande sans le point virgule pour affichage, cela donne :

-->[A,B,C,D]=abcd(Sys)
 D  =  0.  
 C  =  14.142136  
 B  =  14.142136  
 A  =  - 200.