Systèmes du premier ordre/Utiliser SCILAB pour les calculs
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.
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
modifierPour 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
modifierLa construction de la fonction de transfert se fait avec syslin.
La fonction de transfert générale est impossible à utiliser en Scilab sans donner des valeurs numériques à K et à . Scilab est un logiciel de calcul numérique et non pas symbolique.
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
modifierIl 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
modifierLe 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 :
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 :
Tracer d'autres diagrammes
modifierLe diagramme de Nyquist
modifierLe diagramme de Nyquist se fait avec nyquist.
Le diagramme de Nichols
modifierLe diagramme de Nicols se fait avec chart ou avec nicolschart.
Le diagramme de Black-Nichols
modifierLe diagramme de Black-Nichols se fait avec black.
Tracer les réponses impulsionnelles et indicielles
modifierLa réponse indicielle
modifierLa 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
modifierLa 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".
La commande "csim" peut prendre comme premier paramètre un nom de fonction que vous avez défini. Elle permet donc de trouver la réponse à n’importe quelle entrée.
Retrouver une représentation d'état
modifierUne 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.