Documente Academic
Documente Profesional
Documente Cultură
MATLAB R2009,
SIMULINK et STATEFLOW
pour Ingenieurs, Chercheurs
et Etudiants
123
ISBN 978-3-642-11763-3
e-ISBN 978-3-642-11764-0
DOI 10.1007/978-3-642-11764-0
Springer Heidelberg Dordrecht London New York
Library of Congress Control Number: 2010929779
c Springer-Verlag Berlin Heidelberg 2010
This work is subject to copyright. All rights are reserved, whether the whole or part of the material is
concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation, broadcasting,
reproduction on microfilm or in any other way, and storage in data banks. Duplication of this publication
or parts thereof is permitted only under the provisions of the German Copyright Law of September 9,
1965, in its current version, and permission for use must always be obtained from Springer. Violations
are liable to prosecution under the German Copyright Law.
The use of general descriptive names, registered names, trademarks, etc. in this publication does not
imply, even in the absence of a specific statement, that such names are exempt from the relevant protective
laws and regulations and therefore free for general use.
Cover design: KuenkelLopka GmbH
Printed on acid-free paper
Springer is part of Springer Science+Business Media (www.springer.com)
VIII
IX
Chapitre 9 SIMULINK
I. PRISE EN MAIN RAPIDE ....................................................................................................... 338
I.1. SIMULATION DE SYSTMES DYNAMIQUES CONTINUS .............................................. 338
I.1.1. Rponse un chelon et une rampe dun systme analogique du 2nd ordre............... 339
I.1.2. Equation diffrentielle du second ordre ......................................................................... 342
I.1.3. Modle dtat du systme du second ordre .................................................................... 344
I.1.4. Rgulation Proportionnelle et Intgrale......................................................................... 347
I.1.5. Gnration dun sinus cardinal...................................................................................... 351
I.2. SIMULATION DE SYSTMES DISCRETS........................................................................... 353
I.2.1. Filtrage dun signal bruit par moyenne mobile ............................................................ 353
I.2.2. Rgulation intgrale numrique ..................................................................................... 357
XI
XII
Chapitre 11 S-fonctions
I. PRINCIPE DE FONCTIONNEMENT DES S-FONCTIONS ............................................... 455
II. LES DIFFRENTES TAPES DE SIMULATION .............................................................. 458
II.1. S-FONCTION CODE EN LANGAGE M ............................................................................ 458
II.1.1. S-fonction avec modle dtat discret ........................................................................... 458
II.1.2. S-fonctions avec paramtres optionnels ........................................................................ 462
II.1.3. S-fonction avec chantillonnage variable ..................................................................... 465
II.1.4. S-fonction avec modle dfini par ses quations mathmatiques .................................. 467
II.2. S-FONCTION EN LANGAGE C (FICHIER C MEX) ........................................................... 468
III. LES S-FONCTIONS BUILDER ........................................................................................... 472
III.1. SYSTME SOUS FORME DE MODLE DTAT DISCRET ............................................ 472
III.2. SYSTME SOUS FORME DE MODLE DTAT CONTINU .......................................... 476
III.3. SYSTME DFINI PAR DES QUATIONS MATHMATIQUES.................................... 479
IV. S-FONCTIONS HYBRIDES ................................................................................................. 480
IV.1. EXEMPLE 1 DE SYSTME HYBRIDE .............................................................................. 480
V. S-FONCTIONS AUX TAILLES DES SIGNAUX DES
ENTRES/SORTIES DYNAMIQUES .................................................................................. 484
V.1. TAILLE DYNAMIQUE DES VECTEURS DENTRES/SORTIES .................................... 485
V.2. TAILLE DYNAMIQUE DU VECTEUR DTAT ................................................................ 486
VI. DIFFRENTS AUTRES EXEMPLES DE S-FONCTIONS ............................................... 489
VI.1. SYSTME DU 2ND ORDRE DISCRET, QUATION DE RCURRENCE ....................... 489
VI.2. SOLUTION DUN SYSTME LINAIRE 2 INCONNUES ............................................ 491
VI.3. RSOLUTION DUNE QUATION RCURRENTE NON LINAIRE ............................ 492
VI.4. RGULATION PROPORTIONNELLE ET INTGRALE P.I. ............................................ 493
VII. USER DATA .......................................................................................................................... 497
Chapitre 13 Stateflow
I. INTRODUCTION ..................................................................................................................... 514
II. EXEMPLES DAPPLICATION ............................................................................................. 516
II.1. EXEMPLE 1 : SYSTME DESSUIE-GLACES DUN VHICULE .................................... 516
II.2. EXEMPLE 2 : CHRONOMTRE........................................................................................... 519
XIII
XIV
XV
AVANT-PROPOS
XVIII
AVANT-PROPOS
Chapitre 1
:
:
:
:
Chapitre 1
demo :
Pour quitter MATLAB, tapez quit suivi de la touche ENTREE ou utilisez le menu
"File" avec l'option "Exit MATLAB".
help : produit une liste de domaines MATLAB par catgories,
help <fonction ou commande> : fournit de l'aide sur l'utilisation de la fonction
ou de la commande indique.
>>
help demo
DEMO Access product demos via Help browser.
DEMO opens the Demos pane in the Help browser, listing
demos for all installed products that are selected
in the Help browser product filter.
Dans cette aide, nous trouvons les diffrents cas dutilisation de cette fonction avec des
exemples. On suggre, enfin, de consulter dautres fonctions de la mme catgorie.
Certaines commandes ou fonctions de base (built-in function), ne possdent pas
de texte daide, comme la fonction inv.
lookfor <mot-cl> : fournit la liste des fonctions et commandes contenant le mot-cl
spcifi dans la premire ligne de leur texte d'aide.
On peut aussi faire appel la documentation MATLAB pour des fonctions, par la
commande : doc fonction, comme pour la fonction exponentielle :
>> doc exp
exp
Exponential
Syntax
Y = exp(X)
Description
The exp function is an elementary function that operates
element-wise on arrays. Its domain includes complex numbers.
Y = exp(X) returns the exponential for each element of X. For
complex
,
it
returns
the
complex
exponential
.
Remark
Use expm for matrix exponentials.
L'exemple suivant de la commande lookfor a pour but de lister l'ensemble des
commandes et fonctions MATLAB contenant le mot-cl identity.
>> lookfor identity
eye
- Identity matrix.
speye
- Sparse identity matrix.
dspblkeye
- is the mask function for the Signal Processing
Blockset Identity
La commande help help montre les diffrentes faons dutiliser la commande
help.
Chapitre 1
Dautres types daide peuvent tre fournis par les commandes suivantes :
doc,
docsearch,
helpbrowser, helpwin,
matlabpath,
more,
which,
whos,
Pour avoir de laide sur un thme donn de MATLAB, comme pour les graphiques par
exemple :
>> demo matlab graphics
I.2. Types de donnes
Dans MATLAB, il y a un seul type de donnes : le type matrice (Matrix). Tout est matrice,
un scalaire est une matrice carre d'ordre 1. Il n'y a donc pas de dclaration de types. De
mme, l'utilisateur ne s'occupe pas de l'allocation mmoire. Les variables matrices et
vecteurs peuvent tre redimensionns et mme changer de type.
MATLAB fait la distinction entre les majuscules et minuscules ; ainsi, mavar et MAVAR
sont deux variables diffrentes.
>> variable=2;
>> Variable
??? Undefined function or variable 'Variable'.
I.3. Notions de base de MATLAB
Le mode interactif
Dans le mode interactif, MATLAB peut tre utilis comme une "super-puissante"
calculatrice scientifique. On dispose des oprations arithmtiques et d'un ensemble
important de fonctions de calcul numrique et de visualisation graphique.
Variables spciales et constantes
Dans MATLAB, on trouve des constantes pr-dfinies :
3.14159265358979. pi=4atan(1)= imag(log(-1)).
2.2204e-016 (distance entre 1.0 et le flottant le plus
proche) ; cette valeur peut tre modifie,
Inf (Infinite) :
nombre infini,
NaN (Not a Number) : n'est pas un nombre, exprime parfois une indtermination.
ans :
variable contenant la dernire rponse.
Comme constantes prdfinies, on trouve :
pi :
eps :
>> pi
ans =
3.1416
sin(pi) ne donne pas exactement 0.
>> sin(pi)
ans =
1.2246e-016
>> eps
eps =
2.2204e-016
Cette variable qui vaut 2-52, peut tre modifie en lui assignant une autre valeur, auquel
cas elle perd sa valeur prdfinie. Il en est de mme pour pi ou i qui dsigne limaginaire
pur unit.
>> 1/0
Warning: Divide by zero
ans =
Inf
>> 0/0
Warning: Divide by zero
ans =
NaN
Oprations arithmtiques
Les oprations arithmtiques de base dans MATLAB sont : + pour l'addition, - pour la
soustraction, * pour la multiplication et / ou \ pour la division. La division droite et la
division gauche ne donnent pas les mmes rsultats, ce sont donc deux oprations
diffrentes que ce soit pour les scalaires ou pour les vecteurs et matrices.
Exemples
>> 5+7-3+2*5
ans =
19
a/b : c'est a qui est divis par b
>> 4/3
ans =
1.3333
a\b : c'est b qui est divis par a
>> 4\3
Chapitre 1
ans =
0.7500
Les oprations peuvent tre enchanes en respectant les priorits usuelles des oprations
et en utilisant des parenthses.
>> 4*(-5)+12
ans =
-8
>> 2.3*(4-6)/(3+15)
ans =
-0.2556
MATLAB possde l'oprateur "^" pour l'lvation une puissance entire ou relle.
>> 3^4
ans =
81
>> 5.3^(-1.5)
ans =
0.0820
L'lvation une puissance est prioritaire par rapport aux autres oprations ; l'utilisation
des parenthses est recommande.
>> 9^1/2
ans =
4.5000
>> 9^(1/2)
ans =
3
Format des nombres et prcision des calculs
MATLAB a la possibilit d'afficher les valeurs des variables dans diffrents formats :
flottants courts (short), flottants longs (long), flottants courts en notation scientifique
(short e), flottants longs en notation scientifique (long e), ainsi que les formats
montaire, hexadcimal et rationnel (notation sous forme d'une fraction).
format flottant short
>> format short
>> 22/7
ans =
3.1429
format flottant long
>> format long
>> 22/7
ans =
3.142857142857143
format flottant short en notation scientifique
>> format short e
>> 22/7
ans =
3.1429e+000
format flottant long en notation scientifique
>> format long e
>> 22/7
ans =
3.142857142857143e+000
format rationnel (fraction)
>> format rat
>> 0.36
ans =
9/25
>> format hex
>> 1977
ans =
409ee40000000000
Edition des lignes de commande
MATLAB conserve l'historique des commandes entres de faon interactive lors d'une
session. Il est donc possible de rcuprer des instructions dj saisies et de les modifier
dans le but de les rutiliser.
Il suffit de double-cliquer dessus pour les rexcuter. On peut tout aussi les effacer et les
supprimer de lespace de travail par un clic droit de la souris. Lhistorique est conserv
dans la fentre History de lenvironnement MATLAB.
I.4. Tableaux
I.4.1. Vecteurs ou tableaux 1 dimension
Le moyen le plus simple de saisir un vecteur de type ligne est d'entrer ses lments en les
sparant par des blancs ou des virgules.
Saisie du tableau x, vecteur ligne
>> x = [6 4 7]
x =
6
4
7
Afin d'viter l'affichage du rsultat d'une expression quelconque, on terminera celle-ci par
un point-virgule.
Chapitre 1
x = [6,4,7] ;
Ce vecteur est considr comme une matrice une ligne et trois colonnes.
>> size(x)
ans =
1
3
Les dimensions d'un tableau quelconque peuvent tre rcupres par la commande size
sous forme d'un vecteur, [m n], m et n tant respectivement le nombre de lignes et de
colonnes.
>> [m n] = size(x)
m =
1
n =
3
La longueur d'un tableau quelconque est, par dfinition, sa plus grande dimension.
>> longueur_x = length(x)
longueur_x =
3
Si l'on veut crer le vecteur v = [6 4 7 1 2 8], on peut utiliser le vecteur x
prcdent, en ralisant une concatnation.
Construction d'un tableau partir d'un autre
>> v = [x 1 2 8]
v =
6
4
7
>> w = [1 x 1 2 8]
w =
1
6
4
Dans MATLAB, les indices d'un tableau commencent 1. Pour rcuprer une composante
d'un vecteur, il faut spcifier son indice entre parenthses.
>> w(3)
ans =
4
Si les composantes d'un vecteur sont espaces d'un pas constant et si la premire et la
dernire valeur sont connues, alors ce vecteur peut tre dcrit de la manire suivante :
>> debut = 0; fin = 1;
>> pas = 0.25;
>> t = debut:pas:fin
t =
0
0.2500
0.5000
0.7500
1.0000
x = [0 4 3];
y = [2 5 7];
x-y
=
-2
-1
-4
>> x+y
ans =
2
9
10
Ajouter ou retrancher un scalaire un vecteur, revient lajouter ou le retrancher toutes
les composantes du vecteur.
>> 3+x
ans =
3
>> x-2
ans =
-2
De mme, la multiplication et la division d'un vecteur par un scalaire sont ralises sur
toutes les composantes du vecteur.
>> 2*x
ans =
0
8
6
>> x/4
ans =
0
1.0000
0.7500
La transformation d'un vecteur ligne en un vecteur colonne et inversement, sera ralise
l'aide de l'oprateur de transposition "'".
>>
tx = x'
10
Chapitre 1
tx =
0
4
3
Le produit d'un vecteur par sa transpose donne le carr de la norme de celui-ci.
>> x*tx
ans =
25
Le produit d'un vecteur colonne de taille n par un vecteur ligne de taille m donne une
matrice de dimensions (n, m).
>> tx*y
ans =
0
8
6
0
20
15
0
28
21
En prcdant d'un point les oprateurs *, / , \ et ^, on ralise des oprations lment par
lment.
>> x.*y
ans =
0
20
21
>> x.^2
ans =
0
16
>> x./y
ans =
0
0.8000
0.4286
>> y.\x
ans =
0
0.8000
0.4286
Plusieurs fonctions oprant directement sur des vecteurs sont disponibles sous MATLAB.
On peut en citer :
sum
prod
sqrt
mean
:
:
:
:
>> sum(x)
ans =
7
11
>> prod(y)
ans =
70
>> sqrt(x)
ans =
0
2.0000
1.7321
>> mean(x)
ans =
2.333
>> cumsum(x) % somme cumule des composantes du vecteur x
ans =
0
4
7
On se propose dutiliser la mthode de Cramer pour la rgression non linaire. Nous avons
la srie de mesures y en fonction de x :
x = [0.10 0.20 0.50 1.0 1.50 1.90 2.00 3.00 4.00 6.00]
y = [0.95 0.89 0.79 0.70 0.63 0.58 0.56 0.45 0.36 0.28]
En traant y en fonction de x, nous obtenons la courbe suivante dallure exponentielle.
Mesures X et Y
1
mesures
courbe exp.
0.9
0.8
Mesures Y
0.7
0.6
0.5
0.4
0.3
0.2
3
Mesures X
12
Chapitre 1
N
N
z (k )
x(k )
1
1
k
k
=
=
det
det
N
N
N
2
x(k ) z (k )
x(k )
x(k )
k =1
, =
k = 1
k = 1
=
N
x(k )
N
N
k =1
det
det
N
N
N
2
x( k )
x(k )
x(k )
k = 1
k = 1
k =1
z (k )
k =1
N
x(k ) z (k )
k =1
x(k )
k =1
N
2
x(k )
k =1
fichier regress_cramer.m
clear all,
close all
x = [0.1 0.2 0.5 1.0 1.5 1.9 2.0 3.0 4.0 6.0];
y = [0.95 0.89 0.79 0.70 0.63 0.58 0.56 0.45 0.36 0.28];
figure(1)
plot(x,y,x,y,'r*')
N =length(x);
% construction de la matrice de mesures phi
z = log(y);
den =det([length(x) sum(x);sum(x) sum(x.^2)]);
alpha = det([sum(z) sum(x);sum(x.*z) sum(x.^2)])/den;
beta = det([N sum(z);sum(x) sum(x.*z)])/den;
% extraction des coefficients A et B du modle
a = exp(alpha);
b = beta;
% vrification de la linarisation de z=alpha*x+beta
figure(2)
plot(x,z)
% calcul sortie du modle
ym = a*exp(b*x)
% trac des donnes relles et du modle
figure(3)
plot(x,y,'p'), hold on, plot(x,ym,'k')
grid
xlabel('x')
gtext('Modle exponentiel'), gtext('Mesures')
title('Mesures et modle exponentiel')
13
Soit :
>> a
a =
0.8835
>> b
b =
-0.2080
z = log(y)
0
-0.2
-0.4
-0.6
-0.8
-1
-1.2
-1.4
14
Chapitre 1
Mesures et modle exponentiel
1
0.9
0.8
0.7
Modle exponentiel
0.6
0.5
Mesures
0.4
0.3
0.2
3
x
>> matrice=[5 7 9; 1 4 2]
matrice =
5
7
9
1
4
2
-
>> matrice2=[3 5 7
8 6 10]
matrice2 =
3
5
7
8
6
10
Concatnation de matrices
La concatnation de 2 ou plusieurs matrices de dimensions adquates, peut se faire
horizontalement ou verticalement.
15
7
9
3
4
>> B = [5 3 0; 7 1 6]
B =
5
7
3
1
0
6
7
9
3
4
5
7
3
1
0
6
7
9
3
1
3
4
0
6
Nous pouvons aussi utiliser la commande cat, en spcifiant la dimension selon laquelle
on concatne ces matrices.
La syntaxe est la suivante :
MatConcat = cat(dim, A, B)
>> MatConcatH=cat(2,A,B)
MatConcatH =
5
7
3
5
2
9
4
7
>> MatConcatV=cat(1,A,B)
MatConcatV =
5
7
3
2
9
4
5
3
0
7
1
6
3
1
0
6
16
Chapitre 1
On peut ainsi extraire une sous-matrice comme suit (cas des lignes 2 3 et colonnes 1 2).
>> SousMat=MatConcatV(2:3,1:2)
SousMat =
2
5
9
3
=
3
4
0
6
17
2
1
13
4
15
10
5
16
25
1
44
7
26
35
3
14
33
10 15 4 12
24 7 8
13 -3 3
-5 12 6
51
42
13
8
55
68
10
20
Ainsi la valeur 68, 2me ligne et 3me colonne de la 3me page peut tre indexe par :
tableau(2,3,3)
Ci-aprs, nous crons 2 matrices de mme nombre de colonnes pour faire une
concatnation verticale (selon la direction 1).
>>
>>
>>
>>
>>
clear all
page1=randn(4);
page2=ones(2,4);
page3=randn(1,4);
mat1=cat(1,page1,page2,page3)
mat1 =
0.5377
1.8339
-2.2588
0.8622
1.0000
1.0000
-0.1241
0.3188
-1.3077
-0.4336
0.3426
1.0000
1.0000
1.4897
3.5784
2.7694
-1.3499
3.0349
1.0000
1.0000
1.4090
0.7254
-0.0631
0.7147
-0.2050
1.0000
1.0000
1.4172
18
mat2(:,:,1) =
1
1
1
1
1
1
mat2(:,:,2) =
1
0
0
1
0
0
Chapitre 1
1
1
1
0
0
1
1.5000
1.5000
1.5000
1.5000
1.5000
1.5000
ans(:,:,2) =
1.5000
0.5000
0.5000
0.5000
1.5000
0.5000
0.5000
0.5000
1.5000
Les oprations propres aux vecteurs, telles que sum, mean, max, etc. se font selon les
colonnes, puis le vecteur ligne obtenu et enfin par page.
>> sum1 = sum(sum((ans))
ans(:,:,1) =
13.5000
ans(:,:,2) =
7.5000
>> sum(sum(sum(sum1))
ans
21
Nous pouvons supprimer les lments de la 2me colonne du tableau en remplaant toutes
les lignes de toutes ses pages par un ensemble vide. Appliquons-le la matrice mat2 :
19
>> mat2(:,2,:)=[]
mat2 =
1
0
0
0
0
1
La matrice mat2 possde toujours 3 lignes mais seulement 2 colonnes, la 1re et la 3me de
la matrice dorigine.
I.5. Les chanes de caractres
Toute chane de caractres est une matrice une ligne, et un nombre de colonnes gal sa
longueur. Une chane est considre par MATLAB comme un vecteur ligne dont le
nombre dlments est le nombre de ses caractres.
>> ch = 'matlab'
ch =
matlab
Ainsi la chane 'matlab' est considre comme une matrice une ligne et six colonnes,
ou plus simplement comme un vecteur ligne de taille 6.
La commande length qui permet d'obtenir la taille d'un vecteur ou la plus grande
dimension d'une matrice, est applicable aux chanes de caractres dont elle retourne la
longueur.
>> length(ch)
ans =
6
On peut concatner plusieurs chanes de caractres en les crivant comme des lments
d'un vecteur.
>> cch = ['langage ' ch]
cch =
langage matlab
Comme pour les vecteurs, sa transposition devient une chane verticale de mme longueur.
>> ch'
ans =
20
Chapitre 1
m
a
t
l
a
b
I.6. Les nombres complexes
L'imaginaire pur i (i2 = -1) est not i ou j. Un nombre complexe est donc de la forme
z = a + ib ou a + jb. Mais MATLAB, dans ses rponses, donne toujours le symbole i.
>> i^2
ans =
-1.0000 + 0.0000i
>> j^2
ans =
-1.0000 + 0.0000i
Le conjugu d'un nombre complexe est obtenu par la fonction conj. Considrons le
nombre complexe z1.
>> z1 = 4-3i
z1 =
4.0000 - 3.0000i
Nous pouvons aussi effectuer les oprations courantes sur les complexes telles que
l'addition, la multiplication, l'lvation une puissance et la division.
>> z2 = 2+3i
z2 =
2.0000 + 3.0000i
21
Multiplication
>> z1*z2
ans =
17.0000 + 6.0000i
>> z1*z1c
ans =
25
Division
>> z1/z2
ans =
-0.0769 - 1.3846i
Inverse
>> 1/(1+j)
ans =
0.5000 - 0.5000i
Remarques
Il nest plus ncessaire d'crire le signe de multiplication '*' avant i (ou j) ; on peut noter
z = 4+2i au lieu de z = 4+2*i. Ce signe est, par contre, ncessaire avant le nom du
variable.
>> im = 3;
>> 2+jim
??? Undefined function or variable 'jim'.
Il est conseill d'utiliser la premire notation pour viter toute ambigut, surtout si on a
dfini une variable i laquelle on a affect une valeur.
Par exemple, si on dfinit une variable i laquelle on affecte la valeur -3,
>>
i = -3;
La dfinition du complexe z sans le signe '*' avant i, donne bien le nombre complexe
dsir.
>> z = 4+2i
z =
4.0000 + 2.0000i
22
Chapitre 1
Alors que si l'on utilise le signe '*', i reprsente la variable prcdemment affecte de la
valeur -3 au lieu du symbole i des nombres complexes ; dans ce cas, l'instruction
prcdente revient une simple opration arithmtique.
>> z = 4+2*i
z =
-2
Les fonctions real et imag permettent d'obtenir respectivement les parties relle et
imaginaire d'un nombre complexe.
>> a = real(z1)
a =
4
>> b = imag(z1)
b =
-3
Module et argument
Nous pouvons calculer le module et l'argument d'un nombre complexe partir de leurs
dfinitions mathmatiques.
>> r = sqrt(z1*z1c)
r =
5
>> theta = atan(b/a)
theta =
-0.6435
MATLAB propose les fonctions abs et angle qui permettent d'obtenir directement le
module et l'argument d'un complexe.
>> r = abs(z1)
r =
5
>> theta = angle(z1)
theta =
-0.6435
Rappel
forme algbrique :
forme trigonomtrique :
z = a + ib
z = [r, theta]
23
Comme on peut dfinir des tableaux ou des matrices de rels, on peut aussi dfinir des
tableaux et des matrices de complexes.
>> Z = [z1 0; z2 z1+z2]
Z =
4.0000 - 3.0000i
0
2.0000 + 3.0000i
6.0000
MATLAB reprsente un polynme sous forme d'un tableau de ses coefficients classs dans
l'ordre des puissances dcroissantes.
Saisie d'un polynme
Le polynme P d'expression :
dimension suivant :
>>
P = [1 -6 9]
P =
1
-6
24
Chapitre 1
Q = [1 2 0 -3]
Q =
1
-3
On peut aussi dterminer les coefficients d'un polynme partir de ses racines en utilisant
la fonction poly.
25
-6
3
2
qui correspond : K ( x )= x 6 x + 11x 6 . En multipliant par un rel non nul, tous les
coefficients de K, on trouve un autre polynme ayant les mmes racines que K.
racines = roots(K);
>>
racines
racines =
3.0000
2.0000
1.0000
Reprsentation graphique
x = 0:0.1:4;
y = polyval(K,x);
plot(x,y)
grid
title('trac de y = x^3-6x^2+11x-6')
xlabel('x')
ylabel('y')
Grce au bouton Data Curseur, nous montrons sur le graphique les solutions du
polynme.
26
Chapitre 1
trac de y = x 3-6x 2+11x-6
6
2
X: 2
Y: 0
0
x=3
-2
x=1
-4
-6
plot :
grid :
title :
xlabel :
ylabel :
0.5
1.5
2
x
2.5
3.5
Le titre, les labels de x et de y peuvent tre insrs directement par le menu Insert de la
fentre graphique.
Multiplication et division de polynmes
>> P1 = [1 2]
P1 =
1
2
>> P2 = [1 -2 1]
P2 =
1
-2
1
27
[Q,R] = deconv(P2,P1)
Q =
1
-4
R =
9
En divisant P3 par P1, on retrouve bien le polynme P2 (le reste R est nul).
>> [Q,R] = deconv(P3,P1)
Q =
1
-2
R =
0
La commande plot permet de tracer des graphiques xy. Avec plot(x,y) on trace y en
fonction de x ; x et y sont des vecteurs de donnes de mmes dimensions.
Dfinition de l'intervalle de x et calcul des valeurs de la fonction y = f(x)
>> x =
>> y =
-pi:0.1:pi
sin(x);
28
Chapitre 1
Trac de la fonction
>>
plot(x,y)
Documentation du graphique
>>
>>
>>
grid
xlabel('angle : de -\pi \pi')
title('courbe de sin \pi x/\pi x')
>>
>>
>>
>>
>>
>>
>>
>>
29
t = 0:0.001:2*pi;
x = cos(3*t);
y = sin(2*t);
plot(x,y)
grid
xlabel('x')
ylabel('y')
title('courbe de lissajous')
courbe de lissajous
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
-1
-0.8
-0.6
-0.4
-0.2
0
x
0.2
0.4
0.6
0.8
Pour imprimer le graphique courant, on utilisera la commande print. Pour la coller dans
un texte, on utilisera loption Copy Figure.
Cette copie se fera selon les options que lon spcifie dans Copy options de ce mme
menu edit. On peut choisir un arrire plan blanc (Force white background), un
arrire plan transparent, etc. On peut aussi copier limage comme un mtafile avec perte ou
prservation des informations ou une image Bitmap (.bmp).
I.8.2. Graphiques 3D
sin( x 2 + y 2 )
,
x2 + y2
30
>>
Chapitre 1
beta = alpha;
Dans la prochaine tape on gnre deux matrices carres X et Y qui dfinissent le domaine
de calcul de z, on utilisera pour ceci la fonction mesh pour le trac.
[X,Y]= meshgrid(alpha, beta);
Z = sin(X.^2+Y.^2)./(X.^2+Y.^2);
mesh(X,Y,Z)
Nous pouvons rajouter un titre pour le trac (title), des lgendes pour les axes
(xlabel, ylabel et zlabel) ainsi qu'un quadrillage (grid).
>>
>>
>>
Si une apostrophe est prsente dans une chane de caractres, il faut la doubler car
MATLAB l'utilise comme dlimiteur de chanes.
2
sin ( + )/( + )
0.5
-0.5
4
2
4
2
-2
angle = - :
-2
-4
-4
angle = - :
31
D'autres commandes comme plot3, surf, etc. tendent considrablement les capacits
graphiques de MATLAB.
Un chapitre complet est prvu pour tudier les normes possibilits graphiques de
MATLAB ainsi que les moyens de grer les objets graphiques, les pointeurs ou handle
graphics.
I.9. Les fichiers et la programmation avec MATLAB
Dans MATLAB, il y a deux types de fichiers : les fichiers de donnes et les fichiers de
programmes (scripts et fonctions).
En plus des fichiers de donnes que l'on peut dfinir et utiliser par programmation, dans
MATLAB on trouve les fichiers MAT. Ce sont des fichiers binaires (d'extension "mat")
qui permettent de stocker et de restituer des variables utilises dans l'espace de travail. Ces
oprations sont ralises respectivement par les commandes save et load.
Exemple (sauvegarde de variables)
On dfinit une variable t.
>> t = [1 2 3]
t =
1
2
save fic_t t
Le fichier obtenu aura pour extension "mat" et sera sauvegard sous le nom fic_t.mat.
Si on ne spcifie pas le nom d'une ou plusieurs variables dans les arguments de la
commande save, toutes les variables de l'environnement seront sauvegardes.
Si on efface toutes les variables de la mmoire,
>>
clear all
Si l'on charge le fichier fic_t, la variable t est de nouveau prsente dans l'espace de
travail.
>>
load fic_t
32
Chapitre 1
soit par l'utilisation de la commande whos qui affiche toutes les variables de l'espace de
travail avec leurs attributs (taille, etc.).
>> whos
Name
t
Size
Bytes
1x3
24
Class
Attributes
double
t = [1 2 3];
x = 1;
z = 2 - 3i;
>> whos
Name
t
x
z
Size
Bytes
1x3
1x1
1x1
Class
24
8
16
double
double
double
Attributes
complex
clear t x
L'excution de la commande whos n'affiche que la seule variable z avec ses attributs.
>> whos
Name
z
Size
1x1
Bytes
16
Class
double
Attributes
complex
MATLAB peut excuter une squence d'instructions stockes dans un fichier. Ce fichier
est appel fichier M (M-file). Ce nom provient du fait que l'extension est "m".
33
La majorit de votre travail avec MATLAB sera lie la manipulation de ces fichiers. Il y
a deux types de fichiers M : les fichiers de commandes (fichiers scripts) et les fichiers de
fonctions.
Pour excuter un script, dans la fentre de commande de MATLAB, il suffit de mettre son
nom aprs le prompt ou de cliquer sur la flche verte de lditeur
34
>>
Chapitre 1
courbe1
25
20
15
10
5
-5
-4
-3
-2
-1
0
x
Pour excuter ce script directement de lditeur, il suffit de cliquer sur la flche verte
dans le menu de lditeur.
Remarque
Pour insrer des commentaires dans un programme, il suffit d'utiliser le symbole "%".
Tout ce qui suit ce symbole, jusqu' la fin de la ligne, est considr comme un
commentaire et n'est pas, par consquent, interprt par MATLAB.
Un autre moyen trs utile dignorer, dans le cadre du dboguage, une grande partie dun
programme, on utilise la condition if 0 ou while 0.
Toutes les commandes rencontres entre cette commande et end sont alors ignores et
donc pas excutes.
Considrons ces quelques lignes o lon affecte la variable x plusieurs valeurs mais qui
ne garde que la 2me valeur grce cette possibilit dignorer des parties dun programme.
a=[1 3 5];
if 0
b=a+3;
end
35
Nous obtenons bien la bonne valeur de b, celle dont linstruction nest pas dlimite par
if 0 ou while 0 et end.
>> b
b =
2
Les fichiers fonctions fournissent une extensibilit MATLAB. Vous pouvez crer de
nouvelles fonctions spcifiques votre domaine de travail qui auront le mme statut que
toutes les autres fonctions MATLAB.
Les variables dans les fonctions sont par dfaut locales, mais on peut dfinir des variables
globales.
Exemple de fichier fonction
Nous allons crire une fonction pour gnrer un tableau de n nombres alatoires entiers
compris entre 0 et une valeur maximale contenue dans une variable note max.
fichier randint.m
function res = randint(n, max)
% res : tableau de n entiers compris entre 0 et max
% "rand" : gnre un nombre alatoire entre 0 et 1,
% "floor" : renvoie la partie entire d'un nombre
temp = rand(1,n);
res = floor((max+1).*temp);
36
Chapitre 1
48
24
40
21
46
40
48
Il est ncessaire de faire suivre la premire ligne d'un fichier fonction par des lignes de
commentaires dans lesquelles on dcrira son but et ses arguments. Ces lignes seront
utilises par les commandes lookfor et help.
>>
help randint
La commande sinus cardinal est programme dans MATLAB comme un fichier fonction.
Son code est le suivant :
SINC Sin(pi*x)/(pi*x) function.
SINC(X) returns a matrix whose elements are the sinc of
the elements
of X, i.e.
y = sin(pi*x)/(pi*x)
if x ~= 0
= 1
if x == 0
where x is an element of the input matrix and y is the
resultant output element.
Elle consiste utiliser la condition if pour lever lindtermination lorsque largument est
nul. Cette indtermination peut tre leve grce des oprateurs relationnels dans la
fonction sinc2.m.
function y=sinc2(x)
% fonction sinus cardinal
% x : vecteur des abscisses
% y : vecteur des ordonnes
y=(x==0)+sin(x)./((x==0)+x)
37
L'instruction for
for compteur = ValDbut : pas : ValFin
instructions
end
L'exemple suivant permet de gnrer, l'aide de la boucle for, les carrs des n premiers
entiers naturels.
fichier ncarres.m
% tableau des carrs des n premiers entiers naturels
n = 10;
x = [];
for i = 1:n
x = [x,i^2];
end
x
>> ncarres
x =
1
4
16
25
36
49
64
81
100
Ce programme peut tre mis sur une mme ligne lorsquon spare les instructions par des
par des virgules ou des points-virgules.
x = []; for i = 1:n, x = [x,i^2]; end
L'instruction while
while conditions
instructions
end
Dans l'exemple suivant, on affiche le plus petit entier naturel n tel que 2^n est suprieur
ou gal un nombre donn x.
fichier n_x.m
x = 15; n = 0;
while 2^n < x
n = n+1;
end
n
>> n_x
n =
4
38
Chapitre 1
L'instruction if
if conditions
instructions (si les conditions sont vrifies)
elseif
else
instructions (si les conditions ne sont pas vrifies)
end
L'exemple suivant permet de vrifier si un entier naturel donn n est pair ou impair.
if rem(n,2) == 0
disp('nombre pair')
else
disp('nombre impair')
end
rem :
disp :
Ces oprateurs peuvent tre utiliss avec des scalaires ou des matrices. Le rsultat
d'valuation d'une expression relationnelle est 1 (vrai) ou 0 (faux).
Quand ces oprateurs sont appliqus des matrices, le rsultat est une matrice, de mmes
dimensions, forme de 0 et de 1, rsultats de comparaisons lment lment.
Oprateurs logiques
Les expressions relationnelles peuvent tre combines en utilisant les oprateurs logiques
suivants :
&, |, ~
qui signifient respectivement "et" (AND), "ou" (OR) et "non" (NOT). Ces oprateurs sont
appliqus sur les matrices lment par lment. Les oprateurs logiques ont une priorit
plus faible que les oprateurs relationnels, qui leur tour ont une priorit plus faible que
les oprateurs arithmtiques.
Il est conseill d'utiliser les parenthses afin d'viter toute ambigut.
39
Exemple 1
L'exemple suivant permettra de limiter un signal u(t) variant dans le temps, entre les
valeurs u_min et u_max en utilisant les oprateurs relationnels et logiques.
fichier sature.m
function u_limite = sature(u, u_min, u_max)
% limitation d'un signal
% si signal < u_min alors signal = u_min,
% si signal > u_max alors signal = u_max,
% si u_min <= signal <= u_max alors signal non modifi
% expressions
expr1 = (u >=
expr2 = (u <=
expr3 = ((u <
logiques retournant 0 ou 1
u_max);
u_max);
u_max) & (u > u_min));
Une expression logique vraie a pour valeur 1, dans le cas contraire (fausse) elle a pour
valeur 0.
Dans la fonction sature, les oprateurs relationnels et logiques ont permis d'viter
l'emploi de l'instruction de contrle if.
Quelques exemples d'appels de cette fonction
on dfinit les valeurs u_min et u_max
>>
>>
u_min = 0;
u_max = 10;
Nous pouvons adapter la fonction de saturation prcdente, pour qu'elle puisse s'appliquer
un tableau de valeurs. Nous appellerons le fichier correspondant "sature2.m".
40
Chapitre 1
fichier sature2.m
function ul = sature2(u, u_min, u_max)
% limitation d'un signal
% si signal < u_min alors signal = u_min
% si signal > u_max alors signal = u_max
% si u_min <= signal <= u_max alors signal non modifi
ul = (u>=u_max).*u_max + (u<=u_min).*u_min + ((u<u_max)& ...
(u>u_min)).*u;
Notez bien que la seule modification se trouve au niveau de la multiplication des vecteurs
(multiplication lment par lment ".*"). Cette nouvelle fonction est, bien sr, valable
dans le cas d'un rel qui est simplement un vecteur un lment.
Nous allons appliquer la fonction sature2 un signal sinusodal auquel on a ajout un
bruit gaussien.
fichier sgn_sat.m
hold off
% les limites du signal
u_min = 0;
u_max = 10;
% signal sinusodal bruit
t = 0:100;
% bruit gaussien centr et d'cart type 3
bruit = 3*randn(size(t));
u = 15*sin(0.1*t)+ bruit;
% la saturation
sgn = sature2(u,u_min,u_max);
% signal non satur
plot(t,u);
hold on
title('signaux satur et d''origine')
xlabel('temps')
% signal satur
plot(t,sgn)
% modification des chelles des axes
axis([0 100 -20 20])
grid
41
signaux satur et d'origine
20
15
10
signal satur
5
0
-5
-10
signal d'origine
-15
-20
10
20
30
40
50
temps
60
70
80
90
100
Exemple 2
Gnration de deux sinusodes de frquence dpendant du ssigne de x
Le script suivant gnre un signal sinusodal sin(k x) avec une valeur de k dpendant
du signe de x, soit k = 1 pour des valeurs ngatives de la variable x et k = 4 dans le
cas contraire.
fichier sinus2.m
% domaine des variations de la fonction
x = -4*pi:pi/100:4*pi;
% y = sin(x) si x<=0, et y = sin(4x) si x>0
y = sin(x).*(x<=0)+sin(4*x).*(x>0);
% On trace ensuite la courbe y = f(x)
plot(x,y)
xlabel('x')
ylabel('y')
title('y = sin(x) si x<=0, et y = sin(4x) si x>0')
La figure suivante montre que la sinusode possde une frquence 4 fois plus grande
lorsque labscisse x devient positive.
42
Chapitre 1
y = sin(x) si x<=0, et y = sin(4x) si x>0
1
0.8
0.6
0.4
0.2
y
0
-0.2
-0.4
-0.6
-0.8
-1
-15
-10
-5
0
x
10
15
Exemple 3
Gnration du sinus cardinal
sin(x)
possde une valeur indtermine en x = 0, alors qu'elle vaut 1 lorsqu'on
La fonction
x
lve l'indtermination.
Afin de forcer sa valeur 1 lorsque x vaut zro, on utilise l'expression logique (x ==
0) qui vaudra 1 lorsque x est nul et 0 partout ailleurs.
fichier sin_card.m
% trac de la fonction sinus cardinal
% domaine des valeurs de la variable x
x = -4*pi:pi/100:4*pi;
% valeurs de la fonction
y = (x==0)+sin(x)./(x+(x==0));
% trac de la fonction sinus cardinal
plot(x,y)
grid
title('sinus cardinal y = sin(x)/x')
43
sinus cardinal y = sin(x)/x
0.8
0.6
0.4
0.2
-0.2
-0.4
-15
-10
-5
10
15
Dans MATLAB, la fonction sinus cardinal existe sous le nom "sinc", programme sous
une forme lgrement diffrente que prcdemment.
En demandant de l'aide sur cette fonction comme suit, on remarque que la variable x est
multiplie par .
>> help sinc
SINC Sin(pi*x)/(pi*x) function.
SINC(X) returns a matrix whose elements are the sinc of
the elements
of X, i.e.
y = sin(pi*x)/(pi*x)
if x ~= 0
= 1
if x == 0
where x is an element of the input matrix and y is the
resultant
output element.
% Example of a sinc function for a linearly spaced
vector:
t = linspace(-5,5);
y = sinc(t);
plot(t,y);
xlabel('Time
(sec)');ylabel('Amplitude');
title('Sinc
Function')
See also square, sin, cos,
pulstran, rectpuls,and tripuls..
chirp,
diric,
gauspuls,
44
Chapitre 1
En utilisant la commande type, vous pouvez visualiser le code des fonctions MATLAB
lorsqu'elles existent sous forme de fichiers M.
>>
type sinc
function y=sinc(x)
%SINC Sin(pi*x)/(pi*x) function.
%
SINC(X) returns a matrix whose elements are the sinc of
the elements
%
of X, i.e.
%
y = sin(pi*x)/(pi*x)
if x ~= 0
%
= 1
if x == 0
%
where x is an element of the input matrix and y is the
resultant
%
output element.
%
Example of a sinc function for a linearly spaced
%
vector:
%
t = linspace(-5,5);
%
y = sinc(t);
%
plot(t,y);
%
xlabel('Time (sec)');ylabel('Amplitude'); title('Sinc
Function')
%
See also SQUARE, SIN, COS, CHIRP, DIRIC, GAUSPULS,
PULSTRAN, RECTPULS,
%
and TRIPULS.
%
Author(s): T. Krauss, 1-14-93
%
Copyright 1988-2004 The MathWorks, Inc.
%
$Revision: 1.7.4.1 $ $Date: 2004/08/10 02:11:27 $
i=find(x==0);
x(i)= 1;
% From LS: don't need this is /0 warning is off
y = sin(pi*x)./(pi*x);
y(i) = 1;
Le code de la fonction sinc se trouve dans les quatre dernires lignes, toutes les
premires sous forme de commentaires servent uniquement pour laide en linvoquant par
help sinc.
Le code des fonctions appartenant au noyau MATLAB ne peut tre consult. C'est le cas
par exemple de la fonction inv.
>> type inv
INV
Matrix inverse.
INV(X) is the inverse of the square matrix X.
A warning message is printed if X is badly scaled or
nearly singular. See also slash, pinv, cond, condest,
lsqnonneg, lscov. Overloaded methods: lti/inv
45
Nous avons, dans cette bibliothque, des gnrateurs de signaux, des blocs de lecture de
fichiers textes, binaires, des variables de lespace de travail, un bloc constant, etc.
46
Chapitre 1
Pour cela, nous utilisons le bloc gnrateur dchelon de la librairie Sources que lon
relie lentre du systme (librairie Discrete).
La sortie du systme ainsi que la commande chelon sont sauvegardes, grce un
multiplexeur (librairie Signal Routing), dans la variable y que lon peut utiliser dans
lespace de travail MATLAB.
Elle est de mme affiche dans un oscilloscope (librairie Sinks).
47
48
Chapitre 1
La matrice A et le vecteur B sont entrs comme des constantes qui prennent les valeurs des
variables spcifies et connues dans lespace de travail MATLAB.
Considrons le systme sur dtermin suivant :
2 x1 + 10 x2 = 0
x1 + 2 x2 = 2
4 x1 + 20 x2 =1
2 10
0
x
1 2 1= 2 A X =B
x
4 20 2 1
Les matrices A et B, si elles ne sont pas connues dans lespace de travail, peuvent tre
spcifies dans un callback (voir chapitre Callbacks ), tel le callback InitFcn.
49
2 3 x1 8
=
A X =B
1 2 x2 3
>> A = [2 1; 1 1];
>> B= [4 3]';
>> inv(A)*B
ans =
1
2
50
Chapitre 1
51
Nous appliquons le mme signal dentre au systme analogique du 2nd ordre et nous
obtenons la mme rponse temporelle.
Le signal dentre est un chelon suivi dune rampe selon la condition spcifie par
loprateur relationnel (Relational Operator) de la bibliothque Logic & Bit
Operations.
Lchelon passe travers le Switch lorsque la sortie de loprateur <= est au niveau
logique 1 soit le temps dhorloge infrieur 100. Le signal dentre est ensuite envoy
dans la variable locale u, grce au bloc Goto
Sa valeur sera rcupre via la mme variable u grce au bloc From. Goto et From
appartiennent la bibliothque Signal Routing.
Lquation diffrentielle est programme par 2 intgrateurs purs et 2 gains dans lesquels
on utilise les valeurs du coefficient damortissement et la pulsation propre w .
0
Les signaux dentre et de sortie sont envoys la fois vers loscilloscope, le fichier
binaire es.mat et lafficheur numrique Display.
52
Chapitre 1
Dans le modle suivant, le mme signal dentre est envoy lentre du systme du 2nd
ordre de coefficient damortissement , de pulsation propre w et un gain statique unit.
0
Nous avons aussi sauvegard ce signal dans le fichier binaire es.mat que lon peut lire
grce la commande load.
On efface toutes les variables de lespace de travail et on lit le fichier binaire.
>> clear all
>> load es
La seule variable de lespace de travail est celle portant le nom du fichier binaire.
>> who
Your variables are:
es
53
Par dfaut, MATLAB ajoute toujours la variable temps en dbut de fichier, soit le vecteur
es(1, :) dans notre cas ici.
>>
>>
du
>>
>>
>>
7
6
5
4
Signal d'entre
3
2
1
0
20
40
60
80
100
120
Temps continu
140
160
180
200
54
Chapitre 1
1
1 0 .8 z + 0 .5 z 2
55
Proportionnelle, P
1
Intgrale,
avec un gain I.
p
du
Drive,
, prcde du gain D.
dt
R( p) = 0.1 +
>>
>>
>>
>>
0.05
p
P=0.1;
I=0.05;
D=0;
signaux_es
signaux_es =
time: []
signals: [1x1 struct]
blockName: 'PID_regulator/To Workspace'
56
Chapitre 1
>> isstruct(signaux_es)
ans =
1
57
un accs rapide tous les outils additionnels MATLAB, Simulink ainsi quaux
diffrentes boites outils (Toolboxes),
la connexion au site de Mathworks pour du support, la documentation, et lchange
de fichiers entre utilisateurs (MATLAB File Exchange), etc.
la recherche de fichiers,
avoir de laide sur un produit donn,
avoir accs des dmos,
etc.
Dmos
Ce menu de Start permet davoir accs assez rapidement des dmos de MATLAB,
SIMULINK, des boites outils (Toolboxes) et aux outils associs, etc. Ci-dessous nous
observons les dmos de SIMULINK.
58
Chapitre 1
Recherche de fichiers,
Ci-dessous, nous avons recherch la localisation de la fonction sinc.m dans tous les
rpertoires prsents dans les chemins de recherche MATLAB (Entire MATLAB
path). Nous pouvons aussi spcifier le rpertoire (Current directory) courant ou
un rpertoire particulier (Browse).
59
Nous remarquons que cette fonction fait partie de la boite outils Signal
Processing Toolbox .
Preferences
Spcifie des prfrences ou des proprits par dfaut, comme par exemple, dans le cas cidessous, le temps de simulation (Stop time) et le type de Solveur, qui sont, par dfaut
10 et Ode45 (Dormand-Price), avant dtre modifis par lutilisateur.
60
Chapitre 1
Web
Raccourcis (Shortcuts)
deffacer lcran,
fermer toutes les fentres graphiques,
se placer dans le rpertoire C:/Users.
Cette fentre ddition du raccourci (Shortcut Editor) est obtenue lorsquon choisit
Edit Shortcut.
61
Cette proprit peut aussi tre ralise par un script que lon nommer startup.m,
seulement ce dernier ne sexcute quau dbut dune nouvelle session MATLAB,
contrairement au raccourci quon peut excuter tout moment grce au menu Start.
Le raccourci peut avoir une icne type MATLAB (cas ci-dessus), SIMULINK ou une
icne standard.
Si lon choisit Toolbar Shortcuts dans le champ Category au lieu de Shortcut,
licne se retrouve dans la barre des raccourcis juste en dessous des menus de MATLAB
comme le montre la figure suivante.
Help
On a, grce cette option du menu Start, accs laide disponible sur tous les outils
associs MATLAB.
62
Chapitre 1
- MATLAB
Block
63
Chapitre 2
Chanes de caractres, dates et heures
Mme si MATLAB est un langage de calcul scientifique de haut niveau et orient Objet, il offre, de plus,
des possibilits de traitement des chanes de caractres, des dates et heures.
Pour plus de renseignements sur les fonctions MATLAB concernant les chanes de caractres, vous
pouvez consulter l'aide en ligne (help strfun).
66
Chapitre 2
76
65
66
double
Transforme une chane en format numrique en double prcision.
>> Chaine='MATLAB';
>> Double=double(Chaine)
Double =
77
65
84
76
>> whos
Name
Chaine
Size
1x6
65
66
Bytes
12
Class
char
Attributes
1x6
67
48
double
La taille mmoire occupe par la variable Double est 4 fois celle de la chane Chaine.
str2double
Transforme le nombre en chane sous forme dun nombre en double prcision.
>> Chaine='MATLAB';
>> str2double(Chaine)
ans =
NaN
>> Ch1='123';
>> str2double(Ch1)
ans =
123
bin2dec
Convertit un nombre binaire sous forme de chane en sa valeur dcimale.
>> bin2dec('0111')
ans =
7
hex2num
Cette fonction fournit une conversion d'un nombre crit sous forme hexadcimale IEEE (chane de
caractres) en un flottant double prcision.
>> hex2num('400921fb54442d18')
ans =
3.1416
>> ans==pi
ans =
1
Le rsultat est gal .
hex2dec
Conversion d'un nombre hexadcimal (crit sous forme d'une chane de caractres) en un nombre entier.
>> hex2dec('F89')
ans =
3977
68
Chapitre 2
65
84])
76
73
78
75
>> setstr(Code)
ans =
SIMULINK
num2str
Transforme un nombre sous forme dune chane de caractres.
>> ch1 = 'MATLAB';
>> Version = 2009;
>> Chaine = [ch1, ' Version ', 'R', num2str(2009),'a']
Chaine =
MATLAB Version R2009a
mat2str
Transforme la matrice numrique en chane de caractres.
>> MatString=mat2str([5 4 7; 8 4 2; 6 0 8])
MatString =
[5 4 7;8 4 2;6 0 8]
>> isstr(MatString)
ans =
1
>> size(MatString)
ans =
69
19
70
Chapitre 2
>> dec2bin(3)
ans =
11
>> isstr(ans)
ans =
1
I.2.3. Tests sur les chanes
Retourne 1 si le caractre est un espace et 0 autrement.
>> isspace('Mat lab')
ans =
0
0
1
1
1
0
1
0
1
71
']
ans =
MATLAB & SIMULINK
R2009a
>> size(ans)
ans =
2
17
strvcat
Concatnation verticale de chanes de caractres, indpendamment de leurs longueurs.
>> strvcat('MATLAB & SIMULINK','R2009a')
ans =
MATLAB
R2009a
MATLAB ajoute automatiquement le nombre de blancs ncessaires la chane la plus courte.
72
Chapitre 2
73
74
Chapitre 2
ans =
35
>> length(Chaine2)
ans =
24
La longueur de la chane est passe de 35 24 en supprimant les blancs devant la chane Chaine.
On se propose, ci-aprs, de supprimer tous les blancs de la chane de caractres. On remplace tous les
blancs par un ensemble vide. Malgr le Warning, le rsultat est bon.
>> Chaine3= strrep(Chaine,' ',[])
Warning: Inputs must be character arrays or cell arrays of strings.
x =
MATLABetSIMULINK
strtok
Retourne le 1er mot d'une chane, ainsi que le reste. Les champs sont spars par un dlimiteur qui est par
dfaut l'espace.
>> Chaine = 'MATLAB R2009a';
>> [PremierMot, reste] = strtok(Chaine)
PremierMot =
MATLAB
reste =
R2009a
>> enreg = 'Langage de trs haut niveau : MATLAB';
>> delimiteur = ':';
>> [nom, reste] = strtok(enreg,delimiteur)
nom =
Langage de trs haut niveau
reste =
: MATLAB
I.3. Fonctions utiles
eval
Evaluation d'une chane de caractres contenant des commandes MATLAB, des oprations et des noms
de variables. Si la chane n'est pas valide une erreur est retourne.
>> x = [2*pi pi/3; pi/2 -1]
x =
6.2832
1.0472
1.5708
-1.0000
75
sin(sqrt(2+2))/ sqrt(2+2)
0.8
0.6
0.4
0.2
-0.2
-8
-6
-4
-2
angle: -2 : 2
76
Chapitre 2
blanks
Permet de gnrer une chane de caractres forme de blancs. Cette commande est utile dans le cas o
l'on a besoin d'un vecteur colonne de chanes de caractres de mme longueur. Les chanes sont
compltes par des blancs jusqu' ce que la longueur maximale soit atteinte. Nous proposons ci-aprs un
exemple d'application de cette commande.
fichier blancs.m
% chanes assembler dans un vecteur colonne
Chaine1 = 'MATLAB & SIMULINK';
Chaine2 = 'Version R2009';
n = 2;
% recherche de la longueur maximale
for i = 1:n,
LongueurChaine(i) = length(eval(['Chaine', num2str(i)]));
end
% Longueur maximale des chanes concatner
LongMax = max(LongueurChaine);
% Concatnation verticale des chanes quilibres
ConcatChaines = [];
for i = 1:n
Chaine = eval(['Chaine', num2str(i)]);
% i-me chane
longueurChaine = length(Chaine);
Chaine = [Chaine, blanks(LongMax-longueurChaine)];
ConcatChaines = [ConcatChaines; Chaine];
end
% Affichage des chanes concatnes
ConcatChaines
>> AjoutBlancs
ConcatChaines =
MATLAB & SIMULINK
Version R2009
>> eq(length(ConcatChaines), length('MATLAB & SIMULINK'))
ans =
1
MATLAB prvoit la commande str2mat pour effectuer les oprations dcrites prcdemment.
>> Chaine1=['MATLAB, langage de calcul scientifique de haut niveau'];
>> Chaine2=['& SIMULINK VersionR2009a'];
>> str2mat(Chaine1,Chaine2)
ans =
MATLAB, langage de calcul scientifique de haut niveau
& SIMULINK VersionR2009a
77
deblank
Supprime les espaces prsents la fin d'une chane de caractres.
>> Chaine = 'MATLAB
Chaine =
MATLAB
'
>> size(Chaine)
ans =
1
18
I.4. Lecture et criture de chanes formates
sprintf
Le but de cette fonction est l'envoi de sorties formates dans une chane.
[chane, msg_erreur] = sprintf(format, data1, data2, ...)
La chane retourne "chane" contient les donnes des matrices data1, data2, etc. arranges sous le
contrle de la chane de formatage format (dont les instructions sont analogues celles du langage C).
Si une erreur se produit, un message msg_erreur est gnr, sinon une chane vide est retourne.
Cette fonction est semblable la fonction fprintf ; l'criture est faite sur une chane de caractres
MATLAB au lieu d'un fichier.
>> x=exp(1)
x =
2.7183
>> [Chaine, msg] = sprintf('la valeur du neper vaut : %5.2f',x)
Chaine =
la valeur du neper vaut : 2.72
msg =
''
Si x est une matrice, le rsultat serait une concatnation des chanes obtenues par l'application de la
fonction sprintf chacun des lments de la matrice x.
>> x=randn(2)
x =
0.5377
-2.2588
1.8339
0.8622
>> [Chaine, msg] = sprintf('Matrice alatoire : %5.2f',x)
Chaine =
Matrice alatoire : 0.54Matrice alatoire : 1.83Matrice alatoire :
-2.26Matrice alatoire : 0.86
msg =
''
78
Chapitre 2
La chane de format est une chane de caractres contenant deux types d'objets : des caractres ordinaires
et des spcifications de format. Les caractres ordinaires sont simplement recopis un un dans la chane
rsultat.
Chaque spcification de format s'appliquera l'argument qui lui correspond dans la liste des arguments.
Les spcifications de format ont la forme suivante :
d
i
o
u
x
X
f
e
g
E
G
c
s
%
sscanf
Cette fonction, dont la syntaxe est dcrite ci-aprs, permet l'extraction d'informations (sous un format
particulier) partir d'une chane de caractres.
[a, compteur, msg] = sscanf(chane, format, taille)
a
compteur
msg
chane
format
taille
Cette fonction est semblable fscanf ; la lecture est faite partir d'une chane de caractres MATLAB
au lieu d'un fichier.
>> Chaine='5 3.5 10'
Chaine =
5 3.5 10
>> x = sscanf(Chaine,'%f')
x =
5.0000
3.5000
10.0000
79
80
Chapitre 2
Le principe de cet exercice est de mettre en vidence l'utilisation de la fonction setstr pour passer des
codes ASCII aux caractres composant une chane, de leur ajouter ou retrancher une valeur fixe et obtenir
ainsi une chane code, donc inintelligible.
fichier Crypt.m
function ChaineCodee = Crypt(Chaine, Code)
% Encryptage d'une chane de caractres en utilisant
% le dcalage du jeu de caractres.
if nargin <2;
disp('nombre d''arguments incorrect');
help Crypt;
return
end;
ChaineCodee = setstr((Chaine+Code));
ChaineCodee =
Phvvdjh#lpsruwdqw#=#wx#grlv#uhyhqlu#oh#64#Drw
Connaissant la faon dont est crypt le message, le fichier suivant, Decrypt.m permet de revenir au
message dorigine.
fonction Decrypt.m
function ChaineDeCodee = Decrypt(Chaine, ValeurCode)
% Dcryptage d'une chane de caractres en utilisant
% le dcalage du jeu de caractres.
% function ChCodee = Decrypt(Chaine, ValDec)
if nargin <2;
disp('nombre d''arguments incorrect');
help Decrypt
return;
end;
ChaineDeCodee = setstr(abs(Chaine)-ValeurCode);
>> Message='Phvvdjh#lpsruwdqw#=#wx#grlv#uhyhqlu#oh#64#Drw';
>> Code=3;
>> ChaineDeCodee=Decrypt(Message,Code)
ChaineDeCodee =
Message important : tu dois revenir le 31 Aot
I.6.2. Palindrome
Un palindrome est un mot, ou une phrase, lisible indiffremment de la gauche vers la droite ou
inversement. On se propose d'crire un programme qui dtermine si une chane de caractres est un
palindrome.
La solution serait d'inverser la chane et de la comparer avec la chane d'origine.
81
fichier palindrome.m
function Palind = palindrome(Chaine)
% Indique si une chane est un palindrome
if nargin <1;
disp('nombre d''arguments incorrect');
help palindrome
return;
end;
ChaineRetournee = fliplr(Chaine);
Palind = strcmp(Chaine,ChaineRetournee);
>> palindrome('atta')
ans =
1
chanes de caractres,
nombres,
vecteurs.
La commande date retourne la date du jour sous forme dune chane de caractres.
date
>> date
ans =
09-Aug-2009
MATLAB gre aussi les dates sous forme de nombres.
now
>> now
ans =
7.3399e+005
La commande now retourne la date et lheure actuelle sous la forme dun seul nombre dont lentier
infrieur correspond la date du jour et le reste lheure actuelle.
Le nombre correspond au nombre de jours passs depuis une date de base. Dans MATLAB, cette date de
base est le 1er Janvier 2000.
datestr
Transforme une date en nombre sous forme dune chane de caractres.
82
>> datestr(1)
ans =
01-Jan-0000
Le nombre correspondant la date du jour est :
>> floor(now)
ans =
733994
>> rem(now,1)
ans =
0.5706
Pour avoir les chanes de caractres, nous utilisons la commande datestr.
>> datestr(floor(now))
ans =
09-Aug-2009
>> datestr(rem(now,1))
ans =
5:25 PM
Applique directement la commande now, datestr donne lheure exacte.
>> maintenant=datestr(now)
maintenant =
09-Aug-2009 13:45:54
On peut spcifier le type de chane pour la date uniquement.
>> maintenant=datestr(now,1)
maintenant =
09-Aug-2009
On peut spcifier un nombre entre 0 et 14 pour designer la forme de la date.
>> maintenant=datestr(now,2)
maintenant =
08/09/09
>> maintenant=datestr(now,14)
maintenant =
08:56:53 PM
datenum
Transforme la date sous forme dune chane en date sous forme de nombre.
>> datenum('31-Aug-2009')
ans =
734016
Chapitre 2
83
datevec
Cette commande permet de transformer une date en nombre sous forme dune date en vecteur.
>>
datevec(now)
ans =
1.0e+003 *
2.0090
0.0080
0.0090
0.0230
0.0120
0.0401
Ce vecteur contient les informations suivantes : [Anne mois jour heure minute second].
Tout comme pour le format nombre, la commande datestr peut donner le format chane de caractres.
clock
La commande clock retourne la date et lheure sous forme dun vecteur.
>> clock
ans =
1.0e+003 *
2.0090
0.0080
>> fix(clock)
ans =
2009
0.0110
0.0020
11
0.0220
0.0471
22
47
>> datestr(clock)
ans =
09-Aug-2009 13:46:05
II.2. Autres fonctions utiles de mesure du temps
eomday
Retourne la date du dernier jour dun mois dune anne. La commande suivante donne la date du dernier
jour du mois daot 2009.
>> D=eomday(2009,08)
D =
31
calendar
Cette commande affiche le calendrier du mois en cours.
>> calendar
S
0
2
9
M
0
3
10
Tu
0
4
11
Aug 2009
W
Th
0
0
5
6
12
13
F
0
7
14
S
1
8
15
84
Chapitre 2
16
23
30
17
24
31
18
25
0
19
26
0
20
27
0
21
28
0
22
29
0
Th
0
6
13
20
27
0
F
0
7
14
21
28
0
S
1
8
15
22
29
0
weekday
Cette commande retourne le jour de la semaine en donnant comme argument la date sous forme de chane
de caractres.
>> [d,w]=weekday(datestr(now))
d =
2
w =
Mon
La commande suivante montre que le 13 Octobre 1977 tait la 5me journe de la semaine, un jeudi,
comme on avait pu le voir dans le calendrier du mois de cette anne.
>> [d,w]=weekday('13-Oct-1977')
d =
5
w =
Thu
MATLAB dispose de fonctions de gestion du temps CPU, trs utiles pour la gestion des programmes.
cputime
Retourne le temps pass, en secondes, depuis le dbut de la session MATLAB.
>> cputime
ans =
59.6563
On peut se servir de cette commande pour mesurer le temps dexcution dune suite dinstructions.
On considre les lignes de commande suivantes quon excute dans lditeur.
% Temps pass depuis le dbut de la session
t1=cputime ; x=randn(1000); moyenne=mean(x(:)); variance=std(x(:))^2;
85
y=exp(log(x.^2));
tic
Initialise le timer.
toc
Stoppe le timer et affiche le temps mis depuis le temps pass en argument.
t1= tic ;
x=randn(1000);
TempsMis=toc(t1)
TempsMis =
0.0680
Lutilisation de ces commandes est plus recommande que la commande etim pour des raisons de
prcision.
datetick
Permet davoir des abscisses sous forme de dates (annes ou mois).
t = (1954:2:1962)';
y = [9 8.8 8.2 7.8 7.5];
plot(datenum(t,1,1),y) % Conversion des annes en format nombre
datetick('x','yyyy')
% Remplace les ticks de laxe x par des annes
% 4 digits
86
Chapitre 2
Population entre le 1er Novembre 1954 et le 5 Juillet 1962
9
8.5
7.5
1954
1955
1956
1957
1958
1959
1960
Chronique des annes de braise
1961
1962
Chapitre 3
I. Gnralits
II. Oprations sur les nombres complexes
II.1. Somme, produit et division de complexes
II.2. Racine, logarithme et exponentielle de complexes
III. Fonctions spciales de nombres complexes
III.1. Reprsentation graphique
III.2. Fonctions de variables complexes
IV. Applications
I. Gnralits
MATLAB accepte les nombres complexes sous leur forme algbrique a+i*b ou
exponentielle rho*exp(j*theta).
Les symboles i et j reprsentent le nombre imaginaire pur vrifiant :
i2 = j2 = -1
Dans MATLAB, on peut omettre le signe produit (*) lorsquon entre un nombre complexe
sous sa forme algbrique.
Ci-dessous, nous observons ces 2 manires de crer un complexe :
>> z1=2+3*i
z1 =
2.0000 + 3.0000i
>> z2=2+3j
z2 =
2.0000 + 3.0000i
Pour l'affichage des nombres complexes, MATLAB utilise toujours le symbole i. Les
deux expressions suivantes reprsentent le mme nombre complexe.
>> z1 = 1 + i
z1 =
1.0000 + 1.0000i
>> z2 = sqrt(2)*exp(i*pi/4)
z2 =
1.0000 + 1.0000i
88
Chapitre 3
Les fonctions real, imag, abs, angle permettent d'obtenir respectivement les
parties relle et imaginaire, le module et l'argument d'un nombre complexe.
>> z = 1 + 1*i;
>> [real(z) imag(z) abs(z) angle(z)]
ans =
1.0000
1.0000
1.4142
0.7854
Le conjugu d'un nombre complexe s'obtient par la fonction conj.
>> conj(1+i)
ans =
1.0000 - 1.0000i
Il existe deux faons de construire une matrice valeurs complexes :
les lments sont saisis sous leur forme complexe
>> X = [1+2*i 3*i; 1+i 1-i]
X =
1.0000 + 2.0000i
0 + 3.0000i
1.0000 + 1.0000i
1.0000 - 1.0000i
>> real(X)
ans =
1
0
1
1
>> imag(X)
ans =
2
3
1
-1
On retrouve la matrice X en utilisant les proprits des calculs entre matrices et celles des
complexes en coordonnes polaires.
>> Y=abs(X).*exp(j*atan(imag(X)./real(X)))
Y =
1.0000 + 2.0000i
1.0000 + 1.0000i
0.0000 + 3.0000i
1.0000 - 1.0000i
Complexes
89
>>(1+i)+sqrt(2)*exp(j*pi/4)
ans =
2.0000 + 2.0000i
Un nombre rel est considr par MATLAB comme un complexe partie imaginaire nulle.
>> z=5;
>> real(z)
z =
5
>> imag(z)
ans =
0
Un rel qu'on ajoute un nombre complexe s'ajoute la partie relle de ce dernier.
>> 2+(1+i)
ans =
3.0000 + 1.0000i
90
Chapitre 3
Multiplication
La multiplication d'un nombre complexe par un rel affecte de la mme faon ses parties
relle et imaginaire.
>> 2*(1+i)
ans =
2.0000 + 2.0000i
>>(1 + i)*(2+3*i)
ans =
-1.0000 + 5.0000i
Division
>> z1=(1+i);
>> z2=1-2*i;
>> z1/z2
ans =
-0.2000 + 0.6000i
>> (abs(z1)/abs(z2))*exp(i*(angle(z1)-angle(z2)))
ans =
-0.2000 + 0.6000i
On vrifie bien la proprit de la division des nombres complexes.
II.2. Racine, logarithme et exponentielle de complexes
Elvation une puissance relle
>> (3-2i)^(-3)
ans =
-0.0041 + 0.0209i
>> sqrt(1+i)
ans =
1.0987 + 0.4551i
Logarithme
>> log(1+i)
ans =
0.3466 + 0.7854i
Exponentielle
>> exp(ans)
ans =
1.0000 + 1.0000i
Complexes
91
La commande cplxdemo permet de voir une dmonstration sur les complexes et leurs
possibilits graphiques.
image de z = -2+0.5i
image de z = 1
partie imaginaire
-1
-2
-3
image de z = -0.5-3i
-4
-3
-2.5
-2
-1.5
-1
-0.5
0
partie relle
0.5
1.5
Chapitre 3
92
title('racines 3-imes')
xlabel('parties relles')
ylabel('parties imaginaires')
grid
Les racines n-imes de l'unit peuvent tre calcules l'aide du script nracine.m dont le
code est donn dans ce mme chapitre.
racines 3-imes
90
120
1
0.8
60
0.6
parties imaginaires
150
30
0.4
0.2
180
210
330
240
300
270
parties relles
Complexes
93
>> feather(z)
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
1.2
1.4
1.6
1.8
2.2
2.4
2.6
2.8
0
0.1667 + 0.2887i
0.3333 + 0.5774i
0.5000 + 0.8660i
0
0.1667 - 0.2887i
0.3333 - 0.5774i
0.5000 - 0.8660i
0
-0.1667 + 0.2887i
-0.3333 + 0.5774i
-0.5000 + 0.8660i
Chapitre 3
94
Column 7
0
-0.3333 + 0.0000i
-0.6667 + 0.0000i
-1.0000 + 0.0000i
fichier racines6.m
s = cplxgrid(3)
plot(s)
hold on
racines = nracine(1,6)
plot(racines,'o')
axis([-1.5 1.5 -1.5 1.5])
grid
1.5
0.5
-0.5
-1
-1.5
-1.5
-1
-0.5
0.5
1.5
Complexes
95
fonctiony= z3
1
0.5
0
-0.5
-1
1
0.5
1
0.5
-0.5
-0.5
-1
-1
Il existe d'autres fonctions telles que rose et quiver pour le trac de fonctions variable
complexe.
IV. Applications
z=
r exp [ j (
+2 k
n
)]
Chapitre 3
96
% z : nombre complexe
% n :
ordre de la racine
if nargin ~= 2 | n == 0
error('arguments incorrects');
end
R = abs(z);
Theta = angle(z);
Alpha = (2*pi*(0:n-1)+Theta)/n;
Res = R^(1/n)*exp(j*Alpha);
Res = conj(Res');
% le prime permet d'obtenir un vecteur colonne
% mais conjugue aussi les complexes
% la fonction conj permet de revenir la forme initiale.
Comme exemple d'application de cette fonction, nous allons rechercher les racines 3-imes
de l'unit.
>> racines = nracine(1,3)
racines =
1.0000
-0.5000 - 0.8660i
-0.5000 + 0.8660i
En utilisant les fonctions, exponentielle et logarithme, les racines n-imes d'un nombre
complexe z sont donnes par l'expression :
n
1
z = exp [ log ( z )]
n
Nous proposons au lecteur de dfinir une fonction logarithme d'un nombre complexe.
Si z est exprim sous sa forme trigonomtrique :
z= e
La fonction logcplx dont le code est dcrit ci-aprs, permet de calculer le logarithme
d'un nombre complexe.
fichier logcplx.m
function Log = logcplx(z,k)
% k : nombre de phases 2 pi prs
% z : nombre complexe dont on veut calculer les k logarithmes
Complexes
97
Ce fichier fonction peut aussi tre utilis pour calculer les racines n-imes d'un nombre
complexe grce la fonction exponentielle; dans le cas du nombre complexe prcdent,
ces racines 3-imes sont :
>> z = 1+i;
>> n = 3;
>> racines = exp(logcplx(z,n)/n)
ans =
1.0842 + 0.2905i
-0.7937 + 0.7937i
-0.2905 - 1.0842i
R
C
ve
avec
R = 100 , L = 01
. H , C = 1m F
vs
jwt
Chapitre 3
98
Dans le domaine frquentiel, ce circuit est dfini par la fonction de transfert suivante :
V ( jw)
1
=
H ( jw) = s
Ve ( jw) 1 LC w 2 + j RC w
Nous dsirons calculer et tracer la rponse en frquences de cette fonction de transfert dans
une bande de pulsations donne.
fichier circuit_RLC.m
% valeurs des composants du circuit
R = 1000; C = 1e-3; L = 0.1;
% domaine des pulsations
w = 0:100;
% fonction de transfert complexe
H = 1./(1-L*C*w.^2+R*C*w*i);
figure(1)
% trac du module de la fonction de transfert
plot(w,abs(H)), grid
xlabel('pulsation rd/s')
title('module du transfert')
axis([0 100 0 1])
module du transfert
0.8
0.6
0.4
0.2
10
20
30
40
50
60
pulsation rd/s
70
80
90
100
Lorsque le module dcrot trs rapidement, il est ncessaire d'utiliser les chelles
logarithmiques pour la pulsation et le module.
Complexes
99
figure(4), loglog(w,abs(H))
grid, title('Module en coordonnes logarithmiques')
Module en coordonnes logarithmiques
10
-1
10
-2
10
10
10
10
Chapitre 3
100
% module et de la phase en coordonnes logarithmiques
figure(1)
semilogx(omega,180*angle(H)/pi), grid
title('Phase en coordonnes semi-logarithmiques')
figure(2)
loglog(omega,abs(H)), grid
title('Module en coordonnes logarithmiques')
case 'lin'
% trac du module et de la phase en coordonnes linaires
figure(1)
plot(omega,180*angle(H)/pi)
grid
title('Phase en chelles linaires')
figure(2)
plot(omega,abs(H))
grid
title('Module en chelles linaires')
end
Pour utiliser cette fonction, il suffit de lui transmettre les polynmes num et den,
respectivement du numrateur et du dnominateur, l'intervalle des pulsations omega dans
laquelle on dsire tracer les courbes du module et de la phase, ainsi que le type du trac.
Ce dernier sera dtermin par une chane de caractres, 'lin' pour un trac en chelles
linaires et 'log' pour un trac en chelles logarithmiques.
Dans le cas du circuit RLC prcdent, les commandes suivantes permettent d'obtenir des
courbes identiques aux prcdentes.
Echelles linaires
>> rpfreqfa(1, [L*C
R*C 1],0:100,lin)
Module en chelles linaires
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
10
20
30
40
50
60
70
80
90
100
Complexes
101
Echelles logarithmiques
>> rpfreqfa(1, [L*C
R*C 1],0:100,'log')
10
10
A = 20 log 1 + (
w 2n
)
wc
Chapitre 3
102
AdB
A
min
3
A
max
f1
f2
fc
Les frquences f 1et f 2 tant fixes, pour obtenir l'ordre n et la frquence de coupure f c ,
on s'impose les conditions suivantes :
A( f 1 ) Amax
A( f 2 ) Amin
f1 = 10 kHz
f 2 = 20 kHz
fichier butt_bas.m
% synthse de filtre passe-bas analogique de Butterworth
% paramtres du gabarit
A_max = 1;
A_min = 46;
f1 = 10e3;
f2 = 20e3;
a = A_max*log(10)/10;
% initialisations
n = 1; Att = 0;
while (Att <= A_min)
b = log(exp(a)-1)/(2*n);
fc = f1/exp(b);
Att = 20*log10(abs((1+j*(f2/fc).^n)));
Complexes
103
n = n+1;
end
n = n-1;
% affichage des rsultats
disp('Ordre et frquence de coupure')
disp(['n = ' num2str(n) ' ; fc =' num2str(fc) ' Hz']);
f12 = [f1 f2]; Att12 = 20*log10(abs(1+j*(f12/fc).^n));
disp(' Attnuation en dB aux frquences f1 et f2')
disp(Att12);
% trac de la courbe d'attnuation et de la phase
f = 0 : 1.2*f2;
Att = 20*log10(abs(1+j*(f/fc).^n));
phase = 180*angle(1./(1+j*(f/fc).^n))/pi;
figure(1), plot(f,Att), grid
title('Filtre passe bas de Butterworth, n=9, fc=10.78 KhZ');
xlabel('frquences en Hz'), ylabel('Attnuation en dB')
figure(2)
plot(f,phase), grid
title('Filtre passe bas de Butterworth, n=9, fc=10.78 KhZ');
xlabel('frquences en Hz'), ylabel('phase en degrs')
ordres = [n-2 n n+2];
for k = 1:length(ordres)
Attn(k,:) = 20*log10(abs((1+j*(f/fc).^ordres(k))));
end
figure(3)
plot(f,Attn), grid
clear Attn ordres Att Att12 f f12
title('Gabarits des filtres d''ordres n = 7, 9 et 11')
xlabel('frquences en Hz')
ylabel('Attnuation en dB')
gtext(['n = '
gtext(['n = '
gtext(['n = '
num2str(n-2)]);
num2str(n)]);
num2str(n+2)]);
Chapitre 3
104
Filtre passe bas de Butterworth, n=9, fc=10.78 KhZ
70
Attnuation en dB
60
50
40
30
20
10
0
0.5
1
1.5
frquences en Hz
2.5
4
x 10
phase en degrs
-30
-40
-50
-60
-70
-80
-90
0.5
1
1.5
frquences en Hz
2.5
4
x 10
La figure ci-aprs montre les diffrentes courbes d'attnuation pour n = 7, 9 et 11, pour
lesquelles, nous avons toujours A( f1) = 1 dB .
Complexes
105
Gabarits des filtres d'ordres n = 7, 9 et 11
80
70
Attnuation en dB
60
50
40
30
20
10
0
0.5
1
1.5
frquences en Hz
2.5
4
x 10
Nous proposons ci-aprs, la fonction tfd pour le calcul d'une TFD de mme taille que le
signal temporel x et un exemple d'application de celle-ci.
fichier tfd.m
function tf = tfd(x)
% transforme de Fourier discrte du signal x(k)
N = length(x);
tn = 0 : N-1; tk = tn;
tf = sum(x'*ones(1,N).*exp(-2*pi*j*(tk'*tn)/N));
Chapitre 3
106
fichier apl_tfd.m
% signal discret x(k)
N=50; x = 0.8.^(0:N-1);
% trac du signal discret x
figure(1)
stem(0:N-1,x)
title('chantillons du signal discret x')
xlabel('n d''chantillon temporel')
grid
% calcul et trac de la TFD de x(k)
tfdx = tfd(x);
figure(2)
stem(0:(N-1)/2
abs(tfdx(1:N/2)))
xlabel('n d''chantillon frquentiel')
grid
title('chantillons du module de la TFD')
% trac de la phase de la tfd
figure(3),
stem(0:(N-1)/2,angle(tfdx(1:N/2)))
xlabel('n d''chantillon frquentiel')
grid
title('chantillons de la phase (rad) de la TFD')
chantillons du signal discret x
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
10
15
20
25
30
35
n d'chantillon temporel
40
45
50
107
Complexes
Les chantillons du module et de la phase de la TFD sont reprsents par les figures
suivantes :
chantillons du module de la TFD
5
4.5
4
3.5
3
2.5
2
1.5
1
0.5
0
10
15
n d'chantillon frquentiel
20
25
10
15
n d'chantillon frquentiel
20
25
Chapitre 3
108
X ( ) = x( k ) e j k ,
k =0
= wT : pulsation normalise.
La fonction tfsd, propose ci-aprs, permet le calcul de la TFSD d'un signal discret. Elle
accepte comme paramtres le vecteur du signal et l'intervalle de variations des pulsations
normalises.
fichier tfsd.m
function tf = tfsd(x,teta)
% transforme de Fourier de signal discret
% tf
: vecteur de la transforme
% x
: vecteur du signal discret
% teta : domaine de valeurs des pulsations normalises
if nargin == 1
teta = -pi : pi/100 : pi;
end
N = length(x);
k = 0 : N-1;
tf = sum((x'*ones(1,length(teta))).*exp(-j*k'*teta));
fichier apl_tfsd.m
% calcul de la TFSD de x(k)
teta = -pi : pi/100 : pi;
tfsdx = tfsd(x,teta);
% trac du module de la tfsd
figure(1)
plot(teta,abs(tfsdx))
xlabel('n d''chantillon frquentiel')
grid
title('chantillons du module de la TFSD')
% trac de la phase de la tfsd
figure(2)
plot(teta,angle(tfsdx))
xlabel('n d''chantillon frquentiel')
grid
title('chantillons de la phase (rad) de la TFSD')
Complexes
109
-3
-2
-1
0
1
n d'chantillon frquentiel
-3
-2
-1
0
1
n d'chantillon frquentiel
Chapitre 3
110
-8
-6
-4
-2
0
2
4
n d'chantillon frquentiel
10
Chapitre 4
Les polynmes
I. Les polynmes
I.1. Oprations sur les polynmes
I.1.1. Multiplication, division et racines de polynmes
I.1.2. Manipulation de fonctions polynomiales
I.2. Interpolation et rgression
I.2.1. Interpolation au sens des moindres carrs
I.2.2. Interpolations linaires et non linaires
II. Applications
II.1. Puissance d'un polynme
II.2. Calcul du PGCD de deux polynmes
II.3. Calcul du PPCM de deux polynmes
II.4. Calcul de la transforme inverse de Laplace
II.5. Calcul de la drive n-ime d'un polynme
I. Les polynmes
Le calcul polynomial est la base de nombreux domaines scientifiques, entre autres, le
traitement du signal numrique et analogique, contrle de procds, approximation de
fonctions et interpolation de courbes.
I.1. Oprations sur les polynmes
MATLAB reprsente les polynmes sous forme de vecteurs lignes dont les composantes
sont ordonnes par ordre des puissances dcroissantes. Un polynme de degr n est
reprsent par un vecteur de taille (n+1).
Considrons le polynme suivant :
f(x) = 2 x 5 x 3 + 5 x 2 + 8 x + 2
Il est reprsent par le vecteur ligne :
>> f = [2 0 -1 5 8 2]
f =
2
0
-1
112
Chapitre 4
En plus des oprations propres aux vecteurs qui peuvent tre utilises pour la manipulation
des polynmes, d'autres oprations spcifiques sont prvues dans MATLAB, telles que
conv, deconv, roots, etc.
I.1.1. Multiplication, division et racines de polynmes
La multiplication et la division de deux polynmes sont ralises respectivement par la
convolution et la dconvolution de leurs coefficients, l'aide des fonctions conv et
deconv.
Multiplication de polynmes
H ( p)
2
avec
3p +1
H1 ( p) =
2
p +2p+3
H 2 ( p) =
p + 0.5
p ( p + 0.2)
H ( p) = H1 ( p) H2 ( p)
Fonctions de transfert individuelles
>> num_H1 = [3 1];
>> den_H1 = [1 2 3];
>> num_H2 = [1 0.5];
>> den_H2 = conv([1 0],[1 0.2]);
La multiplication de polynmes se fait grce la commande conv.
Fonction de transfert globale H
>> num_H = conv(num_H1, num_H2)
num_H =
3.0000
2.5000
0.5000
>> den_H = conv(den_H1, den_H2)
den_H =
1.0000
2.2000
3.4000
0.6000
Le mme rsultat peut tre obtenu en composant plusieurs fois la fonction conv.
113
Les polynmes
>> num_H = conv([3 1],[1 0.5])
num_H =
3.0000
2.5000
0.5000
2.2000
3.4000
0.6000
Pour afficher cette fonction de transfert globale sous forme d'une fraction, nous pouvons
utiliser la fonction printsys de la bote outils "Control System Toolbox".
>> printsys(num_H,den_H,'p')
num/den =
3 p^2 + 2.5 p + 0.5
------------------------------p^4 + 2.2 p^3 + 3.4 p^2 + 0.6 p
x
Division de polynmes
Dans le cas gnral, la division peut ne pas donner un rsultat exact, il existe alors un
quotient Q et un reste R.
Considrons les deux polynmes P et S suivants :
P( x )
S ( x)
x3 x 1
x2 3 x 4
Chapitre 4
114
Q( x ) = x 3
R( x ) = 14 x 13
On dispose de la fonction residue pour dcomposer une fraction en lments simples
sous la forme :
n
ri
P( x )
K ( x)
S ( x)
i 1 x pi
o pi, ri (i = 1 n) et K ( x ) sont respectivement les ples, les rsidus et le terme direct du
rsultat de la dcomposition.
[residus,poles, terme_direct] = residue(P,S)
residus =
13.8000
0.2000
poles =
-4
1
terme_direct =
1
-3
x3
.
138
0.2
x 4 x 1
Les racines d'un polynme sont donnes par la fonction roots. Ceci est intressant en
traitement de signal ; les solutions du numrateur (zros) et ceux du dnominateur (ples)
de la fonction de transfert peuvent renseigner sur les modes du systme.
Considrons la fonction de transfert H ( p) prcdente.
Zros de H(p)
>> zeros_H = roots(num_H)
zros_H =
-0.5000
-0.3333
Ples de H(p)
>> poles_H = roots(den_H)
poles_H =
0
-1.0000 + 1.4142i
-1.0000 - 1.4142i
-0.2000
Inversement, on peut construire un polynme partir de ses racines en utilisant la fonction
poly. Les racines du polynme sont passes la fonction sous forme d'un vecteur.
115
Les polynmes
>> den_H = poly(poles_H)
den_H =
1.0000
2.2000
3.4000
0.6000
La fonction poly accepte aussi une matrice comme argument dont elle retourne le
polynme caractristique.
>> A = [1 2; 3 4];
>> p = poly(A)
p =
1.0000
-5.0000
-2.0000
Chapitre 4
116
fichier poly_di.m
% polynme reprsentant la fonction polynomiale f(x)
p = [2 -2 1];
x = 0:0.01:1;
% valuation du polynme p sur l'ensemble x
f = polyval(p,x);
% trac de la fonction f(x)
plot(x,f); axis([0 1 0 1])
% calcul de la drive
p_derivee = polyder(p);
disp('polynme de la fonction drive :')
p_derivee
% valuation de la drive sur l'ensemble x
f_derivee = polyval(p_derivee,x);
% trac de la drive
hold on, plot(x,f_derivee,'-.')
% calcul de la primitive
p_integ = polyquad(p,x(1));
disp('polynme de la fonction primitive :')
p_integ
% valuation de la fonction intgrale
f_integ = polyval(p_integ,x);
% trac de la primitive
plot(x,f_integ,':'),
gtext('fonction f'), gtext('derive f''')
gtext('primitive')
title('fonction f(x), sa drive f''(x) et sa primitive')
>> poly_di
polynme de la fonction drive :
p_derivee =
4
-2
polynme de la fonction intgrale :
p_integ =
0.6667
-1.0000
1.0000
117
Les polynmes
f ' ( x) = 4 x 2 ,
2
F ( x) = x 3 x 2 + x
3
derive f'
0.8
0.7
fonction f
0.6
0.5
0.4
primitive
0.3
0.2
0.1
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
Chapitre 4
118
I.2. Interpolation et rgression
I.2.1. Interpolation au sens des moindres carrs
fichier sig_reg.m
% gnration de la courbe exprimentale
% effacement des variables de l'espace de travail
% intervalle de dfinition et calcul de la sigmode
x = -5:0.1:5;
% fonction sigmode bruite
y = 1./(1+exp(-x))+ 0.05*randn(1,length(x));
% trac de la sigmode bruite
plot(x,y)
title('fonction sigmode bruite, polynme d''interpolation')
% polynme d'ordre 1 d'interpolation
p = polyfit(x,y,1);
% valeurs du polynme d'interpolation
polyn = polyval(p,x); hold on
% trac du polynme d'interpolation
plot(x,polyn,'-.')
% calcul de l'erreur d'interpolation
err = y-polyn;
% trac de la courbe de l'erreur
plot(x,err,':'), grid
gtext('mesures'), gtext('erreur'), gtext('modle'), hold off
% affichage du polynme d'interpolation
disp('polynme d''interpolation')
p
var_err = num2str(std(err)^2);
disp(['variance de l''erreur d''interpolation : ' ,var_err])
0.5025
119
Les polynmes
fonction sigmode bruite, polynme d'interpolation
1.2
1
mesures
0.8
0.6
modle
0.4
0.2
0
erreur
-0.2
-0.4
-5
-4
-3
-2
-1
La fonction errorbar permet de tracer simultanment la courbe que l'on veut estimer
par un polynme et l'erreur d'estimation.
-4
-2
Chapitre 4
120
0.8
mesures
0.6
0.4
modle
erreur
0.2
-0.2
-5
-4
-3
-2
-1
>> sig_reg
polynme d'interpolation
p =
0.0002
-0.0001
-0.0092
0.0016
0.2244
variance de l'erreur d'interpolation : 0.0023618
0.4943
Une interpolation consiste relier des points exprimentaux par une courbe forme de
segments de droites ou de courbes polynomiales. Ceci est ralis par la fonction
interp1.
La commande interp1(x,y,z) retourne un vecteur de mmes dimensions que z dont
les valeurs correspondent aux images des lments de z dtermins par interpolation sur x
et y.
f = interp1(x,y,z,'type')
La chane 'type' spcifie un type d'interpolation parmi les suivants :
'linear' :
'spline' :
'cubic' :
interpolation linaire,
interpolation par splines cubiques,
interpolation cubique.
Les polynmes
121
Si l'on ne spcifie pas le type, l'interpolation linaire est prise par dfaut.
Dans le script suivant, nous allons tudier ces diffrents types d'interpolations sur un mme
exemple de valeurs discrtes de la fonction cosinus.
fichier interpolation.m
x = 0:10;
% points interpoler
y = cos(x);
% le pas du vecteur z infrieur celui de x
z = 0:.25:10;
% interpolation linaire
figure(1)
f = interp1(x,y,z); % interpolation linaire
% trac des valeurs relles et de la courbe d'interpolation
plot(x,y,'o',z,f)
grid
xlabel('interpolation linaire')
% interpolation par splines cubiques
figure(2)
f = interp1(x,y,z,'spline');
plot(x,y,'o',z,f),
grid
xlabel('interpolation par splines cubiques')
% interpolation par cubiques
figure(3)
f = interp1(x,y,z,'cubic');
plot(x,y,'o',z,f),
grid
xlabel('interpolation par cubiques')
Chapitre 4
122
interpolation linaire
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
10
L'interpolation par splines cubiques peut tre aussi obtenue par invocation de la commande
spline(x,y,z).
interpolation par splines cubiques
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
0
10
123
Les polynmes
fichier int_fft.m
% Interpolation de courbes par interpft
t = 0:pi/16:4*pi;
% fonction interpoler par interpft
x = cos(t)-0.5*sin(2*t);
y = interpft(x,length(x));
% trac de la fonction et de son interpolation
plot(t,x)
hold on
plot(t,y,'o')
title('interpft de x = cos t - 0.5 sin 2t')
grid
interpft de x = cos t - 0.5 sin 2t
1.5
0.5
-0.5
-1
-1.5
10
12
14
Chapitre 4
124
II. Applications
II.1. Puissance d'un polynme
On se propose d'crire une fonction qui permet d'lever un polynme une puissance n
entire quelconque. On nommera le fichier correspondant polypow.m.
function Pres = polypow(P,n)
% lvation d'un polynme la puissance entire n
if nargin ~= 2 | n<0
error('Arguments incorrects !')
end
Pres = 1;
for i = 1:n
Pres = conv(Pres,P);
end
= x2 + 2 x +1
>> p = [1 1];
>> n = 2;
>> q = polypow(p,n)
q =
1
2
1
II.2. Calcul du PGCD de deux polynmes
Le PGCD de deux polynmes est un polynme, de degr le plus lev possible, qui divise
exactement les deux polynmes de dpart. Il est dfini un coefficient rel multiplicatif
prs.
Par exemple, le PGCD de ( x 2 1) et ( x 2 + 3 x + 2) a pour expression : k ( x + 1) , k tant un
rel quelconque non nul.
Le calcul du PGCD repose sur l'algorithme d'Euclide, identique celui de la recherche du
PGCD de deux entiers.
Pour rechercher le PGCD de deux polynmes A et B, on effectue une suite de divisions
euclidiennes.
125
Les polynmes
A = B Q1 + R1
B = R1 Q2 + R2
R1 = R2 Q3 + R3
Etc.
jusqu' ce que le reste soit le polynme nul. Le dernier reste non nul est un PGCD.
Nous allons crire la fonction pgcd ralisant ce qui a t dcrit prcdemment. Nous
aurons besoin de faire appel une fonction de normalisation d'un polynme qu'on
appellera normpoly et qui sera dcrite par la suite.
fichier pgcd.m
function pg = pgcd(p1,p2);
% PGCD de 2 polynmes
if (length(p1) == length(p2)) & (p1 == p2)
pg = p1; % l'un ou l'autre des polynmes est un PGCD
return
end
n1 = length(p1);
n2 = length(p2);
if (n1<n2)
reste = p1;
else
reste = p2;
end
while p2 ~= zeros(1,length(p2))
[quotient,reste] = deconv(p1,p2);
if any(reste)
pg = reste; % On garde le dernier reste non nul
end;
p1 = p2;
p2 = reste;
end
pg = normpoly(pg);
% normalisation
A(x) = x 2 1
B(x) = x 2 + 3 x + 2
>> pg = pgcd([1 0 -1],[1 3 2])
pg =
1
1
Le plus grand commun diviseur des polynmes A(x) et B(x) est alors C(x) = k ( x + 1) .
Chapitre 4
126
Dans le programme prcdent, nous avions fait appel la fonction normpoly dont le but
est la normalisation d'un polynme (division du polynme par le coefficient du monme de
plus haut degr).
fichier normpoly.m
function pn = normpoly(pnn)
% function pn = normpoly(pnn)
% pn : polynme rsultat normalis
% pnn : polynme normaliser
% suppression des premiers zros
n = length(pnn);
i = 1;
while pnn(i) == 0; i = i+1; end;
pn = pnn(i:n);
% on divise par le coefficient du monme de plus haut degr
pn = pn ./pn(1);
D'une part, le coefficient du monme de plus haut degr est nul et l'on remarque la
prsence du coefficient multiplicatif (k = 3) d'autre part.
La fonction normpoly permet de normaliser le polynme rsultat.
>> pg = normpoly(pgcd([1 0 -1],[1 3 2]))
pg =
1
1
II.3. Calcul du PPCM de deux polynmes
fichier ppcm.m
function pp
% PPCM de 2
% le calcul
% PPCM(A,B)
= ppcm(p1,p2);
polynmes
du ppcm utilise celui du pgcd par la formule
= A.B/PGCD(A,B)
127
Les polynmes
% calcul du PGCD
pg = pgcd(p1,p2);
% suppression des premiers lments nuls du polynme pg
while pg(1) == 0
pg = pg(1:length(pg)-1);
end
% calcul du ppcm
pp = deconv(conv(p1,p2),pg);
>> A = [1 0 -1];
>> B = [1 3 2];
>> PPCM = ppcm(A,B)
PPCM =
1
2
-1
-2
Le plus petit commun multiple des polynmes A(x) et B(x) est alors :
C(x) = k ( x 3 + 2 x 2 x 2) , k rel.
Chapitre 4
128
fichier laplinv.m
function x = laplinv(num,den,t)
% cette fonction permet d'obtenir l'expression temporelle
% du signal x(t) dont on donne sa transforme de Laplace X(p)
% sous forme d'une fraction N(p)/D(p)
% x : valeurs du signal temporel x(t)
% num,den : numrateur et dnominateur de X(p)
% t : intervalle de temps pour les valeurs du signal x(t)
[r,p,k] = residue(num,den);
x = r'*exp(p*t);
1
( p + 1) ( p + 2)
0.2
0.15
0.1
0.05
10
129
Les polynmes
2 t
Dans ce qui suit, nous allons crire la fonction polydern qui calcule la drive n-ime
d'un polynme, en utilisant la fonction MATLAB polyder.
On appliquera cette fonction au calcul de la drive d'ordre 3 du polynme suivant :
p( x ) = 2 x 5 3 x 4 + 2 x 2 5
Le rsultat devrait tre le polynme : p (3) ( x ) = 120 x 2 72 x
fichier polydern.m
function pdn = polydern(p,n)
% pdn : polynme drive nime de p
Chapitre 4
130
% p : polynme driver n fois
% n : ordre de la drive
5.0000
Un polynme peut tre valu aux valeurs dune matrice par la commande polyvalm.
>> Matrice=[1,3;0 5]
Matrice =
1
0
3
5
>> p = [1 -1]
p =
1
-1
131
Les polynmes
>> polyvalm(p,Matrice)
ans =
0
0
3
4
La commande lcm(A,B) permet dobtenir le PPCM des lments dun polynme. Ceuxci doivent tre positifs
>> A = [1 2 4];
>> B = [5 3 2];
>> lcm(A,B)
ans =
5
6
Les vecteurs A et B doivent tre de mmes dimensions (un des deux peut tre scalaire) et
avoir des lments entiers positifs.
Chapitre 5
I. Vecteurs et matrices
I.1. Les vecteurs
I.1.1. Addition et soustraction
I.1.2. Transposition
I.1.3. Oprations lment par lment
I.1.4. Gnration de vecteurs
I.1.5. Oprations relationnelles sur les vecteurs
I.2. Les matrices
II. Fonctions sur les vecteurs et matrices
II.1. Quelques fonctions sur les matrices
II.2. Concatnation
II.3. Extraction d'une partie d'une matrice, extension d'une matrice
II.4. Comparaison de matrices
II.5. Typage des donnes numriques
II.6. Transformations de vecteurs et matrices
III. Fonctions propres aux matrices
III.1. Produit de matrices
III.2. Inversion de matrices
III.3. Division de matrices
III.4. Exponentielle, logarithme et racine carre d'une matrice
III.5. Test du type des lments dune matrice
IV. Matrices particulires et spciales
V. Factorisation et dcomposition de matrices
VI. Matrices creuses et fonctions associes
VII. Applications
VII.1. Moyenne et variance d'une srie de mesures
VII.2. Drive d'une fonction
VII.3. Calcul d'intgrales
VII.4. Rsolution d'un systme d'quations linaires
VII.5. Rsolution d'un systme sous- dimensionn ou indtermin
VII.6. Rgression linaire
VII.7. Rgression non linaire
I. Vecteurs et matrices
L'lment de base pour MATLAB est une matrice lments complexes. Ainsi tout
nombre rel est considr comme une matrice une ligne et une colonne dont le seul
lment est partie imaginaire nulle. Un vecteur n'est autre qu'une matrice une ligne ou
une colonne. Les vecteurs servent aussi reprsenter les polynmes et les chanes de
caractres. Les tableaux multidimensionnels sont des matrices concatnes selon certaines
directions.
Chapitre 5
134
I.1. Les vecteurs
I.1.1. Addition et soustraction
-5
>> x+y
ans =
3
10
Tant quon na pas affect le rsultat de lopration une variable, MATLAB cre la
variable ans pour answer (rponse).
>> resultat = 2*x-y
resultat =
-3
5
-3
Multiplier ou diviser un vecteur par un scalaire revient diviser chaque lment du vecteur
par ce scalaire.
>> 3*x-y/2
ans =
-1.5000
12.5000
2.5000
I.1.2. Transposition
Pour raliser certaines oprations vectorielles, on est amen transformer un vecteur ligne
en vecteur colonne et inversement.
La transposition d'un vecteur est ralise en faisant suivre son nom par une apostrophe.
>> z = [2 5 -7 4];
>> zT = z'
zT =
2
5
-7
4
135
La norme d'un vecteur z est gale la racine carre de la somme des carrs de ses
lments. Ceci peut s'obtenir partir du produit scalaire du vecteur z par lui-mme.
Norme d'un vecteur
>> norme_z = sqrt(z*z') % sqrt(N)
norme_z =
9.6954
On peut directement utiliser la fonction norm.
>> norm(z)
ans =
9.6954
Pour tester la taille dun vecteur, sa nature ligne ou colonne, nous pouvons utiliser les
commandes length (longueur) et size (taille).
>> size(z)
ans =
1
4
>> length(z)
ans =
4
z est un vecteur ligne de 4 lments.
La fonction numel donne directement le nombre dlments.
>> numel(z)
ans =
4
Pour afficher un vecteur, il suffit de faire appel son nom ou utiliser la commande disp.
>> z
z =
2
-7
>> disp(z)
2
5
-7
Chapitre 5
136
>> z = x.*y
z =
-5
16
>> x./y
ans =
-0.2000
>> x.^2
ans =
1
-9
1.0000
16
-1.0000
0.7500
1.0000
On peut aussi spcifier la premire et la dernire valeur ainsi que le pas. Par exemple, on
cre le vecteur w dont ces valeurs sont respectivement de 0 et 4.
>> w = 0:0.5:4
w =
0
0.5000
3.0000
3.5000
1.0000
4.0000
1.5000
2.0000
2.5000
137
>> t = logspace(1,2.5,5)
t =
10.0000
23.7137
56.2341
133.3521
316.2278
Pour dterminer si une donne est un scalaire, nous avons la commande isscalar.
>> isscalar(z)
ans =
0
>> x=5 ;
>> isscalar(x)
ans =
1
La variable x=5 est bien un scalaire et pas le vecteur z.
Les vecteurs peuvent contenir des valeurs infinies et des valeurs complexes. Ainsi le
vecteur w contient les valeurs 3+2i et linfini.
>> w = [3+2i inf]
w =
3.0000 + 2.0000i
>> isfinite(w)
ans =
1
0
Inf
138
Chapitre 5
139
Comme pour les vecteurs, on dispose de plusieurs modes d'affichage de matrices : un appel
direct de la variable matricielle ou l'utilisation de la commande disp, qui sert aussi
laffichage dune chane de caractres.
>> x
x =
0
1
5
2
3
6
>> disp(x)
x =
0
5
1
2
3
6
valeur moyenne,
cart type,
somme,
somme cumule,
produit cumul,
valeur minimale,
valeur maximale,
diffrence des lments successifs.
produit,
ordre croissant ou dcroissant des lments du vecteur.
2
5
3
6
Chapitre 5
140
4.5000
2.1213
141
3
6
Chapitre 5
142
fact_5 =
120
Ordonne y
20
15
10
3
4
Abscisse x
On prcde loprateur mathmatique par le point pour effectuer des oprations lment
par lment entre vecteurs.
143
3]
>> cumprod(x)
ans =
2
10
30
Le rsultat du produit obtenu par deux lments successifs est multipli son tour par le
suivant et ainsi de suite jusquau dernier.
On peut aussi sen servir pour le calcul de la factorielle dun nombre entier.
>> N=5;
>> ProdCumul=cumprod(1 :5)
>> fact_N=ProdCumul(length(ProdCumul))
ProdCumul =
1
2
24
120
fact_N =
120
II.2. Concatnation
Une matrice peut tre construite par la concatnation dautres matrices. La concatnation
doit respecter la condition sur les matrices qui doivent tre de mmes tailles.
Soit les matrices A et B suivantes :
>> A = [1 5 3 ; 5 2 6] ;
>> B = [0 6 7; 8 4 3];
On cre la matrice C en concatnant B droite de A, comme suit :
>> C = [A B]
C =
1
5
5
2
3
6
0
8
6
4
7
3
Chapitre 5
144
1
5
0
8
5
2
6
4
3
6
7
3
5
2
3
6
0
8
6
4
7
3
0
8
6
4
7
3
>> C=vertcat(A,B)
C =
1
5
3
5
2
6
0
6
7
8
4
3
>> C=horzcat(A,B)
C =
1
5
3
5
2
6
145
ans =
5
L'instruction suivante permet de rcuprer une partie de la matrice x. Cette partie sera
compose de toutes les lignes de x (reprsentes par le signe :) et des colonnes 2 3.
>> x1 = x(:,2:3)
x1 =
1
2
4
5
Cette matrice peut aussi tre obtenue en supprimant, de la matrice x, la premire colonne.
Remplacement de la premire colonne par une colonne vide
>> x(:,1) = []
x =
1
2
4
5
Extraction de la deuxime colonne
>> x(:,2)
ans =
1
4
Extraction de la deuxime ligne
>> x(2,:)
ans =
3
1
1
Chapitre 5
146
On remarque que seul l'lment A(2,1) ne satisfait pas la condition donne.
Soit la matrice C suivante :
>> C = [0 2; 4 6];
1
0
Pour vrifier si au moins un lment d'un vecteur ou tous les lments de celui-ci sont nuls,
on utilisera respectivement les commandes any et all. Ces commandes s'appliquent aussi
aux matrices.
L'application de la commande all un vecteur retourne 1 si tous ses lments sont non
nuls et 0 dans le cas contraire. Dans le cas d'une matrice, elle retourne un vecteur ligne
dont les composantes sont les rsultats de cette commande applique chacune des
colonnes.
Pour vrifier si une matrice est symtrique, on la comparera sa transpose.
>> isequal(A,A')
ans =
0
Le rsultat de lgalit tant gal 0, ceci implique que la matrice A n'est pas symtrique.
>> all(A == A')
ans =
0
0
Ce test peut tre largement simplifi en appliquant deux fois la commande all.
>> all(all(A == A'))
ans =
0
147
Tout ce qui a t dit sur la commande all reste valable pour la commande any.
Par exemple, la rponse la question : "les matrices A et B ont-elles des lments
identiques ?", sera donne par la commande suivante :
>> any(any(A == B))
ans =
0
La comparaison entre deux matrices de mmes dimensions peut se faire en utilisant des
oprateurs logiques relationnels classiques.
Oprateurs relationnels
Les oprateurs suivants, qui comparent la matrice A la matrice B agissent lment par
lment. Le rsultat est une matrice de mmes dimensions que A (ou B) contenant 1
lindice o la condition est vrifie et 0 ailleurs.
A < B,
A > B,
A <= B,
A >= B,
A == B,
A ~= B
0
0
Il ny a que les lments (1,1) et (2,1) de la matrice A qui sont suprieurs ou gaux ceux
de B.
Loprateur ~ est loprateur de la ngation. Linstruction suivante qui recherche les
lments de A qui ne sont pas strictement plus petits que ceux de B donnera les mmes
rsultats que prcdemment.
>> ~(A<B)
ans =
1
1
0
0
Chapitre 5
148
Oprateurs logiques
Les symboles &, |, et ~ sont les oprateurs logiques correspondent aux portes logiques
AND, OR et NOT.
Nous disposons aussi des fonctions or, not et xor pour implmenter le OU, le NOT et le
ou exclusif .
Avec les matrices A et B prcdentes nous avons :
>> A|B ;
ans =
1
1
1
1
>> A&B
ans =
0
1
1
1
Les valeurs de A et B non nulles sont considres comme une valeur logique 1.
>> xor(A,B)
ans =
1
0
0
0
>> not(A&B)
ans =
1
0
0
0
Ces 2 commandes donnent le mme rsultat.
>> isequal(xor(A,B), not(A&B))
ans =
1
Les oprateurs && et || sont dnomms ET et OU courts-circuits. Ils ont lavantage
dviter lvaluation de toute une expression si loprande de gauche est considr comme
faux.
Considrons lexpression logique suivante. Le premier oprande est choisi volontairement
la valeur fausse. On utilisera successivement le & et le court-circuit && et on
dterminera le temps de calcul mis pour valuer la mme expression logique.
>> clc
>> b=0;
>> tic;
>> x = (b ~= 0) & (randn(1000)> 1);
>> toc
Elapsed time is 0.060768 seconds..
149
Chapitre 5
150
>> intmax(class(a))
ans =
127
II.6. Transformations de vecteurs et matrices
4
5
6
151
12
26
19
41
Si la condition prcdente n'est pas ralise, MATLAB fournit un message annonant une
erreur dans les dimensions des matrices utilises.
>> B*A
??? Error using ==> *
Inner matrix dimensions must agree.
Le produit de Hadamard, ou produit lment par lment de 2 matrices de mmes
dimensions, s'obtient par l'oprateur '.*'.
>> A*A
ans =
7
15
10
22
>> A.*A
ans =
1
9
4
16
Chapitre 5
152
Inversion de la matrice x
>> inv(x)
ans =
-0.4286
0.7143
0.2857
-0.1429
Rang de la matrice x
>> rank(x)
ans =
2
Si la matrice possde un certain nombre de lignes ou de colonnes linairement
dpendantes, elle n'est pas inversible (rang plus faible que l'ordre).
MATLAB fournit dans ce cas, un message d'erreur, signalant que la matrice est singulire
ou mal conditionne.
>> x = [1 2; 3 6]
x =
1
2
3
6
>> rang = rank(x)
rang =
1
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 5.551115e-018
>> x_inv = inv(x)
x_inv =
1.0e+016 *
-1.8014
0.6005
0.9007
-0.3002
Dans ce cas, si on effectue le produit de x par son inverse, on ne retrouve pas la matrice
identit.
>> x_inv*x
ans =
-1.0000
0.5000
-2.0000
1.0000
153
expm1 :
expm2 :
expm3 :
>> x = [1 2; 0 -1]
x =
1
2
0
-1
>> y = expm(x)
y =
2.7183
2.3504
0
0.3679
Les diffrentes fonctions prcdentes donnent le mme rsultat.
La fonction exp applique une matrice, calcule l'exponentielle, lment par lment.
>> z = exp(x)
z =
2.7183
7.3891
1.0000
0.3679
Matrice logarithme
>> w = logm(x)
Chapitre 5
154
w =
0
0
0 - 3.1416i
0 + 3.1416i
Les lments de la matrice rsultat sont complexes si les valeurs propres de la matrice
d'origine sont ngatives, ce qui est le cas de la matrice x.
>> eig(x) % valeurs propres de x
ans =
1
-1
Logarithme des lments d'une matrice
La fonction log applique une matrice, calcule le logarithme nprien de chacun de ses
lments.
>> log(x)
Warning: Log of zero
ans =
0
-Inf
0.6931
0 + 3.1416i
1.4142
0 + 1.0000i
155
D'une manire gnrale, on peut valuer n'importe quelle fonction matricielle par la
commande funm dont la syntaxe est :
fx = funm('f',x)
>> x = [1 -1;0 2];
>> fx = funm('exp',x)
fx =
2.7183
0
-4.6708
7.3891
2.3504
0.3679
1
0
Il ny a que llment (1,3) provenant de la division 0/0 qui ne soit pas un nombre, donc du
type NaN.
Pour dterminer lexistence dune valeur infinie, nous utilisons la commande isinf.
>> isinf(x)
Chapitre 5
156
ans =
0
1
1
0
0
0
Seuls les lments (1,2) et (2,1) sont infinis. Le rsultat inverse est donn par la commande
isfinite.
>> isfinite(x)
ans =
1
0
0
1
0
1
Nous obtenons une matrice de mmes dimensions, avec des 1 l o llment est fini et 0
ailleurs. Dans le cas de cette matrice x, les lments Nan ou Inf ne sont pas finis.
>> isnumeric(x)
ans =
1
La commande isnumeric teste uniquement si les lments dune matrice sont de type
numrique ou chane de caractres.
Bien que la matrice x contienne des valeurs infinies ou des lments NaN (Not a
number), ils restent nanmoins, de type numrique. Comme la matrice ne peut contenir
quun seul type dlments, la rponse est 1 dans le cas numrique et 0 dans lautre cas.
Nous pouvons transformer une matrice sous forme de chanes de caractres par la
commande mat2str. Prenons le cas de la mme matrice x.
>> x_chaine = mat2str(x)
x_chaine =
[100 Inf NaN;Inf 5 0]
La matrice, quelles que soient ses dimensions, est transforme en une seule chane de
caractres.
>> size(x_chaine)
ans =
1
21
La chane ainsi obtenue possde 21 caractres.
Les caractres NaN correspondent aux lments allant du 9me au 12me caractre de la
chane.
>> x_chaine(9:12)
ans =
NaN
157
La commande isnumeric donne 0, la valeur 100 est vue comme une chane de
caractres.
>> isnumeric(x_chaine)
ans =
0
Pour tester le type chane de caractres, nous disposons de la commande isstr.
>> isstr(x_chaine)
ans =
1
Pour dterminer le type chane de caractres >>, nous utilisons la commande ischar.
>> ischar(x_chaine)
ans =
1
Les commandes isfloat et isinteger, testent respectivement les types virgule
flottante et le type entier.
Tableau logique (Logical Array)
Il existe un autre type de tableau : le tableau logique (logical Array) dont on peut se
servir pour indexer un autre tableau.
Le type logical qui naccepte que les valeurs 0 et 1 est un type particulier dont on se
sert pour indexer un tableau pour la recherche.
Soit la matrice x suivante :
>> x=[1 2 6; 8 4 3]
x =
1
2
6
8
4
3
Si lon veut rcuprer les lments (1,1), (2,1) et (2,3) on se servira, pour indexation, de la
matrice index suivante.
>> index=[1 0 0; 1 0 1]
index =
1
0
0
1
0
1
Bien que ne comportant que les valeurs 0 et 1, cette matrice doit tre convertie en type
logique par la commande logical pour servir lindexation.
>> x(index)
??? Subscript indices must either be real positive integers
or logicals.
Chapitre 5
158
>> index=logical(index)
index =
1
1
0
0
0
1
Bien quayant les valeurs 0 et 1, le type de cette matrice nest pas numrique.
>> isnumeric(index)
ans =
0
Le type logique des lments de cette matrice est dtermin par la commande
islogical.
>> islogical(index)
ans =
1
Les valeurs de la matrice x, indexes par la matrice index sont :
>> x(index)
ans =
1
8
3
Nous retrouvons bien les valeurs des index spcifis.
0
0
1
159
Matrice nulle
Matrice nulle rectangulaire
>> zero = zeros(2,3)
zero =
0
0
0
0
0
0
Matrice unit
Matrice unit rectangulaire
>> un = ones(2,3)
un =
1
1
1
1
1
1
Matrices alatoires
On peut gnrer des matrices alatoires dont les lments sont distribus normalement avec
une moyenne nulle et une variance unit l'aide de la commande randn(m,n). Pour une
distribution uniforme, on utilisera la commande rand(m,n). Les paramtres m et n
dsignent respectivement le nombre de lignes et de colonnes. Les instructions suivantes
gnrent 2 matrices alatoires, A_uni et A_norm dont les lments sont respectivement
distribus uniformment et normalement.
>> n = 500; A_normale = randn(n); A_uniforme = rand(n);
Trac des histogrammes des distributions obtenues
Distribution normale
>> n_classes = 100; hist(A_normale(:),n_classes)
>> title('Distribution normale')
Distribution normale
9000
8000
7000
6000
5000
4000
3000
2000
1000
0
-5
-4
-3
-2
-1
Chapitre 5
160
On vrifie bien que la moyenne de la distribution est nulle et que sa variance est gale 1.
>> mean(A_normale(:))
ans =
-0.0041
>> std(A_normale(:))^2
ans =
1.0004
Si l'on dsire une distribution normale de moyenne m et de variance 2, on oprera la
transformation suivante :
A_norm2 = A_norm* + m
Exemple :
Distribution normale de 1000 lments de moyenne 5 et de variance 4
>>
>>
>>
>>
A_norm2 = randn(1,1000)*0.5+5;
n_classes = 100;
hist(A_norm2,n_classes)
title('Distribution normale de moyenne 5, variance 0.25')
Distribution normale (moyenne 5 et variance 0.25)
45
40
35
30
25
20
15
10
5
0
3.5
4.5
5.5
6.5
Distribution uniforme
La commande rand donne une distribution uniforme de valeurs entre 0 et 1 avec une
moyenne de 1/2 et une variance de 1/12.
161
>> mean(A_uni(:))
ans =
0.4999
>> std(A_uni(:))^2
ans =
0.0827
Si l'on dsire une distribution uniforme sur un intervalle [a, b], on oprera la
transformation suivante :
A_uni2 = (b-a)*A_uni + a
Exemple : distribution uniforme de 10000 lments sur l'intervalle [-2 3]
>>
>>
>>
>>
>>
a = -2; b = 3;
A_uni2 = (b-a)*rand(1,10000)+a;
n_classes = 50;
hist(A_uni2,n_classes)
title('Distribution uniforme sur l''intervalle [-2 3]')
>> mean(A_uni2)
ans =
0.5169
>> std(A_uni2)^2
ans =
2.0804
Distribution uniforme sur l'intervalle [-2 3]
250
200
150
100
50
0
-2
-1.5
-1
-0.5
0.5
1.5
2.5
Chapitre 5
162
Carr magique
La commande magic(n) cre une matrice carre d'ordre n dont les lments prennent
les valeurs allant de 1 n2. La somme des lments de chaque ligne ou de chaque colonne
donne le mme nombre.
>> magic4 = magic(4)
magic4 =
16
2
3
5
11
10
9
7
6
4
14
15
13
8
12
1
34
34
>> sum(magic4')
ans =
34
34
34
34
Matrice de Pascal
C'est une matrice d'entiers naturels, dfinie positive, symtrique, construite partir du
triangle de Pascal.
Matrice de Pascal carre d'ordre 4
>> pasc_mat1 = pascal(4)
pasc_mat1 =
1
1
1
1
1
2
3
4
1
3
6
10
1
4
10
20
>> inv(pasc_mat1)
ans =
4.0000
-6.0000
-6.0000
14.0000
4.0000 -11.0000
-1.0000
3.0000
4.0000
-11.0000
10.0000
-3.0000
-1.0000
3.0000
-3.0000
1.0000
163
0
0
0
4
Matrice Compagnon
Si p dsigne un polynme de degr n, la commande compan(p) cre une matrice dite
compagnon d'ordre n-1, dont p est le polynme caractristique (les racines de p sont
gales ses valeurs propres).
>> p = [1
p =
1
2 -1]
2
-1
Chapitre 5
164
D'autres commandes telles que hankel, hilb, toeplitz, vander, etc. permettent
respectivement la gnration des matrices de Hankel, Hilbert, Toeplitz et de
Vandermonde.
1
2
1
1
1
1
Dcomposition QR
La fonction qr produit la dcomposition QR d'une matrice A :
A = Q * R
R :
Q :
0.6344
-0.5639
0.5287
-0.7253
-0.1978
0.6594
-9.0869
4.0532
0
165
-8.5524
3.2778
-5.0113
Dcomposition de Schur
Toute matrice carre A peut s'crire :
A = U * T * U'
U :
T :
matrice unitaire,
matrice triangulaire suprieure.
3 -5];
-0.0874
-0.1947
0.9770
-4.2882
5.5319
-6.9114
0.6022
-0.7983
0.7983
0.6022
S =
5.8549
0
0
4.4407
0.9903
0.1387
-0.1387
0.9903
V =
Chapitre 5
166
Factorisation triangulaire LU
Pour toute matrice carre rgulire A, on peut crire la dcomposition suivante :
P * A = L * U
U :
L :
P :
; 3 5 6];
0
0
1.0000
6.0000
0.0000
1.0000
167
>> x=randn(8) ;
On dcide, pour la rendre creuse, de ne garder que les valeurs suprieures 1 et de
remplacer toutes les autres par 0.
>> x=x.*(x>1)
Toutes les oprations et fonctions matricielles MATLAB peuvent s'appliquer aux matrices
creuses. Les oprations sur les matrices creuses retournent des matrices creuses.
Pour obtenir la matrice pleine on utilisera la fonction full.
>> x_pleine = full(x_creuse);
On peut transformer la matrice pleine originelle en une matrice creuse par la commande
sparse, qui renvoie la liste des lments non nuls avec leurs indices.
L'excution de la commande whos permet d'observer l'occupation mmoire des variables
x_creuse et x_pleine. Nous proposons ci-dessous un extrait du rsultat de cette
commande.
>> whos
Name
x
x_creuse
x_pleine
Size
8x8
8x8
8x8
Bytes
512
156
512
Class
Attributes
double
double
double
sparse
On remarque bien que la matrice creuse occupe 30% environ de l'espace mmoire
ncessaire au stockage de la matrice pleine correspondante.
Nous utiliserons la commande spy pour une visualisation graphique de la densit d'une
matrice.
>> spy(x_creuse)
>> title('Reprsentation de la matrice creuse')
Chapitre 5
168
Reprsentation de la matrice creuse
0
1
2
3
4
5
6
7
8
9
4
5
nz = 16
Le nombre dlments non nuls, est nz=16 sur les 64 lments de la matrice originale.
Les commandes nnz et nonzeros donnent respectivement le nombre d'lments non
nuls d'une matrice et la liste de ces valeurs.
Pour tester si une matrice est creuse, on dispose de la commande issparse qui retourne
1 dans ce cas et 0 dans le cas contraire.
>> issparse(x_creuse)
ans =
1
Nous disposons d'autres commandes et fonctions pour la manipulation de matrices creuses.
spfun('fonction',x_creuse) applique la fonction donne aux seuls lments non
nuls de x_creuse.
>> exp(x_creuse)
ans =
(1,1)
1.0000
(2,1)
1.0000
(3,1)
1.0000
(4,1)
1.0000
(5,1)
1.0000
(6,1)
1.0000
(7,1)
2.8815
(8,1)
1.0000
(1,2)
1.0000
(2,2)
1.0000
Lexponentielle est ici applique tous les lments, y compris ceux qui sont nuls.
169
>> spfun('exp',x_creuse)
ans =
(7,1)
(5,2)
(6,4)
(8,4)
(8,5)
(3,6)
(7,6)
(3,7)
(4,7)
(5,7)
(5,8)
(6,8)
2.8815
3.7065
3.6421
3.6000
2.9562
3.8171
5.0518
5.6728
6.9411
5.1298
2.9508
10.7258
Dans ce cas, la fonction exp n'est applique qu'aux seuls lments non nuls, comme le
montre laffichage prcdent.
Nous disposons de plusieurs mthodes pour la gnration de matrices creuses.
Matrice creuse identit
>> speye(4)
ans =
(1,1)
(2,2)
(3,3)
(4,4)
1
1
1
1
sprandn(x_creuse)
sprandsym(n,densite)
>> sprandn(x_creuse)
ans =
(1,1)
(4,1)
(2,2)
(5,3)
(4,4)
-0.8654
-0.8087
-1.6858
0.3582
-0.6719
Chapitre 5
170
(2,5)
(3,5)
(6,6)
(7,7)
(4,8)
(8,8)
(9,9)
(10,10)
-1.0210
2.4989
-0.6320
0.7838
0.2405
-1.4705
0.3349
1.5990
>> mr = sprandsym(50,0.3);
>> spy(mr)
>> title('Matrice creuse symtrique alatoire')
0
5
10
15
20
25
30
35
40
45
50
0
10
20
30
nz = 653
40
50
La saisie d'une matrice creuse peut se faire en indiquant seulement les lments non nuls
de la matrice originelle, par l'intermdiaire de la fonction sparse qui obit la syntaxe :
sparse(i,j,s,m,n)
i et j sont des vecteurs qui contiennent les indices lignes et colonnes des lments non
nuls, dont les valeurs sont donnes par le vecteur s.
Si n et m ne sont pas spcifis, la matrice obtenue a pour nombre de lignes la valeur
maximale de i et pour nombre de colonnes la valeur maximale de j.
Considrons la matrice suivante dont la saisie sera ralise dans le fichier sparse1.m.
171
fichier sparse1.m
i = [4 8 10 2 3 6 8 4 7]; j = [1 1 2 5 5 5 6 9 10];
s=[-17.70 -16.55 19.56 17.39 -15.87 -15.55 -23.59 -17.55
17.87];
% taille matrice, n lignes et m colonnes
n = 10;
m = 10;
m_creuse = sparse(i,j,s,n,m)
>> sparse1
m_creuse =
(4,1)
(8,1)
(10,2)
(2,5)
(3,5)
(6,5)
(8,6)
(4,9)
(7,10)
-17.7000
-16.5500
19.5600
17.3900
-15.8700
-15.5500
-23.5900
-17.5500
17.8700
VII. Applications
VII.1. Moyenne et variance d'une srie de mesures
On dispose des 5 mesures suivantes dont on dsire calculer la moyenne et la variance :
.
[112
105
.
125
.
126
.
139
. ]
2 =
1 n
( x m) 2
n 1i = 1 i
0.0460
0.1760
>> x2 = x_centre.^2
x2 =
0.0088
0.0269
0.0021
0.0310
0.0013
172
Chapitre 5
somme_x2 =
0.0701
>> var = somme_x2/(length(x)-1)
var =
0.0175
On peut rduire le nombre d'instructions par composition de commandes.
>> var = sum((x-moy_x).^2)/(length(x)-1);
Pour rcuprer la moyenne et la variance, il suffit d'invoquer les noms des variables, soit
individuellement, soit dans un tableau.
>> mv = [moy_x var]
mv =
1.2140
0.0175
Nous voyons ici toute la puissance de MATLAB par rapport aux langages dits volus tels
Pascal ou C pour lesquels nous avons besoin de 2 boucles, une pour le calcul de la
moyenne et l'autre pour celui de la variance.
MATLAB facilite encore plus la programmation dans la mesure o beaucoup de fonctions
sont dj prdfinies ; la moyenne et la variance sont directement accessibles en utilisant
les fonctions mean et std.
>> moy = mean(x)
moy =
1.2140
>> variance = std(x)^2
variance =
0.0175
D'autres fonctions statistiques permettent de calculer la mdiane, les valeurs minimale et
maximale d'une srie de valeurs.
>> [min(x) max(x) median(x)]
ans =
0
8
2
VII.2. Drive d'une fonction
La fonction diff applique un tableau x de taille n donne un tableau de taille (n-1)
dont chaque lment correspond la diffrence de deux lments successifs de x.
>> x = [0 3 8 1];
>> diff(x)
ans =
3
5
-7
173
Cette fonction peut tre utilise pour le calcul de la drive d'une fonction mathmatique
f(x) par la formule suivante :
f'(x) = df/dx = diff(f)./diff(x)
Le programme suivant, illustre le calcul et le trac de la courbe reprsentative de la drive
de la fonction f(x) = x2-1.
fichier derivee.m
clc, clear all, close all
% drive de la fonction f(x) = x^2-1
x = -1:.01:1;
% intervalle de la variable x
f = x.^2-1; % fonction driver
plot(x,f); % trac de la fonction f(x)
hold on
dx = diff(x);
% incrments dx de la variable x
df = diff(f);
% incrments df de la fonction f(x)
df_dx = df./dx; % drive de f(x)
% le vecteur f' possde un lment de moins que f
plot(x(1:length(x)-1),df_dx,':')
axis([-1 1 -2 2])
gtext('f(x)')
% lgende de la courbe de f(x)
gtext('f''(x)') % lgende de la courbe de f'(x)
title('Fonction f(x) = x^2-1 et sa drive f''(x)'), grid
Fonction f(x) = x 2-1 et sa drive f'(x)
2
1.5
1
0.5
0
f'(x)
-0.5
-1
f(x)
-1.5
-2
-1
-0.8
-0.6
-0.4
-0.2
0
0.2
abscisse x
0.4
0.6
0.8
Chapitre 5
174
La fonction f ( x )= x 2 1 peut tre reprsente par le polynme p suivant :
>> p = [1 0 -1];
L'valuation du polynme sur l'ensemble des valeurs, donn par le vecteur x, est ralise
par la fonction polyval.
>> polyval(p_deriv,x)
ans =
2
4
VII.3. Calcul d'intgrales
x
I ( x) = f (t ) dt
1
Nous nous intresserons au cas o f (t ) = t , dont le rsultat thorique est :
On cherche calculer les intgrales de la forme suivante :
t2
I ( x) =
2
x2 1
2
Pour calculer cette intgrale l'aide de MATLAB, on peut utiliser la mthode des
rectangles qui consiste approcher l'aire sous la courbe par celle des rectangles de
longueur f(x) et de largeur dx (le pas d'intgration). La valeur de l'intgrale dans
l'intervalle [a,b] est la somme cumule des surfaces des rectangles lmentaires. La
somme cumule est ralise par la fonction cumsum.
La valeur obtenue par cette mthode est d'autant plus proche de la valeur thorique que le
pas d'intgration est plus faible. Dans cet exemple, ce pas vaut 0.001.
fichier integ.m
clear all, close all, clc
dx = 0.001; % pas d'intgration
a = -1; b = 1; % limites du domaine d'intgration
x = a:dx:b; y = x;
g = cumsum(y.*dx); % somme cumule des aires des rectangles
% trac de l'intgrale
plot(x,g), hold on
% trac de la fonction y = f(x)
plot(x,y,'-.'), grid, gtext('y = x'), gtext('intgrale de y')
title('fonction y = x et son intgrale'), hold off
175
fonction y = x et son intgrale
1
0.8
0.6
0.4
0.2
y=x
0
-0.2
-0.4
-0.6
intgrale de y
-0.8
-1
-1
-0.8
-0.6
-0.4
-0.2
0.2
0.4
0.6
0.8
x1 2 x2 = 3
Chapitre 5
176
X = inv(A)*B;
disp('Solutions:')'
disp(['x1 = ',num2str(X(1)),' et x2 = ',num2str(X(2))])
>> systlin
Solutions :
x1 = 1 et x2 = 2
Les solutions peuvent tre obtenues par la mthode des moindres carrs en utilisant la
fonction nnls.
>> x = nnls(A,B)
x =
1.0000
2.0000
VII.5. Rsolution d'un systme sous-dimensionn ou indtermin
C'est le cas o le nombre d'inconnues est suprieur celui des quations. Considrons le
cas de l'exemple suivant :
2 x + x 3 x =1
1
2
3
x1 2
x2 + x3 = 2
1
2
x
3 1 1
x =
1 2 2
x 3
Un tel systme possde une solution si le rang de la matrice A est gal celui de la matrice
augmente Ab.
La matrice Ab est forme de la matrice A laquelle on ajoute une quatrime colonne
forme des composantes du vecteur b.
Matrices du systme
>> A = [2 1 -3;1 -2 1];
>> b = [1;2];
177
Ab =
2
1
1
-2
-3
1
1
2
0.7333
-0.6667
-0.0667
Si une matrice est carre et inversible, alors son inverse est identique sa pseudo-inverse.
VII.6. Rgression linaire
Chapitre 5
178
y en fonction de x
10
6
y non bruite
4
y bruite
2
-2
bruit gaussien
-4
0
8
10
12
Valeurs de la srie x
14
16
18
20
y (1) x (1) 1
y (2) x (2) 1
a
. = .
.
b
.
. .
y (21) x (21) 1
que l'on note :
Y=
Le vecteur optimal des paramtres qui minimise la variance de l'erreur entre les mesures et
le modle est donn par :
= ( ) 1 Y
179
teta = inv(phi'*phi)*phi'*Y;
a = teta(1,1);
b = teta(2,1);
disp(['paramtres : a = 'num2str(a) 'b = ' num2str(b)]);
a =
0.4653
b =
2.0187
Trac du nuage des points de mesures et de la droite de rgression (suite fichier reg_lin.m)
close all
x = 0:20;
y = 0.5*x;
br=randn(1,21);
yb=y+br;
hold on
plot(x,yb)
grid
phi = ones(21,2);
phi(:,1) = x'; % 1-re colonne de phi = vecteur x
Y = y';
% algorithme des moindres carrs
teta = inv(phi'*phi)*phi'*Y;
a = teta(1,1);
b = teta(2,1);
gtext(['a = ' num2str(a)]);
gtext(['b = ' num2str(b)]);
ym = a*x+b;
% mesures bruites
hold on
plot(x,y,'+','LineWidth',3)
plot(x,br)
% sortie du modle
plot(x,ym,'s')
plot(x,y)
gtext('Mesures bruites')
gtext('Modle')
title('Mesures et Modle linaire'), grid on
Chapitre 5
180
Mesures et Modle linaire
12
10
Mesures bruites
8
6
a = 0.5
Modle
b = 2.3315e-015
bruit
-2
10
12
14
16
18
20
A partir des matrices X et Y, on dispose dans MATLAB, de la fonction nnls pour "non
negative least squares" permettant le calcul immdiat du vecteur des paramtres
du modle par la mthode des moindres carrs.
Le coefficient b du modle linaire tant trs faible (2.33 10-15), le signal non bruit est
confondu avec celui du modle obtenu par la commande nnls des moindres carrs.
VII.7. Rgression non linaire
0.1
0.2
0.5
1.0
1.5
1.9
2.0
3.0
4.0
6.0
0.95
0.89
0.79
0.70
0.63
0.58
0.56
0.45
0.36
0.28
y=Ae
Bx
Les coefficients A et B, calculs par la mthode de Newton, sont donns par les relations
suivantes :
[ x ln y ] x [ln y / n]
(e B x / y)
B=
A=
2B x / y 2 )
2
2
x ( x) / n
(e
En utilisant les fonctions propres aux vecteurs, nous allons calculer les valeurs des
coefficients A et B. Nous tracerons sur un mme graphique, la courbe des donnes relles
et celle du modle exponentiel obtenu.
181
fichier ajustexp1.m
x = [0.1 0.2 0.5 1.0 1.5 1.9 2.0 3.0 4.0 6.0];
y = [0.95 0.89 0.79 0.70 0.63 0.58 0.56 0.45 0.36 0.28];
n = length(x);
B=(sum(x.*log(y))-sum(x)*sum(log(y)/n))/(sum(x.^2)sum(x)^2/n);
A = sum(exp(B*x)./y)/sum(exp(2*B*x)./y.^2);
ym = A*exp(B*x);
% modle
% trac des donnes relles et du modle
close all, clc
plot(x,y), hold on, plot(x,y,'s'), plot(x,ym,'-.')
title('Mesures relles et ajustement exponentiel')
xlabel('abscisse x')
gtext('donnes relles')
gtext('modle'
grid
>> A
A =
0.8795
>> B
B =
-0.2080
Mesures relles et ajustement exponentiel
1
0.9
0.8
0.7
0.6
modle
0.5
donnes relles
0.4
0.3
0.2
3
abscisse x
Chapitre 5
182
Le modle linaris est : ln y=ln A+ B x . Ce modle appliqu toutes les donnes donne le
systme matriciel suivant :
ln y (1) 1 x (1)
ln y (2) 1 x (2)
ln A
. = .
.
B
.
. .
ln y (10) 1 x (10)
que l'on note :
Y=
Le vecteur paramtres est obtenu par :
= ( )1 Y
fichier ajstexp2.m
x = [0.1 0.2 0.5 1.0 1.5 1.9 2.0 3.0 4.0 6.0];
y = [0.95 0.89 0.79 0.70 0.63 0.58 0.56 0.45 0.36
0.28]+0.05*rand(size(x));
% construction de la matrice de mesures phi
phi = [ones(length(x),1) x'] ; b = log(y);
Y = b' % vecteur Y
% calcul du vecteur teta optimal
teta = inv(phi'*phi)*phi'*Y;
% extraction des coefficients A et B du modle exponentiel
A = exp(teta(1,1)); B = teta(2,1);
ym = A*exp(B*x) % modle exponentiel
% trac des donnes relles et du modle
plot(x,y), hold on, plot(x,y,'s'),plot(x,ym,'-.'), grid
gtext('donnes relles'), gtext('modle')
Donnes relles et modle exponentiel
1
0.9
0.8
0.7
0.6
modle
0.5
donnes relles
0.4
0.3
0.2
3
abscisse x
183
>> A
A =
0.9180
>> B
B =
-0.1972
ln yi = ln A + B xi
fi = 1 + 2 xi
fichier ajstexp3.m
x = [0.1 0.2 0.5 1.0 1.5 1.9 2.0 3.0 4.0 6.0];
y = [0.95 0.89 0.79 0.70 0.63 0.58 0.56 0.45 0.36 0.28];
% construction de la matrice de mesures phi
f = log(y);
num_teta1 = det([sum(f) sum(x);sum(x.*f) sum(x.^2)]);
den_teta1 = det([length(x) sum(x);sum(x) sum(x.^2)]);
teta1 = num_teta1/den_teta1;
num_teta2 = det([length(x) sum(f);sum(x) sum(x.*f)]);
den_teta2 = den_teta1; teta2 = num_teta2/den_teta2;
% extraction des coefficients A et B du modle
A = exp(teta1); B = teta2;
% calcul sortie du modle
ym = A*exp(B*x);
% trac des donnes relles et du modle
plot(x,y), hold on, plot(x,ym,'-.'), grid
gtext('donnes relles'), gtext('modle')
>> A
A =
0.8835
>> B
B =
-0.2080
Chapitre 5
184
1
0.9
0.8
0.7
modle
0.6
0.5
donnes relles
0.4
0.3
0.2
Chapitre 6
Les graphiques
I. Les graphiques 2D
I.1. Graphiques en coordonnes cartsiennes
I.2. Graphiques en coordonnes polaires
I.3. Les diagrammes
II. Les graphiques 3D
II.1. Courbes 3D
II.2. Surfaces
II.3. Les contours
II.4. Volumes et surfaces de rvolution
II.5. Apparence des graphiques 3D
III. Autres fonctionnalits graphiques
IV. Gestion des handles et objets graphiques
V. Les animations
MATLAB, outre de permettre de faire des calculs numriques de trs haut niveau, il peut
aussi produire des graphiques impressionnants, de type 2D ou 3D.
Beaucoup doutils sont disponibles, notamment les handle Graphics (pointeurs sur
les graphiques) pour contrler les aspects de ces graphiques.
Chaque lment du graphique peut-tre modifi individuellement grce lapproche Objet
(ligne, surface, axes, figure, etc.) selon la hirarchie suivante :
Pour avoir un bref aperu des possibilits graphiques de MATLAB, on a accs des dmos
de graphiques.
>> demo matlab graphics
Chapitre 6
186
I. Les graphiques 2D
Dans cette section, nous prsenterons les diffrentes fonctions MATLAB prvues pour le
trac de graphiques 2D. Nous tudierons les graphiques en coordonnes cartsiennes et
polaires ainsi que les tracs de diagrammes.
I.1. Graphiques en coordonnes cartsiennes
La commande plot dont la syntaxe est la suivante :
plot(x,y,s)
permet de tracer des graphiques de vecteurs de dimensions compatibles (y en fonction de
x). Le choix du type et de la couleur du trac peut se faire avec le paramtre facultatif s qui
est une chane compose de 1 3 caractres parmi ce qui suit :
Les diffrents types sont :
.
o
x
+
*
s
v
^
<
>
p
h
point
cercle
Lettre x
plus
toile
carr
losange
triangle
triangle gauche
triangle droit
pentagramme
hexagramme
bleu
vert
rouge
cyan
magenta
jaune
noir
blanc
Les graphiques
187
Si a est une constante, toutes les valeurs de y sont traces verticalement cette mme
valeur de labscisse.
>> a=1;
>> plot(a,y,'b*')
La commande plot(y) trace y en fonction de ses indices.
Si lont veut un trac continu en mettant des carrs aux diffrents points, nous utilisons la
commande suivante :
>> plot(x,y,'g-',x,y,'rs')
La commande plot retourne un pointeur sur la ligne. Les proprits de cet objet (ligne ou
courbe du trac) peuvent tre spcifies directement dans la commande plot.
>> plot(x,y,'LineWidth',2,'Color',[.6 0 0])
>> plot(x,y,'--rs','LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
'MarkerSize',10)
Pour ajouter des grilles, on fait appel la commande :
>> grid
La commande title ajoute un titre au graphique de la fentre courante. Les proprits du
titre peuvent tre fixes en utilisant ses handles (pointeurs) ou directement par :
title('texte du titre', 'prop1', val_prop1, 'prop2',
val_prop2, ...)
Pour consulter la liste des proprits et leurs valeurs possibles, il est conseill de consulter
la section "Gestion des handles et objets graphiques" de ce mme chapitre. Nous pouvons,
de plus, utiliser les caractres LateX en prcdant le caractre par un anti-slash.
Chapitre 6
188
0.8
3 e
-sqrt( )
0.6
0.4
2
sin(sqrt( + ))/sqrt( + )
0.2
-0.2
-0.4
Si lon veut insrer un texte explicatif sur le graphique nous avons les commandes text et
gtext. La commande text linsre partir du point de coordonnes x0, y0
text(x0,y0,'texte explicatif')
Il est possible aussi de placer du texte un endroit quelconque du graphique slectionn
par l'utilisateur l'aide de la souris, grce la commande gtext.
>> gtext('Sinus cardinal entre -2\pi et 2\pi')
Les graphiques
189
La fonction plot retourne une liste de pointeurs (handles) sur les diffrentes courbes
du graphique (un pointeur par courbe), pour une utilisation ventuelle des fonctions de bas
niveau.
Dans le cas du trac d'une seule courbe, nous obtenons un seul pointeur comme suit :
>> h = plot(x,y)
h =
171.0093
Si x et y sont des matrices n lignes et m colonnes, plot(x,y) cre m courbes. Chaque
courbe reprsente la i-me colonne de y en fonction de la i-me colonne de x. Il est
possible aussi de tracer plusieurs courbes en utilisant une seule fois la fonction plot
comme suit :
plot(x1, y1, s1, x2, y2, s2, ...)
La commande figure(gcf) permet de passer de la ligne de commande la fentre
graphique courante. L'utilisation des commandes hold on permet le trac de plusieurs
courbes sur le mme graphique. La commande hold off supprime cette possibilit.
Ci-aprs, nous traons le sinus cardinal en utilisant les commandes prcdentes.
fichier trace_sinus_cardinal.m
x=0:pi/10:2*pi; y=sinc(x);grid
plot(x,y,'LineWidth',2,'Color',[.6 0 0])
plot(x,y,'--rs','LineWidth',2,'MarkerEdgeColor','k',...
'MarkerFaceColor','g','MarkerSize',10), grid
title('Sinus cardinal entre 0 et
2\pi','color','b','FontName','Arial','Fontsize',14)
xlabel('Angle : 0 2*pi par pas de \pi/10')
1.2
0.8
0.6
0.4
0.2
-0.2
2
3
4
5
Angle : 0 2*pi par pas de /10
Chapitre 6
190
Exemples de courbes
Dans ce qui suit, nous proposons le trac des courbes des fonctions sinus cardinal et sinus
amorti dans une mme fentre graphique. Un texte explicatif sera insr cot de chacune
d'elles.
fichier courbes.m
x = -4*pi:pi/10:4*pi;
% sinus cardinal en trait rouge continu
y1 = sinc(x/2);
plot(x,y1,'r')
hold on
% sinus amorti en pointills, couleur verte
y2 = sin(x).*exp(-0.1*x)/3 ;
plot(x,y2,'g:');
% documentation du graphique
xlabel('abscisse x')
ylabel('ordonne y')
title('Courbes des fonctions sinus cardinal et sinus amorti')
% Insertion du texte explicatif
txt_x = [-10 ; 2]; txt_y = [1 ; 0.8];
txt_val = ['sinus amorti ' ; 'sinus cardinal'];
text(txt_x,txt_y,txt_val); grid
Courbes des fonctions sinus cardinal et sinus amorti
1.2
1
sinus amorti
0.8
sinus cardinal
sinus amorti
sinus cardinal
ordonne y
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-15
-10
-5
0
abscisse x
10
15
Les graphiques
191
0.5
-0.5
-1
-1.5
-1.5
-1
-0.5
0
x
0.5
1.5
Chapitre 6
192
90
120
0.5
0.4
60
0.3
150
30
0.2
0.1
180
210
330
240
300
270
Comme exemple, nous gnrerons un vecteur de taille 1000 dont les composantes sont les
valeurs d'une variable alatoire gaussienne, centre et rduite. Nous reprsenterons
l'histogramme de ces valeurs rparties en dix classes.
>> y = randn(1000,1); >> hist(y,10);
>> grid, title('Histogramme d''une rpartition en 10
classes')
Les graphiques
193
Histogramme d'une rpartition en 10 classes
300
250
200
150
100
50
0
-4
-3
-2
-1
0.8
0.6
0.4
0.2
-0.2
-8
-6
-4
-2
Chapitre 6
194
>> stairs(x,y), grid
>> title('Trac en escalier de valeurs discrtes')
Trac en escalier de valeurs discrtes
1.2
0.8
0.6
0.4
0.2
-0.2
-8
-6
-4
-2
0.8
0.6
0.4
0.2
-0.2
-8
-6
-4
-2
Les graphiques
195
On peut tracer plusieurs courbes dans la mme fentre graphique grce la commande
subplot.
H = subplot(m,n,p), ou subplot(mnp), transforme la fentre en matrice m-par-n
et slectionne le p-ime axe pour la courbe courante.
>> subplot(231)
>> plot(x,y)
,
>> z=sin(x);
>> subplot(2,3,6)
>> plot(x,z)
La fonction subplot(231) slectionne laxe n1 et trace dessus le sinus cardinal.
Lautre subplot le fait pour le sinus avec subplot(2,3,6).
La commande plotyy permet de tracer 2 courbes sur la mme figure, avec chacune
delles laffichage de ses ordonnes particulires.
>> x=0:pi/10:2*pi;
>> y=sinc(x);
>> z = cos(x).^2;
>> plotyy(x,y,x,z)
Chapitre 6
196
>> title('Trac avec 2 axes d''ordonnes diffrents')
0.5
-2
0
7
On peut tracer des courbes en chelles logarithmiques avec loglog, ou semilogarithmiques avec semilogx, semilogy.
Les graphiques
197
x = 2*sin(t);
y = 2*cos(t);
z = 2*t;
plot3(x,y,z)
% documentation du graphique
title('Hlice circulaire')
grid
xlabel('x')
ylabel('y')
zlabel('z')
Hlice circulaire
40
20
0
-20
-40
2
1
2
1
-1
y
-1
-2
-2
II.2. Surfaces
Soit l'exemple d'une fonction 2 variables :
z = x2 + y2
pour x et y variant de -10 10 avec un pas de 0.5.
>> x = - 10:0.5:10;
>> y = x;
Chapitre 6
198
Un quadrillage, un titre et des lgendes sur les axes ajoutent plus de lisibilit au graphique.
>>
>>
>>
>>
>>
grid
title('Parabolode')
xlabel('x')
ylabel('y')
zlabel('z')
Parabolode
200
150
100
50
0
10
5
10
5
-5
y
-5
-10
-10
MATLAB propose plusieurs autres commandes pour le trac de surfaces telles meshz,
meshc, surf, surfc et surfl.
La commande meshc, de mme syntaxe que mesh, trace une surface avec une projection
des contours sur le plan (Ox, Oy).
Elle est la combinaison des commandes mesh et contour.
Les graphiques
199
meshc(X,Y,Z), grid
title('Parabolode avec contours')
xlabel('x')
ylabel('y')
label('z')
200
150
100
50
0
10
5
10
5
-5
y
-5
-10
-10
Avec la commande meshz, de mme syntaxe que mesh, nous pouvons tracer une surface
avec des plans de rfrences aux limites de chaque axe.
Une application l'exemple prcdent donne ce qui suit :
>>
>>
>>
>>
>>
>>
meshz(X,Y,Z)
grid
title('Parabolode avec des plans de rfrences')
xlabel('x')
ylabel('y')
zlabel('z')
La figure suivante reprsente le mme parabolode que prcdemment, cette fois-ci limit
par des plans aux valeurs de 10 pour les axes x et y.
Chapitre 6
200
Parabolode avec des plans de rfrences
200
150
100
50
0
10
5
10
5
-5
y
-5
-10
-10
Les commandes surf, surfc et surfl ont une syntaxe analogue celle de mesh,
cependant, on obtient une surface colorie au lieu d'une reprsentation en "fil de fer".
Nous allons prsenter un exemple d'utilisation des commandes surf et surfc qui
possdent une syntaxe analogue celle de mesh.
fichier surf_3d.m
% Trac de la surface z = x^2 - 3y^2
x = - 10:2:10; y = x;
[X,Y] = meshgrid(x,y);
Z = X.^2 - Y.^2;
% sans contours : surf
figure(1)
surf(X,Y,Z) grid
title('Surface sans contours')
xlabel('x'), ylabel('y'), zlabel('z')
% avec contours : surfc
figure(2)
surfc(X,Y,Z)
grid
title('Surface avec contours')
xlabel('x'), ylabel('y'), zlabel('z')
Les graphiques
201
Surface avec contours
100
50
0
-50
-100
10
5
10
5
-5
y
-5
-10
-10
Avec les fonctions de trac de surfaces nous avons abord la possibilit de visualiser une
projection des contours de la surface sur le plan (Ox, Oy). MATLAB fournit, de plus, des
fonctions spciales de dessin de contours.
Ces fonctions sont contour3, contour et contourc dont nous prsentons des
exemples.
La commande contour3 a pour syntaxe gnrale :
[C, H] = contour3(x,y,z,N)
C :
H :
N :
>> x = - 10:0.5:10;
>> y = x;
>> [X,Y] = meshgrid(x,y);
Chapitre 6
202
>>
>>
>>
>>
>>
>>
>>
Z = X.^2 + Y.^2;
contour3(X,Y,Z,20)
title('Lignes de contours d''un parabolode')
grid
xlabel('x')
ylabel('y')
zlabel('z')
200
150
100
50
0
10
5
10
5
-5
y
-5
-10
-10
contour(X,Y,Z)
title('Projection d''un parabolode sur le plan (Ox, Oy)')
grid
xlabel('x')
ylabel('y')
La figure suivante prsente la projection des contours sur le plan (Ox, Oy).
Les graphiques
203
Projection d'un parabolode sur le plan (Ox, Oy)
10
8
6
4
2
0
-2
-4
-6
-8
-10
-10
-8
-6
-4
-2
0
x
10
Cylindres
La gnration d'une surface de rvolution d'axe Oz et ayant comme gnratrice une courbe
R = f(x) se fera l'aide de la fonction cylinder selon la syntaxe suivante :
[x,y,z] = cylinder(R,N)
R :
N :
Chapitre 6
204
1
0.8
0.6
0.4
0.2
0
2
1
2
1
-1
y
-1
-2
-2
Sphres
Les graphiques
205
Sphre de rayon unit, N = 20
1
0.5
0
-0.5
-1
1
0.5
1
0.5
-0.5
-0.5
-1
-1
Volumes
La commande slice offre la possibilit de tracer des plans de coupes d'un volume.
slice(X, Y, Z, XI, YI, ZI, N)
X, Y, Z :
XI, YI, ZI :
N :
Chapitre 6
206
plans de coupes d'un volume
0
-1
-2
2
1
2
1
-1
-1
-2
-2
Dans MATLAB, il est possible de spcifier un "point de vue" pour un graphique 3D. Les
angles de vue, fixs par l'utilisateur l'aide de la fonction view, sont exprims en
coordonnes sphriques. On indiquera l'azimut et l'lvation du point partir duquel on
observera le graphique en respectant les coordonnes d'origine.
z
y
Point de vue
Elevation
Azimut
Nous prsentons, dans ce qui suit, plusieurs vues du graphique de la fonction sinus cardinal
3D. Le fichier script grf_vues.m gnre les coordonnes cartsiennes des points, et la
commande vue (fichier vue.m) effectue le trac avec l'azimut et l'lvation spcifis.
fichier grf_vues.m
% Sinus cardinal 3D
Les graphiques
207
fichier vue.m
function vue(X,Y,Z, Az, Elv)
% Az
: Azimut en degrs
% Elv
: Elvation en degrs
% X,Y,Z
: Coordonnes des points
mesh(X,Y,Z)
view(Az,Elv)
txt_az =['azimut = ' num2str(Az) ' et '];
txt_elv =['lvation = ' num2str(Elv) '']
title(['Vue avec : ' txt_az txt_elv ])
grid, xlabel('x'), ylabel('y'), zlabel('z')
0.5
0
-0.5
-4
4
-2
2
0
0
2
x
-2
4
-4
Chapitre 6
208
Vue avec : azimut = 0 et lvation = 45
2
1
0.5
z
0
-1
-0.5
-2
-2
-1.5
-1
-0.5
0
x
0.5
1.5
Palette de couleurs
Une palette de couleurs ou table de couleurs est une matrice m lignes et 3 colonnes de
nombres rels compris entre 0 et 1. La i-me ligne de la table dfinit la i-me couleur en
spcifiant l'intensit des couleurs RVB.
La commande colormap(map) fixe la table "map" comme palette de couleurs
courante.
MATLAB propose un certains nombre de palettes prdfinies, mais l'utilisateur peut
dfinir ses propres tables de couleurs. Parmi les palettes prdfinies on peut citer : hsv,
gray, hot, cool, copper, pink, etc.
Nous conseillons au lecteur d'excuter les instructions suivantes pour mieux s'apercevoir
des diffrences entre les diffrentes palettes prdfinies de MATLAB. "hsv" est la palette
de couleur par dfaut.
>> x = -pi/2:pi/30:pi/2;
>> y = x;
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
[X,Y] = meshgrid(x,y);
Z = sinc(X.^2+Y.^2);
surf(X,Y,Z)
grid
colormap(hot)
colormap(gray)
colormap(pink)
colormap(copper)
colormap(cool)
colormap(hsv)
Les graphiques
209
0.5
-0.5
2
1
2
1
-1
-1
-2
-2
Zoom
La commande zoom applicable seulement aux graphiques 2D, permet de "zoomer" une
partie rectangulaire du graphique courant, slectionne l'aide du bouton gauche de la
souris. Le bouton droit annule le "zoom" prcdent.
zoom off rend inactif le "zoom" et la commande zoom out rtablit le graphique avec
ses dimensions initiales.
La commande zoom est intressante pour une lecture prcise du point d'intersection de
deux courbes comme le montre l'exemple qui va suivre.
Nous dsirons dterminer le point d'intersection des courbes des fonctions f et g dfinies
sur l'intervalle [0, 10] de la faon suivante :
x
f ( x) = e 25
g ( x ) = cos (
x
)
10
Chapitre 6
210
figure(1)
plot(x,f), hold on, plot(x,g)
grid, title('Intersection de 2 courbes')
gtext('f(x) = exp(-0.04x)'), gtext('g(x) = cos(0.1x)')
close all
% trac des 2 courbes sur l'intervalle [0, 10]
x = 0:.1:10;
f = exp(-0.04*x);
g = cos(0.1*x);
figure(1)
plot(x,f), hold on, plot(x,g)
grid, title('Intersection de 2 courbes')
gtext('f(x) = exp(-0.04x)'), gtext('g(x) = cos(0.1x)')
0.77
0.76
0.75
0.74
0.73
0.72
6.8
7.2
7.4
7.6
7.8
>> x(find(abs(f-g)<.002))
ans =
7.3000
< 7.26
Les graphiques
211
Les 2 courbes se rencontrent au point x = 7.256 et valent toutes les deux exactement
0.7481.
Rsolution graphique
La rsolution peut aussi tre faite graphiquement laide de loutil Data Curseur
menu de la fentre graphique.
close all,clc
x=6:0.01:8;
f_g=exp(-x/25)-cos(x/10);
plot(x,f_g)
grid
hold on
f=exp(-x/25); g=cos(x/10);
plot(x,f), plot(x,g)
plot(x(find((abs(f_g)<2e-4))),0,'o')
gtext('f(x)=exp(-x/25)')
gtext('f(x)=exp(-x/25)')
gtext('g(x)=cos(x/10)')
gtext('f(x)-g(x)')
gtext('f(x)-g(x)=0')
du
Chapitre 6
212
Courbes f, g et f-g
0.9
f(x)=exp(-x/25)
0.8
0.7
X: 7.26
Y: 0.7478
g(x)=cos(x/10)
0.6
0.5
0.4
0.3
0.2
f(x)-g(x)=0
0.1
f(x)-g(x)
0
-0.1
6.2
6.4
6.6
6.8
7.2
7.4
7.6
7.8
abscisse x
Les rsultats sont nanmoins moins prcis quavec lutilisation du bloc fsolve de
SIMULINK.
Le problme prcdent peut tre rsolu par la fonction ginput qui rcupre les valeurs
des abscisses et ordonnes des points slectionns sur la fentre graphique courante par
l'intermdiaire de la souris.
La syntaxe de la commande ginput est la suivante :
[x , y] = ginput(n)
x, y
n
On constate que ces valeurs sont moins prcises que celles obtenues avec la commande
zoom. La combinaison de la commande zoom et de la fonction ginput peut donner une
meilleure prcision.
Les graphiques
213
Une troisime mthode consiste en l'utilisation de la commande axis qui permet de fixer
des intervalles de visualisation des diffrents axes.
axis([xMin
xMax
yMin
yMax
zMin
zMax])
zMin et zMax ne sont pas utiliss dans le cas d'un graphique 2D.
A chaque application de la commande axis avec un choix judicieux des bornes des axes,
on amliore la prcision de l'encadrement du point d'intersection. L'application l'exemple
prcdent donne :
>> axis([6 8 0.7 0.8])
>> axis([7 7.5 0.74 0.76])
>> axis([7.2 7.3 0.74 0.76])
Intersection de 2 courbes
0.76
0.758
0.756
0.754
0.752
0.75
0.748
0.746
0.744
0.742
0.74
7.2
7.21
7.22
7.23
7.24
7.25
7.26
7.27
7.28
7.29
7.3
< 7.26
:
:
:
:
:
Avec MATLAB, il est possible de tracer plusieurs graphiques dans une mme fentre
l'aide de la commande subplot en divisant cette dernire en plusieurs zones.
214
Chapitre 6
Les graphiques
215
grid
title('surface de rvolution')
% 6-ime zone : 3,2
subplot(3,2,6)
x = randn(1000,1);
hist(x,30);
grid
title('histogramme')
surface en fil de fer
courbe paramtrique 2D
1
2000
0
-2000
10
-1
-2
-1
courbe paramtrique 3D
10
5
5
0 -5
-10 -10
0
5
-5 -5
surface de rvolution
histogramme
100
0.5
0
5
10
10
-10
10
50
0
-5 -5
0
-4
-2
Trac de fonctions
Cette expression peut tre remplace par le nom d'un fichier M (fichier de fonction) dans
lequel est programme la fonction f.
La syntaxe est la suivante :
fplot('expression', [xMin xMax])
>>
>>
>>
>>
Chapitre 6
216
La commande
fplot('expression', [xMin xMax yMIN yMAX])
-3
-2
-1
0
1
x dans l'intervalle [- ]
Les objets graphiques sont les primitives de base d'un dessin. Ces objets sont organiss
suivant une hirarchie. On y trouve l'cran correspondant la racine, les figures, les axes,
les lignes, les surfaces, les images, le texte, les contrles de l'interface graphique, et les
menus dfinis par l'utilisateur.
Chaque objet graphique possde un identificateur unique (appel pointeur, "handle" ou
poigne) qui lui est attribu lors de sa cration. Certains graphiques sont composs d'objets
multiples, chacun d'entre eux est attach un pointeur qui lui est propre.
Les graphiques
217
Tous les objets graphiques de MATLAB ont des proprits qui contrlent la faon dont ils
sont affichs l'cran. Ces proprits contiennent des informations gnrales telles que le
type de l'objet, l'objet parent, les objets enfants ainsi que des informations spcifiques au
type d'objet considr, telles que les chelles des axes et les donnes utilises pour le trac
du graphique.
A chaque cration d'un objet, un "handle" lui est associ, ainsi que des valeurs par dfaut
aux diffrentes proprits gnrales et particulires de l'objet.
On peut obtenir des informations sur les valeurs courantes des proprits d'un objet par la
commande get.
Il est possible aussi de modifier les valeurs de certaines proprits (certaines ne sont pas
modifiables par l'utilisateur), l'aide de la commande set. Un certain ensemble de
proprits est disponible pour tous les objets.
Pour consulter les valeurs de toutes les proprits d'un objet ayant pour "handle" h on
utilisera la commande get(h). La consultation des seules proprits modifiables d'un
objet de "handle" h sera ralise par set(h).
Exemples
1. Consultation des valeurs des proprits de l'cran (le "handle" de l'cran est 0)
>> get(0)
CallbackObject = []
CommandWindowSize = [45 28]
CurrentFigure = [1]
Diary = off
Chapitre 6
218
DiaryFile = diary
Echo = off
FixedWidthFontName = Courier New
Format = short
FormatSpacing = loose
Language = fr_fr.windows-1252
MonitorPositions = [ (1 by 4) double array]
More = off
PointerLocation = [1024 387]
PointerWindow = [0]
RecursionLimit = [500]
ScreenDepth = [32]
ScreenPixelsPerInch = [96]
ScreenSize = [ (1 by 4) double array]
ShowHiddenHandles = off
Units = pixels
BeingDeleted = off
ButtonDownFcn =
Children = [1]
Clipping = on
CreateFcn =
DeleteFcn =
BusyAction = queue
HandleVisibility = on
HitTest = on
Interruptible = on
Parent = []
Selected = off
SelectionHighlight = on
Tag =
Type = root
UIContextMenu = []
UserData = []
Visible = on
Police de caractres
Format daffichage des nombres
Langue utilise
Unit de mesures
Existence dun objet enfant
Pas de parent pour la racine
De lobjet (racine)
Les graphiques
219
Diary: [ on | off ]
DiaryFile
Echo: [ on | off ]
FixedWidthFontName
Format: [ short | long | shortE | longE | shortG | longG
| hex | bank | + | rational | debug | shortEng | longEng ]
FormatSpacing: [ loose | compact ]
Language
More: [ on | off ]
PointerLocation
RecursionLimit
ScreenDepth
ScreenPixelsPerInch
ShowHiddenHandles: [ on | {off} ]
Units: [ inches | centimeters | normalized | points |
pixels | characters ]
ButtonDownFcn: string -or- function handle -or- cell
array
Children
Clipping: [ {on} | off ]
CreateFcn: string -or- function handle -or- cell array
DeleteFcn: string -or- function handle -or- cell array
BusyAction: [ {queue} | cancel ]
HandleVisibility: [ {on} | callback | off ]
HitTest: [ {on} | off ]
Interruptible: [ {on} | off ]
Parent
Selected: [ on | off ]
SelectionHighlight: [ {on} | off ]
Tag
UIContextMenu
UserData
Visible: [ {on} | off ]
Ci-aprs, nous allons dcrire la syntaxe des commandes set et get avec des exemples.
Trac d'une courbe avec rcupration de son handle
>>
>>
>>
>>
>>
x = 0 :pi/100 :2*pi;
y = sinc(x);
h = plot(x,y);
grid
ht = title('sinus cardinal')
On modifie les proprits du titre la souris avec les menus de la fentre graphique (gras et
taille 14).
On insre les grilles et on spcifi une taille 2 pour lpaisseur du trait.
Chapitre 6
220
sinus cardinal
0.8
0.6
0.4
0.2
-0.2
-0.4
:
:
:
DisplayName:
Annotation:
Color:
LineStyle:
''
[1x1 hg.Annotation]
[1 0 0]
'-'
Les graphiques
LineWidth:
Marker:
MarkerSize:
MarkerEdgeColor:
MarkerFaceColor:
XData:
YData:
ZData:
BeingDeleted:
ButtonDownFcn:
Children:
Clipping:
CreateFcn:
DeleteFcn:
BusyAction:
HandleVisibility:
HitTest:
Interruptible:
Selected:
SelectionHighlight:
Tag:
Type:
UIContextMenu:
UserData:
Visible:
Parent:
XDataMode:
XDataSource:
YDataSource:
ZDataSource:
221
2
'none'
6
'auto'
'none'
[1x201 double]
[1x201 double]
[1x0 double]
'off'
[]
[0x1 double]
'on'
[]
[]
'queue'
'on'
'on'
'on'
'off'
'on'
''
'line'
[]
[]
'on'
170.0012
'manual'
''
''
''
Chapitre 6
222
FontUnits = points
FontWeight = normal
HorizontalAlignment = center
LineStyle = LineWidth = [0.5]
Margin = [2]
Position = [3.49194 1.02661 1.00011]
Rotation = [0]
String = Sinus cardinal
Units = data
Interpreter = tex
VerticalAlignment = bottom
BeingDeleted = off
ButtonDownFcn =
Children = []
Clipping = off
CreateFcn =
DeleteFcn =
BusyAction = queue
HandleVisibility = off
HitTest = on
Interruptible = on
Parent = [170.001]
Selected = off
SelectionHighlight = on
Tag =
Type = text
UIContextMenu = []
UserData = []
Visible = on
La couleur tant dfinie dans le type RVB, celle de la courbe tant bien le bleu.
>> trait = get(h,'LineStyle')
trait =
>> get(h,'Linewidth')
Les graphiques
223
ans =
2
Chapitre 6
224
Units = normalized
View = [0 90]
XColor = [0 0 0]
XDir = normal
XGrid = off
XLabel = [268.001]
XAxisLocation = bottom
XLim = [0 7]
XLimMode = auto
XMinorGrid = off
XMinorTick = off
XScale = linear
XTick = [ (1 by 8) double array]
XTickLabel =
0
1
2
3
4
5
6
7
XTickLabelMode = auto
XTickMode = auto
YColor = [0 0 0]
YDir = normal
YGrid = off
YLabel = [269.001]
YAxisLocation = left
YLim = [-0.4 1]
YLimMode = auto
YMinorGrid = off
YMinorTick = off
YScale = linear
YTick = [(1 by 8) double array]
YTickLabel =
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
YTickLabelMode = auto
YTickMode = auto
ZColor = [0 0 0]
Les graphiques
225
ZDir = normal
ZGrid = off
ZLabel = [270.001]
ZLim = [-1 1]
ZLimMode = auto
ZMinorGrid = off
ZMinorTick = off
ZScale = linear
ZTick = [-1 0 1]
ZTickLabel =
ZTickLabelMode = auto
ZTickMode = auto
BeingDeleted = off
ButtonDownFcn =
Children = [171.003]
Clipping = on
CreateFcn =
DeleteFcn =
BusyAction = queue
HandleVisibility = on
HitTest = on
Interruptible = on
Parent = [1]
Selected = off
SelectionHighlight = on
Tag =
Type = axes
UIContextMenu = []
UserData = []
Visible = on
NomProprit :
ValeurProprit :
Chapitre 6
226
0.8
0.6
0.4
0.2
-0.2
-0.4
La liste des proprits modifiables du trac peut tre obtenue avec set(h).
>> set(h)
ans =
DisplayName:
Color:
LineStyle:
LineWidth:
Marker:
MarkerSize:
MarkerEdgeColor:
MarkerFaceColor:
XData:
YData:
ZData:
ButtonDownFcn:
Children:
Clipping:
CreateFcn:
DeleteFcn:
BusyAction:
HandleVisibility:
HitTest:
{}
{}
{5x1 cell}
{}
{14x1 cell}
{}
{2x1 cell}
{2x1 cell}
{}
{}
{}
{}
{}
{2x1 cell}
{}
{}
{2x1 cell}
{3x1 cell}
{2x1 cell}
Les graphiques
Interruptible:
Selected:
SelectionHighlight:
Tag:
UIContextMenu:
UserData:
Visible:
Parent:
XDataMode:
XDataSource:
YDataSource:
ZDataSource:
227
{2x1
{2x1
{2x1
{}
{}
{}
{2x1
{}
{2x1
{}
{}
{}
cell}
cell}
cell}
cell}
cell}
La fentre graphique courante a pour "handle" gcf ; avec les commandes get et set,
on pourra afficher les valeurs ou modifier des proprits telles que :
la couleur de la fentre graphique ('Color'),
sa position ('Position') l'cran,
la palette des couleurs ('Colormap'), etc.
Par exemple, la commande suivante fixe la couleur blanche pour le fond de la fentre
graphique courante.
>> set(gcf,'color',[1 1 1])
Nous pouvons rcuprer directement les pointeurs des objets enfants des axes courants
grce au handle des axes courants, gca (get current axes).
>> get(gca,'Children')
ans =
Empty matrix: 0-by-1
h =
171.0040
ht =
172.0035
Lobjet axes est parent du titre (pointeur ht) et de la ligne du trac (pointeur h).
Les lignes suivantes permettent de rcuprer le style, la taille et le contenu du titre.
>> get(ht,'FontWeight')
ans =
bold
>> get(ht,'FontSize')
ans =
14
228
Chapitre 6
>> get(ht,'String')
ans =
Sinus cardinal
Dans les exemples suivants, nous faisons appel la gestion des handles.
fichier plot2axes.m
close all
x=1:12;
t=[4.9 6.5 9.3 8.9 9.2 15.7 19.8 21.1 20 16 11 7.6000] ;
bar(x,t)
ylabel('axe de l''histogramme')
h1=gca;
h2=axes('Position',get(h1,'Position'));
y=-0.0804*x.^3+1.11999*x.^2-2.9354*x+7.1162;
plot(x,y,'Linewidth',2)
set(h2,'YaxisLocation','right','Color','none',
'XtickLabel',[])
set(h2,'Xlim',get(h1,'Xlim'),'Layer','top')
ylabel('axe de la courbe continue')
text(2,6,'texte inclin','Rotation',35)
grid
title('Trac de 2 courbes dans 2 systmes d''axes
diffrents','FontSize',12)
Les graphiques
axe de l'histogramme
20
15
10
te
tex
15
lin
inc
10
-5
10
11
12
25
229
-10
fichier hanles_2D_Graphics.m
x = -2*pi:pi/100:2*pi; y = sin(x); z = sinc(x);
w = sin(2*x).*exp(-0.5*abs(x));
figure('Name','Etude de tracs continus','NumberTitle','off')
subplot(211)
% trac des 3 courbes la fois avec styles de traits
% diffrents
plot(x, y,'-.', x, z,'-', x,w,':')
% pointeur sur le titre
titre=title('plusieurs courbes avec une commande plot')
set(titre,'FontName','Times')
% gestion des pointeurs sur chacune des courbes
subplot(212)
h1=plot(x,y); % pointeur sur le trac y(x)
set(h1,'Linewidth',2,'Color',[1 0 0])
% pointeur sur le titre
ht=title('gestion des pointeurs des diffrentes courbes');
set(ht,'FontName','Arial','FontSize',14)
hold on
h2=plot(x,z)
230
Chapitre 6
set(h2,'Linestyle',':')
xlabel('x allant de -2\pi 2\pi par pas de \pi/100')
Les graphiques
% Create figure
figure1 = figure('PaperSize',[20.98
29.68],'NumberTitle','off',...
'Name','Etude de tracs continus');
% Create subplot
subplot1 = subplot(2,1,1,'Parent',figure1);
box(subplot1,'on');
hold(subplot1,'all');
% Create multiple lines using matrix input to plot
plot1 = plot(X1,YMatrix1,'Parent',subplot1);
set(plot1(1),'LineStyle','-.');
set(plot1(3),'LineStyle',':');
% Create title
title('plusieurs courbes avec une commande
plot','FontName','Times');
% Create subplot
subplot2 = subplot(2,1,2,'Parent',figure1);
box(subplot2,'on');
hold(subplot2,'all');
231
Chapitre 6
232
use_graphic_handles.m
figure('NumberTitle','off','Name','ma 1re figure')
x=-1:0.1:1;
Hndl=plot(x,x.^2,'LineWidth',2,'Color','r');
title('Parabole','FontName','Times','FontSize',16)
get(gcf,'children'); % proprits des axes
pause(5)
set(get(get(gcf,'children'),'children'),'Color',[0 1
0],'Linewidth',5);
Les graphiques
233
select_object.m
%
%
%
%
%
h_sin
h_sinc
h_obj
k
type
:
:
:
:
:
handle of sin
handle of sinc
handle of current object
value of waitforbuttonpress
object type
end
if upper(oui_non)=='O'
details=get(handle);
disp (details)
end
Chapitre 6
234
k =
0
type =
axes
objet de type :axes
Voulez-vous des Dtails sur
ActivePositionProperty:
ALim:
ALimMode:
AmbientLightColor:
BeingDeleted:
Box:
BusyAction:
ButtonDownFcn:
CameraPosition:
CameraPositionMode:
CameraTarget:
CameraTargetMode:
CameraUpVector:
CameraUpVectorMode:
CameraViewAngle:
CameraViewAngleMode:
Children:
CLim:
CLimMode:
Clipping:
Color:
l'objet ?o
'outerposition'
[0 1]
'auto'
[1 1 1]
'off'
'on'
'queue'
''
[0 0 17.3205]
'auto'
[0 0 0]
'auto'
[0 1 0]
'auto'
6.6086
'auto'
[2x1 double]
[0 1]
'auto'
'on'
[1 1 1]
Les graphiques
ColorOrder:
CreateFcn:
CurrentPoint:
DataAspectRatio:
DataAspectRatioMode:
DeleteFcn:
DrawMode:
FontAngle:
FontName:
FontSize:
FontUnits:
FontWeight:
GridLineStyle:
HandleVisibility:
HitTest:
Interruptible:
Layer:
LineStyleOrder:
LineWidth:
MinorGridLineStyle:
NextPlot:
OuterPosition:
Parent:
PlotBoxAspectRatio:
PlotBoxAspectRatioMode:
Position:
Projection:
Selected:
SelectionHighlight:
Tag:
TickDir:
TickDirMode:
TickLength:
TightInset:
Title:
Type:
UIContextMenu:
Units:
UserData:
View:
Visible:
XAxisLocation:
XColor:
XDir:
XGrid:
XLabel:
XLim:
XLimMode:
XMinorGrid:
XMinorTick:
XScale:
235
[7x3 double]
''
[2x3 double]
[15 1 1]
'auto'
''
'normal'
'normal'
'Helvetica'
10
'points'
'normal'
':'
'on'
'on'
'on'
'bottom'
'-'
0.5000
':'
'replace'
[0 0 1 1]
1
[1 1 1]
'auto'
[0.1300 0.1100 0.7750 0.8114]
'orthographic'
'off'
'on'
''
'in'
'auto'
[0.0100 0.0250]
[0.0929 0.0905 0.0143 0.0786]
173.0026
'axes'
[]
'normalized'
[]
[0 90]
'on'
'bottom'
[0 0 0]
'normal'
'off'
174.0026
[-15 15]
'auto'
'off'
'off'
'linear'
Chapitre 6
236
XTick:
XTickLabel:
XTickLabelMode:
XTickMode:
YAxisLocation:
YColor:
YDir:
YGrid:
YLabel:
YLim:
YLimMode:
YMinorGrid:
YMinorTick:
YScale:
YTick:
YTickLabel:
YTickLabelMode:
YTickMode:
ZColor:
ZDir:
ZGrid:
ZLabel:
ZLim:
ZLimMode:
ZMinorGrid:
ZMinorTick:
ZScale:
ZTick:
ZTickLabel:
ZTickLabelMode:
ZTickMode:
type =
line
objet de type :line
Voulez-vous des Dtails sur l'objet ?
use_graphic_handles1.m
close all, clc, clear all
x=-4*pi:pi/100:4*pi;
y=(x==0)+sin(x)./((x==0)+x);
Hndl=plot(x,y);
set(gcf,'color',[0.5 0.8
0],'NumberTitle','off','Name','modification proprits')
set(Hndl,'LineWidth',3,'Color',[1 0.8 0]);
set(gca,'Ygrid','on','YaxisLocation','right')
title('\itSinus
Cardinal','FontName','Arial','FontSize',16,'Color','b')
xlabel('Angle : \theta = [-4\pi:4\pi]', ...
'color','r','FontSize',18)
Les graphiques
237
V. Les animations
Avec MATLAB, vous pouvez crer des animations, par exemple, l'animation du trac de
courbes de fonctions ou de surfaces.
Une animation est une succession d'images dont on peut contrler la vitesse de dfilement.
La ralisation d'animations est subordonne aux capacits graphiques de votre matriel qui
doit supporter un nombre de couleurs suprieur 16.
La cration d'une animation commence par la rservation de l'espace mmoire ncessaire
aux diffrentes images ou frames. Ceci sera ralis par la commande moviein dont la
syntaxe est la suivante :
Anim = moviein(n)
Cette commande initialise la mmoire pour l'enregistrement d'une animation par la cration
d'une matrice Anim suffisamment large pour pouvoir stocker n images.
Chaque colonne de la matrice Anim correspond une image de l'animation.
Chapitre 6
238
Pour gnrer une animation dont les images contiennent la fentre graphique entire et non
seulement un graphique, on utilisera la syntaxe suivante :
Anim = moviein(n,gcf)
Une image est une photo instantane du graphique courant (axes courants). La capture des
images de l'animation se fera l'aide de la commande getframe qui retourne pour
chaque image un vecteur colonne.
Cette instruction est gnralement utilise dans une boucle for pour la construction d'une
animation.
getframe(h)
getframe(h,rect) :
Les graphiques
239
mesh(X,Y,sin(2*pi*i/5)*Z)
axis(lim)
Anim(:,i) = getframe;
end
% amortissement de la surface
% pas de changement d'axes
% capture d'une image
excute l'animation "Anim" n fois avec une vitesse de ips images par seconde (par
dfaut ips est gal 12).
>> boucles = 10;
% nombre de boucles
>> ips = 20;
% nombre d'images par seconde
>> movie(Anim, boucles, ips);
Cette commande offre d'autres possibilits comme par exemple l'excution de l'animation
dans une rgion donne de la fentre graphique.
Chapitre 7
fonction
addition de rels et de matrices
soustraction de rels et de matrices
produit de rels et de matrices
produit lment par lment de matrices
lvation une puissance de rels et de matrices
puissance lment par lment de matrices
Chapitre 7
242
\
/
./
galit
diffrent
strictement infrieur
infrieur ou gal
strictement suprieur
suprieur ou gal
ET logique (AND)
OU logique (OR)
NON logique (NOT)
OU exclusif (XOR)
Des commandes telles que and, or, ralisent les mmes fonctions que & et |.
>> a=1; b=0; a&b
ans =
0
>> a=1; b=0; a|b
ans =
1
>> or(a,b)
ans =
1
>> and(a,b)
ans =
0
I.1.3. Caractres spciaux
Nous donnons ci-aprs, les caractres spciaux uniquement propres MATLAB.
%
'
!
,
;
...
..
[ ]
commentaires
transpose de matrices et dlimiteur de chanes de caractres
commandes systme (chappement)
sparation d'instructions ou de rels dans une matrice ou de
commandes dans une mme ligne.
sparation d'instructions (pas d'affichage de valeurs
intermdiaires) ou des lignes d'une matrice
symbole de continuation (pour terminer une instruction ou une
expression la ligne suivante)
rpertoire parent du rpertoire en cours
dfinition de vecteurs ou de matrices
Dans les lignes de commandes suivantes, nous allons utiliser certains de ces caractres.
Programmation
243
fichier carac_spec.m
% matrice carre
A = [1 3;4 6] ;
At = A' % La transpose de A
% Produit de At par A et inverse
AtA=At*A, inv_AtA=inv(AtA)
A =
1
3
4
6
At =
1
3
4
6
AtA =
17
27
27
45
inv_AtA =
1.2500
-0.7500
-0.7500
0.4722
Chapitre 7
244
% fichier M
all
val = all(Var)
Retourne la valeur "vrai" si tous les lments du vecteur Var sont vrais (diffrents de 0).
Si Var est une matrice, l'opration est ralise, par dfaut, sur chaque colonne et la
fonction all retourne un vecteur de type ligne, constitu de 0 et 1.
>> all(x)
ans =
0
0
Programmation
245
>> all(all(x>=0))
ans =
1
Lopration peut tre ralise sur chaque colonne, et dans ce cas le rsultat sera un vecteur
colonne, si on spcifi la dimension 2 avec la syntaxe :
val = all(Var, dim)
>> all(x,2)
ans =
0
0
Il est inutile de spcifier la dimension 1 dans le cas dune matrice 2D.
Cette proprit est intressante dans le cas dun tableau multidimensionnel pour lequel on
peut considrer la dimension suprieure ou gale 3 (On se rfrera au chapitre des
tableaux multidimensionnels)
>> y=cat(3,x, eye(3), randn(3))
y(:,:,1) =
1
0
0
0
5
7
3
1
0
y(:,:,2) =
1
0
0
1
0
0
0
0
1
y(:,:,3) =
1.4090
1.4172
0.6715
>> all(y,3)
ans =
1
0
0
0
0
0
-1.2075
0.7172
1.6302
0.4889
1.0347
0.7269
0
0
0
Pour tester tous les lments du tableau y, nous devons imbriquer 3 commandes all.
>> all(all(all(y)))
ans =
0
Chapitre 7
246
any
val = any(Var)
Retourne la valeur "vrai" si au moins un lment du vecteur Var est vrai (diffrent de 0).
Si Var est une matrice, l'opration est ralise sur chaque vecteur colonne et la valeur
retourne est un vecteur ligne, constitu de 0 et 1.
>> x = [1 0 3; 0 0 1]
x =
1
0
>> any(x)
ans =
1
0
0
3
1
Pareil que pour la commande all, on peut spcifier la dimension 2, suprieure ou gale
3 pour un tableau multidimensionnel.
>> any(x,2)
ans =
1
1
>> any(y,3)
ans =
1
1
1
1
1
1
1
1
1
>> any(any(y,3))
ans =
1
1
1
find
I = find(Exp), [I,J] = find(Exp)
Les arguments de retour sont les indices des lments non nuls du tableau Exp.
Exp :
I :
[I, J] :
Les lments non nuls de la matrice x dfinie prcdemment nont pour numros 1 et 6
comme le montre l'instruction suivante.
Programmation
247
>> i = find(x==1)
ans =
1
6
Seuls les lments x(1,1) et x(2,3) sont gaux 1.
>> [i j] = find(x==1)
i =
1
2
j =
1
3
isnan
val = isnan(Var)
La valeur de retour val est une matrice de mmes dimensions que Var. L'lment
val(i,j) est 0 si Var(i,j) est un nombre fini ou infini (Inf) et 1 dans le cas o
Var(i,j) correspond NaN.
>> x=[1 0/0; inf/0 5]
x =
1
NaN
Inf
5
>> isnan(x)
ans =
0
1
0
0
isinf
val = isinf(Var)
La valeur de retour val est une matrice de mmes dimensions que Var. L'lment
val(i,j) est 1 si Var(i,j) est un nombre infini (Inf) et 0 dans le cas o
Var(i,j) correspond NaN ou un nombre fini.
>> isinf(x)
ans =
0
1
0
0
>> isinf(x)|isnan(x)
ans =
0
1
1
0
Chapitre 7
248
isfinite
val = isfinite(Var)
La valeur de retour val est une matrice de mmes dimensions que Var. L'lment
val(i,j) est 1 si Var(i,j) est un nombre fini et 0 dans le cas o Var(i,j)
correspond NaN ou nombre infini (Inf).
>> x=[1 0/0; inf/0 5]
>> isfinite(x)
ans =
1
0
0
1
isempty
val = isempty(Var)
val prend la valeur 1 si Var est une matrice vide (0 ligne ou 0 colonne) et 0 dans le cas
contraire. Une matrice vide est symbolise par [ ].
>> isempty(x)
ans =
0
>> x = [];
>> isempty(x)
ans =
1
isreal
val = isreal(Var)
val prend la valeur 1 si Var est une matrice ne contenant que des nombres rels et 0 dans
le cas o Var contient au moins un nombre complexe.
>> isreal(x)
ans =
1
>>
>>
>>
ans
clear all
w = [1+i 2; 1-i -5];
isreal(w)
=
0
issparse
val = issparse(Mat)
Retourne 1 si la matrice Mat est une matrice creuse et 0 dans le cas contraire.
Programmation
249
>> x=sprand(2)
x =
(1,1)
0.6324
>> issparse(x)
ans =
1
isstr
Retourne 1 si Var est une chane de caractres et 0 dans les cas contraires.
val = isstr(Var)
>> isstr('MATLAB')
ans =
1
isglobal
val = isglobal(Var)
Retourne 1 si la variable Var est dfinie comme globale (entre lespace de travail
MATLAB et une fonction) ou seulement locale la fonction.
2
-1
Chapitre 7
250
Exemple
On peut concatner plusieurs commandes et les valuer comme dans lexemple suivant de
la gnration de 5 matrices carres de nombres alatoires, d'ordre 3, nommes M1 M5.
for i = 1:5
eval(['M' num2str(i) ' = rand(3);']);
end
>>
whos
Name
A
M1
M2
M3
M4
M5
ans
i
x
>> M1
M1 =
0.8147
0.9058
0.1270
Size
2x2
3x3
3x3
3x3
3x3
3x3
2x2
1x1
2x2
Bytes
32
72
72
72
72
72
32
8
32
0.9134
0.6324
0.0975
Class
double
double
double
double
double
double
double
double
double
Attributes
0.2785
0.5469
0.9575
feval
Cette commande value la fonction fonct avec ses paramtres dappel x1, ..., xn.
feval(fonct, x1, x2, ... , xn)
fonct :
x1, x2, ... , xn :
Exemple
fichier sommep.m
function a = somme(x)
% somme des lments de la matrice x
a = sum(x);
>> a=[1 2 ;4 7] ;
>> som=somme(a)
som=
14
Programmation
251
Chapitre 7
252
f = inline('inv(transpose(A)*A)*transpose(A)*B','A','B')
A=[1, 2; 4 5];
B=[5 6]';
f(A,B)
ans =
-4.3333
4.6667
La commande char transforme le corps de la fonction en chane de caractres.
>> char(f)
ans =
inv(transpose(A)*A)*transpose(A)*B
Les arguments sont rcuprs par la commande argnames.
>> argnames(f)
ans =
'A'
'B'
Programmation
253
N
N
z (k )
x(k )
1
1
k
k
=
=
det
det
N
N
N
2
x(k ) z (k )
x(k )
x(k )
k =1
, b =
k = 1
k = 1
a=
N
x(k )
N
N
k =1
det
det
N
N
N
2
x(k )
x(k )
x( k )
k = 1
k = 1
k =1
z (k )
k =1
N
x(k ) z (k )
k =1
x(k )
k =1
N
2
x(k )
k =1
z (k )
x(k )
,
k =1
num _ a = det k = 1
N
N
2
x(k ) z (k )
x(k )
k = 1
k =1
Le calcul, en utilisant la boucle for donne le script suivant.
fichier calcul_avec_for.m
x = [0.10 0.20 0.50 1.0 1.50 1.90 2.00 3.00 4.00 6.00]
y = [0.95 0.89 0.79 0.70 0.63 0.58 0.56 0.45 0.36 0.28]
clear all, close all, format long, clc
x = [0.1 0.2 0.5 1.0 1.5 1.9 2.0 3.0 4.0 6.0];
y = [0.95 0.89 0.79 0.70 0.63 0.58 0.56 0.45 0.36 0.28];
% Initialisation des variables
num_a11=0;
num_a12=0;
num_a21=0;
num_a22=0;
for k= 1 : length(x)
num_a11 = num_a11+y(k);
num_a12 = num_a12+x(k);
num_a21=num_a21+x(k)*y(k);
num_a22=num_a22+x(k)^2;
end
num_a=det([num_a11 num_a12; num_a21 num_a22])
Nous pouvons aussi remplir directement la matrice directement chaque pas de la boucle.
mat_num_a=0 ;
for k= 1 : length(x)
mat_num_a= mat_num_a+[y(k) x(k);x(k)*y(k) x(k)^2];
end
MATLAB redimensionne les variables, mat_num_a est initialise 0 comme une
variable scalaire mais elle est remplie comme une matrice 2D lintrieur de la boucle.
Chapitre 7
254
Nous allons maintenant comparer les temps de calcul que nous dterminons en utilisant les
commandes tic et toc .
fichier temps_avec_for.m
tic
calcul_avec_for %
toc
et
fichier temps_sans_for.m
tic
calcul_sans_for % appel du script calcul_sans_for.m
toc
Le temps de calcul est 2,6 fois suprieur pour le calcul avec boucles que sans. Ce rapport
augmente avec la taille des vecteurs x et y.
Nanmoins, ce rapport sera faible avec la puissance sans cesse croissante des processeurs.
Programmation
255
Dans de nombreux cas, la boucle for peut tre remplace avantageusement par des
oprations matricielles. L'exemple suivant en est une bonne illustration.
On dsire calculer les valeurs du vecteur x de dimension n dont les composantes sont
dfinies par l'expression suivante :
m
x(i ) = exp(i ) log( j 2 ) i =1, 2,K, n
j =1
Solution avec les boucles for (fichier fic_for1.m)
function x = fic_for1(n,m)
for i = 1:n
xtemp = 0;
for j = 1:m
xtemp= xtemp + exp(i)*log(j^2);
end
x(i)=xtemp;
end
>> fic_for1(4,5)
ans =
26.0275
70.7501
192.3187
522.7764
fichier fic_for2.m
function x = fic_for2(n,m)
x=sum((((exp(1:n))'*ones(1,m)).*(ones(n,1)*log((1:m).^2)))');
>> fic_for2(4,5)
ans =
26.0275
70.7501
192.3187
522.7764
Dans ce fichier, nous mettons en uvre les fonctionnalits du calcul matriciel et celui
lment par lment.
Les temps de calcul ncessaire aux fichiers fic_for1 et fic_for2 sont obtenus par les
fichiers scripts cmp_for1.m et cmp_for2.m.
fichier cmp_for1.m
% fonction avec des boucles for
clc
% initialisation du timer
tic
fic_for1(300,200);
256
Chapitre 7
temps_ecoule1 = toc
>> cmp_for1
temps_ecoule1 =
0.0658
>> cmp_for2
temps_ecoule2 =
1.1105
On remarque bien que le calcul vectoriel est nettement mieux quavec lutilisation des
boucles for.
Le rapport des 2 dures de calcul est alors :
>> temps_ecoule2/temps_ecoule1
ans =
16.8722
III.2. Boucle while
La boucle est excute tant que la condition qui suit la commande while est vraie.
fichier calcul_avec_while.m
clc, disp('Avec boucle While')
x = [0.1 0.2 0.5 1.0 1.5 1.9 2.0 3.0 4.0 6.0];
y = [0.95 0.89 0.79 0.70 0.63 0.58 0.56 0.45 0.36 0.28];
% Initialisation des variables
mat_num_a=0;
k=1;
while k<=length(x)
mat_num_a= mat_num_a+[y(k) x(k);x(k)*y(k) x(k)^2];
k=k+1;
end
det_mat_num=det(mat_num_a)
Programmation
257
Si Condition1 est vraie, alors Liste1 est excute, sinon et si condition2 est
vrifie alors il y a excution de Liste2, autrement cest Liste3. Considrons le cas o
on peut choisir un signal selon la valeur 1 ou 2 quon donne la variable signal, une
sinusode pour signal=1, un sinus cardinal pour signal=2, autrement ce sera le signal
chirp qui sera pris en considration.
fichier choix_signal_if.m
clc
signal=3;
t=-2:0.01:1;
if eq(signal,1)
signal=sin(2*pi*0.5*t)
elseif signal==2
signal=sinc(2*pi*0.5*t);
else
signal=chirp(t,0,1,5);
end
plot(signal)
Dans le cas o signal vaut 2 ou toute autre valeur diffrente de 1 ou 2, ce sera le signal
chirp qui sera trac. La commande de test dgalit eq(signal,1) consiste tester
lgalit de la valeur de la variable signal 1. On peut aisment la remplacer par
isequal(signal, 1) ou signal==1. Avec la valeur signal=3, nous avons le
trac du signal chirp suivant :
Signal chirp
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
0
500
1000
1500
2000
Temps
2500
3000
3500
4000
Chapitre 7
258
III.4. Condition switchcase
Cette commande permet de basculer dune liste de commandes vers une autre selon la
valeur de lexpression qui se trouve juste aprs la commande switch.
switch expression
case val_expression1,
Liste1 de commandes
case val_expression2
Liste2 de commandes
otherwise
Liste3 de commandes
end
...
Cette boucle ressemble beaucoup la condition if, car dans les 2 cas, on teste les valeurs
de lexpression.
Considrons le cas utilis pour la condition if.
choix_signal_switch.m
clc, signal=2;
t=-2:0.01:1;
switch signal
case 1
signal=sin(2*pi*0.5*t)
case 2
signal=sinc(2*pi*0.5*t);
otherwise
signal=chirp(t,0,1,5);
end
plot(signal)
1
0.8
0.6
0.4
0.2
-0.2
-0.4
50
100
150
200
250
300
350
Programmation
259
nous
avons
les
instructions
break,
return
et
break
Termine l'excution d'une boucle. Si plusieurs boucles sont imbriques, break permet de
sortir de la boucle la plus proche.
return
Cette instruction permet de revenir au fichier M ayant appel le programme courant ou la
ligne de commande MATLAB.
error('message')
Affiche le message spcifi et interrompt l'excution du programme.
Une fonction est un fichier quon sauvegarde dans la liste des chemins de MATLAB avec
passage de paramtres dits dentre ou dappel. Elle retourne dautres paramtres dits de
sortie ou de retour.
fonction sinc2.m
function y=sinc2(x)
% fonction sinus cardinal
% x : vecteur des abscisses
% y : vecteur des ordonnes
y=(x==0)+sin(x)./((x==0)+x);
On dfinit un angle pour le trac de la fonction sinc, et son appel se fait lintrieur de la
fonction plot.
>> x=-4*pi:pi/100:4*pi; plot(sinc2(x), 'LineWidth',3);
1
0.8
0.6
0.4
0.2
-0.2
-0.4
100
200
300
400
500
600
700
800
900
Chapitre 7
260
Si on invoque la variable x :
>> x
??? Undefined function or variable 'x'.
La variable x nest pas connue dans lespace de travail. Pour quelle le soit, il faut la
rendre globale par la commande global x lintrieur de la fonction.
On peut dfinir plusieurs variables en tant que globales simultanment par :
global x y z
On ne peut rendre globale une variable quavant son utilisation dans une expression de
calcul.
Considrons la fonction suivante dans laquelle on effectue le calcul de lexpression
suivante :
y = sinc(x)+0.1*randn(size(x))
On peut faire appel une fonction lintrieur dune autre fonction. Ici, on appelle la
fonction sinc dans la fonction sinc_bruite.
fichier var_glob.m
clear all, clc
x=-2*pi:pi/100:2*pi;
y=sinc_bruite(x);
plot(y,'LineWidth',2)
title('Appel d''une fonction dans une autre')
grid
Programmation
261
Appel d'une fonction dans une autre
1.2
1
0.8
0.6
sinc bruit
0.4
0.2
0
-0.2
-0.4
-8
-6
-4
-2
Comme les variables y1 et y2 sont dclares comme globales dans lespace de travail et
dans la fonction sinc_bruite, nous pouvons alors avoir leurs valeurs.
Ici, on affiche les 5 premires valeurs de y1 et les 3 premires de y2.
% Appel des variables globales
global y1 y2
y1=y1(1:5)
y2=y2(1:3)
y1 =
-0.0000
-0.0050
-0.0101
y2 =
-0.0560
-0.1226
0.0793
-0.0152
-0.0204
Une telle fonction retourne diffrents types de rsultats selon le nombre et/ou le type des
arguments dappel ou de retour.
Un exemple est donn par la fonction abs qui retourne le module dun nombre complexe
ou le code ASCII des caractres dune chane de caractres.
>> x=3+2i;
>> module_x = abs(x)
Chapitre 7
262
module_x =
3.6056
>> abs('Casa')
ans =
67
97
115
97
On se propose dcrire une fonction qui fait diffrents types de calculs selon le nombre et
le type des arguments dappel :
- Factorielle dun nombre entier ou codes ASCII dune chane,
- Calcul et trac de la fonction y=a*x^b si elle reoit 3 paramtres dont a,b, 2
rels et le troisime, x un vecteur dabscisses.
On teste le nombre darguments dappel ou dentre, nargin. Si nargin est gal 1, on
retourne sa factorielle sil est entier ou les codes ASCII des caractres si cest une chane
de caractres.
Si nargin vaut 3 (2 rels a, b et un vecteur x), on trace la courbe de y = a x 2 + b .
Dans tous les autres cas, on quitte la fonction sans retourner de rsultat.
Le nombre darguments de retour (de sortie) est contenu dans la variable nargout.
Programmation
263
otherwise
disp('Unknown method.')
return
end
66
Chapitre 7
264
$ '
'
On se propose de crer une fonction qui calcule les polynmes de Chebyshev de premire
espce par les formules suivantes :
Tn(x) = 2xTn 1(x) Tn 2(x), n = 2, 3, , T0(x) = 1,
T1(x) = x.
Programmation
265
Ces polynmes sont retourns dans lordre dcroissant de ses coefficients, ordre quon
peut rtablir par la commande fliplr.
>> T=fliplr(T)
T =
0
5
-20
16
Nous obtenons les temps de calculs suivants, pour ces 2 types de fonctions.
Forme itrative :
Elapsed time is 0.000573 seconds.
--Forme rcursive :
Elapsed time is 0.001531 seconds
266
Chapitre 7
La variable varargin est utilise au sein dune fonction pour contenir un nombre
optionnel et variable darguments dappel.
La variable nargin contient le nombre total darguments dappel. Cette fonction effectue
la somme ou la diffrence des 2 premiers arguments dappel si on lui envoie 2 arguments
standards (a, b) et un troisime (1 argument optionnel, soit varargin {1}) sous forme
de la chane de caractres somme ou diff.
Si elle reoit 5 arguments au total (2 standards et 3 optionnels), elle trace la courbe ax2+b,
x tant le premier argument dappel optionnel avec des caractristiques graphiques
spcifies dans les 2 derniers arguments optionnels.
De mme, une fonction peut retourner un nombre variable darguments en utilisant la
variable varargout.
function test_vararg(a,b,varargin)
clc
nbre_argin = nargin;
taille_varargin=size(varargin,2);
stdargin = nbre_argin - taille_varargin;
fprintf('Nombre d''arguments d''appel = %d\n', nargin)
fprintf('Entres standards : %d\n', stdargin)
if isequal(stdargin,2)& isstr(varargin{1});
switch varargin{1}
case 'somme'
disp(['Somme =' num2str(a+b)])
case 'diff'
disp(['diff =' num2str(a-b)])
end
end
if isequal(stdargin,2)& ~isstr(varargin{1});
plot(a.*varargin{1}.^2+b,'LineStyle',varargin{2},'LineWidth',
varargin{3});
grid
title([num2str(a) 'x^2+' num2str(b)])
end
end
On applique les diffrents cas suivants o lon obtient successivement la somme, puis la
diffrence des arguments a et p et enfin la courbe avec un style en pointills, de largeur 3.
>> a=1; b=2; test_vararg(a,b,'somme')
Nombre d'arguments d'appel = 3
Entres standards : 2
Somme =3
Programmation
267
20
40
60
80
100
120
268
Chapitre 7
Programmation
269
help fact
error('N doit tre un entier naturel')
end
if N==0
factorielle = 1;
else
factorielle=prod(1:N);
end
Pour chaque valeur de lindice n, on ralise les mmes oprations de calcul des 3
2 1
cos n
sin 3n
.
expressions 3 + 2 , 4 (1 + + 2 ) et
n
n2
n n
Il est alors judicieux de faire appel la mme routine de calcul, appele sous-fonction
(fonction de fonction). Dans ce qui suit, les routines numer, den1 et den2 sont dfinies
comme des sous-fonctions qui calculent les 3 expressions prcdentes.
fichier subfunction.m
function u = subfunction(n)
% calcul de u par appel de 3 sous-fonctions
%num, den1 et den2
u=num(n)./(den1(n)+den2(n));
% sous-fonction num
function numer=num(n)
numer=3+cos(n)./(n.^2);
% sous-fonction den1
function d1= den1(n)
Chapitre 7
270
d1=4*(1+2./n+1./(n.^2));
% sous-fonction den2
function d2=den2(n)
d2=sin(3*n)./(n.^2);
Utilisation de sous-fonctions
0.9
0.8
0.7854
0.7
Convergence vers /4
0.6
0.5
0.4
0.3
0.2
20
40
60
80
100
120
. 0.7854.
140
160
180
200
Programmation
271
ou
while 0
....
instructions ignorer
....
end
x fichiers P-code
Il est parfois utile de cacher le code de certains fichiers. Pour transformer le fichier
factorielle_recursive2.m en fichier P, nous utilisons la commande suivante :
>> pcode factorielle_recursive2
Si on demande le code par la commande type, la rponse est que ce fichier est du type Pfile.
>> type factorielle_recursive2
'factorielle_recursive2' is a P-file.
272
Chapitre 7
Nous pouvons voir la taille du mme fichier, avant et aprs sa transformation en P-code.
>> r = dir('factorielle_recursive2.p')
r =
name: 'factorielle_recursive2.p'
date: '27-juil.-2009 23:46:59'
bytes: 246
isdir: 0
datenum: 7.3398e+005
>> r = dir('factorielle_recursive.m')
r =
name: 'factorielle_recursive.m'
date: '27-juil.-2009 23:46:37'
bytes: 680
isdir: 0
datenum: 7.3398e+005
Nous crons, ci-aprs, la fonction qui dterminera si un nombre est entier ou pas.
function k = isinteg(x);
% Check whether or not x is an integer number.
% If it is, function isint returns 1 otherwise it returns 0.
if abs(x - round(x)) < realmin
k = 1; else k = 0; end
MATLAB R2009 possde la fonction isinteger pour raliser cette opration. Le mme
chiffre 6 ne sera pas vu comme entier car par dfaut, il appartient la classe double.
Programmation
273
>> isinteger(6)
ans =
0
Pour quil soit vu comme un entier, il suffit de transformer son type en entier par int8(6),
cod sur 8 bits, par exemple.
>> isinteger(int8(6))
ans =
1
Nous utiliserons comme exemples de programmes pour une session de mise au point, des
fonctions ralises prcdemment. Il sagit de la fonction
factorielle_recursive.m
Nous pouvons utiliser la commande dbtype pour afficher les lignes de code numrotes
de ces fonctions.
>> dbtype chebt
1
function T = ChebT(n)
2
% Coefficients T of the nth Chebyshev polynomial of the
first kind.
3
% They are stored in the descending order of powers.
4
t0 = 1;
5
t1 = [1 0]
6
if n == 0
7
T = t0;
8
elseif n == 1;
9
T = t1;
10
else
11
for k=2:n
12
T = [2*t1 0] - [0 0 t0];
13
t0 = t1; t1 = T;
15
end
16
end
Nous pouvons fixer des points d'arrt dans les diffrentes fonctions, nous utiliserons
pour cela la commande dbstop.
274
Chapitre 7
>> chebt(5)
10 else
K>>
On se retrouve alors dans le mode "debug" signal par l'invite " K>>". Nous pouvons,
ce niveau, utiliser les commandes de mise au point (dbstep, dbcont, dbstack,
dbstop, etc.).
La commande dbstep permet de progresser ligne par ligne dans l'excution de la
fonction ppcm.
Programmation
275
K>> dbstep
11 for k=2:n
K>>
Nous pouvons consulter la liste des variables locales la fonction, dfinies avant la ligne
11.
K>> whos
Name
n
t0
t1
Size
1x1
1x1
1x2
Bytes
8
8
16
Class
double
double
double
Attributes
Seules les variables dfinies dans la fonction chebt ne sont visibles dans on espace de
travail.
La variable x tant dj dfinie dans lespace de travail MATLAB comme une matrice
alatoire.
Pour remonter de lespace de travail de la fonction celui de MATLAB, on utilise la
commande dbup.
K>> dbup
In base workspace.
K>> whos
Name
Size
ans
x
1x6
4x4
Bytes
48
128
Class
Attributes
double
double
276
Chapitre 7
-20
On retrouve alors l'espace de travail de base avec les variables dfinies dans ce dernier,
aprs la commande dbup.
who
Name
ans
x
Size
1x6
4x4
Bytes
48
128
Class
double
double
Attributes
On retrouve les variables dfinies auparavant, avant dentrer dans le mode debug, dans
lespace de travail MATLAB.
On peut raliser les commandes prcdentes en mode debug par les options du menu
debug de la fentre de lditeur o sont affiches les instructions de la fonction chebt
dbuggeur.
Le point darrt est signal par un cercle rouge la ligne 10.
Par le menu debug, on peut excuter le fichier, mettre ou supprimer un point darrt,
permettre ou pas un point darrt, etc.
Programmation
277
VII. Le profiler
Le principe du profiler consiste tudier et amliorer les performances dun programme.
Par la commande profview, on ouvre une interface HTML pour lancer le profiler.
Pour tudier les performances dun programme, MATLAB fournit une interface utilisateur
(GUI). Amliorer les performances dun programme consiste par exemple dterminer les
lignes de programme qui consomment plus de temps dexcution, afin de rechercher les
amliorer.
Nous allons tudier le profiler sur un programme qui utilise la rcursivit plutt que
litration.
Pour ouvrir le profiler, on peut, soit utiliser la commande profile qui possde beaucoup
doptions, ou choisir loption Profiler du menu Desktop de la fentre principale de
MATLAB.
On peut aussi utiliser le menu Tools Open profiler de la fentre de lditeur une
fois quon a ouvert ce fichier.
Un autre moyen est dexcuter la commande profview de MATLAB qui affiche
linterface HTML du profiler.
Nous allons tudier le fichier sinc2.m pour le comparer la version disponible dans
MATLAB sans aucune expression logique pour lever lindtermination.
Chapitre 7
278
La fonction sinc2.m met 25 fois plus de temps que sinc m, disponible dans MATLAB,
cause des tests relationnels de linstruction :
y=(x==0)+sin(x)./((x==0)+x);
profile on
y=sinc(-2*pi:pi:2*pi);
profile viewer
profsave(profile('info'),'profile_results')
Programmation
279
S = profile('INFO')
La seule fonction appele est la fonction sinc qui ne contient pas de rcursivit
(Isrecursive=0), de type fichier M (Type : M-function), de temps de
rcursivit nul (TotalRecursiveTime: 0), avec un seul appel de la fonction sinc.
Le champ CompleteName contient le nom de la fonction et le rpertoire o elle se
trouve, celui de la boite outils Signal Processing Toolbox .
>> SF.CompleteName
ans =
C:\Program
Files\MATLAB\R2009a\toolbox\signal\signal\sinc.m>sinc
Chapitre 7
280
Programmation
281
Une fois qu'une variable est dfinie, on pourra utiliser la commande save pour la
sauvegarder dans un fichier MAT. Sa restauration sera ralise par la commande load.
clc, clear all, alpha = -2*pi:pi/100 :2*pi;
x = rand(4); alpha ;
save fic_mat x alpha
Size
Bytes
Class
1x401
1x401
4x4
3208
3208
128
double
double
double
Attributes
Ds quon ouvre le fichier mat, les variables quil contient sans dans lespace de travail.
La variable x est bien une matrice 4x4 et alpha un vecteur de 401 lments.
On peut sauvegarder les variables dans une structure.
>> S1.x=[1 2 ;4 7] ;
>> S1.alpha=-4*pi:pi/100:4*p
Les variables x et alpha sont cette fois sauvegardes dans la structure S1.
S1 =
x: [2x2 double]
alpha: [1x801 double]
>> S1.x
ans =
1
2
4
7
>> S1.alpha(1:5)
ans =
-12.5664 -12.5350
-12.5035
-12.4721
-12.4407
Chapitre 7
282
1.0000000000000000e+000
4.0000000000000000e+000
2.0000000000000000e+000
7.0000000000000000e+000
-3.1415926535897931e+000
0.0000000000000000e+000
3.1415926535897931e+000
-7.8539816339744828e-001
7.8539816339744828e-001
Ces fichiers peuvent tre crits et lus par des commandes type langage C, telles fprintf
et fscanf, etc.
quit
Programmation
283
clc
Efface lcran de MATLAB mais les variables sont toujours prsentes dans lespace de
travail. Cette commande est utile au dbut de tout programme pour plus de lisibilit.
La commande home ralise la mme fonction en mettant le prompt en haut et gauche de
lcran.
Dos
05:38
<REP>
.
05:38
<REP>
..
06:38
20302 fsolve_syst_nl.mdl
18:13
20198 fsolve_syst_nl2.mdl
18:32
261 sol_syst_graph.m
3 fichier(s)
40761 octets
2 Rp(s) 21377597440 octets libres
sol_syst_graph.m
Chapitre 7
284
02:09
02:09
05:09
17:16
05:12
00:04
22:20
<REP>
<REP>
292
315
189
98
283
.
..
calcul_avec_for.m
calcul_avec_while.m
calcul_sans_for.m
carac_spec.m
chebt.m
unix
diary
>> diary on
>> diary('history_cmd')
>> x=randn(3);
>> chebt(5)
ans =
16
-20
Programmation
285
format
Permet de spcifier le format daffichage des nombres. Ceci naffecte pas la prcision du
rsultat des calculs. Par dfaut, MATLAB affiche les nombres en format court, short.
>> format long
>> pi
ans =
3.141592653589793
>> format short e
>> pi
ans =
3.1416e+000
>> format short eng % notation ingnieur
>> exp(100.78766)
ans =
59.0914e+042
>> format hex % format hexadcimal
>> pi
ans =
400921fb54442d18
>> format rat % format rationnel
286
Chapitre 7
>> pi
ans =
355/113
La commande help seule, affiche des quelques types daide, par le nom dun rpertoire
o lon peut obtenir cette aide.
help
help nom_fonction donne de laide sur cette fonction.
Cette aide est constitue des lignes de commentaires, sans espace, qui suit la dfinition de
cette fonction.
Programmation
287
demo
lookfor
Chapitre 7
288
chebt
polynomial of
chebt_recc
polynomial
chebyPoly_atan_fixpt
polynomial
chebyPoly_atan_fltpt
polynomial
approximation
poly_atan2
- Calculate the four quadrant inverse
tangent via Chebyshev polynomial
cheb1ap
- Chebyshev Type I analog lowpass filter
prototype.
cheb1ord
- Chebyshev Type I filter order selection.
cheb2ap
- Chebyshev Type II analog lowpass filter
prototype.
cheb2ord
- Chebyshev Type II filter order
selection.
chebwin
- Chebyshev window.
cheby1
- Chebyshev Type I digital and analog
filter design.
cheby2
- Chebyshev Type II digital and analog
filter design.
fdcheby1
- Chebyshev Type I Module for filtdes.
fdcheby2
- Chebyshev Type II Module for filtdes.
Nous retrouvons dans la liste, les 2 fonctions que nous avons cres, chebt.m et
chebt_recc.m, la plupart tant des fonctions de dveloppement de filtres de
Tchebychev.
web
>>
web('http://www.mathworks.com', '-new');
Programmation
289
which
which fonct donne le rpertoire qui contient cette fonction.
>> which sinc2
C:\Documents and Settings\MARTAJ\Mes
documents\MATLAB\Chapitres prochains\Programmation_x\sinc2.m
cd
fic_for2.m
fic_mat.mat
fict3
fict3.txt
fonct_multiple.m
Chapitre 7
290
chebt.m
isinteger2.m
chebt_recc.asv
newstruct.mat
Desktop Tools and Development Environment
[1x93 char]
{'sol_syst_graph.m'}
{0x1 cell}
{0x1 cell}
{2x1 cell}
{0x1 cell}
{0x1 cell}
{0x1 cell}
path
C:\Program Files\MATLAB\R2009a\toolbox\shared\optimlib
C:\Program Files\MATLAB\R2009a\toolbox\symbolic
Programmation
addpath
matlabroot
291
292
Chapitre 7
X. Editeur de fichiers M
Nous nous proposons dtudier quelques menus de la fentre de lditeur de fichiers M.
Pour ouvrir cet diteur, on utilise la commande edit nom_fichier .
La commande edit seule ouvre lditeur avec un fichier vide, nomm Untitled.m
>> edit chebt
Les variables de lespace de travail sont sauvegardes par dfaut dans le fichier
matlab.mat mais on peut choisir un autre nom de fichier.
Nous excutons les commandes suivantes et nous observons les variables dans la fentre
Workspace (espace de travail).
Programmation
>> chebt(4)
ans =
8
0
293
-8
>> x=randn(5);
>>
W
=
what('C:\Documents
and
documents\MATLAB\Chapitres
prochains\Programmation_x\sinc2.m')
Settings\MARTAJ\Mes
W =
path: 'C:\Documents and Settings\MARTAJ\Mes
documents\MATLAB\Chapitres prochains\Analyse numrique_x'
m: {'sol_syst_graph.m'}
mat: {0x1 cell}
mex: {0x1 cell}
mdl: {2x1 cell}
p: {0x1 cell}
classes: {0x1 cell}
packages: {0x1 cell}
Dans lespace de travail, nous avons les matrices x et ans ainsi que la structure W.
Nous pouvons sauvegarder ces valeurs dans un fichier et pouvoir rcuprer ces variables.
File publish
On peut publier un script, comme le fichier de donnes data.m, sous forme html.
294
Chapitre 7
Permet douvrir la boite de dialogue qui permet la gestion des rpertoires (ajout avec sans
sous-rpertoires, suppression de rpertoires, etc.).
On peut parcourir la liste des rpertoires dans le sens ascendant (Move to Bottom) ou
descendant (Move Down).
Le chemin de recherche commence par le rpertoire du haut et finit par le dernier plus bas.
On peut ainsi rajouter des rpertoires ou en supprimer certains dans le chemin de recherche
de MATLAB.
Si on veut ajouter un rpertoire, on clique sur le bouton Add Folder et on lon
choisit le rpertoire quon veut dans la nouvelle boite de dialogue.
File Preferences
Programmation
Name
Attributes
A_pastespecial
295
Size
3x1
Bytes
346
Class
cell
Permet dutiliser des outils tel le profiler tudi plus haut, ainsi que M-Lint qui peut
afficher un rapport des erreurs au fur et mesure de la programmation.
debug
Permet la gestion des diffrentes fentres de MATLAB (leur forme, leur disposition, etc.).
296
Chapitre 7
Help
Chapitre 8
I. Tableaux multidimensionnels
I.1. Dfinition et gnration dun tableau multidimensionnel
I.1.1. Dfinition
I.1.2. Cration dun tableau multidimensionnel
I.1.3. Extraction dun sous-tableau
I.1.4. Oprations sur les tableaux
I.1.4.1. fonctions de tableaux
I.1.4.2. Oprations lment par lment
I.1.5. Changement des dimensions dun tableau
I.1.6. Permutation des dimensions dun tableau
I.1.7. Utilisation pratique des tableaux multidimensionnels dans lindustrie
II. Tableaux multidimensionnels de cellules
II.1. Cellules, Tableaux de cellules
II.1.1. Construction de cellules
II.1.2. Accs aux lments des cellules, indexation
II.1.3. Concatnation de cellules
II.2. Tableaux de cellules
II.2.1. Tableaux bidimensionnels
II.2.2. Tableaux multidimensionnels de cellules
II.3. Fonctions propres aux cellules et tableaux de cellules
III. Tableaux multidimensionnels de structures
III.1. Structures
III.2. Tableaux de structures
III.3. Convertir un tableau de cellules en tableau de structures
et inversement
III.4. Fonctions propres aux tableaux de structures
I. Tableaux multidimensionnels
I.1. Dfinition et gnration dun tableau multidimensionnel
I.1.1. Dfinition
MATLAB, langage orient objet, admet des tableaux plusieurs dimensions, suprieures
2 pour le cas particulier des matrices.
Un tableau 3 dimensions est form de pages , elles-mmes constitues de matrices
(tableaux 2 dimensions), avec le mme nombre de lignes et de colonnes.
298
Chapitre 8
7.0000
3.0000
2.0000
7.0000
tableau1(:,:,3) =
4
5
7
8
9
10
6
3
2
8
6
5
Laffichage se fait par page, le signe : indique toutes les lignes et toutes les colonnes
de chaque page.
Pour accder llment de la 2me page, 4me ligne et 1re colonne :
>> tableau1(4,1,2)
ans =
3.1400
299
Nous pouvons aussi utiliser la commande cat en prcisant la concatnation selon une
autre dimension comme la 4me dimension, par exemple.
>> tableau4=cat(4, tableau1, randn(size(tableau1))) ;
300
Chapitre 8
0.5314
0.7275
2.0984
0.7221
1.7015
-1.0518
0.6462
0.1764
Size
Bytes
Class
1x1
0x0
4x3
4x3
4x3
4x3x3
2x2x3
4-D
1x3
8
double
0
double
96 double
96
double
96
double
288
double
96
double
576
double
24
double
Attributes
301
Pour supprimer la 2me colonne dans toutes les pages de tableau3, on doit la remplacer
par un ensemble vide.
>> tableau3(:,2,:)=[]
La premire page de ce nouveau tableau donne :
>> tableau3(:,:,1)
ans =
8
4
6
9
7
5
1
3
On peut accder une partie du tableau en indexant les lignes, les colonnes et les pages
correspondantes.
I.1.3. Extraction dun sous-tableau
>> subtableau3=tableau3(1:2,1,1:2)
subtableau3(:,:,1) =
8
6
subtableau3(:,:,2) =
6
4
Dans ce cas on ne considre que les 2 premires lignes, uniquement la 1re colonne, des
pages 1 2. Le tableau est uniquement constitu dun tableau 3 dimensions 2 pages
formes de 2 vecteurs. Les conditions sur les valeurs des lments dun tableau des
tableaux de mmes dimensions forms de 1 et 0 aux index des lments o la condition est
respectivement vraie et fausse.
>> [i,j,k]=find(tableau5>3)
i =
3
3
j =
3
4
k =
1
1
302
Chapitre 8
On trouve uniquement 2 lments qui vrifient cette condition, savoir les lments (3,3)
et (3,4) de la 1re page.
On peut crer un tableau form de ces lments en indexant directement tableau5
laide de la commande find.
>> tableau6=tableau5(find(tableau5>3))
tableau6 =
3.5784
3.0349
Le tableau6 est alors une matrice 2 lignes et 1 colonne.
>> size(tableau6)
ans =
2
1
On peut transformer nimporte quel tableau en un seul vecteur colonne en lindexant par le
signe : . Si on veut calculer la moyenne de tous les lments de tableau5, nous
avons plusieurs possibilits.
I.1.4. Oprations sur les tableaux
I.1.4.1. Fonctions de tableaux
>> moy1=mean(tableau5)
moy1(:,:,1) =
0.0376
-0.0422
moy1(:,:,2) =
1.1625
1.4848
moy1(:,:,3) =
0.4590
0.3869
Le calcul se fait dabord par page en calculant la moyenne de chacune de ses colonnes.
En combinant deux fois la commande mean, nous obtenons toujours 3 pages contenant la
moyenne de tous les lments de toutes les pages.
>> moy2=mean(moy1)
moy2(:,:,1) =
-0.0023
moy2(:,:,2) =
1.3237
moy2(:,:,3) =
0.4229
303
Les oprations lment par lment peuvent soprer tableau par tableau, matrice par
matrice, vecteur par vecteur ou lment par lment (singleton).
Certaines oprations ne sappliquent que pour les tableaux 2 dimensions (matrices)
comme det, eig, etc.
>> a = rand(1,2,3,4,5);
>> eig (a)
??? Undefined function or method 'eig' for input arguments
of type 'double' and attributes 'full nd real'.
>> det(a)
??? Undefined function or method 'det' for input arguments
of type 'double' and attributes 'full nd real'.
Ces fonctions sappliquent, par contre, des pages (matrices) de ces tableaux.
>> c=cat(4,cat(3,[1 3;5 6],[2 6;8 9]), cat(3,[7 5; 4 7],[9
2;8 5]))
>> det(c(:,:,2,1))
ans =
-30
>> inv(c(:,:,2,1))
ans =
-0.3000
0.2000
0.2667
-0.0667
Lapplication des fonctions telles que sinc, cos, exp, etc. des tableaux
multidimensionnels, donne des tableaux de mmes dimensions.
304
Chapitre 8
>> sinc_a=sinc(a);
>> size(sinc_a)
ans =
1
2
3
4
5
>> exp_2_sin_a=exp(2*sin(a));
>> size(exp_2_sin_a)
ans =
1
2
3
4
5
I.1.5. Changement des dimensions dun tableau
tableau5 de dimensions (3, 2, 3) possde 18 lments. Il peut tre transform ainsi en
une matrice 6 lignes et 3 colonnes, par exemple.
>> reshape(tableau5,[6,3])
ans =
0.5377
1.8339
-2.2588
0.8622
0.3188
-1.3077
-0.4336
0.3426
3.5784
2.7694
-1.3499
3.0349
0.7254
-0.0631
0.7147
-0.2050
-0.1241
1.4897
0.8622
0.3188
-1.3077
-0.4336
0.3426
3.5784
2.7694
-1.3499
3.0349
0.7254
-0.0631
0.7147
-0.2050
-0.1241
1.4897
On peut la transformer en nimporte quel tableau, pourvu que le nombre dlments reste
inchang, soit par exemple le tableau 3 dimensions de 3 pages, chacune de 2 lignes et 3
colonnes.
>> reshape(tableau5,[2,3,3])
ans(:,:,1) =
0.5377
1.8339
-2.2588
0.8622
ans(:,:,2) =
-0.4336
3.5784
0.3426
2.7694
ans(:,:,3) =
0.7254
0.7147
-0.0631
-0.2050
0.3188
-1.3077
-1.3499
3.0349
-0.1241
1.4897
305
>> size(b)
ans =
2
1
306
Chapitre 8
Dbit (l/mn)
Pression (bar)
20.1
0.48
1.67
21.0
0.50
1.20
21.2
0.52
1.18
21.5
0.55
1.16
21.8
0.57
1.12
21.7
0.60
1.08
21.9
0.62
1.08
22.1
0.64
1.07
22.5
0. 67
1.04
22.8
0.68
1.02
Temprature (C)
Dbit (l/mn)
Pression (bar)
30
0.54
1.04
30.6
0.62
1.03
30.8
0.65
1.01
31
0.67
0.96
31.2
0.69
0.94
31.5
0.71
0.93
31.7
0.81
0.91
31.9
0.91
0.89
32.2
1.01
0.84
32.5
1.1
0.81
Pour la vitesse 2:
307
0.4800
0.5000
0.5200
0.5500
0.5700
0.6000
0.6200
0.6400
0.6700
308
Chapitre 8
22.8000
1.0200
0.6800
vit12 (:,:,2)
30.0000
30.6000
30.8000
31.0000
31.2000
31.5000
31.7000
31.9000
32.2000
32.5000
=
1.0400
1.0300
1.0100
0.9600
0.9400
0.9300
0.9100
0.8900
0.8400
0.8100
0.5400
0.6200
0.6500
0.6700
0.6900
0.7100
0.8100
0.9100
1.0100
1.1000
On dsire tracer la courbe des mesures de chaque capteur sur le mme graphique pour
visualiser leffet de la vitesse du moteur sur cette mesure (temprature, pression, dbit).
fichier mesures_capteurs.m
% Trac des mesures de capteurs
vit1 =[20.1000
1.6700
0.4800
21.0000
1.2000
0.5000
21.2000
1.1800
0.5200
21.5000
1.1600
0.5500
21.8000
1.1200
0.5700
21.7000
1.0800
0.6000
21.9000
1.0800
0.6200
22.1000
1.0700
0.6400
22.5000
1.0400
0.6700
22.8000
1.0200
0.6800];
vit2 =[30.0000
1.0400
0.5400
30.6000
1.0300
0.6200
30.8000
1.0100
0.6500
31.0000
0.9600
0.6700
31.2000
0.9400
0.6900
31.5000
0.9300
0.7100
31.7000
0.9100
0.8100
31.9000
0.8900
0.9100
32.2000
0.8400
1.0100
32.5000
0.8100
1.1000];
vit12= cat(3, vit1,vit2)
subplot(1,3,1)
plot(1:10,vit12(:,1,1))
grid on
hold on
plot(1:10,vit12(:,1,2))
title('Temp. C')
309
subplot(1,3,2)
plot(1:10,vit12(:,2,1))
hold on
plot(1:10,vit12(:,2,2))
title('Pression (Bar)'), grid on
subplot(1,3,3)
plot(1:10,vit12(:,3,1))
grid on
hold on
plot(1:10,vit12(:,3,2))
title('Dbit l/mn')
% courbe de la pression en fonction de la temprature
hold off
figure(2)
plot(vit12(:,1,1), vit12(:,2,1),'s')
title('Pression en fonction de la temprature - Vitesse 1 du
moteur')
Temp. C
Dbit l/mn
Pression (Bar)
34
1.8
1.1
1.7
32
1.6
vit2
vit1
30
0.9
1.5
vit2
1.4
28
0.8
1.3
26
1.1
24
vit1
0.6
22
20
0.7
1.2
0.5
0.9
0
10
0.8
vit1
vit2
0
10
0.4
10
Chapitre 8
310
1.8
1.6
data 1
cubic
y= - 0.059*x3+3.9*x2- 86*x+6.4e+002
1.4
1.2
1
0.8
20
20.5
21
21.5
residuals
22
22.5
23
20.5
21
21.5
22
22.5
23
0.4
0.2
0
-0.2
-0.4
20
311
La structure aura pour nom fit, la norme des rsidus sous le nom normresid et les
rsidus sous le nom resids.
Ces noms peuvent tre, bien sr, modifis.
Dans le cas o on garde ces noms, nous avons :
>> fit
fit =
type: 'polynomial degree 3'
coeff: [-0.0587 3.8915 -86.0531 635.8273]
>> fit.type
ans =
polynomial degree 3
>> fit.coeff
ans =
-0.0587
3.8915
>> normresid
normresid =
0.0555
Les valeurs des rsidus sont :
>> resids
resids =
0.0026
-0.0220
0.0055
0.0338
0.0232
-0.0251
-0.0095
-0.0068
-0.0084
0.0066
-86.0531
635.8273
312
Chapitre 8
';'Antoine']
[1+3j
5i;5+2i
[2x2 double]
[3x2 double]
[2x2 double]
{1x3 cell }
Nous remarquons que Cell1 est constitue dun tableau dune ligne et 3 colonnes.
- Le premier lment est du type chane de caractres (3 lignes de 9 colonnes ou
caractres),
- Le deuxime est de type rel (matrice carre 2x2),
313
Les chanes dune mme colonne doivent avoir la mme longueur (mme nombre de
caractres). Dans le cas prcdent, nous avons du rajouter autant de blancs aux chanes les
plus courtes afin davoir la mme longueur que la plus grande.
Pour saffranchir de ce calcul fastidieux de longueur des chanes, nous utilisons la
commande strvcat (concatnation verticale des chanes de caractres).
>> Cell1={[strvcat('Paris','Saint Nom','Clichy')] [3 5;7 8]
...
[3j 1+5i;3+6i 2+3i ;5+j j]}
>>
Cell2={[strvcat('Khadija','Mehdi','Antoine')]
[1+3j
5i;5+2i exp(3i)]; ...
[5 7 8 ;3 4 6 ;7 9 0] Cell1}
Cell1 =
[3x9 char]
[2x2 double]
Cell2 =
[3x7 char ]
[3x3 double]
[3x2 double]
[2x2 double]
{1x3 cell }
[]
[]
[]
[]
314
Chapitre 8
ans =
-2.2023
ans =
0.9863
-0.5186
0.3274
0.2341
ans =
0.0215
-1.0039
-0.9471
-0.3744
-1.1859
-1.0559
1.4725
0.0557
-1.2173
5
8
315
Pour avoir tous les lments de la cellule, on met loprateur : entre les accolades,
comme pour les tableaux de rels.
>> Cell1{:}
ans =
Paris
Saint Nom
Clichy
ans =
3
5
7
8
ans =
0 + 3.0000i
3.0000 + 6.0000i
5.0000 + 1.0000i
1.0000 + 5.0000i
2.0000 + 3.0000i
0 + 1.0000i
Nous remarquons que llment 2x2 de la cellule Cell2 est aussi une autre cellule de
taille 1x3 (1 ligne et 3 colonnes).
>> x=Cell2{2,2}
x =
[3x9 char]
[2x2 double]
[3x2 double]
[2x2 double]
[3x2 double]
>> x=Cell2{2,2}
x =
[3x9 char]
>> x(3)
ans =
[3x2 double]
>> iscell(x)
ans =
1
Lindexation peut se faire soit entre crochets soit entre accolades.
Comme nous venons de le voir, Cell2{2,2} retourne le contenu de la cellule Cell2
spcifi par lindex (2me ligne et 2me colonne).
On utilise les parenthses pour indexer les cellules dun tableau (voir tableaux de cellules).
316
Chapitre 8
chaudes';'Saint
Nom
>> Cell3{2}
ans =
2 Sources chaudes
Saint Nom
Saint Lazare
>> Cell4={'Thermodynamique chelle finie' 8667}
Cell4 =
[1x30 char]
[8667]
Concatnation des cellules
>> Cell5={Cell3 Cell4}
Cell5 =
{1x2 cell}
{1x2 cell}
On remarque bien que Cell5 est constitue de 2 cellules.
Pour accder au 1er lment de la 1re cellule de Cell5, nous devons faire deux fois
lindexation.
>> Cell5{1}
ans =
[2x2 double]
[3x17 char]
[1x31 char]
[8667
On obtient bien une seule cellule avec un lment supplmentaire que la cellule Cell5.
317
>> Cell6{:}
ans =
1
3
5
9
ans =
2 Sources chaudes
Saint Nom
Saint Lazare
ans =
Thermodynamique chelle finie
ans =
8667
>> Cell5{1}{2}
ans =
2 Sources chaudes
Saint Nom
Saint Lazare
II.2. Tableaux de cellules
II.2.1. Tableaux bidimensionnels
Un tableau de cellules contient des cellules de mmes dimensions.
>> x1 = {['MATLAB R2009a' ; 'exergie
x1 =
[2x13 char]
[8667]
'] ,8667}
[
8667]
'SIMULINK 7.8.5'
Lindexation entre parenthses retourne les cellules dun tableau spcifies par lindex.
>> x12(1)
ans =
[2x13 char]
>> x12(1:2)
ans =
[2x13 char]
[2x2 double]
318
Chapitre 8
Lindexation entre accolades retourne le contenu des cellules dun tableau spcifies par
lindex.
>> x12{1}
ans =
MATLAB R2009a
exergie
>> x12{1:2}
ans =
MATLAB R2009a
exergie
ans =
0.3188
-1.3077
-0.4336
0.3426
Considrons le tableau de cellules suivant dont nous rentrons les valeurs par lignes.
>> x(1,:) = {'tissu rouge', {'transparent', [3193, 8667]}};
>> x(2,:) = {'2 toiles vertes', {'vertes', [3, 2]}};
>> x(3,:) = {'brushing film du Dimanche',
{'Octobre', [13
10]}};
>> x
x =
'tissu rouge'
{1x2 cell}
'2 toiles vertes'
{1x2 cell}
[1x25 char]
{1x2 cell}
Ce tableau est constitu de 3 cellules contenant chacune une cellule ayant 2 lments (une
chane de caractres et un vecteur ligne de taille 2).
Le deuxime lment de chacune de ces cellules internes vaut :
>> x{:,2}
ans =
'transparent'
[1x2 double]
ans =
'vertes'
[1x2 double]
ans =
'Octobre'
[1x2 double]
Le 4me lment du tableau x, x{4}, tant une cellule :
>> x{4}
ans =
'transparent'
[1x2 double]
319
Le premier lment de cette cellule peut tre index comme suit pour pouvoir extraire sa
valeur :
>> x{4}{1}
ans =
transparent
Cest la 1re valeur du 4me lment du tableau de cellules x.
II.2.2. Tableaux multidimensionnels de cellules
La mme notion de pages est dfinie pour les tableaux multidimensionnels de cellules o
la mme commande cat peut tre utilise selon une dimension.
Considrons les tableaux de cellules suivants, bass sur la mme structure que le schma
prcdent :
>> % Cellule A
% Cellule
>> A{1,1}
>> A{1,2}
>> A{2,1}
>> A{2,2}
%
>>
>>
>>
>>
A
=
=
=
=
'Saint Nom';
ones(2);
i;
'Casablanca';
Cellule B
B{1,1} = 'Antony';
B{1,2} = [1 3;5 7];
B{2,1} = exp(j*[pi pi/4]);
B{2,2} = 3;
Chapitre 8
320
Nous obtenons le tableau de structures 3 dimensions suivant :
>> C
C(:,:,1) =
'Saint Nom'
[0.6324 + 1.0000i]
C(:,:,2) =
'Antony'
[1x2 double]
[2x2 double]
'Casablanca'
[2x2 double]
[
3]
Chacune de ces 2 pages est un tableau bidimensionnel de cellules, qui peut tre remplie
directement sans utiliser la commande cat comme pour les tableaux ordinaires.
>> D(:,:,1)={'Saint Nom' ones(2);i+rand 'Casablanca'};
>> D(:,:,2)={'Antony' [1 3;5 7]; exp(j*[pi pi/4]) 3};
>> D
D(:,:,1) =
'Saint Nom'
[2x2 double]
[0.7382+ 1.0000i]
'Casablanca'
D(:,:,2) =
'Antony'
[2x2 double]
[1x2 double]
[
3]
On obtient le mme tableau de cellules 3 dimensions sans utiliser la commande cat.
II.3. Fonctions propres aux cellules et tableaux de cellules
cellfun
321
>>
VarCellNombres
=
'UniformOutput', false)
VarCellNombres =
[1.5811]
[1]
[NaN]
cellfun(@std,
CellNombres,
cellfun(@std,
CellNombres,
[NaN]
>> cellplot(CellNombres)
iscell
Pour dterminer si une donne est du type cellule, on utilise la commande iscell qui
retourne 1 si largument est une cellule et 0 dans le cas contraire.
>> Cell5{1}
ans =
[2x2 double]
[3x17 char]
>> iscell(ans)
ans =
1
Le premier lment de la cellule Cell5 est aussi une cellule.
322
Chapitre 8
num2cell
[2x1 double]
>> C(1)
ans =
[2x1 double]
Le contenu de la 1re cellule est :
>> C{1}
ans =
1
5
>> D=num2cell(A,2) %contenu des lignes dans cellules spares
D =
[1x2 double]
[1x2 double]
Cette commande sapplique aussi pour des tableaux multidimensionnels.
iscellstr
323
Retourne 1 pour un tableau de cellules sous forme de chanes de caractres et 0 dans le cas
contraire.
>> CellChaine={'MATLAB R2009a','Amel','SIMULINK', 'Khadija'}
CellChaine =
'MATLAB R2009a'
'Amel'
'SIMULINK'
'Khadija'
>> iscellstr(CellChaine)
ans =
1
cellstr
Cette commande cre une structure de chanes de caractres partir dun tableau de
chanes.
>> TabChaines=['MATLAB R2009a';'Amel
';
'Khadija
']
';'SIMULINK
TabChaines =
MATLAB R2009a
Amel
SIMULINK
Khadija
>> CellChaines=cellstr(TabChaines)
CellChaines =
'MATLAB R2009a'
'Amel'
'SIMULINK'
'Khadija'
>> whos
Name
Size
CellChaines
TabChaines
ans
4x1
4x13
4x1
Bytes
304
104
304
Class
Attributes
cell
char
cell
Les mmes chanes de caractres occupent 304 octets en tant que cellule contre 104 en tant
que tableau de chanes de caractres.
celldisp
Chapitre 8
324
Affiche la structure donne en argument.
>> celldisp(CellChaine)
CellChaine{1} =
MATLAB R2009a
CellChaine{2} =
Amel
CellChaine{3} =
SIMULINK
CellChaine{4} =
Khadija
cellplot
cell2mat
325
5
8
7
3
8
12
9
20
3
5
2
4
1
3
8
12
>> cell2mat(C)
ans =
1
5
5
8
9
7
4
9
20
7
3
5
La seule condition est que les contenus de la cellule doivent pouvoir tre concatns dans
un hyperrectangle.
Si on trace la figure donnant la forme du tableau de cellules, nous remarquons que chaque
cellule possde toujours le mme nombre de lignes que celle qui lui est voisine
horizontalement et le mme nombre de colonnes que celle qui lui est voisine verticalement.
326
Chapitre 8
sort
Arrange les chanes dun tableau de cellules par ordre alphabtique.
>> TabChaines={'MATLAB R2009a','Amel','SIMULINK', 'Khadija'}
TabChaines =
'MATLAB R2009a'
'Amel'
'SIMULINK'
'Khadija'
>> CellOrd=sort(TabChaines)
CellOrd =
'Amel'
'Khadija'
'MATLAB R2009a'
>> iscell(CellOrd)
ans =
1
'SIMULINK'
327
CouleurDesYeux: 'noirs'
DateDeNaissance: '10 Mai 1977'
Adresse: 'Alle Les Erables Saint Nom'
LieuDeNaissance: 'Sidi Bernoussi Casablanca'
La description de 2 personnes la fois se fait en spcifiant 2 valeurs chaque fois pour
chaque champ de la structure NomPers.
>> NomPers = struct('Poids',{50 75},...
'CouleurDesYeux',{'noirs' 'marrons'},...
'DateDeNaissance', {'10 Mai 1977' '13 Octobre 1954'},...
'Adresse', {'Alle Les Erables, Saint Nom' 'Avenue de Clichy
Paris'},...
'LieuDeNaissance',{'Sidi Bernoussi Casablanca' 'Amazoul'})
>> NomPers(1)
ans =
Poids: 50
CouleurDesYeux: 'noirs'
DateDeNaissance: '10 Mai 1977'
Adresse: 'Alle Les Erables, Saint Nom'
LieuDeNaissance: 'Sidi Bernoussi Casablanca'
>> NomPers(2)
ans =
Poids: 75
CouleurDesYeux: 'marrons'
DateDeNaissance: '13 Octobre 1954'
Adresse: 'Avenue de Clichy Paris'
LieuDeNaissance: 'Amazoul'
On peut accder nimporte quel champ dune personne dfinie dans cette structure.
>> NomPers.Adresse
ans =
Alle Les Erables, Saint Nom
ans =
Avenue de Clichy Paris
Pour obtenir ladresse de la premire personne :
>> Adress1=NomPers(1).Adresse
Adress1 =
Alle Les Erables, Saint Nom
Et la date de naissance de la deuxime personne :
>> NomPers(2).DateDeNaissance
ans =
13 Octobre 1954
328
Chapitre 8
[]
[]
[]
[]
Tous les champs sont vides sauf le champ Poids, seul auquel on a affect la valeur 78.
Laffectation directe dune valeur un champ est la deuxime faon de crer une structure.
La simple instruction suivante permet de crer la structure a en affectant la valeur 5 au
champ b.
>> a.b=5 ;
>> isstruct(a)
ans =
1
La variable a dsigne bien une structure qui possde jusqu prsent un seul champ b qui
vaut 5.
329
>> a(:)
ans =
b: 5
III.2. Tableaux de structures
Un tableau multidimensionnel peut possder comme lments des structures.
Considrons la structure NomPers tudie prcdemment.
>> NomPers = struct('Poids',{50},...
'CouleurDesYeux',{'noirs'},...
'DateDeNaissance', {'10 Mai 1977'},...
'Adresse', {'Alle Les Erables Saint,
Nom'},...
'LieuDeNaissance',{'Sidi
Bernoussi,
Casablanca'})
NomPers =
Poids:
CouleurDesYeux:
DateDeNaissance:
Adresse:
LieuDeNaissance:
50
'noirs'
'10 Mai 1977'
'Alle Les Erables Saint Nom'
'Sidi Bernoussi Casablanca'
La commande suivante spcifie cette structure comme tant llment (2,3) de la 5me
page du tableau TablStruct 3 dimensions.
>> TablStruct(2,3,5)=NomPers
TablStruct =
2x3x5 struct array with fields:
Poids
CouleurDesYeux
DateDeNaissance
Adresse
LieuDeNaissance
>> isstruct(TablStruct)
ans =
1
Ce tableau est lui-mme de type structure.
>> size(TablStruct)
ans =
2
3
5
Si on veut afficher les lments de ce tableau, on obtient des structures avec des champs
vides, sauf llment (2, 3, 5).
330
Chapitre 8
>> TablStruct(1,2,4)
ans =
Poids:
CouleurDesYeux:
DateDeNaissance:
Adresse:
LieuDeNaissance:
[]
[]
[]
[]
[]
>> TablStruct(2,3,5)
ans =
Poids:
CouleurDesYeux:
DateDeNaissance:
Adresse:
LieuDeNaissance:
50
'noirs'
'10 Mai 1977'
'Alle Les Erables, Saint Nom'
'Sidi Bernoussi, Casablanca'
331
isstruct
rmfield
>> NomPers2=rmfield(NomPers,'Poids')
NomPers2 =
CouleurDesYeux:
DateDeNaissance:
Adresse:
LieuDeNaissance:
'noirs'
'10 Mai 1977'
'Alle Les Erables Saint, Nom'
'Sidi Bernoussi, Casablanca'
On obtient une structure sans les champs supprims par la commande rmfield.
fieldnames
332
Chapitre 8
getfield
isfield
orderfields
333
setfield
struct2array
75017
ParisSidi
>> size(VectNomPers)
ans =
1
75
structfun
NomPers,
Ci-aprs, on transforme le contenu des champs par le code ASCII de leurs valeurs
334
Chapitre 8
>>
CodeAscii=
structfun(@(x)
'UniformOutput', false)
abs(x)
),
NomPers,
CodeAscii =
Poids:
CouleurDesYeux:
DateDeNaissance:
Adresse:
LieuDeNaissance:
50
[110 111 105 114 115]
[49 48 32 77 97 105 32 49 57 55 55]
[1x28 double]
[1x26 double]
Chapitre 9
SIMULINK
336
Chapitre 9
SIMULINK
337
Chacune de ces librairies est constitue de blocs comme pour la librairie Continuous :
Cette librairie contient des blocs de modlisation de systmes continus (fonctions de transfert,
intgrateur, drivateur, etc.).
Au cours de ltude de Simulink, nous allons tudier dans des exemples la plupart des blocs
de ces librairies.
Chapitre 9
338
Les diffrentes librairies ont les fonctionnalits suivantes ;
Blocs couramment utiliss.
Blocs modlisant les discontinuits.
Blocs doprations logiques.
Blocs doprations mathmatiques.
Utilitaires.
Blocs dattributs de signaux.
Blocs daffichage ou de sortie.
Fonctions dfinies par lutilisateur.
Blocs de modles continus.
Blocs de modles discrets<.
Tables dinterpolation.
Blocs de vrification (limites, gradient, etc.)
Ports et sous-systmes.
Routage du signal.
Gnrateurs de signaux, lecture de fichiers, etc.
339
SIMULINK
I.1.1. Rponse un chelon et une rampe d'un systme analogique du 2nd ordre
Un systme analogique du second ordre a pour fonction de transfert:
H ( p) =
1
2
2
p
p+ 2
1+
w0
w0
w0=1;
dzeta=0.1;
% pulsation propre
% coefficient d'amortissement
Avant de crer le modle de simulation, nous commenons par prparer dans la fentre
Untitled, les diffrents blocs qui nous seront utiles.
Pour placer un bloc dans une fentre vierge de SIMULINK, il suffit de double cliquer sur la
bibliothque correspondante de la librairie et le ramener par l'intermdiaire de la souris
(bouton gauche).
Dans le tableau suivant, nous rsumons, pour chacun de ces blocs, la bibliothque de la
librairie SIMULINK, dans laquelle on peut l'obtenir.
Icne
Constant
Step
Ramp
Manual switch
Transfer Fcn
Bibliothque
Sources
Sources
Sources
Signal Routing
Continuous
Fonction
Cration d'une valeur constante par double clic
Signal chelon de retard et d'amplitude variables
Rampe de pente, retard et valeur initiale variables
Commutateur de signal
Fonction de transfert analogique
Chapitre 9
340
To file
Scope
Clock
Mux
Relational
Operator
Sinks
Sinks
Sources
Signal Routing
Logic and Bit
Operations
Dans la fentre suivante, nous appliquons le signal chelon tant que le temps est infrieur ou
gal 100. A partir du temps t=101, le signal rampe est ensuite appliqu grce au slecteur.
Les signaux d'entre (sortie du slecteur) et de sortie du systme dynamique sont appliqus
l'oscilloscope travers un multiplexeur afin qu'ils soient visualiss simultanment. Le signal
de sortie est sauvegard sous forme d'un fichier .mat dont on a fix le nom
sortie.mat.
Ce fichier peut tre ainsi rcupr dans l'espace de travail MATLAB. D'autre part, chaque
valeur de ce signal de sortie peut tre visualise dans l'afficheur Display (la dernire valeur
tant de 19.98).
En double cliquant sur le bloc du commutateur (Switch), nous pouvons spcifier le seuil,
lequel, lorsqu'il est dpass ou gal la valeur prise par le signal de contrle (sortie logique
de l'oprateur relationnel) fait passer le signal de la premire entre (l'chelon dans le cas de
cet exemple) lentre du systme du 2nd ordre.
Lorsque le signal de contrle devient plus faible que le seuil spcifi, c'est le signal rampe qui
attaque le systme analogique du second ordre.
Le seuil du commutateur est ici choisi gal 0.5 puisque l'oprateur relationnel sort une
valeur logique (1 si le temps de simulation est gal ou suprieur 100 et 0 dans le cas
contraire).
Ce seuil peut bien sr valoir des valeurs strictement infrieures 1 et strictement suprieures
0. Avant de dmarrer la simulation, nous avons besoin de fixer le nombre de points de
simulation qui correspond aussi la taille des signaux mis en uvre.
L'option Parameters du menu Simulation permet de fixer cette dure en spcifiant
l'instant de dpart (Start time) et de fin de simulation (Stop time).
341
SIMULINK
La fentre suivante reprsente les paramtres de simulation.
load sortie
t=y(1,:); s=y(2,:); u=y(3,:);
h=plot(t,s) ;
set(h,'LineWidth',2), hold on
plot(t,u), grid
title('Rponse du systme et signal de
commande chelon+rampe')
xlabel('temps')
20
18
16
14
12
10
Signal de sortie
8
6
4
2
0
20
40
60
80
100
temps
120
140
160
180
200
Chapitre 9
342
Le signal de sortie est trac avec un gros trait, le trait fin correspond au signal de commande
form de lchelon suivi de la rampe.
I.1.2. Equation diffrentielle du second ordre
Le systme du second ordre tudi prcdemment, que l'on peut reprsenter par:
u(t )
1
2
p2
1+
p+ 2
w0
w0
s(t )
peut se dfinir par l'quation diffrentielle suivante, reliant l'entre u(t) la sortie s(t):
2
s' (t ) s(t )]
w0
1
du bloc Continuous. Afin
s
d'viter des lignes de connexions longues ou croises, un signal peut tre envoy une
variable tiquette (tag) Goto (bloc Signal Routing) dont on spcifie un nom par un
double clic. Ce signal peut tre rcupr travers une autre tiquette From de mme nom.
Pour attacher un commentaire une connexion, on double clique dessus pour faire apparatre
un rectangle vide dans lequel on crit le texte correspondant (exemple de s''(t), s'(t) et s(t)).
En ralisant un double clic dans un espace vierge de la fentre, on peut aussi crire des textes
de commentaires (par exemple le titre dcrivant le modle). C'est le cas du texte Equation
diffrentielle du 2nd ordre . Pour chaque bloc ou commentaire pralablement
slectionn, on peut associer une ombre grce la commande Show Drop Shadow du menu
Format. Inversement une ombre peut tre supprime par Hide Drop Shadow.
Dans cet exemple, nous avons ombr l'oscilloscope et le titre du modle.
Dans cet exemple, nous avons utilis l'oprateur d'intgration,
Contrairement au modle SIMULINK prcdent, tous les blocs sont dpourvus de label, ceci
peut tre ralis, aprs avoir slectionn tous les blocs par Select All du menu Edit, par
343
SIMULINK
la commande Hide Name du menu Format. Cette opration peut tre ralise pour un seul
bloc ou un ensemble de blocs pralablement slectionns la souris.
Les signaux d'entre u(t) et s(t) sont stocks dans un fichier .mat travers un
multiplexeur. Par un double clic sur le bloc untitled.mat, on peut spcifier le nom du
fichier (us dans notre cas) ainsi que le nom de la variable qui contiendra les donnes (le nom
spcifi ici est xy).
Le fichier us.mat contient la variable xy de dimension (3xN), N tant le nombre de points
de la simulation fix dans le menu Simulation Parameters. La variable xy contiendra, par
dfaut, le vecteur ligne reprsentant le temps. Les 2 autres lignes sont successivement le
signal d'entre u(t) et le signal de sortie s(t).
Dans le script suivant, on ouvre le fichier us.mat dans l'espace de travail MATLAB par la
commande load. On rcupre ensuite les variables temps, entre et sortie pour reprsenter
graphiquement les signaux d'entre et de sortie.
fichier lect_fichier.m
% lecture du fichier us.mat
load us
t=xy(1,:); u=xy(2,:); s=xy(3,:);
plot(t,u,t,s)
axis([0 length(t) -0.8 1.8])
xlabel('temps');
title('solution d''quation diffrentielle'), grid
axis([0 100 -0.2 1.8])
gtext('Echelon d''entre')
gtext('Signal de sortie')
solution d'quation diffrentielle
1.8
1.6
Echelon d'entre
1.4
1.2
1
0.8
Signal de sortie
0.6
0.4
0.2
0
-0.2
10
20
30
40
50
temps
60
70
80
90
100
Chapitre 9
344
I.1.3. Modle d'tat du systme du second ordre
2
1
s' + 2 s'' = u
w0
w0
2
1
s' + 2 s' ' = u
w0
w0
x1
x2
et l'quation d'observation:
s( t ) = x1
Sous forme matricielle, ce systme d'crit:
1 0
+
u
2 w0 w02
x&1 0
x& = w 2
2 0
x1
s( t ) = 1 0
x2
SIMULINK
345
Dans cet exemple, nous appliquons au systme un crneau de hauteur 1 et de largeur 200,
obtenu par la diffrence entre un chelon commenant au temps t=300 et un autre dbutant au
temps t=100.
L'entre, la sortie du systme et le temps sont envoys vers les variables (To Workspace du
bloc Sinks) que le nomme respectivement entree, temps et sortie aprs un double
clic.
On entre les valeurs suivantes des paramtres dans l'espace de travail MATLAB.
>>
>>
w0=0.5;
dzeta=0.1;
Chapitre 9
346
Aprs la simulation, nous rcuprons les diffrentes variables dans lespace de travail
MATLAB pour leur affichage.
>>
>>
>>
>>
>>
>>
Pour faire correspondre le temps pour les signaux de commande et de sortie, nous avons trac
les 2 signaux dans 2 fentres diffrentes. Le systme tant sous amorti (dzeta = 0.1),
nous observons de fortes oscillations chaque changement de valeur de lchelon.
signal d'entre du systme du second ordre
1.5
1
0.5
0
-0.5
50
100
150
200
250
300
350
400
450
500
400
450
500
2
1
0
-1
50
100
150
200
250
temps
300
350
347
SIMULINK
I.1.4. Rgulation Proportionnelle et Intgrale
1
) P.I. d'expression:
Ti p
1+
p
K H0
H0=0.8; tau=20;
Si l'on veut rduire l'ensemble des blocs de ce rgulateur en un systme, nous devons en faire
un sous-systme.
Pour cela, il faut slectionner, la souris, l'ensemble des blocs et choisir l'option Create
Subsystem du menu Edit.
348
Chapitre 9
Nous obtenons, le bloc unique suivant, aprs avoir redimensionn et supprim les connexions.
Par un double clic sur le bloc Subsystem, nous remarquons la mise en place de ports
d'entre et de sortie, nomms In1 et Out1 par dfaut, que lon renomme respectivement par
erreur et commande.
Ainsi, nous disposons du bloc unique suivant qui reprsente le rgulateur PI.
Le label Subsystem est transform en Rgulateur PI.
SIMULINK
349
fichier aff_signaux.m
clear all, close all
% lecture du fichier .mat
load bo_bf
t=y(1,:);
rep_bo=y(2,:); consigne=y(3,:); rep_bf=y(4,:); cde=y(5,:);
% rponse du systme en boucle ouverte
figure(1)
plot(t,rep_bo); hold on, plot(t,consigne)
i=find(abs(rep_bo-(1-exp(-1))*max(rep_bo))<0.04);
cste_temps=t(i);
plot(cste_temps*ones(1,21),rep_bo(i).1:0.01:rep_bo(i)+0.1,':')
title('signaux d''entre et de sortie du systme en BO')
axis([0 max(t) 0 1.2]), xlabel('temps')
gtext('\downarrow signal d''entre')
gtext('\uparrow rponse en boucle ouverte')
gtext(['\leftarrow \tau = ' num2str(cste_temps) ' s'])
Sur ce graphique, la constante de temps est calcule en cherchant le temps pour lequel la
valeur du signal atteint 1-exp(-1) = 63% de la valeur maximale.
La valeur obtenue est telle que le signal atteint 63% 0.04 prs.
Chapitre 9
350
signaux d'entre et de sortie du systme en BO
signal d'entre
0.8
0.6
= 18.9421 s
0.4
0.2
50
100
150
200
250
temps
0.8
0.6
0.4
0.2
10
15
20
25
temps
30
35
40
45
50
351
SIMULINK
Nous remarquons que le systme boucl est environ 5 fois plus rapide qu'en boucle ouverte.
0
0
50
100
150
200
250
temps
352
Chapitre 9
Si l'on veut crer un seul bloc ayant comme paramtres d'entres la frquence et l'amplitude,
on supprime le bloc Scope, les constantes f et ampl ainsi que le titre du modle, puis on
slectionne le tout la souris (pas avec Select All du menu Edit) et l'on cre le soussystme par Create Subsystem du menu Edit.
Nous obtenons ceci:
353
SIMULINK
Le temps et le signal sont enregistrs sur la variable globale nomme sinc via un
multiplexeur. Les lignes de commandes suivantes permettent l'affichage du signal sinus
cardinal en fonction du temps.
>> plot(Sinc(:,2), Sinc(:,1))
>> xlabel('temps'), grid
>> title('Sinus cardinal d''amplitude 5 et de frquence 1')
Sinus cardinal d'amplitude 5 et de frquence 1
-1
10
temps
On considre un signal discret x(t) bruit dont le bruit b(t) possde une variance b2 .
Lorsqu'on le fait passer travers un filtre moyenne mobile d'ordre (n-1) de type:
1
H ( z ) = (1 + z 1 + z 2 + ... + z ( n 1) )
n
y (t ) = 5 sin 01
. t,
354
Chapitre 9
fichier filtre_ma.m
close all
% affichage du signal d'origine et du signal bruit
x_origine=filtrage(:,1);
t=filtrage(:,2);
xfiltre=filtrage(:,3);
xbruite=filtrage(:,4);
% affichage du signal bruit
figure(1)
plot(t,xbruite)
axis([0 max(t) -8 8])
title('signal sinusodal bruit')
xlabel('temps')
grid
% affichage du signal filtr
figure(2)
plot(t,xfiltre)
axis([0 max(t) -8 8])
title('signal filtr')
SIMULINK
355
xlabel('temps'), grid
% calcul des variances
% bruit avant filtrage
b1=xbruite-x_origine;
% bruit aprs filtrage
b2=xfiltre-x_origine;
disp(['variance du signal bruit : ' num2str(std(b1)^2)])
disp(['variance du signal filtr : ' num2str(std(b2)^2)])
close all
% affichage du signal d'origine et du signal bruit
x_origine=filtrage(:,1);
t=filtrage(:,2);
xfiltre=filtrage(:,3);
xbruite=filtrage(:,4);
% affichage du signal bruit
figure(1)
plot(t,xbruite)
axis([0 max(t) -8 8])
title('signal sinusodal bruit')
xlabel('temps')
grid
% affichage du signal filtr
figure(2), plot(t,xfiltre), axis([0 max(t) -8 8])
title('signal filtr')
xlabel('temps'), grid
% calcul des variances
% bruit avant filtrage
b1=xbruite-x_origine;
% bruit aprs filtrage
b2=xfiltre-x_origine;
disp(['variance du signal bruit : ' num2str(std(b1)^2)])
disp(['variance du signal filtr : ' num2str(std(b2)^2)])
Les deux figures suivantes reprsentent le signal sinusodal bruit quon met lentre du
filtre ainsi que le signal de sortie. Nous vrifions bien que le signal de sortie du filtre possde
une variance plus faible, avec des rsultats donns par la thorie.
Chapitre 9
356
signal sinusodal bruit
8
6
4
2
0
-2
-4
-6
-8
10
20
30
40
50
60
70
80
90
100
temps
signal filtr
8
6
4
2
0
-2
-4
-6
-8
10
20
30
40
50
60
temps
70
80
90
100
357
SIMULINK
I.2.2. Rgulation intgrale numrique
H0
0.8
=
1 + p 1 + 20 p
0177
.
b
=
z a z 0.7788
Les signaux d'entre et de sortie discrets, u(t) et y(t) sont dcrits par l'quation de rcurrence:
y (t ) = a y (t 1) + b u(t 1)
Dans la figure suivante, le systme modlis dans l'espace d'tat est attaqu, en boucle ouverte
par un chelon unitaire.
Afin quelles soient connues dans Simulink, les valeurs des paramtres a et b sont spcifies
dans lespace de travail MATLAB.
>> a=0.7788;
>> b=0.177;
Chapitre 9
358
Les lignes de commande suivantes, permettent de rcuprer les variables temps, entre et
sortie du systme contenues dans la variable globale es des fins d'affichage.
>> t=es(:,3);
>> entree=es(:,1);
>> sortie=es(:,2);
>> plot(t,sortie)
>> hold on
>>
>>
>>
>>
plot(t,entree)
axis([0 max(t) 0 1.2])
xlabel('temps')
title('systme en boucle ouverte')
0.8
0.6
0.4
0.2
50
100
150
200
temps
250
300
350
400
On retrouve bien le gain statique de 0.8. Ce systme boucl par un correcteur intgral pur,
K
a pour fonction de transfert:
z 1
Kb
F ( z) = 2
z z (a + 1) + a + Kb
C'est un systme du second ordre de gain statique unit, F(1)=1.
>>
359
SIMULINK
Dans l'espace de travail, on affecte au gain K la valeur 0.1 et l'on spcifie les valeurs des
paramtres a et b .
Chapitre 9
360
Quand on enregistre des signaux dans lespace de travail (To Workspace), on peut le faire
de 3 manires diffrentes :
-
Dans les exemples prcdents, nous navons utilis que la mthode de tableau.
Dans cet exemple, nous avons choisi dutiliser le type Structure.
On efface toutes les variables de lespace de travail, on excute encore une fois le fichier et on
utilise la commande whos pour avoir les variables prsentes dans lespace de travail ainsi que
leurs caractristiques.
>> clear all
>> whos
Name
suite
tout
Size
1x1
21x1
Bytes
986
168
Class
struct array
double array
On remarque bien que la variable suite est une structure (struct array).
La variable tout contient le mme signal, un vecteur de 21 variables puisquon a choisi stop
time de 20 dans le menu Simulation Configuration Parameters.
SIMULINK
361
En invoquant la structure suite, on rcupre ses champs que sont : le temps, signals et le
nom du bloc savoir blockName.
>> suite
suite =
time: []
signals: [1x1 struct]
blockName: 'equat_recurrente/To Workspace'
Comme nous avons choisi le type de structure simple, le champ time est vide, []. Le champ
signals est une structure.
Pour voir les valeurs des champs de la structure signals, on excute la commande
suivante :
>> suite.signals
ans =
values: [21x1 double]
dimensions: 1
label: 'x(n)'
Chapitre 9
362
fichier lect_struct.m
plot(suite.signals.values,'x')
hold on
plot(suite.signals.values,'-')
title('Solution de l''quation rcurrente')
solution=suite.signals.values;
solution=solution(length(solution));
gtext(['\downarrow ' num2str(solution)])
grid
Solution de l'quation rcurrente
1.6
1.4
1.2
0.75738
0.8
0.6
0.4
0.2
10
15
20
25
Pour rsoudre cette quation, nous disposons du bloc Solve de la bibliothque Math
Operations qui permet de trouver la solution qui annule l'quation qui est connecte son
entre.
La fonction cosinus est ralise par le bloc MATLAB Function dans lequel on a spcifi la
fonction cos.
363
SIMULINK
cos( x) + y + 0.5
log( x + 1) 3 a sin y 2.5
Ces expressions sont programmes lintrieur dun bloc Fcn aprs double clic.
Chapitre 9
364
Bien que lentre du bloc Fcn soit toujours note u, cette dernire, dans les blocs log(u+1)
et cos(u) correspond la variable x, alors que la variable u du bloc -3*asin(u)
reprsente la variable y.
.
Pour vrifier les solutions obtenues par la fonction fsolve,
.
x = 1567
y = 0.4961
nous allons chercher le point d'intersection des 2 fonctions y = f (x) obtenues dans chacune
des 2 quations du systme. Ces 2 expressions extraites du systme sont:
y1 = cos( x ) 0.5
log( x + 1) 2.5
y 2 = sin
3
fichier systeme_nl.m
% intervalle des abscisses
x=0:0.001:10;
365
SIMULINK
% expressions des 2 fonctions
y1=cos(x)-0.5;
y2=sin((-2.5+log(x+1))/3); close
% affichage des 2 fonctions
plot(x,y2), hold on, plot(x,y1), grid
% recherche des indices des solutions
% avec une prcision de 5 10-4
i=find(abs(y1-y2)<0.0005);
% Trac des points de rencontre des 2 courbes
title('expressions y1 et y2 en fonction de x')
h=plot(x(i),y1(i),'*')
set(h,'linewidth',5)
% labels des axes
xlabel('variable x'), ylabel('variable y')
expressions y1 et y2 en fonction de x
0.5
v a ria b le y
X: 1.567
Y: -0.4962
7.4672
-0.1208
4.9885
-0.2339
-0.5
-1
-1.5
5
variable x
10
4.9810
7.4650
Chapitre 9
366
>> y1(i)
ans =
-0.4962
-0.2346
-0.1208
>> y2(i)
ans =
-0.4961
-0.2349
-0.1211
L'avantage de l'utilisation de la fonction fsolve de SIMULINK est qu'il n'est pas ncessaire
de donner l'avance l'intervalle, inconnu a priori, dans lequel se trouve l'une des solutions.
L'inconvnient de la rsolution par SIMULINK rside dans le fait que la simulation s'arrte
ds l'obtention de la premire solution.
La rsolution de ce systme peut se faire l'aide d'un seul bloc fsolve. En effet, on peut
exprimer l'une des inconnues en fonction de l'autre.
Dans le systme prcdemment tudi, la variable y peut tre remplace dans la deuxime
quation par:
y = cos x 0.5
On aboutit la recherche de la solution x de l'quation suivante:
log( x + 1) 3 arcsin(cos x 0.5) 2.5 = 0
La valeur de y peut tre rcupre facilement dans le modle SIMUMINK comme dans le
modle suivant.
SIMULINK
367
Le bloc unique (sous-systme) et son contenu obtenu par un double-clic sont les suivants ;
C : consigne.
y : sortie du processus.
368
Chapitre 9
Les paramtres du sous-systme ne sont pas affects leurs valeurs car elles seront entres
travers une boite de dialogue.
Les paramtres du rgulateur (gain et dnominateur) sont appels K et den_reg. Pour le
modle dtat du processus, nous utilisons la forme de fonction de transfert discrte.
Idem pour la priode dchantillonnage quon dsigne par Te=5s.
Lorsque ces variables sont affectes leurs valeurs, elles le sont automatiquement dans
SIMULINK. Pour cela, nous excutons le fichier param_masq_reg.m.
Les 2 fentres suivantes montrent les noms de ces diffrentes variables (rgulateur et
processus).
fichier param_masq_reg.m
% Paramtres du processus
a=0.7788;
b=0.177;
% Rgulateur intgral
K=0.1; % Gain du rgulateur
den_reg=[1 -1]; % dnominateur du rgulateur
SIMULINK
369
On remplit ensuite des champs pour dfinir le masque (Se rfrer au chapitre Masques et
sous-systmes). Dans cette fentre le prompt est ce qui sera affich par Matlab dans la boite
de dialogue, lorsquon clique sur le masque. Dans la colonne variable, on spcifie le nom de
la variable utilise.
370
Chapitre 9
Dans la colonne variable, ce sont les valeurs des paramtres qui seront utiliss lors de
lexcution du masque.
Dans le fichier nous avons spcifi les valeurs de ces diffrentes variables, a,b, K,
den_reg et Te.
SIMULINK
371
Pour lapprentissage approfondi sur le masquage des sous-systmes, le lecteur doit se rfrer
au chapitre Masques et sous-systmes ddi cet effet.
372
Chapitre 9
Ces commandes peuvent tre utilises dans le callback PostLoadFcn (juste aprs
louverture du modle Simulink).
Nous pouvons utiliser ce modle sans excuter de script pour spcifier des valeurs aux
variables. Avec la mme consigne carre que prcdemment, nous obtenons les mmes
rsultats (signaux de consigne et de sortie sur loscilloscope).
Un chapitre entier est consacr aux callbacks auquel le lecteur doit se rfrer.
SIMULINK
373
Pour faire apparatre cette librairie de blocs personnels, on modifie le fichier slblocks.m
comme suit :
Aprs lexcution de ce fichier, nous retrouvons cette bibliothque dans le browser Simulink,
au mme titre que Stateflow, etc.
Nous pouvons ainsi utiliser ses diffrents blocs de la mme faon quon le fait pour les blocs
Simulink ou autre outil additionnel.
Nous remarquons la prsence de la librairie Mes blocs au mme titre que celles de
Simulink.
Nous pouvons ainsi utiliser ces blocs dans un programme Simulink, comme par exemple le
bloc inverse qui calcule linverse dun vecteur terme terme.
374
Chapitre 9
des appareils virtuels de visualisation graphique (oscilloscope pour afficher des donnes en
fonction du temps, XY graph pour visualiser une srie de donnes en fonction dune
autre comme le diagramme de Lissajous),
un bloc denregistrement de donnes dans un fichier mat,
un bloc pour enregistrer des donnes dans une variable globale entre SIMULINK et
lespace de travail MATLAB,
375
SIMULINK
une icne qui permet larrt de la simulation lorsquelle reoit un niveau logique 1 son
entre.
Un exemple dutilisation du bloc XY Graph est donn par la figure suivante dans lequel on
trace une sinusode en fonction dune autre.
Pour raliser un autre exemple utilisant les autres blocs, nous avons besoin dutiliser un
systme continu dfini par sa fonction de transfert (continuous) attaqu par un signal
chelon (librairie Sources).
4
est du premier ordre, de gain statique gal 4.
3p +1
Nous calculons la diffrence instantane sortie moins la consigne. Ds que cette diffrence est
gale ou suprieure 2.999 on arrte la simulation en attaquant le bloc Stop par un signal
logique (Boolean).
Le systme analogique H ( p =
Comme le bloc de comparaison une constante sort un signal de type uint8 (octet non
sign), nous avons du placer un convertisseur de uint8 vers Boolean.
Le convertisseur (converter) appartient la librairie Signal Attributes. Le bloc de
comparaison une constante
Operations.
376
Chapitre 9
Nous avons aussi sauvegard les signaux qui sortent du multiplexeur dans un fichier binaire
es.mat, les signaux tant contenus dans la variable signaux.
La lecture du fichier binaire se fait par la commande load.
377
SIMULINK
Les commandes suivantes permettent de lire ce fichier et de tracer les 2 signaux dentre et de
sortie.
load es
whos
Name
signaux
Size
Bytes
3x29
696
Class
Attributes
double
On retrouve bien la variable signaux qui contient les signaux dentre/sortie auquel sest
ajout le temps.
Comme on la vu dans loscilloscope, il y a bien 29 points larrt de la simulation.
Les lignes de commande permettent de tracer les signaux enregistrs dans le fichier binaire.
load es, close all
temps= signaux(1,:);
entree=signaux(2,:);
sortie=signaux(3,:);
plot(temps, entree)
axis([0 50 -0.5 4.5])
grid, hold on
plot(temps, sortie)
gtext('entre'), gtext('sortie')
title('Signaux d''entre et de sortie'), xlabel('temps')
Signaux d'entre et de sortie
4.5
4
3.5
sortie
3
2.5
2
entre
1.5
1
0.5
0
-0.5
10
15
20
25
temps
30
35
40
45
50
Chapitre 9
378
Le bloc In1 sert dentre pour les sous-systmes avant leur masquage, en mme
temps que le port Out1 de la librairie Sinks pour servir de port de sortie.
SIMULINK
379
Selon la valeur du temps de simulation (30 et 70), on fait passer un signal carr, puis une
squence rptitive bruite par un random gaussien puis un signal sinusodal.
Chapitre 9
380
diffrentes fonctions de transfert discrtes en z ou z-1 que lon peut spcifier par les
coefficients de leur numrateur et dnominateur ou par les valeurs de leurs ples et
zros,
fichier aff_sign_sortie.m
% rcupration des signaux dans la variable sortie
y=sortie(:,1); u=sortie(:,2); c=sortie(:,3);
% affichage des diffrents signaux
plot(y), hold on, plot(c), stairs(u), grid
% annotation des diffrents signaux
gtext('signal de commande'), gtext('sortie')
gtext('consigne')
% titre et axe des abscisses
title('commande par un intgrateur intgr SIMULINK')
xlabel('temps')
381
SIMULINK
commande par un intgrateur intgr SIMULINK
22
20
signal de commande
18
16
14
12
10
8
consigne
6
4
2
0
sortie
0
10
20
30
40
50
60
70
80
90
100
temps
Chapitre 9
382
Les 2 fentres suivantes reprsentent respectivement lvolution, dans le temps des diffrents
signaux ; la consigne et le signal de sortie pour la premire et le signal de commande pour la
seconde.
Ces lignes de commande permettent de tracer les signaux de consigne, sortie et commande.
close all
plot(cuy(:,3))
hold on
plot(cuy(:,1))
title('Consigne et sortie')
gtext('Sortie')
grid
figure
stairs(cuy(:,2))
grid
title('Signal de commande')
Consigne et sortie
9
8
Sortie
7
6
5
4
3
2
1
0
20
40
60
80
100
120
383
SIMULINK
Signal de commande
1000
800
600
400
200
0
-200
-400
-600
20
40
60
80
100
120
Dans la loi de commande suivante, la commande prcdente est reproduite tant que la valeur
absolue de lerreur est infrieure 3, dans le cas contraire seule la partie proportionnelle de
10 est utilise.
Les lignes de commande suivantes permettent de lire le fichier binaire cuy.mat et de tracer
les diffrents signaux qui y sont stocks.
plot(cuy(:,1)), hold on, plot(cuy(:,3))
axis([0 160 3 6]), grid, gtext('sortie'), gtext('consigne')
title('Signaux de consigne et de sortie')
Chapitre 9
384
Comme le montrent les figures suivantes, lvolution de la sortie est non linaire. Grce
linhibition de lintgrale lors des grandes erreurs de poursuite, nous obtenons des valeurs de
la commande plus faibles que prcdemment.
Signaux de consigne et de sortie
sortie
5.5
4.5
consigne
3.5
20
40
60
80
100
120
140
160
close
stairs(cuy(:,2)), grid
gtext('Signal de commande')
250
200
Signal de commande
150
100
50
0
-50
-100
10
20
30
40
50
60
70
80
90
SIMULINK
385
Nous remarquons que sur loscilloscope, il apparat le signal x(n) qui correspond ltiquette
de la ligne laquelle il est reli ; ceci par un double clic sur la ligne et remplissage de la zone
texte de ltiquette.
Le signal, aprs plusieurs oscillations dcroissantes, se stabilise la valeur finale 2.223 au
bout dune cinquantaine ditrations environ.
Chapitre 9
386
>>
>>
>>
>>
>>
>>
y=yu(:,1); u=yu(:,2);
stairs(y), hold on, stairs(u)
title('solution d''une quation rcurrente')
xlabel('temps discret')
gtext(['\downarrow solution = ' num2str(y(length(y)))])
grid, gtext('entre'), gtext('volution de la solution')
solution d'une quation rcurrente
1.5
entre
1
solution = 0.75007
volution de la solution
0.5
10
20
30
temps discret
40
50
60
SIMULINK
387
Dans cette librairie, on trouve des blocs continus, tels la drive continue, les fonctions de
transfert de Laplace, les modles dtat continus ainsi quun intgrateur continu et des
transports delay.
Dans lexemple suivant on ralise diverses oprations (drivation, intgration, transport delay
et retard de 1 chantillon sur le mme signal sinusodal).
Chapitre 9
388
Les lignes de commande suivantes permettent la lecture du fichier binaire et de tracer les
diffrentes figures quon peut observer aussi sur loscilloscope.
close all, clear all, clc
load signaux
temps=sign(1,:); signal_origine=sign(2,:);
plot(temps,signal_origine)
gtext('\leftarrow Signal origine')
pause(2)
hold on
derivee=sign(3,:);
plot(temps,derivee,':'), gtext('\rightarrow Drivee ')
pause(2)
hold on
integration=sign(4,:);
plot(temps,integration,'-.')
gtext('\leftarrow Integ'), grid
title('Transformations continues')
delay=sign(5,:);
plot(temps,delay,'o')
gtext('Delay de 5')
Transformations continues
2
Integ
1.5
Signal origine
1
0.5
Drivee
Delay de 1
-0.5
-1
10
389
SIMULINK
H ( p) =
1
p2
>>
>>
>>
>>
>>
>>
h=plot(y);
set(h,'Linewidth',2);
axis([0 200 0 max(y)])
grid,
title('rponse indicielle du volant d''inertie')
xlabel('temps continu')
390
Chapitre 9
r ponse indicielle du volant d'inertie
18000
16000
14000
12000
10000
8000
6000
4000
2000
0
20
40
60
80
100
120
temps continu
140
160
180
200
&y& = u (t )
Le systme dtat obtenu partir de cette quation est :
x&1 0 1 x1 0
x& = 0 0 x + 1 u (t ) = A X + B u (t )
2
2
x
X dsigne le vecteur dtat 1 .
x2
Ci-dessous, on montre lutilisation du bloc de la reprsentation dtat et la saisie des
diffrentes matrices.
On dsire changer la dynamique du processus en imposant les ples de la boucle ferme par
le retour dtat.
Ces ples sont les solutions de lquation caractristique :
det( pI A + B F ) = 0
391
SIMULINK
On dsire que la position atteigne la valeur 50 radians pour se stabiliser (vitesse nulle) suivant
la dynamique impose par les ples de la boucle ferme. On impose les ples du retour
lquilibre suivants :
p1 = 0.2 et p 2 = 0.1 .
0.04
On obtient le vecteur de retour dtat suivant : F =
.
0.3
Si le systme est boucl par le retour dtat comme entre : q F x(t ) , avec q une constante,
nous avons :
u (t ) = q F x(t )
En rgime permanent, la drive du vecteur dtat est nulle,
X& = A X + B u = 0
Chapitre 9
392
soit :
A X = Bu
Nous avons ainsi :
A X = B u = B (q F X )
En rgime permanent, le vecteur dtat, qui se confond la premire composante x1 (la
deuxime correspondant la vitesse sera nulle), avec cette commande, est alors donn par :
X = q ( A B F ) 1 B
La valeur de la constante q permettant davoir une position finale x10 est alors, dans ce cas,
donne par :
B q = (A B F) X
Ceci donne la valeur de la constante q pour atteindre ltat final X f :
q = ( B '*B ) 1 * B '*( A B * F ) X f
La figure suivante montre la loi de commande ainsi que la valeur du vecteur du retour dtat.
393
SIMULINK
Les lignes de commande suivantes permettent de lire le fichier x et de tracer les courbes des 2
composantes dtat.
close all
% trace de la 1re composante dtat x1
plot(x(:,1)), hold on
% trace de la 2me composante dtat x2
plot(x(:,2)), axis([0 50 0 60])
title('Evolution des composantes d''tat')
xlabel('Temps'), grid
gtext('\leftarrow x1')
gtext('\downarrow x2')
60
50
40
x1
30
20
10
x2
0
10
15
20
25
30
35
40
45
50
Temps
La position, qui correspond la composante dtat x1, se stabilise sur la valeur de 50 radians
au bout de 25 secondes environ. La deuxime composante x2 sannule au mme moment
puisquelle reprsente la vitesse.
V.5. Tables dinterpolation ou dextrapolation linaires
Les tables permettent destimer, par interpolation linaire, une valeur dune fonction partir
dun nombre fini de points.
MATLAB fournit des tables une ou deux dimensions.
Chapitre 9
394
La table consiste partir dun ensemble limit de points dcrits par leurs abscisses et leurs
ordonnes, dobtenir lordonne dun point intermdiaire dont on donne la valeur de son
abscisse.
La figure suivante implmente une table donnant les valeurs allant de la tangente
hyperbolique de valeurs allant de -5 0 par pas de 1.
A partir de cette table, on cherche obtenir lordonne de la valeur dabscisse x=1.
On peut facilement vrifier cette valeur en traant cette fonction entre -5 et 10 par pas de 0.1.
395
SIMULINK
verif_table1.m
% intervalle de variation de x
x=-5:0.1:10;
% fonction tangente hyperbolique dfinie sur -5 et 10
f=tanh(x);
% trac de la fonction
plot(x,f)
% recherche de lindice pour lequel x=1
i=find(x==1);
% affichage de la valeur de f de cet indice
gtext(['l''ordonne pour x=1 est : ' num2str(f(i))])
grid
L'ordonne pour x=1 est : 0.76159. On obtient exactement la mme chose et le trac montre
la validit de cette valeur.
Ces lignes de commandes permettent de tracer la courbe sur lintervalle [-5 ; 5] sur laquelle
on fait apparatre en traits pointills labscisse x=1 et la valeur de son ordonne, quasiment la
mme que celle obtenue par lintervalle en utilisant la table.
plot(ones(1,length(-1:0.1:tanh(1))),-1:0.1:tanh(1),':')
hold on
plot(-5:0.1:1,tanh(1)*ones(1,length(-5:0.1:1)),':')
axis([-5 5 -1 1]), >> grid
title('tangente hyperbolique')
1.5
V a le u rs d o n n e s p a r la ta b le
>>
>>
>>
>>
>>
X: 1
Y: 0.7616
0.5
-0.5
-1.5
-5
-4
-3
-2
-1
abscisse
396
Chapitre 9
On peut interpoler ou extrapoler plusieurs points en mme temps en envoyant lensemble des
abscisses de ces points la table.
Grce
lorsque lentre
Les lignes de code suivantes permettent de tracer les points de la table (ronds) et ceux obtenus
par interpolation (croix).
>>
>>
>>
>>
>>
>>
>>
hold on
plot([0 2 3 5],[0 1 6 16],'o')
plot([[1.5 3 4 4.5]],[0.75 6 11 13.5],'*')
title('o : points de la table, * : points interpols')
xlabel('abscisses')
ylabel('ordonnes')
grid
397
SIMULINK
o : points de la table, * : points interpols
16
14
ordonnes
12
10
8
6
4
2
0
0.5
1.5
2.5
abscisses
3.5
4.5
398
Chapitre 9
Une table deux dimensions permet, partir dun couple restreint (x,y) et de leurs ordonnes
respectives, destimer lordonne dun couple dabscisses en dehors (extrapolation) ou
lintrieur (interpolation) du domaine implment dans la table.
V.6. Librairie Logic and Bit Operations
Cette librairie comporte des blocs logiques et combinatoires, dautres qui permettent de
dtecter le monte ou la descente dune courbe. Nous avons aussi des oprateurs logiques
(AND, NOT, etc.) et relationnels (gal, plus petit, etc.) ainsi quune table combinatoire
logique permettant la spcification dexpressions logiques complexes.
V.6.1. Circuits logiques et combinatoires
0
0
0
1
0
1
Pour raliser cette opration, il faut remplir les diffrentes valeurs (0 ou 1) suivant le sens de
la flche en les sparant par un point virgule.
En dautres termes, on peut reprsenter cette table par le tableau suivant :
a
0
0
1
1
b
0
1
0
1
a ET b
0
0
0
1
399
SIMULINK
b
0
1
0
1
a+b
0
1
1
0
retenue
0
0
0
1
Chapitre 9
400
Considrons la fonction :
x = (a+b). c b
La figure suivante montre sa ralisation en utilisant les oprateurs logiques (Logical
Operators) :
401
SIMULINK
a
b
c
x
=
=
=
=
[0 0 0 0 1 1 1 1] ;
[0 0 1 1 0 0 1 1] ;
[ 0 1 0 1 0 1 0 1] ;
not(not(or(a,b))& c & not(b))
0
On peut raliser cette fonction laide de sa table de vrit, en utilisant le tableau suivant :
a
0
0
0
0
1
1
1
1
b
0
0
1
1
0
0
1
1
c
0
1
0
1
0
1
0
1
x
1
0
1
1
1
1
1
1
402
Chapitre 9
Nous allons tudier dans le modle Simulink suivant des blocs de cette librairie qui
permettent de :
- dtecter le type de variation (positif, signal croissant ou ngatif dans le cas de la
dcroissance),
- le passage par zro dun signal continu.
fichier autres_elts_log.m
close all
subplot(411)
plot(simout(:,1))
axis([0 50 -1.2 1.2])
title('Sinusode')
subplot(412)
plot(simout(:,2))
title('Dtection de la dcroissance')
axis([0 50 -0.2 1.2])
subplot(413)
plot(simout(:,3))
title('Dtection d''un passage croissant par zro')
axis([0 50 -0.2 1.2])
subplot(414)
plot(simout(:,4))
axis([0 50 -0.2 1.2])
title('Dtection de la variation')
403
SIMULINK
Sinusode
1
0
-1
0
10
15
20
25
30
35
Dtection de la dcroissance
40
45
50
10
15
20
25
30
35
40
Dtection d'un passage croissant par zro
45
50
10
15
40
45
50
10
15
40
45
50
1
0.5
0
1
0.5
0
20
25
30
35
Dtection de la variation
1
0.5
0
20
25
30
35
qui donne 1
Le deuxime bloc
sens croissant.
Chapitre 9
404
V.7. Librairie Ports & Subsystems
Cette librairie contient principalement des blocs concernant les sous-systmes. Nous
trouvons, dans la nouvelle version de Simulink, des boucles For, While, Switch Case,
des conditions If disponibles auparavant, uniquement dans les scripts Matlab.
Nous
allons
dabord
tudier
la
condition
If
elseif,
en
utilisant
le
.
bloc
En double-cliquant dessus nous obtenons cette boite de dialogue dans laquelle on peut
spcifier le nombre dentres sur lesquelles portera la condition.
On crit ensuite lexpression de la condition If, comme ici u1>0.
SIMULINK
405
Nous pouvons aussi utiliser des oprateurs logiques tels le ET (&), ~= (diffrent), le OU (|),
etc. dans lexpression de la condition. Les expressions des diffrents elseif sont entres
dans le champ correspondant en les sparant par des virgules. Dans notre cas, nous avons les
deux elseif u1<9 et u1==0.
If
Chaque sortie de ce bloc attaque lentre trigger (dclenchement) dun sous-systme dans
lequel est programme laction raliser.
Chapitre 9
406
A ce sous-systme on peut ajouter autant dentres (In) et de sorties (Out) que lon peut
renommer (pour plus dinformations sur les sous-systmes, on se rfrera au chapitre ddi
aux sous-systmes et leur masquage).
Puisque la condition if(u1>0) est ralise, nous obtenons bien le carr de lentre. Les
sorties elseif, alors ignors sortent 0.
Les deux elseif permettent de raliser les actions suivantes :
9 u1
sortie de cette valeur nulle telle quelle.
Le else final correspond au calcul du produit des lments du vecteur [1 5 9].
Switch case
Dans le cas o lentre vaut 1 (case {1}), on value le polynme x2+2x+3 pour x = 2.
SIMULINK
407
On peut montrer ou cacher le cas par dfaut en cochant ou dcochant la case Show
default case. Ici, il est visible mais non utilis.
Dans cette librairie, nous trouvons des blocks qui permettent lutilisateur de crer ses
propres fonctions (Fcn, S-fonctions, etc.).
Les S-fonctions font partie dun chapitre particulier. Le bloc Fcn, linstar du bloc Matlab
Fcn, permet de programmer des fonctions utilisant des commandes Matlab.
Dans le modle Simulink suivant, nous rsolvons le systme linaire A x = B en spcifiant la
diffrence A x B lentre du bloc Fcn afin de lannuler.
La sortie de ce bloc correspond la valeur de x qui annule cette diffrence.
Chapitre 9
408
Dans lexemple suivant, nous rsolvons le systme non linaire 2 inconnues, suivant :
cos x + y = 0.5
ln( x + 1) 3 arcsin y = 2.5
En faisant la rtroaction (retour de droite vers la gauche) des variables x et y, on utilise 2
blocs Fsolve pour rsoudre les deux quations suivantes :
cos x + y + 0.5 = 0
ln( x + 1) 3 arcsin y 2.5 = 0
Les diffrences sont les entres des blocs et les sorties sont les solutions.
Nous pouvons aussi rsoudre le systme laide dun seul bloc Fsolve et 2 blocs Fcn, en
recherchant simultanment le vecteur form par les 2 variables, [x,y].
La variable dentre dun bloc Fcn est toujours note u. Cette fois-ci u reprsente le vecteur
o x = u(1) et y = u(2).
SIMULINK
409
Aprs le calcul de chacune des composantes de ce vecteur, on les multiplexe avant lentre
dans le bloc Fsolve.
Nous retrouvons les mmes valeurs de x et y avec cette mthode vectorielle que par le calcul
spar de chacune des inconnues.
Nous retrouvons les mmes rsultats que prcdemment.
V.9. Librairie Commonly Used Blocks
Cette librairie contient des blocs qui reviennent trs souvent dans la modlisation des
systmes dynamiques.
Chapitre 9
410
V.10. Librairie Discontinuities
On gnre un signal sinusodal que lon fait passer en parallle, et successivement par le bloc
valeur absolue , llment de quantification (Quantizer), la zone morte (dead zone)
et le bloc qui sature entre 2 limites donnes.
Les diffrents traitements donnent des signaux qui entrent dans un commutateur multiple qui
fait passer lun deux suivant le chiffre prsent sa premire entre, comme le montre le
tableau suivant.
seuil de la 1re entre
jusqu 1.4999...
de 1.5 2.4999...
de 2.5 3.4999...
de 3.5 4.4999...
etc.
411
SIMULINK
Ainsi le tableau suivant rsume le type de signal qui passe par le commutateur en fonction du
temps :
intervalle de temps
t<500
500<t<=1000
1000<t<=1500
1500<t<=2000
fonction ralise
valeur absolue
quantification
zone morte
limitation
0.2
0.4
0.6
0.8
Temps
1.2
1.4
1.6
1.8
2
4
x 10
412
Chapitre 9
, permutation des
SIMULINK
413
414
Chapitre 9
Afin dviter des longs fils de connexion ainsi que le croisement de ceux-ci, pour une
meilleure visibilit du diagramme, on peut stocker une information dans une tiquette (Goto)
que lon nomme par une chane de caractres dsignant le signal stock et le rcuprer plus
loin par le bloc (From) nomm pareillement.
Dans ce diagramme, on gnre, dans 2 sous-systmes diffrents, un signal sinusodal et un
signal alatoire que lon dirige vers des tiquettes.
SIMULINK
415
416
Chapitre 9
Le diagramme suivant montre le stockage et la restitution de valeurs par les blocs Data
Store Write et Data Store Read. Le bloc Data Store Memory doit tre prsent
dans le mme diagramme.
Bus Selector
Le bus slecteur agit comme un dmultiplexeur avec lequel on peut slectionner les entres
venant dun multiplexeur. Les diffrents signaux dentre peuvent provenir dun autre bus
slecteur.
SIMULINK
417
En double cliquant sur le bus slecteur, on ouvre la fentre suivante dans laquelle on
slectionne les entres qui doivent sortir. Ces noms correspondent aux tiquettes insres aux
lignes de connexion en double cliquant dessus. On slectionne une entre et avec le bouton
Select >>, il sinsre dans la partie Selected signals (signaux slectionns).
Le bouton Remove permet de supprimer un ou plusieurs signaux slectionns. Up et Down
permettent de descendre et monter dans la liste de ces signaux.
On obtient bien les signaux Chirp et Ramp slectionns. Si on coche le bouton Muxed
Output, tous les signaux slectionns sont multiplexs.
418
Chapitre 9
Dans ce cas, loscilloscope affiche les 2 signaux multiplexs la fois. Le titre de la fentre
correspond ltiquette du 1er signal, qui est rampe dans notre cas.
Slecteur
Dans la fentre de dialogue du slecteur, on indique quil admet 5 entres et que lon dcide
de rcuprer la 1re et la 3me des valeurs.
Cest une librairie contenant principalement des modles discrets avec des tats initiaux ou
sorties initiales connus, soit sous forme zros /ples ou fonction de transfert.
SIMULINK
419
Dans ce qui suit, nous avons un modle sous la forme zros/ples avec tats initiaux (entre et
sortie nulles).
Les lignes de commande suivantes permettent dafficher les signaux dentre et de sortie du
systme contenus dans la variable globale y.
>> s=y(:,1);
>> u=y(:,2);
>> stairs(u)
>> hold on
>> h=plot(s);
>> set(h,'LineWidth',2)
>> title('rponse une rampe d''un 1er ordre avec retard
pur')
>> xlabel('temps discret')
>> grid
>> gtext('\leftarrow rampe d''entre')
>> gtext('\leftarrow signal de sortie')
420
Chapitre 9
rponse une rampe d'un 1er ordre avec retard pur
80
70
60
signal de sortie
50
40
rampe d'entre
30
20
10
0
10
20
30
40
50
60
temps discret
Dans cette librairie, nous trouvons le rgulateur PID, le bloc de modlisation dtat avec
initialisation des sorties, des fonctions de transfert continues, ainsi que la forme zros/ples
avec des tats initiaux.
Dans le modle Simulink suivant, nous allons tudier une rgulation PID laide de lun de
ces blocs.
SIMULINK
421
>> u=uy(:,1);
>> y=uy(:,2);
>> plot(u)
>> hold on
>>
>>
>>
>>
plot(y)
grid
axis([0 80 0 1.1])
h=plot(y);
>> set(h,'LineWidth',2)
>> title('Rgulation PI d''un processus analogique du 1er ...
ordre')
>> xlabel('temps')
Chapitre 9
422
Rgulation PI d'un processus analogique du 1er ordre
1
Sortie du processus
0.8
Signal de consigne
0.6
0.4
0.2
10
20
30
40
50
temps
60
70
80
SIMULINK
423
Dans le diagramme suivant, on affiche la densit spectrale de puissance dun signal sinusodal
de pulsation 10 rad/s sur 512 points.
Dans la fentre suivante, on affiche le signal, la densit spectrale de puissance dont le pic de
puissance se trouve exactement la puissance du signal (10 rad/s) et tout en bas on retrouve
la phase en degrs. Tous ces signaux sont affichs en fonction de la pulsation (rad/s).
Chapitre 9
424
VI.4. Librairies Transformation & Flips Flop
Transformation
3 exemples de conversion sont donns ci-dessous : une conversion de radians en degrs et son
inverse ainsi que celle qui transforme les coordonnes polaires en coordonnes cartsiennes.
SIMULINK
425
Flips Flops
Chapitre 9
426
Les lignes de commande suivantes permettent de tracer lvolution de lhorloge et des bits du
compteur.
Nous avons ajout aux valeurs de lhorloge et des 3 bits du compteur le vecteur [1.5 0 -1.5 -3]
pour un trac clair des 4 signaux.
>>
>>
>>
>>
clock=mot(:,1)
bit1=mot(:,2);
bit2=mot(:,3);
bit3=mot(:,4);
>> plot(clock)
stairs(bit1)
stairs(bit2)
stairs(bit3)
stairs(bit4)
427
SIMULINK
compteur 3 bits (modulo 8)
3
-1
-2
-3
0
10
15
20
25
30
Chapitre 10
Masques et sous-systmes
I. Sous-systmes
I.1. Sous-systme sinus amorti
I.2. Sous-systme Gnrateur de squences
binaires pseudo-alatoires, SBPA
II. Masquage des sous-systmes
II.1. Masquage du sous-systme sinus amorti
II.2. Masque du sous-systme du gnrateur SBPA
II.3. Masques dalgbre linaire
II.3.1. Rsolution dquation linaire
II.3.2. Gnrateur PWM
III. Sous-systmes bibliothque Ports & Subsystems
III.1. Iterator Subsystem
III.2. Sous-systme If
III.3. Sous-systme Switch Case
III.4. Sous-systmes activs et triggs
III.4.1. Sous-systmes activs
III.4.2. Sous-systmes triggs ou dclenchs
III.5. Sous-systme configurables
Lencapsulation ou le masquage dun ensemble de blocs, linstar des S-fonctions, est une
fonctionnalit trs importante de SIMULINK qui permet dobtenir un seul bloc par fonction
dans un modle complexe. Cette association dun ensemble de blocs est transforme en un
seul pour effectuer une tche spcialise (calcul particulier, gnration de signal, etc.).
Parmi les principaux intrts des masques et des sous-systmes, il y a, entre autres :
cration de blocs propres au domaine de chaque utilisateur,
rduction du nombre de botes de dialogue,
hirarchisation, rduction et plus de clart des modles SIMULINK.
Nous allons, tout dabord, tudier quelques sous-systmes de la bibliothque Ports &
Subsystems, puis lditeur de masques dans quelques exemples prcis de calcul
numrique, gnrateurs de signaux, etc.
430
Chapitre 10
I. Sous-systmes
I.1. Sous-systme sinus amorti
Les blocs correspondants sont dans la librairie Ports & Subsystems.
Nous nous intressons aux sous-systmes, bloc Subsystem, dont on se servira pour raliser
des masques.
Nous dsirons crer un bloc SIMULINK permettant de gnrer le signal sinusodal amorti
dexpression :
x (t ) = a e k t sin( w t )
Nous commenons par crer lensemble des blocs ralisant cette expression.
On utilise principalement le bloc MATLAB Function dans lequel on programme les
fonctions mathmatiques sin (sinus) et exp (exponentielle) de MATLAB.
Masques et sous-systmes
431
Les oprateurs sinus et exponentiel sont dfinis par le mme bloc MATLAB
Function de la librairie User-Defined Functions la Release 2009a.
En slectionnant lensemble laide de la souris, loption Create Subsystem du menu
Edit permet de crer le sous-systme quivalent.
En double-cliquant sur licne obtenue, on retrouve le dtail du systme auquel sont ajouts
les blocs input (entres) et output (sorties).
Il est ncessaire, pour plus de lisibilit, de donner ces blocs les noms des variables utilises,
soit a, phi, w, k et x dans notre cas.
Chapitre 10
432
On
obtient
signal x (t ) = 4 e 0.2 t sin 2 t , que lon envoie dans lespace de travail sous la forme de
matrice x (Array).
4
3
2
1
0
-1
-2
-3
-4
-5
10
20
30
40
50
60
Les squences binaires pseudo-alatoires sont trs utilises dans le domaine de lidentification
de processus pour reprsenter un signal binaire suppos blanc et centr.
Chaque squence SBPA est dfinie par un polynme caractristique, llment n j dune
squence de longueur 1023 est donn par : u( j ) = u( j 7) u( j 10) .
On utilise les retards z-3 et z-7 de la bibliothque quon initialise indpendamment 1 et -1.
La squence SBPA de longueur 1023 est implmente de la faon suivante :
Masques et sous-systmes
433
Loscilloscope reprsente ce signal PWM variant entre -1 et 1. Les retards discrets doivent
tre imprativement initialiss -1 pour lun et 1 pour lautre.
Pour avoir des valeurs comprises entre 0 et une amplitude ampl, nous devons programmer
une transformation linaire a x + b. Cest ce que nous verrons lorsque nous ferons le
masque afin davoir le cas gnralement utilis dans lindustrie, des tensions variant entre 0 et
5 V (niveau TTL).
Chapitre 10
434
2. Icon transparency
3. Icon Units
4. Icon rotation
5. Port rotation
Dans la fentre Parameters, on dfinit les variables que lon spcifie comme ditables,
valuables et modifiables.
Masques et sous-systmes
435
436
Chapitre 10
Le menu Initialization permet de dfinir les variables ainsi que leur signification
(prompt) que lon retrouvera dans la bote de dialogue dans laquelle on entrera les valeurs
de type numrique, chane de caractres ou boolen. La valeur numrique dune variable peut
tre entre directement dans un champ ddition ou choisie parmi plusieurs dans un menu
droulant. Le type boolen est prvu en cochant (1 logique) ou en laissant vierge (0 logique)
la case correspondante.
Une variable peut prendre une valeur sous forme de chane de caractres. MATLAB
linterprtera en utilisant la commande eval.
Les variables dfinies (a, w, phi, k) nexistent que dans lespace de travail du masque ;
elles ne sont donc pas vues par MATLAB.
On excute le masque et on fait appel la variable k dans MATLAB :
>> k???
Undefined function or variable 'k'.
On peut utiliser cette mme variable k dans le masque et MATLAB sans quil y ait
interfrence.
II.2. Masque du sous-systme du gnrateur SBPA
Masques et sous-systmes
437
Le bloc MATLAB Function comporte la commande u(k) pour choisir la squence nk.
On slectionne lensemble des blocs que lon transforme dabord en sous-systme puis en
masque.
Les commandes crites dans la fentre Dialog Callback saffiche devant le prompt de
MATLAB chaque excution du masque.
Dans la fentre du menu Parameters de lditeur de masque permet de dfinir les
diffrentes variables.
Nous pouvons les diter en leur affectant des valeurs (numriques ou chanes de caractres),
ou choisir leurs valeurs dans un menu droulant ou des boites cocher.
Chapitre 10
438
Le masque du sous-systme est utilis pour gnrer la squence n 2 soit une longueur 63.
>> stairs(x), axis([0 63 -3.5 3.5])
>> title('SBPA de longueur 63, et d''amplitude 3')
SBPA de longueur 63, et d'amplitude 3
3
-1
-2
-3
0
10
20
30
40
50
60
Masques et sous-systmes
439
0.5
-0.5
-1
-1.5
100
200
300
400
500
600
700
800
900
1000
440
Chapitre 10
Masques et sous-systmes
441
Nous obtenons le sous-systme suivant qui donne les mmes solutions si on lui rentre la
mme matrice A et le mme vecteur B (connus dans le Callback InitFcn, comme
prcdemment).
Chapitre 10
442
Onglet Parameters
Dans la colonne Prompt on note ce qui sera affich dans la boite de dialogue du masque
lorsquon double clique dessus.
Dans la colonne Variable, on met les valeurs de la matrice A et du vecteur B. Dans ce cas,
A et B reprsentent les valeurs de ces variables puisquon spcifie celles-ci dans la boite de
dialogue du masque.
Onglet Documentation
Masques et sous-systmes
443
Le texte que lon met dans le champ Mask help est celui quon obtient lorsquon demande
de laide en slectionnant le bloc avec le choix de Help aprs un clic droit.
Ci-dessous, nous utilisons le masque pour rsoudre le mme systme quavec le sous-systme
prcdent, puis un systme dtermin.
Le masque permet aussi la rsolution des systmes dtermins (autant dquations que
dinconnues).
444
Chapitre 10
Dans longlet Parameters, et dans la colonne Variable, on crit les noms des variables
mat_A et vect_B du modle ci-dessus.
Masques et sous-systmes
445
Le signal PWM est trs utilis dans lindustrie, entre autres, de lautomobile. Cest un signal
carr dont le rapport cyclique est dfini par la longueur du niveau haut sur la priode du
signal.
Dans le cas dune tension qui varie entre 0 et 5V, ces 2 valeurs correspondent respectivement
aux valeurs 0% et 100% du rapport cyclique.
Un signal purement carr possde un rapport cyclique de 50%.
On se propose de raliser un masque qui gnre ce type de signal.
On utilise la fonction square de la boite outils Control System Toolbox dfinie
par :
y= square(2*pi*f*t, duty) = square(2*pi*t/T, duty),
f, t et duty tant respectivement la frquence, le temps et le rapport cyclique.
Ce signal varie entre -1 et 1 et si lon veut que notre signal PWM ait une amplitude ampl,
nous devons raliser la transformation linaire ampl*(y+1)/2.
On rentre le temps (clock), le paramtre 2/T et le rapport cyclique duty-cycle
travers un multiplexeur.
On donne ci-aprs le masque et le rsultat du cas du rapport cyclique de 80% et une amplitude
de valeur 5. Dans longlet Icon & Parameters, on trace un signal PWM de rapport
cyclique de 20%.
446
Chapitre 10
Lorsquon double clique sur le bloc du masque, nous avons la boite de dialogue suivante dans
laquelle on spcifie la priode et lamplitude du signal.
Dans lexemple suivant, nous montrons lexemple de la gnration dun signal PWM de
rapport cyclique 80% et damplitude 5.
Masques et sous-systmes
447
Nous avons rajout dans le sous-systme une sortie supplmentaire out2, qui ressort le
nombre ditrations, gal 10.
448
Chapitre 10
Masques et sous-systmes
449
Le sous-systme If comporte une condition sur lentre, if(u1<0). Cette condition peut
tre plus complexe et sur autant dentres quil y a. Le sous-systme If sort des signaux
daction qui sont vrai quand cette condition est ralise.
On peut avoir les sorties else et else if.
Dans notre cas, lorsque le signal dentre sinusodal est ngatif, on prend sa valeur absolue,
autrement on multiplie son amplitude par 5.
Ce bloc, comme les prcdents, contrle le flux de donnes dans le cas o une condition
aboutit plusieurs alternatives. On se propose, dans ce qui suit, de raliser un masque dun
gnrateur de signal alatoire dont on peut choisir le type gaussien ou uniforme.
Chapitre 10
450
Le type k sera choisi par menu droulant (popup). Lorsquon double-clique sur le masque,
on aboutit la fentre suivante pour le choix de ces paramtres. Il sagit ici de la gnration
dun signal gaussien centr (moyenne nulle) et de variance 0.01.
Masques et sous-systmes
451
Le bouton Unmask dsactive tout ce qui a t dfini dans lditeur du masque. Il suffit de ne
pas enregistrer le modle si on veut revenir et garder le masque. Le bouton Help donne de
laide sur la cration de masques. Lorsquon veut visualiser le contenu du masque, il suffit de
choisir loption Look Under Mask du menu Edit.
III.4. Sous-systmes activs et triggs
III.4.1. Sous-systmes activs
452
Chapitre 10
Les systmes triggs voir le contenu excut au front (montant, descendant) du signal de
dclenchement (trigger).
Masques et sous-systmes
453
1
0.8
Trigger
0.6
0.4
Entre
0.2
0
Sortie
-0.2
-0.4
-0.6
-0.8
-1
0
10
20
30
40
50
60
70
80
90
Un sous-systme peut tre dclench (triggred) et activ (enabled) par le mme ou des
signaux diffrents.
Il suffit de prendre un sous-systme atomique (atomic subsystem) dans la bibliothque
Ports & Subsystems et de mettre lintrieur les ports de dclenchement (trigger)
et dactivation (enable).
Un sous-systme configurable ralise les actions de plusieurs sous-systmes la fois qui sont
alors sauvegards dans une librairie.
On se propose de faire un sous-sysme configurable qui ralise la rsolution dune quation
du 1er et du 2nd degr.
On ouvre un nouveau fichier library dans laquelle on insre alors le modle (Template)
de ce systme configurable et les 2 sous-systmes correspondants.
454
Chapitre 10
Pour utiliser lun ou lautre des 2 sous-systmes on le choisit dans loption Block Choice
dans le menu contextuel quon invoque en cliquant droit sur le bloc du systme configurable
Lorsquun des sous-systmes possde moins dentres et de sorties que le modle
(Template), on utilise la masse (Ground) ou le terminateur (Terminator) des
bibliothques Sources et Sinks respectivement.
Chapitre 11
S-fonctions
On dispose, de plus, du bloc S-Function Examples qui propose diffrents exemples de S-fonctions,
codes en langage M, C, C++, Ada et Fortran.
Chapitre 11
456
Les S-fonctions peuvent dcrire des systmes continus, discrets ou hybrides. On peut utiliser les Sfonctions galement avec le produit Real-Time Workshop, ou RTW ). Le code peut tre adapt
ou optimis en crivant un fichier TLC Target Language Compiler
Les S-fonctions sont utiles principalement :
Une S-fonction est dfinie par un vecteur dentre u, un vecteur de sortie y et un modle dtat avec les
matrices A (dtat ou dvolution), B (de commande), C (dobservation) et D (transfert direct) et le vecteur
dtat x.
Pour la modlisation des systmes physiques, la matrice D est gnralement nulle.
Notons, comme nous le verrons dans ce chapitre, une S-fonction peut tre dfinie sans le modle dtat,
par des quations mathmatiques reliant les sorties y aux entres u, par exemple.
Dans la dfinition gnrale dune S-fonction, le vecteur dtat possde une partie continue xc et une autre
discrte, xd.
x
x = c
xk
Avec la drive de ltat continu, x&c et lvolution de ltat discret, xk +1 donnes par :
x& c = f d (t , x, u ) , Derivatives (Drives)
x k +1 = f u (t , x, u ) , Update (Mise jour)
457
S-fonctions
Le vecteur de sortie est :
y = f o (t , x, u ) , Output (sortie)
La S-fonction peut tre modlise par le schma suivant :
MATLAB fournit un modle de S-fonction, nomm template.m quil suffira de transformer afin de
ladapter la fonction quil doit raliser dans le modle SIMULINK correspondant.
Lorsquelle reoit ses entres, et avant de dlivrer la valeur du vecteur de sortie, la S-fonction passe par
plusieurs tapes de simulation.
Lors de lexcution dun modle SIMULINK, il y a successivement les tapes suivantes :
1. Une phase dinitialisation pendant laquelle SIMULINK incorpore les librairies des blocs qui
composent le modle, et initialise la structure SimStruct qui contient les informations sur
la S-fonction.
2. Propagation des signaux (taille, type, cadence dchantillonnage),
3. Evaluation des paramtres des blocs,
4. Dtermination de lordre dexcution des blocs,
5. Allocation de mmoire ncessaire.
SIMULINK entre ensuite dans une boucle de simulation, o chaque passage est dnomm pas de
simulation . A chaque pas, SIMULINK excute les blocs dans lordre dfini lors de ltape
dinitialisation.
A chaque excution dun bloc, SIMULINK fait le calcul de ses tats, de leurs drives et calcule la sortie
pour linstant dchantillonnage courant.
Il y a excution de cette boucle jusqu ce que le solveur calcule les tats avec exactitude.
Ceci se renouvelle jusqu la fin de la simulation.
Un drapeau (flag) indicateur permet chaque instant de connatre ltape dans laquelle on se trouve.
Une S-fonction est btie comme une simple fonction qui reoit des paramtres dappel et retourne des
paramtres de sortie, ou dits de retour.
La syntaxe gnrale dune S-fonction est la suivante :
function[sys,x0,str,ts] = nom_fonction(t,x,u,flag,P1,P2,...)
Les paramtres dappel sont le temps t, lentre u, ltat x et le flag qui dtermine ltape courante. La
S-fonction peut aussi recevoir autant de paramtres optionnels que ncessaires, comme P1, P2, etc.
La S-fonction retourne :
-
Chapitre 11
458
S-fonction
en fichier M
Etat du flag
Initialisation
0
Calcul du prochain pas dchantillonnage 4
(Optionnel)
Calcul des sorties
3
Mise jour de ltat discret
2
Drives de ltat continu
1
Fin de simulation
9
Fonction appele
fichier C-MEX
mdlInitializeSizes
mdlGetTimeOfNextVarHit
mdlOutputs
mdlUpdate
mdlDerivatives
mdlTerminate
La sortie et toutes les variables de retour au systme dpendent, selon ltape de simulation, de ltat x,
lentre u et de la valeur du flag.
Nous donnons, ci-aprs, ltat de la S-fonction, selon lindication du flag.
flag = 0, Etape dinitialisation dans laquelle la S-fonction retourne dans la variable sys les
informations du systme modlis, ainsi que ltat initial. La chane str est vide dans le cas des
fichiers ainsi que la cadence dchantillonnage dans ts. La fonction mdlInitializeSizes
initialise la structure simsize contenant les champs suivants :
NumContStates
NumDiscStates
NumOutputs
NumInputs
DirFeedthrough
NumSampleTimes
%
%
%
%
%
%
S-fonctions
459
flag = 9, fin de simulation, les variables du systme sont effacs et sys reoit un vecteur vide
(sys = [].
Nous allons tudier un cas dun systme du 2nd ordre, dfini par son modle dtat, qui sera modlis par
une S-fonction.
Le systme est dfini dabord par sa fonction de transfert discrte du 2nd ordre H(z) :
1
H ( z 1 ) =
1 0.8 z 1 + 0.5 z 2
Dans le modle SIMULINK suivant, sf_2ordre_discret_etat.mdl, nous avons aussi modlis
le systme par cette fonction de transfert discrte, titre de comparaison, avec les rsultats de la
S-fonction.
Le systme reoit son entre un chelon unit.
Le modle SIMULINK a ainsi pour but dobtenir la rponse indicielle du systme.
1
=1.43
Le gain statique vaut
1 0.8 + 0.5
La sortie discrte est donne, en fonction de lentre, par lquation de rcurrence suivante :
y (k ) = 0.8 y (k 1) 0.5 y (k 2) + u (k )
En notant x1 , la 1re composante dtat, et en posant : x1 (k ) = y (k )
Nous avons : x1 (k + 1) = 0.8 x1 (k ) + x 2 (k )
Ainsi : x 2 (k + 1) = 0.5 x1 (k ) + u (k )
0.8 1
0
Ainsi les matrices dtat sont : A =
, B = 1, C = (1 0), D = 0
0
.
5
0
En double-cliquant sur le bloc quon a pris de la librairie User-Defined Functions de
SIMULINK, on met dans le champ S-function name, le nom du fichier M dans lequel est
programme la S-fonction.
Chapitre 11
460
% matrice d'tat
% matrice de commande
% matrice d'observation
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
case 3
sys=mdlOutputs(C,x);
case {1,4,5,9}
sys=[];
case 2
sys=mdlUpdate(x,u,A,B);
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
S-fonctions
461
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0; % pas dtats continus
sizes.NumDiscStates = 2; % 2 tats discrets
sizes.NumOutputs
= 1; % 1 sortie
sizes.NumInputs
= 1; % 1 entre
sizes.DirFeedthrough = 0; % D = 0
sizes.NumSampleTimes = 1; % au moins une cadence dchantillonnage
sys = simsizes(sizes);
x0 = [0 0]; % tat initial nul
str = [];
% chane vide lors de ltape dinitialisation
ts = [1 0]; % instant dchantillonnage de 1s sans offset
function sys=mdlDerivatives(t,x,u,A,B)
sys = [];
function sys=mdlUpdate(x,u,A,B)
sys = A*x+B*u; % Mise jour de ltat
function sys=mdlOutputs(C,x)
sys =C*x; % Calcul de la sortie
On retrouve les mmes signaux dentre/sortie pour la modlisation par fonction de transfert que par la
S-fonction et nous observons le gain statique de 1.43 dans les afficheurs et les oscilloscopes.
Dans ce cas, il ny a ni tat continu, ni tat discret. Seule la sortie est calcule lorsque le flag indique la
valeur 3.
flag = 0, tape dinitialisation o lon spcifie :
le nombre dtats continues (0),
le nombre dtats discrets (2),
le nombre dentres (1),
le nombre de sorties (1),
le nombre dinstant dchantillonnage (1 car loffset est nul),
ltat initial [0 0],
la cadence dchantillonnage (1s) et loffset (0).
Dans les valeurs [1, 4, 5, 9] du flag, on retourne un vecteur vide dans la variable sys.
flag = 1, appel de la fonction du calcul de la drive de ltat,
x& = A x + B u
flag = 3, appel de la fonction de calcul de la sortie
y = C x + Du
462
Chapitre 11
Nous allons utiliser la mme S-fonction avec des paramtres optionnels, tels la priode dchantillonnage
Te et ltat initial Xinit.
modle Sf_2ordre_discret_etat2.mdl
En double-cliquant sur le bloc de la S-fonction, on ouvre la fentre suivante dans laquelle, on met le nom
du fichier M contenant le code de la S-fonction et les valeurs des paramtres optionnels dans le mme
ordre dans lequel ils ont t dfinis.
S-fonctions
463
Les matrices dtat A, B, C et la priode dchantillonnage sont dfinies dans le callback InitFcn
(file Model Properties).
Quant ltat initial Xinit, il a t choisi gal [0.5 -0.1].
Les paramtres optionnels doivent tre affects leurs valeurs dans le mme ordre dans lequel ils ont t
dfinis dans la S-fonction
function [sys,x0,str,ts]=Sf_2ordre_discret_etat2(t,x,u,flag,Te,Xinit,A,B,C)
Les paramtres optionnels sont Te, puis ltat initial Xinit, puis les matrices dtat, dans lordre, A, B et
C. La matrice D, nulle na pas t utilise.
% Etapes inutilises
otherwise
error(['Unhandled flag=',num2str(flag)]);
end
% Fonction d'initialisation
Chapitre 11
464
function [sys,x0,str,ts]=Initialisation(A,Te,Xinit)
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=length(A);
sizes.NumOutputs=1;
sizes.NumInputs=1;
sizes.DirFeedthrough=0;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=Xinit;
% Conditions initiales sur l'tat
str=[];
ts=[Te 0];
% Priode d'chantillonnage Te sans offset
% Fonction de calcul de l'tat
function sys= Mise_a_jour_etat(x,u,A,B)
sys=A*x+B*u;
% Fonction de calcul de la sortie
function sys= CalculSorties(x,u,C)
sys=C*x;
Signal desortie
1.5
Signal d'entre
0.5
-0.5
Temps discret
10
S-fonctions
465
Le rgime transitoire du signal de sortie est diffrent que prcdemment cause du fait quon a chang la
valeur du vecteur dtat initial et la priode dchantillonnage Te.
II.1.3. S-fonction avec chantillonnage variable
Nous allons simuler le fonctionnement chantillonnage variable du mme systme dfini par son
modle dtat.
Comme la priode dchantillonnage est variable, on doit mettre none, loption Source block
specifies -1 sample dans Diagnostics du menu Simulation Configuration
Parameters
Comme dans lexemple prcdent, les matrices dtat A, B, C sont spcifies dans le callback
InitFcn du modle SIMULINK Sf__2ordre_discret_etat3.mdl.
fonction sf_2ordre_discret_etat3.m
% Simulation d'un modle d'tat discret priode d'chantillonnage
variable : 2 priodes d'chantillonnage Te = 0.1s puis 0.9s
function
[sys,x0,str,ts]=Sf_2ordre_discret_etat3(t,x,u,flag,A,B,C,Xinit)
switch flag,
case 0
% Etape d'initialisation
[sys,x0,str,ts]=Initialisation(A,Xinit);
case 2
% Etape de calcul du l'tat
sys=MiseaJourEtat(x,u,A,B);
466
Chapitre 11
case 3
% Etape de calcul de la sortie
sys=CalculSorties(x,u,C);
case 4
% Etape de calcul du prochain Te
sys=CalculProchainTe(t,u);
case {1,9}
% Etapes inutilises
sys=[];
otherwise
error(['Unhandled flag=',num2str(flag)]);
end
% Fonction d'initialisation
function [sys,x0,str,ts]=Initialisation(A,Xinit)
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=length(A);
sizes.NumOutputs=1;
sizes.NumInputs=2;
sizes.DirFeedthrough=1;
% car on utilise le flag = 4
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=Xinit;
str=[];
ts=[-2 0];
% pour obtenir un pas d'chantillonnage variable
% Fonction de calcul de l'tat
function sys=MiseaJourEtat(x,u,A,B)
sys=A*x+B*u(1);
% Fonction de calcul de la sortie
function sys= CalculSorties(x,u,C)
sys=C*x; % Sinusode de consigne
% Fonction de calcul du prochain Te
function sys= CalculProchainTe(t,u)
sys=t+u(2); % 2me chelon dont la valeur donne la valeur de Te
Lorsquon utilise plusieurs valeurs de la priode dchantillonnage Te, nous sommes obligs de mettre 1
la valeur de DirFeedthrough. Dautre part, dans la mme tape dinitialisation on initialise Te la
valeur [-2 0]
Les signaux dentres/sorties sont sauvegards dans le fichier binaire uy3.mat sous le nom de variable
signals.
Les lignes de commande suivantes permettent de tracer les diffrents signaux.
load uy3
stairs(signals(1,:), signals(2,:))
hold on
plot(signals(1,:), signals(3,:))
title('Signaux d''entre et de sortie')
plot(signals(1,:), signals(4,:))
xlabel('Temps discret')
gtext('Signal de sortie')
gtext('Sinusode d''entre'), grid
S-fonctions
467
Signauxd'entreet desortie
2
Te=0.1s
Te=0.9s
1.5
1
0.5
0
-0.5
Sinusoded'entre
-1
Signal desortie
-1.5
-2
10
Temps discret
On observe bien la diffrence des 2 priodes dchantillonnage sur le signal de sortie.
II.1.4. S-fonction avec modle dfini par ses quations mathmatiques
Nous allons utiliser les quations mathmatiques de lquation de rcurrence pour dfinir le systme au
lieu du modle dtat.
fonction sf_2nd_ordre_equa_recc.m
% Simulation d'un systme du 2nd ordre discret
% par son quation de rcurrence
function [sys,x0,str,ts]=sf_2nd_ordre_equa_recc(t,x,u,flag,a,b)
switch flag
case 0
% Etape d'initialisation
[sys,x0,str,ts]=mdlInitialisation;
case 3
% Etape de calcul de la sortie
sys=a*u(1)+b*u(2)+u(3);
case {1,2,4,9}
sys=[];
% Etapes inutilises
otherwise
error(['Unhandled flag=', num2str(flag)]);
end
468
Chapitre 11
% Fonction d'initialisation
function [sys,x0,str,ts] = mdlInitialisation
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=0;
sizes.NumOutputs=1;
sizes.NumInputs=3;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=[];
str=[];
ts=[1 0];
Il y a transfert direct (relation entre la sortie y et lentre u de paramtre 1 dans lquation de rcurrence
y (k ) = 0.8 y (k 1) 0.5 y (k 2) + u (k )
On doit donc mettre : sizes.DirFeedthrough=1;
Nous avons :
- 3 entres,
- 1 sortie,
- aucun tat, ni continu ni discret,
- 1 seule priode dchantillonnage dune seconde (offset nul).
modle sf__2nd_ordre_equa_recc.mdl
Nous devons choisir le compilateur pour passer du fichier C quon peut diter dans nimporte quel diteur
de texte un fichier excutable. MATLAB dispose du compilateur lcc quon peut utiliser la place dun
compilateur C.
La commande suivante permet le choix de ce compilateur. Dans notre cas, nous ne disposons que du
compilateur lcc.
>> mex -setup
Please choose your compiler for building external interface (MEX)
S-fonctions
469
files:
Would you like mex to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc-win32 C 2.4.1 in C:\PROGRA~1\MATLAB\R2009a\sys\lcc
[0] None
Compiler: 1
Please verify your choices:
Compiler: Lcc-win32 C 2.4.1
Location: C:\PROGRA~1\MATLAB\R2009a\sys\lcc
Are these correct [y]/n? y
Trying
to
update
options
file:
C:\Documents
and
Settings\MARTAJ\Application Data\MathWorks\MATLAB\R2009a\mexopts.bat
From template:
C:\PROGRA~1\MATLAB\R2009a\bin\win32\mexopts\lccopts.bat
Done . . .
**********************************************************************
Warning: The MATLAB C and Fortran API has changed to support MATLAB
variables with more than 2^32-1 elements. In the near future
you will be required to update your code to utilize the new
API. You can find more information about this at:
http://www.mathworks.com/support/solutions/data/15C27B9.html?solution=1-5C27B9
Building with the -largeArrayDims option enables the new API.
**********************************************************************
Lorsquon a choisi le compilateur, la commande mex termine par demander de vrifier le choix effectu.
Nous allons, par principe de vrification et comparaison, raliser la modlisation du mme systme du
second que prcdemment.
fonction sf_2nd_ordre_etat_num_C
/* Dfinition du nom de la S_fonction */
#define S_FUNCTION_NAME sf_2nd_ordre_etat_num_C
/* fichiers en-tte de dfinition de SimStruct */
#include "simstruc.h"
/* Dclaration des matrices d'tat */
static double A[2][2]={{0.8, 1},
{-0.5 ,0}};
static double B[2][1]={{0},{1}};
static double C[1][2]={1, 0};
/* Initialisation des caractristiques de la S_fonction */
static void mdlInitializeSizes(SimStruct *S)
{
ssSetNumContStates(S,0);
/* Aucun tat continu */
ssSetNumDiscStates(S,2);
/* 2 tats discrets */
ssSetNumInputs(S,1);
/* 1 entre */
ssSetNumOutputs(S,1);
/* 1 sortie */
470
Chapitre 11
S-fonctions
471
En langage C, on retrouve la mme structure que pour les S-fonctions crites en langage M : des fonctions
dcrivant chacune une tape de simulation.
Pour compiler le fichier texte auquel on aura mit lextension .c, on utilise la commande mex.
>> mex sf_2nd_ordre_etat_num_C.c
modle sf__2nd_ordre_etat_num_C.mdl
Les signaux dentre/sortie sont sauvegards dans la variable yu sous forme dune structure. Il ny a
aucun paramtre mettre dans la boite de dialogue du bloc de la S-fonction part la spcification de son
nom.
Nous retrouvons bien le gain statique de 1.43. Le signal dentre est constitu dun chelon avant t=10 et
ensuite une sinusode grce au switch qui fait passer le signal de lentre 1 tant que la sortie de
loprateur relationnel est vraie.
>> plot(yu.signals.values), grid
>> gtext('Signal de sortie')
>> gtext('Signal d''entre')
values est un champ de la structure signals, lui-mme champ de la structure y, comme on peut le
voir ci-aprs.
>> yu
yu =
time: []
signals: [1x1 struct]
blockName: 'sf__2nd_ordre_etat_num_C/To Workspace'
>> yu.signals
ans =
values: [501x2 double]
Chapitre 11
472
dimensions: 2
label: ''
>> size(yu.signals.values)
ans =
501
2
2
Signal desortie
1.5
0.5
Signal d'entre
-0.5
-1
-1.5
0
100
200
300
400
500
600
Nous allons tudier le mme systme du 2nd degr reprsent par son systme dquations dtat.
Construire une fonction avec le Builder consiste coder les diffrentes tapes de simulation en langage
C, dans leurs onglets spcifiques.
En double-cliquant sur le bloc de la S-fonction, nous obtenons une boite de dialogue qui comprend, en
mme temps, les tapes de simulation dun systme discret (Mise jour de ltat discret) et dun systme
analogique (Calcul des drives de ltat analogique), comme le montre la figure suivante :
S-fonctions
473
Onglet Initialisation
Cet onglet correspond ltape dinitialisation de la S-fonction dans laquelle, comme pour le code en
langage M ou C, nous devons spcifier le nombre dtats (continus et discrets), leurs valeurs initiales
correspondantes ainsi que le nombre de cadences dchantillonnage. Sample mode spcifie le type
dchantillonnage (inherited, continuous et discret).
Le mode inherited , lorsquon met -1 la valeur de la cadence dchantillonnage, consiste
utiliser la mme cadence que le bloc prcdent du modle SIMULINK.
Ci-dessus, nous avons spcifi 2 tats discrets, de valeur initiales (0,0), aucun tat continu, un
chantillonnage de type Discrete de cadence d1s.
474
Chapitre 11
Dans cet onglet, on spcifie le nom des entres et des sorties de la S-fonction.
Comme les tats sont imprativement nots xC et xD respectivement pour ltat continu et discret, les
entres et sorties sont imprativement notes u0 et y0. Si la S-fonction possde 2 entres, elles seront
alors y0[1] et y0[2], composantes du vecteur y0.
Si la S-fonction possde des paramtres optionnels, on les dfinit dans longlet Parameters suivant :
Il est impratif dutiliser les termes xC et xD, respectivement pour ltat continu et ltat discret.
Dans cet onglet Outputs, on calcule la sortie y0 partir de ltat discret xD ou ltat continu xC.
S-fonctions
475
Dans longlet Discrete Update, on met jour ltat discret et dans celui de Continuous
Derivatives, on calcule la drive de ltat continu.
Dans le cas dun systme du 2nd degr continu, le calcul de la sortie se fait comme suit :
Le rectangle de gauche rcapitule larchitecture de la S-fonction : ses entres/sorties et les matrices dtat.
Dans longlet Build Info, on choisit les options de compilation et on sauvegarde par save.
Il y a alors cration du fichier C de la S-fonction et du Target Langage TLC.
Dans la fentre de commande MATLAB, nous avons la liste des fichiers cres :
Le modle suivant comporte la S-fonction Builder reprsentant le mme modle discret du 2me ordre.
476
Chapitre 11
Nous retrouvons bien le gain statique de 1.43 et la mme courbe de sortie de la S-fonction que lon peut
observer sur loscilloscope.
III.2. Systme sous forme de modle dtat continu
y" = 02 (u s ) 2 w0 y '
En programmant lquation diffrentielle ci-dessus, on sait que lordre du systme correspond aux
nombre dintgrateurs dont chaque sortie correspond une variable dtat, nous avons le modle
SIMULINK suivant (quation diffrentielle) dont on fait ressortir chaque variable dtat et le bloc
modlisant lespace dtat. Les variables dtat, dpendant des paramtres z et w0 sont spcifis dans le
callback InitFcn de ce modle SIMUMINK. Dans le modle SIMUINK suivant, nous programmons la
rsolution de lquation diffrentielle ainsi que le modle dtat correspondant.
Les deux modlisations reoivent le mme signal dentre constitu dun chelon suivi dune rampe.
Nous observons des oscillations en sortie du fait que lamortissement est plus petit que sa valeur optimale
2
= 0.7071 .
de =
2
modle equa_diff_mod_etat_continu.mdl
S-fonctions
477
Par lquation diffrentielle ou le bloc espace dtat nous obtenons le mme signal de sortie avec une
entre chelon suivi dune rampe.
Le callback InitFcn o sont spcifis les paramtres z, w0 et les matrices dtat est le suivant (File
Properties) :
modle Builder_Sfonct_etat_analogique.mdl
Paramtres de la S-fonction
Dans le champ des valeurs nous mettons seulement le nom des variables car elles sont connues grce au
callback.
Chapitre 11
478
La drive de ltat est nomme imprativement dx, comme xC et xD pour les tats continus et discrets.
Les signaux dentre et de sortie sont tracs grce aux lignes de commande suivantes :
>> load uy4
>>
>>
>>
>>
>>
>>
plot(es(1,:), es(2,:))
hold on
plot(es(1,:), es(3,:))
grid
title('S-fonction tat analogique')
xlabel('Temps continu')
Le systme est faiblement amorti do les oscillations en rgime transitoire mais atteint la valeur de
lentre en rgime permanent du fait du gain statique gal lunit.
S-fonctiontat analogique
1.8
1.6
sortie
1.4
1.2
1
0.8
entre
0.6
0.4
0.2
0
10
20
30
40
50
60
Temps continu
70
80
90
100
S-fonctions
479
La S-fonction est dfinie par des quations mathmatiques qui rgissent le signal de sortie en fonction de
lentre.
Nous nutilisons pas le modle dtat mais les quations mathmatiques pour calculer la sortie en fonction
de lentre.
Nous nous proposons de rsoudre lquation de rcurrence suivante :
x n = 1 + 0.8 x n 1 0.5 x n 2
Grce au bloc Delay, on cre les variables xn-1et xn-2 quon multiplexe pour former le vecteur dentre u
de la S-fonction.
Dans ltape dinitialisation, il y a bien 2 entres et 1 sortie.
Par cette quation, il y a bien une relation directe entre lentre et la sortie donc le champ DirFeedthrough
est gal 1.
fonction sf_sans_etat.m
% Simulation d'un modle d'tat continu
function [sys,x0,str,ts]=sf_sans_etat(t,x,u,flag)
switch flag
case 0
% Etape d'initialisation
[sys,x0,str,ts]=mdlInitialisation;
case 3
% Etape de calcul de la sortie
sys=0.8*u(1)-0.5*u(2)+1;
case {1,2,4,9}
sys=[];
% Etapes inutilises
otherwise
error(['Unhandled flag=', num2str(flag)]);
end
% Fonction d'initialisation
function [sys,x0,str,ts] = mdlInitialisation
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=0;
sizes.NumOutputs=1;
sizes.NumInputs=2;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=[];
str=[];
ts=[1 0];
480
Chapitre 11
Un systme hybride est constitu dtats continus et dtats discrets la fois, comme le systme suivant :
La sortir dun intgrateur est une variable dtat continue, x2(t), celle dun retard unit est une variable
dtat discrte comme x1(k)
MATLAB dfinit le vecteur dtat, dans le cas gnral comme la concatnation du vecteur dtat continu
suivi du vecteur dtat discret.
Dans le cas gnral, nous avons le schma suivant du vecteur dtat hybride :
S-fonctions
481
La modlisation dtat du schma hybride prcdent (retard discret + intgrateur analogique) donne :
x' 2 (t )
x (k + 1) = A
1
x 2 (t )
x (k ) + B u (t ) =
1
0 0
A =
0 1
Dans la S-fonction on programme les 2 tats, analogique et discret et on dfinira pour chacun deux la
condition initiale.
fonction syst_hybrid1.m
function [sys,x0,str,ts] = syst_hybrid1(t,x,u,flag)
% Un exemple de systme hybride compos dun intgrateur analogique
%(1/p) en srie un retard unit(1/z).
%
switch flag,
case 0
% Initialization
[sys,x0,str,ts] = mdlInitializeSizes;
case 1
sys = mdlDerivatives(t,x,u); % Calculate derivatives
case 2
sys = mdlUpdate(t,x,u); % Update disc states
case 3
sys = mdlOutputs(t,x,u); % Calculate outputs
case {4, 9}
sys = [];
% Unused flags
otherwise
error(['unhandled flag = ',num2str(flag)]); % Error handling
end
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 1; % 1 tat continu
sizes.NumDiscStates = 1; % 1 tat discret
sizes.NumOutputs
= 1; % 1 sortie
sizes.NumInputs
= 1; % 1 entre
sizes.DirFeedthrough = 0; % pas de passage direct de u y
sizes.NumSampleTimes = 2; % 2 cadences dchantillonnage.
sys = simsizes(sizes);
x0 = ones(2,1);
% valeurs initiales des 2 tats = 1
str = [];
ts = [0,
0
% 0s avec offset de 0s (tat continu)
1,
0];
% 1s avec offset nul pour ltat discret
function sys = mdlDerivatives(t,x,u)
sys = u; % Drive de ltat continu = entre u(t)
function sys = mdlUpdate(t,x,u)
sys = x(1); % Mise jour de ltat discret (1re composante dtat)
function sys = mdlOutputs(t,x,u)
sys = x(2); % sortie = 2me composante du vecteur dtat
Chapitre 11
482
modle Sf_syst_hybride1.mdl
>> uy6
uy6 =
>>
>>
>>
>>
>>
>>
>>
>>
rampedesortie
12
10
8
6
4
chelonunitd'entre
2
0
10
12
Temps discret
14
16
18
20
S-fonctions
483
Dans le cas prcdent, nous navons pas utilis la modlisation de ltat hybride, juste de spcifier que la
sortie est la deuxime variable dtat, soit x1(k) et que la drive de ltat continu correspond lentre
u.
Dans ce qui suit, la S-fonction utilisera la modlisation de ltat hybride.
fonction syst_hybrid_etat.m
function [sys,x0,str,ts] = syst_hybrid_etat(t,x,u,flag,A,B,C)
switch flag,
case 0
% Initialization
[sys,x0,str,ts] = mdlInitializeSizes;
case 1
sys = mdlDerivatives(A,B,x,u); % Calculate derivatives
case 2
sys = mdlUpdate(A,B,x,u); % Update disc states
case 3
sys = mdlOutputs(C,x); % Calculate outputs
case {4, 9}
sys = [];
% Unused flags
otherwise
error(['unhandled flag = ',num2str(flag)]); % Error handling
end
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 1; % 1 tat continu
sizes.NumDiscStates = 1; % 1 tat discret
sizes.NumOutputs
= 1; % 1 sortie
sizes.NumInputs
= 1; % 1 entre
sizes.DirFeedthrough = 0; % pas de passage direct entre/sortie
sizes.NumSampleTimes = 2; % 2 cadences dchantillonnage
sys = simsizes(sizes);
x0 = ones(2,1);
str = [];
ts = [0,
0
% Te = 0 (tat continu)
1,
0];
% Te = 1s (tat discret)
function sys = mdlDerivatives(A,B,x,u)
sys = A(1,:)*x+B(1)*u; % drive de ltat continu
function sys = mdlUpdate(A,B,x,u)
sys = A(2,:)*x+B(2)*u; % mise jour de ltat discret
function sys = mdlOutputs(C,x)
sys = C*x; % calcul de la sortie
Chapitre 11
484
Dans le cas du modle hybride, le calcul de la drive de ltat continu est suivi de la mise jour de ltat
discret.
modle Sf_syst_hybride_etat.mdl
25
20
sinusodedesortie
15
rampedesortie
10
sinusoded'entre
chelond'entre
-5
10
20
30
40
50
60
70
80
90
100
Temps discret
Nous retrouvons la mme rampe de sortie entre les instants 0 et 20. Au-del, les 2 signaux, sinusodaux
sont presquen opposition de phase cause de lintgration analogique suivie du retard numrique.
S-fonctions
485
Comme dans lexemple suivant, selon la fonction ralise par la S-fonction, la taille du vecteur de sortie
est automatiquement impose par cette opration indpendamment de la taille du vecteur dentre.
Dans lexemple suivant, on obtient en sortie un vecteur de mme taille que lentre car on ralise une
opration lment par lment.
Si on faisait la somme des lments du vecteur dentre, on obtiendrait un scalaire donc la taille de la
sortie est dynamique.
fonction resizing_inputs_outputs.m
function [sys,x0,str,ts] = resizing_inputs_outputs(t,x,u,flag)
switch flag,
case 0
% Initialization
[sys,x0,str,ts] = mdlInitializeSizes;
case 3
sys = mdlOutputs(u); % Calcule de la sortie
case {1,2,4,5,9}
sys = [];
% flags non utiliss
otherwise
error(['unhandled flag = ',num2str(flag)]); % Error handling
end
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs
= -1; % taille dynamique en sortie
sizes.NumInputs
= -1; % taille dynamique en entre
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0=[];
str = [];
ts = [1 0];
function sys = mdlOutputs(u)
% rcupration de la taille du vecteur dentre
size_input=size(u);
sys = u.^2; % carr du vecteur dentre, lment par lment
modle sf_resing_input_output.mdl
Chapitre 11
486
Pour accepter un vecteur dentre taille dynamique, il suffit de fixer la taille -1 dans ltape
dinitialisation.
sizes.NumOutputs
sizes.NumInputs
La taille n du vecteur dtat dpend des dimensions de la matrice dvolution, carre, A(n,n).
Considrons la S-fonction dans laquelle on met -1 la taille du vecteur dtat analogique, ainsi que celle
du vecteur de sortie.
Considrons la matrice dvolution A suivante :
>> A = [0.8 1 0;-0.5 0 -0.1; 0 1 -0.5];
% matrice d'volution
Avec les matrices de commande B et dobservation C suivantes, nous obtenons la fonction de transfert ciaprs :
>> B=[0.5 0.1 0.4]'; C=[1 0 0]; D=0;
>> [num, den]=ss2tf(A,B,C,D);
>> printsys(num, den,'z')
num/den =
0.5 z^2 + 0.35 z + 0.06
---------------------------z^3 - 0.3 z^2 + 0.2 z + 0.17
>> dstep(num, den)
Step Response
1.4
1.2
Amplitude
0.8
0.6
0.4
0.2
10
15
Time (sec)
20
25
S-fonctions
487
Nous avons ainsi un systme du 3me ordre, stable, de gain statique 0.84 environ.
Nous allons ainsi ignorer la taille du vecteur dtat, celui dentre et de sortie. Seule la connaissance des
matrices dtat suffisent.
Dans le modle SIMULIK suivant, nous avons simul le mme systme du 3me ordre dfini plus haut par
sa fonction de transfert ainsi que par une S-fonction dont le nombre dtats est dfini dynamiquement
selon les dimensions du modle dtat (matrice dvolution A).
Nous obtenons la mme rponse indicielle que prcdemment et le mme gain statique de 0.85.
Nous obtenons la rponse indicielle suivante sur loscilloscope.
modle sf_3ordre_discret_etat_dynamique.mdl
Chapitre 11
488
S-fonction Sf_3ordre_discret_etat_dynam.m
function [sys,x0,str,ts] = Sf_3ordre_discret_etat_dynam(t,x,u,flag,A,B,C)
switch flag
case 0,
[sys,x0,str,ts]=mdlInitializeSizes(A);
case 3
sys=mdlOutputs(C,x);
case {1,4,5,9}
sys=[];
case 2
sys=mdlUpdate(x,u,A,B);
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes(A)
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = length(A);
sizes.NumOutputs
= 1;
sizes.NumInputs
= 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;
% 1 chantillonnage de valeur nulle.
sys = simsizes(sizes);
x0 = zeros(length(A),1);
str = [];
ts = [1 0];
function sys=mdlDerivatives(t,x,u,A,B)
sys = [];
function sys=mdlUpdate(x,u,A,B)
sys = A*x+B*u;
function sys=mdlOutputs(C,x)
sys =C*x;
Le nombre n dtats discrets est gal la dimension de la matrice dvolution A (matrice carre, nxn). De
mme que ltat initial x0 est gal au vecteur, type colonne, nul de n lments.
Les matrices dtat sont spcifies dans le callback InitFcn du modle SIMULINK (File Model
Properties).
S-fonctions
489
Si nous passons un systme dun ordre diffrent, stable, avec ses matrices dtat que nous mettons dans
ce mme callback, cette mme S-fonction le dcrira parfaitement sans rien changer son code.
Nous allons dfinir le systme du second ordre discret par lquation de rcurrence qui relie les
chantillons de la sortie ceux de lentre.
Lordre est donn par le nombre de retards, comme le systme analogique pour celui des intgrateurs. Les
variables dtats discrtes sont aussi les sorties de ces retards comme pour celles des intgrateurs pour le
cas analogique.
modle sf__secd_ordre_discret_equa_recc.mdl
La fonction de transfert discrte H(z) du systme du second ordre peut tre mise sous la forme de telle
faon faire apparatre le coefficient damortissement z et la pulsation propre non amortie w0.
La cadence dchantillonnage doit tre spcifie la valeur 0.1s comme spcifi dans le corps de la Sfonction.
fonction sf_2nd_ordre_equa_recc.m
function [sys,x0,str,ts]=sf_2nd_ordre_equa_recc(t,x,u,flag,alpha1,alpha2)
switch flag,
case 0
% Initialization
[sys,x0,str,ts] = mdlInitializeSizes;
case 3
sys = mdlOutputs(alpha1,alpha2,u); % Calculate outputs
case {1,2,4,5,9}
sys = [];
% Unused flags
otherwise
error(['unhandled flag = ',num2str(flag)]); % Error handling
end
Chapitre 11
490
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0; % pas dtat continu
sizes.NumDiscStates = 0; % pas dtat discret
sizes.NumOutputs
= 1;
sizes.NumInputs
= 3; % 3 entres
sizes.DirFeedthrough = 1; % existence de passage direct
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0=[];
str = [];
ts = [0.1 0]; % 1 seule cadence dchantillonnage de 0.1 s
function sys = mdlOutputs(alpha1,alpha2,u)
sys = alpha1*u(1)+alpha2*u(2)+(1-alpha1-alpha2)*u(3);
Les signaux dentre et de sortie sont sauvegardes dans la structure es et sont tracs grce aux lignes de
commande suivantes.
>>
>>
>>
>>
>>
>>
>>
>>
stairs(es.signals.values(:,1)), hold on
plot(es.signals.values(:,2))
axis([0 50 0 1.2])
grid
title('Rponse d''un systme du 2nd ordre')
xlabel('Temps discret')
gtext('Signal de sortie - temps de rponse optimal')
gtext('Signal d''entre')
Rponsed'unsystmedu2ndordre
Signal desortie- temps derponseoptimal
1
0.8
Signal d'entre
0.6
0.4
0.2
10
15
20
25
30
Temps discret
Le gain statique vaut 1 et le temps de rponse est optimal.
35
40
45
50
S-fonctions
491
On se propose dcrire une S-fonction qui rsout un systme dquations linaires par la mthode LMS
(des moindres carrs). Cette S-fonction sans entre, recevra la matrice A et le vecteur B sous forme de
paramtres optionnels, spcifis dans le callback InitFcn du modle SIMULINK.
modle SF_sol_syst_lin_sf_sans_input.mdl
% flags inutiliss
otherwise
% dans tous les autres cas
error(['unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0; % pas dtat continu
sizes.NumDiscStates = 0; % pas dtat discret
sizes.NumOutputs
= 2; % 2 sorties
sizes.NumInputs
= 0; % aucune entre
sizes.DirFeedthrough = 1; % passage direct entre entres et sorties
sizes.NumSampleTimes = 1; % 1 cadence dchantillonnage nul ts=[0 0]
sys = simsizes(sizes);
x0=[];
str = [];
ts = [0 0];
function sys = mdlOutputs(A,B)
sys = inv(A'*A)*A'*B;
Chapitre 11
492
VI.3. Rsolution dune quation rcurrente non linaire
1
de la librairie Discrete (retard dune cadence
z
dchantillonnage).
fonction sf_equat_recc_nl.m
function [sys,x0,str,ts] = sf_equat_recc_nl(t,x,u,flag)
switch flag,
case 0,
% Initialization %
[sys,x0,str,ts]=Initialisation;
case {1,2,4,9}
sys=[];
case 3,
sys=sortie(u);
end
function [sys,x0,str,ts]=Initialisation
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs
= 1;
sizes.NumInputs
= 2;
sizes.DirFeedthrough = 1; % existence dun passage direct
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
% tat initial nul
x0 = [];
str = [];
% 1 seul chantillonnage de 1s sans offset
ts = [1 0];
function sys=sortie(u)
sys = 1-0.8*u(1)+0.5*cos(u(2));
Dans le modle SIMULINK suivant on ralise les retards de la valeur courante xn grce au retard unit.
Les valeurs xn et xn-1 sont ramenes lentre de la S-fonction travers un multiplexeur.
Nous avons ainsi lexistence dun lien direct de lentre vers la sortie (sizes.DirFeedthrough=1).
La sortie est calcule par une relation linaire entre lentre 1 du multiplexeur et le cosinus de la 2me.
S-fonctions
493
modle Sf__equat_recc_nl.mdl
Cette solution (valeur finale et volution dans le temps) peut tre vrifie par le modle SIMULINK
suivant grce une rtroaction et des retards.
La valeur finale peut tre obtenue en rsolvant lquation : x f = 1 0.8 x f + 0.5 cos x f
En utilisant les blocs Fcn et Solve, on recherche la valeur de la variable u qui satisfait lgalit :
1 1.8 u + 0.5 cos u = 0
b1 z 1
1 a1 z 1
494
Chapitre 11
modle regul_pi.mdl
fonction sf_ordre_1.m
% S_fonction de simulation d'un systme du 1er ordre
function [sys,x0,str,ts]=sf_ordre_1(t,x,u,flag,a1,b1,Te)
switch flag
case 0
% Etape d'initialisation
[sys,x0,str,ts]=Initialisation(Te);
case {1,2,4,9}
sys=[];
case 3
% paramtres du modle du 2nd ordre
sys=a1*u(1)+b1*u(2);
otherwise
error(['Unhandled flag = ', num2str(flag)])
end
function [sys,x0,str,ts]=Initialisation(Te);
S-fonctions
495
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=0;
sizes.NumOutputs=1;
sizes.NumInputs=2;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=[];
str=[];
ts=[Te 0];
Cette S-fonction reoit son entre les valeurs prcdentes u(k-1) et y(k-1) en retardant la
commande u(k) issue du rgulateur et la sortie y(k) du processus.
Le principe de cette rgulation PI est de calculer ses paramtres afin que le systme en boucle ferm se
comporte comme un systme du second ordre damortissement optimal, (meilleur temps de rponse), soit
=0.7071.
fonction sf_reg_pi.m
% S_fonction de rgulateur PI
function [sys,x0,str,ts]=sf_reg_pi(t,x,u,flag,a1,b1,Te)
switch flag
case 0
% Etape d'initialisation
[sys,x0,str,ts]=Initialisation(Te);
case {1,2,4,9}
sys=[];
case 3
% Paramtres de la FTBF du 2nd ordre
z = u(1);
% coeffient d'amortissement
w0T = u(2); % pulsation propre non amortie
gamma1=-2*exp(-z*w0T)*cos(w0T*sqrt(1-z*z));
gamma2=exp(-2*z*w0T);
% calcul des erreurs de poursuite err1 et err2
err1=u(5)-u(3); % err(t)
err2=u(6)-u(4); % err(t-1)
% calcul des paramtres alpha0 et alpha1 du PI
alpha0=(gamma1+a1+1)/b1;
alpha1=(gamma2-a1)/b1;
% calcul de la commande PI
sys=alpha0*err1+alpha1*err2;
otherwise
error(['Unhandled flag = ', num2str(flag)])
496
Chapitre 11
end
function [sys,x0,str,ts]=Initialisation(Te);
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=0;
sizes.NumOutputs=1;
sizes.NumInputs=6;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
str=[];
x0=[];
ts=[Te 0];
Les diffrents signaux (sortie du processus, commande et consigne) sont tracs par les lignes de
commande suivantes :
>>
>>
>>
>>
>>
>>
>>
>>
>>
load result_pi
stairs(signaux_temps(1,:), signaux_temps(2,:))
hold on
plot(signaux_temps(1,:), signaux_temps(3,:))
plot(signaux_temps(1,:), signaux_temps(4,:))
gtext('Signal de commande'), gtext('Signal de sortie')
gtext('Signal de consigne')
title('Signaux de consigne, sortie et commande')
xlabel('Temps discret'), grid
Signal desortie
25
20
Signal deconsigne
15
Signal decommande
10
10
20
30
40
50
60
Temps discret
70
80
90
100
S-fonctions
497
Du fait de la prsence dune intgration, le signal de sortie rejoint la consigne en rgime permanent.
Le systme en boucle ferme, se comporte comme un second ordre damortissement optimal, = 2
2
Avec un seul dpassement, le temps de rponse est minimal.
Grce la commande get on peut avoir accs aux valeurs prcdentes dune variable.
modle regule_PID_UserData.mdl
fonction discrete_pid_user_data.m
function [sys,x0,str,ts] = discrete_pid_user_data(t,x,u,flag,Kp,Ki,Td,Te,Umax,Umin)
switch flag,
case 0,
% Initialization %
[sys,x0,str,ts]=mdlInitializeSizes(Te);
case 1, % continuous states derivatives
sys=mdlDerivatives(t,x,u);
case 2,
sys=mdlUpdate(t,x,u,Umax,Umin,Te); % Discrete states updating
case 3,
sys=mdlOutputs(Kp,Ki,Td,Te,x,u); % output computing
case 4
sys=mdlGetTimeOfNextVarHit(t,x,u);
case 9,
sys=mdlTerminate(t,x,u);
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes(Te)
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 1;
sizes.NumOutputs
= 1;
Chapitre 11
498
sizes.NumInputs
= 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = 0;
str = [];
ts = [Te 0];
function sys=mdlDerivatives(t,x,u)
sys = [];
function sys=mdlUpdate(t,x,u,Umax,Umin,Te)
x=(x+Te*u);
%x=min(max(x,Umin),Umax));
sys=x;
function sys=mdlOutputs(Kp,Ki,Td,Te,x,u)
e_d_avant = get_param(gcb,'Userdata');
set_param(gcb,'Userdata',u);
deriv_err=(u-e_d_avant)/Te;
sys = Kp*u+Ki*x+Td*deriv_err;
function sys=mdlTerminate(t,x,u)
sys = [];
Les lignes de commande suivantes permettent de tracer les diffrents signaux sauvegards dans le fichier
cuy.
>>
>>
>>
>>
>>
>>
>>
1.6
1.4
Signal de sortie
1.2
1
0.8
Signal de consigne
0.6
0.4
0.2
0
50
100
Temps discret
150
Chapitre 12
Les callback sont des expressions MATLAB qui seront excutes lors de loccurrence dun
vnement (ouverture dun modle SIMULINK, un double-cliqu sur un bloc ).
Ces fonctions sont spcifies par les paramtres dun bloc, dun port ou du modle
SIMULINK. Dans le cas particulier du callback NameChangeFcn, ses fonctions sont
excutes lorsquon double-clique sur ce bloc.
Les instructions MATLAB associes au callback CloseFcn sont excutes la fermeture
du modle SIMULINK.
On peut crer des fonctions callback de 2 faons : interactivement ou par programmation.
La faon interactive consiste utiliser la boite de dialogue Model Properties de la
fentre SIMULINK.
500
Chapitre 12
501
Dans la partie gauche nous retrouvons les diffrents callbacks. Pour chacun deux, nous
spcifions dans la partie droite, les fonctions Matlab ou les scripts excuter.
Le tableau suivant reprsente ltape dexcution par type de callback.
Block/modle
modle
Callback
CloseFcn
Bloc/modle
InitFcn
modle
modle
modle/bloc
PostLoadFcn
PostSaveFcn
PreLoadFcn
modle
modle
PreSaveFcn
StartFcn
modle
StopFcn
Etape dexcution
A la fermeture du modle.
Permet lexcution dun script
MATLAB, la fermeture des
fentres, la suppression des
variables du Workspace
Avant lexcution du modle.
Peut
tre
utilis
pour
linitialisation des variables de
MATLAB utiliser lors de la
simulation
Au chargement du modle
Aprs la sauvegarde du modle
Avant louverture du modle
(Initialiser
des
variables
MATLAB
Avant la sauvegarde du modle
Avant la simulation mais aprs la
lecture
des
variables
de
MATLAB
Aprs larrt de la simulation.
Exemple
dexcution
dun
graphique aprs larrt de la
simulation du modle.
502
Chapitre 12
Notre but, en utilisant les callbacks, sera dviter lexcution du fichier M afin de spcifier
les valeurs des variables utilises dans le modle SIMULINK.
Nous pouvons utiliser les callbacks InitFcn, PostLoadFcn et PreLoadFcn.
Prenons le cas du callback InitFcn (tape dinitialisation du modle). Nous effaons
toutes les variables de lespace de travail et programmons le callback comme suit :
503
Nous pouvons maintenant programmer le trac de ces courbes dentre/sortie aprs chaque
arrt de la simulation en utilisant le callback StopFcn.
Les variables dentres/sorties sont sauvegardes dans la variable entree_sortie sous
forme de structure.
Nous mettons les lignes suivantes droite du callback StopFcn. Elles seront excutes
la fin de la simulation du modle.
On peut mettre ces instructions dans un fichier script. Dans ce cas, on fera appel son nom
dans la fentre du callback.
Ds la fin de la simulation, nous obtenons automatiquement le trac des courbes
dentres/sorties.
Chapitre 12
504
Entre/Sortie du processus
1.5
0.5
10
15
20
25
30
35
40
45
50
fichier prog_callback_Init.m
pole=0.8;
hauteur=5;
fichier prog_callback_Stop.m
plot(entree_sortie.signals.values)
axis([0 50 0 1.5])
grid
title('Entre/Sortie du processus')
505
La mthode itrative semble plus intressante que cette dernire car dune part, elle
ncessite des fichiers scripts. Dautre part, la premire mthode a lavantage dintgrer les
commandes MATLAB (ou le fichier script) directement dans SIMULINK.
Nous verrons plus loin dautres possibilits et avantages de la commande set_param
dans le contrle de la simulation dun modle SIMULINK.
Des paramtres de simulation peuvent tre spcifis par cette commande comme le type de
solveur, le temps de fin de simulation ou StopTime.
Nous dcidons de spcifier dautres valeurs que celles que nous avons utilises afin de
vrifier cette commande :
>> set_param('Simulink_Callback1', 'Solver', 'ode15s',
'StopTime', '100')
De la mme faon que ces paramtres, tous ceux quon spcifie dans la boite de dialogue
dun bloc peuvent tre ainsi spcifis par la commande set_param.
On vrifie bien les changements en observant la fentre Configuration
Parameters :
506
Chapitre 12
Nous allons tudier quelques callbacks sparment et nous les utiliserons pour des blocs
dun autre modle SIMULINK Certains blocks font apparatre une boite de dialogue par un
double-clic, le slider gain fait apparatre un curseur en utilisant un callback.
Les callbacks sont trs proches des Handle graphics. Lors de la cration dun GUI,
lappui dun bouton poussoir, par exemple, fait appel une sous-fonction excutant un
callback. Nous allons considrer le modle regul_PI.mdl suivant dans lequel on
ralise une rgulation PI (proportionnel et Intgral) dun systme du 1er ordre.
507
axis([0 115 0
gtext('Signal
gtext('Signal
gtext('Signal
16])
d''erreur')
de commande')
de consigne')
Signaux d'erreur, de commande et de sortie du processus
16
14
Signal d'erreur
12
10
Signal de commande
8
6
4
Signal de consigne
2
0
20
40
60
80
100
508
Chapitre 12
On efface lespace de travail MATLAB et on vrifie que les variables pole et hauteur
sont inexistantes.
>> clear all
>> who
La commande who naffiche aucune variable.
>> pole
??? Undefined function or variable 'pole'.
509
Lorsquon fait une copie ou que lon supprime ce bloc, il y a apparition de la fentre du
trac du sinus cardinal.
Chapitre 12
510
Instant dexcution
A la fermeture du modle. Permet de supprimer toutes les variables
inutiles la fermeture du modle
Chargement du modle
Fermeture du modle
Quand un bloc est dplac ou redimensionn
Ne fonctionne pas pour la rotation (Rotate Block) ou le retournement
(Flip Block)
Quand un bloc est dplac ou redimensionn
Ne fonctionne pas pour la rotation (Rotate Block) ou le retournement
(Flip Block)
Lors du lancement de la simulation du modle
Lors de la sauvegarde du modle
511
0.8
0.6
0.4
0.2
10
15
20
25
30
35
40
45
50
Chapitre 13
Stateflow
I. Introduction
II. Exemples dapplication
II.1. Exemple 1 : systme dessuie-glaces dun vhicule.
II.2. Exemple 2 : chronomtre
II.3. Compteur
II.4. Clignotant
II.5. Horloge
III. Objets de Stateflow
III.1. Les tats
III.2. Les transitions
III.2.1. Les transitions par dfaut
III.2.2. Labels des transitions
III.3. Les vnements
III.4. Les objets Data
IV. Modlisation de systmes continus dans Stateflow
V. Fonctions graphiques
V.1. Sinus cardinal
V.2. Carr, tiers de la valeur absolue
VI. Fonctions de test if ... then ... else
VII. Boucle for
VII.1. Valeur dune fonction
VII.2. Courbes de Lissajous
VIII. Gnration dun signal PWM
VIII.1. Comparaison dune constante et dun signal triangulaire
VIII.2. Condition else
IX. Rgulation PID numrique et analogique
IX.1. Rponse impulsionnelle dun systme discret du 1er ordre
IX.2. Rgulation PID discrte
IX.3. Rgulation PID analogique
X. Fonctions dcrites en langage MATLAB (Embedded Matlab)
XI. Les box
XII. Fonctions temporelles logiques
XIII. Tables de vrit
XIV. Jonction de lhistorique
XV. Utilisation des vecteurs et matrices dans Stateflow
XV.1. D terminant et inverse dune matrice
XVI. Utilisation de fonctions et de donnes Matlab, oprateur ml
XVI.1. Utilisation de fonctions Matlab
XVI.2. Rsultat dun calcul prcdent de loprateur ml
XVII. Fonction ml
XVIII. Appel de fonctions MATLAB
Chapitre 13
514
I. Introduction
Stateflow est un outil graphique interactif intgr SIMULINK pour modliser et simuler des machines
dtat fini, systmes qui ragissent des vnements, dits systmes ractifs. Ces systmes passent dun
tat un autre en rponse des vnements et des conditions.
De tels systmes permettent de modliser des processus dynamiques tels des moteurs, pompes, etc.
Une machine tats finis est une machine qui ne fonctionne que dans un nombre fini dtats, ou modes
opratoires.
Cest le cas dun ventilateur qui fonctionne dans les 5 tats suivants :
- arrt,
- vitesse maximale
- vitesse maximale,
- de sa vitesse maximale,
- vitesse maximale.
Pour construire une machine dtats finis, Stateflow propose un graphe ou chart quon peut dplacer
dans une fentre Simulink.
Stateflow
515
Lorsquon double-clique sur le bloc Chart dans la fentre SIMULINK, on aboutit une fentre
Stateflow dans laquelle nous trouvons une palette doutils ncessaires pour construire une machine dtat
fini.
516
Chapitre 13
Considrons le cas suivant qui reprsente le fonctionnement des essuie-glaces dun vhicule.
Stateflow
517
Ainsi, ce passage est conditionn par le test Switch==1 que lon crit sur la transition.
Ltat ON commence systmatiquement par ltat Slow (1re vitesse) do la prsence de la transition par
dfaut qui arrive cet tat sans aucune condition, la seule tant quon soit dans ltat ON. Ltat off
possde, lui aussi, une transition par dfaut car cest le premier auquel on arrive ds le dbut du
fonctionnement de la machine.
De ltat interne Fast, on passe vers ltat Slow si la condition Speed==1 est vrifie.
De ltat ON (Slow ou Fast), on revient ltat off si le switch est mis la position 0.
Pendant quon est dans un tat, on ralise des actions. Dans le cas de lessuie-glace, on applique au moteur
une tension qui correspond la vitesse souhaite. Ceci est symbolis par la valeur donne la variable M
(moteur).
Sur les transitions, on trouve principalement des conditions relatives ltat des capteurs et dans les tats
on agit sur les actionneurs.
Dans le menu View Model Explorer on peut visualiser toutes les entres venant de SIMULINK
ou les sorties que ce bloc Stateflow y affiche.
Les variables Switch et Speed sont des entres venant de SIMULINK alors que M est une sortie qui y
est affiche.
Chapitre 13
518
Pour dfinir ces variables nous utilisons le menu Add. Nous pouvons utiliser le menu Add de la fentre
Stateflow ou mieux le menu Tools Explore ou View Model Explorer.
Nous pouvons ajouter des entres-sorties SIMULINK, des vnements, des donnes ou des entres de
dclenchement (Trigger).
Dans notre cas, nous devons ajouter les entres Switch et Speed et la sortie M. Nous utilisons le menu
Add Data
On choisit le nom de la variable dans le champ Name, Input dans le champ Scope (entre) et son type
entier int8. On fait de mme pour lentre Speed et M sera output de type int8.
Dans SIMULINK, le bloc Stateflow qui reprsente le systme des essuie-glaces reoit les signaux dentre
Switch et Speed par un interrupteur (bloc Switch) qui peut basculer, respectivement entre 1 et 0 pour
Switch et entre 1 et 2 pour Speed. La sortie M est affiche dans un afficheur numrique (Display).
Nous vrifions bien que M vaut 2 lorsque Switch=1 et Speed=2.
modle windshield_wiper_system.mdl
Stateflow
519
Si nous visualisons la fentre Stateflow, nous remarquons que la machine est dans ltat ON (bordure en
rouge).
Nous avons les spcifications du conducteur ainsi que la valeur de la variable de sortie M correspondant
la tension applique au moteur. Toutes les autres variables sont inutiles donc supprimer. Cette fentre
peut aussi safficher par le menu Tools Explore.
Cette fentre reprsente le choix du menu Add Data directement dans la fentre Stateflow.
Chapitre 13
520
Le mme test et la mme incrmentation peuvent tre faits pour la variable heures. Ce chronomtre a
besoin du signal tick sous forme dun signal carr de dclenchement qui peut agir sur un de ses fronts.
tick est choisi comme tant un vnement (event).
On ajoute les vnements par le raccourci symbolis par
Larrt du comptage peut se faire par celle de SIMULINK ou par Stateflow lorsquon met la variable run
ltat faux reprsente par la condition [ ! run] qui valide la transition du passage vers ltat de dpart
Stopped.
modle chrono.mdl
Stateflow
521
Le graphe Stateflow du chronomtre possde une entre, run et deux sorties : minutes et secondes.
Lentre run, de type boolean permet de valider ou non le comptage du temps. Le comptage se fait au
rythme du signal carr (priode 2 secondes) qui sert dentre de dclenchement (trigger).
Dans ltat stopped, on ne ralise aucune action. La transition vers ltat started est du type
[condition]/transition action
Lorsque la condition run est vraie (run==1) on ralise les actions de remise zro des variables de
sortie minutes et secondes.
Ltat Counter ne possde, non plus, aucune action. Les actions de comptage se font au niveau des
transitions qui deviennent du type
Event [condition]/transition action
Lorsque lvnement tick survient, que le nombre de secondes est infrieur 59, on incrmente ce
nombre.
Ds que le nombre de secondes atteint 59, la transition de gauche nest plus active cause de la condition
[seconds<59] qui devient fausse.
II.3. Compteur
modle compteur.mdl
Chapitre 13
522
Dans ce cas, la transition par dfaut fait passer la machine par ltat A dans lequel on initialise la variable
count 0.
Ds lentre ltat B, on incrmente cette variable count. Le passage de A B se fait suite
lvnement Event condition que la condition count==0 soit vrifie. Dans cette transition on ralise
galement laction de lincrmentation de count.
On reste dans ltat B tant que la valeur de count est diffrente, donc infrieure 5.
Lincrmentation de count se fait dans la transition de ltat A vers B ainsi que dans ltat B. La
transition se fait au rythme du signal tick, dfini boolen. Nous avons du faire une conversion du type
double vers boolean dans le modle Simulink.
II.4. Clignotant
Le systme consiste au passage dun tat vers un autre la frquence dun signal dhorloge.
Lordre de clignotement doit tre valid avant tout fonctionnement, indpendamment de la prsence de ce
signal.
modle clignotant.mdl
Le modle Stateflow possde une entre run qui valide le fonctionnement de clignotement et une entre
tick de dclenchement (trigger) sous forme dun signal carr.
Stateflow
523
Les signaux lampe et run sont dfinis comme logiques (boolean) pendant que le dclenchement se
fait au front montant du signal carr.
Ltat Clignt peut tre dfini comme un sous tat du bloc Stateflow puisquil est le seul.
Ltat init est un sous tat de ltat Clignt.
Ils ont tous deux, comme tout tat interne ou sous tat, une transition par dfaut (sans condition).
Ds lentre dans ltat Clignt, on aboutit ltat init o on simule lextinction de la lampe.
Si lentre run est au niveau 1 on entre dans ltat Allume. Lorsquon valide une transition par un
signal logique (boolean) comme run, on le met entre crochets.
Ds lentre dans cet tat (entry :), on met le signal logique lampe 1.
Lextinction de la lampe se fait au front montant du signal de dclenchement si le signal run est 1, do
la condition tick [run].
Cette mme condition sur les signaux run et tick permet le retour ltat init o la lampe steint.
Tant que cette condition est valide, on passe sans discontinuer de Eteint Allume et inversement.
Chapitre 13
524
modle horloge.mdl
Le bloc Stateflow est dclench par le signal tick sur le front montant (Rising) dun signal carr.
Il reoit le chiffre en secondes sur son entre nbre_sec, entre de SIMULINK sous forme dun entier
non sign, cod sur 8 bits, uint8.
Ses 3 sorties (heures, minutes, secondes) sont affiches sur le bloc display, aprs passage
par un multiplexeur.
Les signaux logiques run et stop servent aux transitions pour valider le calcul et son arrt.
La programmation nest pas optimale mais uniquement but pdagogique afin dtudier dautres
fonctionnalits de Stateflow.
Le test [1==1] est toujours valide, condition toujours ralise.
Lorsquon doit se dplacer vers plusieurs tats selon des conditions diffrentes, ces dernires valideront
autant de transitions qui partent dun mme tat.
Stateflow
525
On ne peut pas avoir plusieurs transitions par dfaut partant dun mme tat.
Une manire dviter cette erreur est de mettre cette condition qui rend cette transition prioritaire une
autre par dfaut.
Ds lentre dans ltat start, on initialise les variables locales run et stop respectivement 1 et 0.
Dans la transition [1==1] {secondes=0}, on force la variable secondes 0.
Laffiche des sorties ne se fait que lorsque la variable stop est 1 et au front montant du signal de
dclenchement.
tats,
vnements,
transition,
les donnes,
les conditions,
jonction
jonction de lhistorique
etc.
526
Chapitre 13
Un tat est appel super tat, ou tat parent vis vis de ceux quil contient et ceux-l deviennent des soustats (ou enfants).
Cette hirarchie apparat dans la fentre de gauche de lexplorateur (Tools Explorer)
Les tats init, Eteint et Allume sont des sous-tats de ltat Clignt, lui-mme un enfant de ltat
racine compteur.
Notons que Stateflow est un enfant pour Simulink. Le bloc Stateflow (compteur) possde la mme
hirarchie que le switch manuel.
Chaque tat possde un parent. Dans le cas suivant, les tats B et C ont ltat A comme parent.
Le cas suivant contient des tats exclusifs. Cest aussi le cas prcdent pour les tats B et C vis--vis de
ltat parent A.
Ils ne peuvent pas tre actifs en mme temps. On dit quils sont en dcomposition OU.
Lexclusivit est ralise par les transitions qui contiennent des conditions qui valident le passage dun
tat vers un autre.
Stateflow
527
Un graphe Stateflow peut possder plusieurs tats qui peuvent tre actifs simultanment. Ces tats sont
dits parallles, soit en dcomposition ET. Les tats parallles sont encadrs par des bords en pointills.
Chaque tat possde un nom (label) en haut gauche du rectangle dlimitant cet tat.
En gnral, nous avons :
nom/
entry:
<actions raliser lentre dans cet tat>
during:
<actions raliser Durant lactivit de cet tat>
exit:
<actions raliser ds quon sort de cet tat>
on <nom_evt> : actions raliser loccurrence de lvnement nom_evt
bind :
<variable> <actions>
Si on ne spcifie rien, cest considr comme entry donc les actions sont excuter ds lentre dans
ltat.
Le fait de mettre bin : a signifie que seul cet tat ou des tats enfants peuvent modifier la valeur
de la variable a.
Les autres tats peuvent utiliser cette variable mais ne peuvent modifier sa valeur.
Le nom de chaque tat doit tre unique lintrieur de chaque super tat pour ne pas quil y ait ambigut.
Bien quils aient les mmes noms On et Off, les tats Lampe et Clim, enfants du super tat Vehicule
possdent les noms complets suivants :
Les actions sont trs proches du langage C, exemple pour lincrmentation, ajout/retrait dune constante
et appel dune fonction :
- a++;
- b+=5
- [vrai, faux] = ma_fonction(x);
Lindexation de vecteurs et tableaux se fait comme dans le langage C :
x = vect [4];
y = matr[2][7]
Chapitre 13
528
Les lignes de commentaire peuvent dbuter par lun des 3 symboles : //, */ et %.
Tout comme pour MATLAB, une ligne peut se terminer par le symbole pour indiquer que la ligne
continue jusqu la suivante.
Exemple du graphe horloge, laction de ltat affiche_sec peut scrire comme suit :
secondes =(secondes-60*minutes
- 3600*heures) ;
On peut utiliser quelques fonctions de la librairie Math du langage C telles : abs, sqrt, ceil, etc.
En plus de ces instructions particulires du langage C, on peut faire appel des fonctions pralablement
dfinies.
On peut utiliser les fonctions MATLAB et les variables de lespace de travail grce lutilisation de
loprateur ml.
Nous
allons
tudier
un
cas
lon
fait
appel
ces
variables
et
fonctions.
modle appel_fct_MATLAB.mdl
Stateflow
529
Lorsque lentre logique MoyVar est au niveau 1, on calcule la moyenne et la variance de la variable x.
Cest ce quon fait dans ltat moy_var.
La commande ect.std(ml.x) revient calculer lcart type de la variable x de lespace de travail par
lutilisation de la commande MATLAB std.
Idem pour le calcul de la moyenne pour la commande mean de MATLAB.
Le passage de ltat start ltat moy_var est conditionn par la variable logique MoyVar que le
graphe reoit de SIMULINK.
Dans cet tat, les variables, moyenne et variance sont affiches dans le display.
Si lentre logique MoyVar est fausse, on passe de ltat start min_max dans lequel on calcule le
minimum et le maximum du tableau x.
Dans chacun de ces deux tats, on remet 0 les variables de lautre tat (variables locales).
Les calculs de la moyenne et de la variance se font par les fonctions Matlab std^2 et mean quon
associe la commande ml.
La condition vidente [1==1] permet dviter lexistence de plus de deux transitions par dfaut entre les
tats moy_var et sin_card.
Le retour de chacun des deux tats vers start se fait en utilisant une jonction (objet
de la palette).
Comme on ne doit pas avoir, en sortie ou en entre dun objet Stateflow (ici la jonction), 2 transitions par
dfaut, on utilise la condition [1==1] qui vaut toujours 1.
Chapitre 13
530
III.2. Les transitions
Une transition est un objet graphique qui lie un tat un autre. Un label dcrit les circonstances ou les
conditions du passage entre ces tats
III.2.1. Les transitions par dfaut
La transition par dfaut (sans aucune condition, ni label) dtermine ltat qui doit tre actif lorsquil y a
ambigut entre plusieurs tats en dcomposition OU et qui ont le mme niveau de hirarchie.
Chaque tat qui contient des sous-tats doit avoir sur lun deux une transition par dfaut qui dtermine
cet tat actif ds lentre de ce super tat (ou tat parent).
III.2.2. Labels des transitions
Une condition est une expression boolenne qui valide la transition du passage dun tat vers un autre. La
condition est mise entre crochets.
Les conditions peuvent faire intervenir des variables locales ou des entres SIMULINK. Lexemple
suivant montre laugmentation de la vitesse du ventilateur lorsque la temprature ambiante dpasse un
certain seuil.
On peut mettre un nom de variable logique locale auparavant mise 1 lorsque la condition est ralise.
Dans une transition, on peut raliser des actions comme celles quon fait lintrieur dun tat.
Les actions ralises dans une transition sont mises entre accolades.
Dans le cas suivant, la transition se fait lorsque la temprature dpasse le seuil et dans ce cas on arrte le
moteur de recirculation de lair en mettant la variable recirc 0.
Stateflow
531
532
Chapitre 13
Comme dans le modle horloge, les variables logiques run et stop sont locales au graphe (dfinies et
utilises dans le graphe).
Elles sont invisibles dans Simulink, et dans Matlab.
Par contre, comme MATLAB est au niveau hirarchique le plus lev, ces donnes peuvent y tre
dfinies et utilises dans Stateflow.
Stateflow
533
Les variables dfinies comme continues sont uniquement des variables locales, elles ne peuvent pas tre
des entres, ni des sorties.
Toutes les oprations lies aux variables continues ne peuvent se faire que pendant ltape during de
ltat.
Nous allons tudier la modlisation dun systme continu du 1er et du 2me ordre.
La fonction de transfert du systme du 1er ordre :
H ( p) =
k
1+ p
permet dobtenir le rgime transitoire : y (t ) = y (t ) que nous allons programmer dans Stateflow.
En dfinissant la variable (Data) comme locale et continue, Stateflow cre implicitement sa drive
y_dot, invisible dans lexplorateur.
Dans le seul tat nomm _1erOrdre, on programme lquation diffrentielle :
y_dot= tau y,
Chapitre 13
534
Nous dfinissons les variables x1 et x2 comme locales et continues et Stateflow cre leurs drives
x1_dot et x2_dot que nous relions par les quations dtat ci-dessus.
Dans la transition par dfaut nous initialisons ces variables 0.
modle syst_2eme_ordre_continu.mdl
Stateflow
535
Avec un coefficient damortissement de 0.1, nous observons des oscillations amorties dans la rponse
transitoire du systme.
V. Fonctions graphiques
Une fonction graphique est une fonction dfinie graphiquement par un graphe Stateflow. Une fonction
graphique est cre grce loutil
Dans le diagramme dune fonction on peut trouver tous les objets graphiques tels les tats, les transitions,
les jonctions ainsi que les conditions et les actions.
Lorsquon utilise loutil
, on fait apparatre un rectangle dans lequel sera dfinie la fonction
graphique, comme dans lexemple suivant o la fonction f1 accepte 2 paramtres dappel dont elle fait le
produit.
Une fonction peut accepter autant de paramtres dappel que ncessaire et elle-mme peut tre utilise
dans des actions dtats ou de transitions dans un graphe Stateflow.
Une fonction ne peut pas retourner plus dun argument de retour. Les arguments dappel et de retour ne
peuvent pas tre des tableaux.
On peut faire appel une fonction dans le corps dune autre fonction graphique. On se propose dtudier
quelques exemples dutilisation de fonctions graphiques.
536
Chapitre 13
On se propose de programmer la fonction sinus cardinal laide de Stateflow en utilisant uniquement des
actions dans les transitions.
V.1. Sinus cardinal
modle sin_card_stateflow.mdl
Dans ltat A, on fait appel la fonction sin_card, avec y et x les oprateurs de retour et dappel.
de la palette doutils, on fait apparatre le rectangle dans lequel on programme la
A laide de loutil
fonction sin_card.
On lve lindtermination sin(0)/0 grce aux deux transitions 1 et 2.
La transition 1 teste si largument dappel est diffrent de zro : [u~=0].
Aprs une jonction, nous trouvons la transition dans laquelle on ralise laction qui programme le sinus
cardinal : {t=sin(u)/u ;}
La transition 2 permet uniquement de mettre 1 la valeur du sinus cardinal. Les 2 transitions arrivent
une jonction finale.
Dans le modle sin_card_stateflow on sauvegarde les signaux dentre et de sortie du bloc
Stateflow dans lespace de travail sous la forme dun tableau y.
Stateflow
537
Les lignes suivantes permettent de tracer les signaux dentre/sortie. Largument est une rampe de pente
/50.
subplot(211), plot(y(:,1)), title('Sinus cardinal'), grid on
axis([0 50 -0.3 0.9]), subplot(212), plot(y(:,2))
title('Argument du sinus cardinal (rampe de pente \pi/50)')
grid, axis([0 50 0 25])
Sinus cardinal
0.8
0.6
0.4
0.2
0
-0.2
0
10
15
20
25
30
35
40
45
50
45
50
25
20
15
10
5
0
10
15
20
25
30
35
Les valeurs de langle entre 0 et 50 rads, sont espaces dun pas de /50.
V.2. Carr, tiers de la valeur absolue
Modle fct_stateflow.mdl
40
538
Chapitre 13
Dans le seul tat power que nous avons dans le graphe Stateflow, nous faisons appel la fonction
graphique nomme transf qui fait appel son tour 2 autres fonctions : carre et val_abs qui
consistent, respectivement lever au carr largument et au tiers de la valeur absolue, telles que sont
dfinies ces fonctions dans le graphe Stateflow.
Les tats de dfinition ou dappel de chaque fonction commencent par une jonction laquelle arrive une
transition par dfaut.
Lorsque x est positif ou nul, la transition dfinie par la seule condition [x>=0] est valide et on arrive la
transition dans laquelle on ralise, par dfaut, laction consistant lappel de la fonction carre.
Cette transition est uniquement dfinie par laction {y=carre(x);}
Dans le cas contraire o x est ngatif, on passe successivement par la transition dfinie par la condition
[x<0] et celle de laction [y=val_abs(x);}
Les dfinitions ou les appels de fonctions aboutissent une jonction finale.
Le graphe peut tre optimis comme suit:
Stateflow
539
plot(y(:,1))
grid on
axis([0 50 -1 1])
hold on
plot(y(:,2))
title('Signaux d''entre/sortie')
Signaux d'entre/sortie
1
0.8
signal de sortie
0.6
0.4
0.2
0
-0.2
signal d'entre
-0.4
-0.6
-0.8
-1
10
15
20
25
30
35
40
if ... else
45
50
540
Chapitre 13
Le graphe Stateflow dbute par une jonction laquelle arrive une transition par dfaut, comme on aurait
pu le faire avec un tat.
De cette jonction partent 2 transitions dont lune est par dfaut. Lautre indique que si la valeur absolue
du signal dentre est suprieure 0.5 alors le signal de sortie prend sa valeur.
Dans le cas contraire, le signal de sortie garde la valeur atteinte par le signal dentre (blocage).
Une transition interne ltat gnral arrive la jonction de dpart pour raliser une excution continue
du modle durant le temps de simulation dfini par le menu de Simulink (Simulation
...Configuration Parameters).
Les signaux dentre/sortie sont envoys vers le fichier binaire y.mat. Les lignes de commande
suivantes permettent le trac de ces signaux.
% lecture du fichier y
load y
plot(ans(2,:))
axis([0 50 -1 1])
hold on
plot(ans(3,:))
title('Signaux d''entre/sortie')
grid
Stateflow
541
Signaux d'entre/sortie
1
0.8
0.6
0.4
Signal de sortie
0.2
0
-0.2
-0.4
-0.6
Signal d'entre
-0.8
-1
10
15
20
25
30
35
40
45
50
If ... else2.mdl
modle if_else2.mdl
Dans le graphe Stateflow du modle if_else2.mdl, nous utilisons des transitions comportant chacune
une seule condition ou action.
542
Chapitre 13
Ce graphe commence par une jonction laquelle arrive une jonction interne ltat. De cette jonction
partent 2 jonctions dont lune est par dfaut.
Lautre jonction active le passage vers une autre jonction par la condition [abs(a)>=0.5] savoir que
la valeur absolue du signal dentre suprieure 0.5.
Aprs le passage par une autre jonction, on ralise laction {x=0.5*(a/abs(a)} qui consiste mettre
x 0.5 * signe(x).
Ce graphe peut tre optimis comme suit (2 jonctions seulement).
Les signaux dentre/sortie sont envoys vers loscilloscope et le fichier binaire y.mat.
Les lignes de commande suivantes permettent de tracer les signaux dentre/sortie du bloc Stateflow.
Stateflow
543
load y
plot(ans(2,:))
axis([0 50 -1 1])
hold on
plot(ans(3,:))
title('Signaux d''entre/sortie')
grid
Signaux d'entre/sortie
1
0.8
Signal d'entre
0.6
0.4
0.2
0
Signal de sortie
-0.2
-0.4
-0.6
-0.8
-1
10
15
20
25
30
35
40
45
50
modle if_if_else.mdl
Dans le graphe Stateflow suivant, dans la transition par dfaut, on ralise la mise zro des sorties I1, I2
et I3.
544
Chapitre 13
On arrive ltat init dont on peut se passer pour aboutir directement la jonction laquelle on passe
travers la transition dans laquelle on met I1 1 si lentre c1 est vraie (gale 1). De cette jonction
partent 2 transitions dont lune ne comporte ni condition ni action. Dans la transition de gauche, on met I2
1 si lentre c2 est vraie. Dans le chemin de droite, on fait de mme pour I3 si c3 = 1.
Dans le cas prcdent, seule c2 est nulle, ce qui a pour consquence I2=0.
Stateflow
545
gtext(['\downarrow'
num2str(y(length(y)))])
xlabel('Indice n')
ylabel('Evolution de y')
La figure suivante montre lvolution de y en fonction de lindice n ainsi que sa convergence vers la
mme valeur obtenue par Stateflow.
Chapitre 13
546
0.9
0.8
0.74256
Evolution de y
0.7
0.6
0.5
0.4
0.3
0.2
20
40
60
80
100
120
140
160
180
200
Indice n
On se propose de tracer une courbe paramtre en fonction dune autre, soit la fonction z=a cos(4 t)
en fonction de y=a cos(3 t), toutes deux paramtres par la variable t incrmente chaque pas de
la valeur n /1000 avec n allant de 1 100.
Stateflow
547
548
Chapitre 13
modle pwm_stateflow.mdl
Le graphe Stateflow possde 2 entres (le rapport cyclique rc exprim en pourcentage et un signal
triangulaire).
Une sortie constitue le signal PWM.
Pour gnrer le signal, on utilise le test conditionnel ~(Tri>=rc/100), qui donne 1 partout o le
signal triangulaire est suprieur au centime du rapport cyclique (spcifi entre 0 et 100%) et 0 ailleurs.
Les signaux triangulaires et PWM sont envoys vers lespace de travail sous forme de structure de nom
xy.
plot(xy.signals.values(:,1))
hold on
plot(xy.signals.values(:,2))
Stateflow
549
La figure suivante montre le cas dun signal PWM de rapport cyclique de 80%.
0.8
0.6
0.4
0.2
-0.2
10
15
20
25
30
35
40
45
50
Le signal PWM est ralis la frquence du signal triangulaire ; 1 lorsque la constante (rapport cyclique)
est suprieure la valeur du triangle.
Nous obtenons le mme rsultat avec le graphe suivant (modle pwm2_stateflow.mdl) o laction
se fait dans la transition.
Nous pouvons aussi utiliser la condition if ... then... else pour gnrer ce signal PWM
partir des mmes signaux dentre : le signal triangulaire pour spcifier la frquence et la constante pour
le rapport cyclique.
550
Chapitre 13
La mme condition sur la constante et le triangle est faite sous forme de programmation (action sur une
transition).
modle if_else_pwm.mdl
Ce cas, utilis pour gnrer un signal PWM de rapport cyclique de 20%, donne la courbe suivante.
Stateflow
551
On se propose dobtenir la rponse impulsionnelle dun systme du 1er ordre numrique de fonction de
transfert :
b z 1
H ( z 1 ) = 1 1
1 a1 z
Correspondant lquation de rcurrence temporelle suivante entre lentre u(t) et la sortie y(t).
y (t ) = a1 y (t 1) + b1 u (t 1)
modle repimp_1er_ordre_stateflow.mdl
Les lignes de commande suivantes permettent de lire le fichier binaire uy.mat et de tracer limpulsion et
sa rponse lorsquon lapplique au processus.
load uy
who
size(s)
plot(s(1,:),s(2,:))
hold on
plot(
s(1,:),s(3,:))
grid
axis([0 40 0 1.2])
title('Impulsion et rponse impulsionnelle')
xlabel('Temps discret')
gtext('Impulsion')
text('Rponse impulsionelle du processus')
gtext('Rponse impulsionelle du processus')
gtext('Impulsion')
Chapitre 13
552
Impulsion et rponse impulsionnelle
Impulsion
0.8
0.6
0.4
0.2
10
15
20
25
30
35
40
Temps discret
Dans le modle Simulink suivant, on ralise une commande PID avec un signal de consigne constitu
dun chelon suivi dune rampe.
Le graphe du rgulateur reoit comme entres, les signaux de lerreur linstant courant err, sa valeur
prcdente err_t_1 et la commande prcdente u(k-1).
Sa sortie consiste en la commande u(k) appliquer au processus linstant k.
Stateflow
553
modle pid_stateflow_discret.mdl
u (k ) = u (k 1) +
Kp
[(1 + T ) err (k ) T err (k 1)]
T
La lecture du fichier binaire y.mat et le trac des signaux de consigne, commande et sortie du processus
sont raliss par les lignes de commande Matlab suivantes.
close all
load y
plot(x(1,:),x(2,:))
hold on
stairs(x(1,:),x(3,:))
plot(x(1,:),x(4,:))
grid
axis([0 100 0 4.5])
title('Consigne, sortie et signal de commande')
xlabel('Temps discret')
gtext('commande')
gtext('sortie du processus')
gtext('Consigne')
554
Chapitre 13
4.5
4
3.5
3
sortie du processus
2.5
2
Consigne
1.5
commande
1
0.5
0
10
20
30
40
50
60
70
80
90
100
Temps discret
On ralise une autre rgulation PID discrte avec seulement une consigne de type chelon.
modle PID_Stateflow.mdl
Le graphe Stateflow suivant, possde un seul tat, PID/, avec une transition par dfaut dans laquelle on
ralise laction daffectation des valeurs 0.01 et 0.1, respectivement, pour le gain proportionnel Kp et la
constante de temps dintgration T.
555
Stateflow
Durant toute la dure de lactivation de ltat, on value la relation rcurrente qui donne le signal de
commande u.
Le modle du processus, du premier ordre est le suivant : b1 z-1/(1-a1 z-1) avec le ple a1=0.8
et b1=0.5.
Laffectation de ces valeurs est ralise dans laction lie la premire transition du graphe dfinissant le
processus.
Aprs le passage par une jonction, nous trouvons une autre transition dans laquelle on value lquation
de rcurrence dfinissant le modle du processus :
y(k)=a1 y(k-1) + b1 u(k-1)
Dans lexplorer suivant, nous observons la hirarchie des objets du graphe Stateflow. Nous observons
notamment les 2 tats PID et Process_1er_ordre.
Chapitre 13
556
Les signaux de la boucle de rgulation sont affichs sur loscilloscope et sauvegards dans le fichier
binaire cuy.mat.
load cuy
plot(signaux(1,:), signaux(2,:))
axis([0 200 -0.2 1.2])
hold on
stairs(signaux(1,:), signaux(3,:))
plot(signaux(1,:), signaux(4,:))
title(['Consigne, commande et sortie'])
grid
gtext('Signal de commande')
gtext('Sortie du processus')
gtext('Signal de consigne')
xlabel('Temps discret')
Consigne, commande et sortie
Signal de consigne
1
0.8
Sortie du processus
0.6
0.4
Signal de commande
0.2
-0.2
20
40
60
80
100
120
Temps discret
140
160
180
200
Aprs deux dpassements dont le deuxime est ngligeable, la sortie rejoint le signal de consigne.
557
Stateflow
IX.3. Rgulation PID analogique
u (t ) = Kp err (t ) + Ti err (t )
Stateflow cre automatiquement les variables err_dot et u_dot pour les drives de lerreur et de la
commande. Ainsi, nous aurons : u_dot = Kp err_dot + Ti err.
PID_stateflow_continu.mdl
Le rgulateur PI analogique possde la fonction de transfert suivante:
,
soit lquation diffrentielle suivante :
.
u (t ) = Kp err (t ) + Ti err (t )
Stateflow cre automatiquement les variables err_dot et u_dot pour les drives de lerreur et de la
commande. Ainsi, nous aurons : u_dot = Kp err_dot + Ti err.
modle PID_analogique.mdl
Le processus analogique est choisi de gain statique unit et de constante de temps =2s, avec
Y ( p)
1
=
U ( p) 1 + p
558
Chapitre 13
Dans la transition par dfaut, nous ralisons laction daffectation des valeurs 20 et 5, respectivement
pour le gain proportionnel Kp et la constante de temps dintgration Ti. Durant lactivation de ltat, on
value la drive du signal de sortie et on affecte la valeur de ce signal celui de la sortie du bloc,
y_out.
Avant de donner les rsultats de cette rgulation, nous traons, en mme temps, les rponses, indicielle et
impulsionnelle du processus.
Le modle Simulink suivant permet dobtenir la rponse indicielle de ce processus.
modle rep_ind_imp.mdl
Stateflow
559
La figure suivante montre limpulsion suivie de lchelon ainsi que la rponse du processus ces 2
entres.
Le trac de ces courbes se fait par la lecture du fichier binaire entrees.mat.
Rponses Impulsionnelle et Indicielle
2.5
1.5
Impulsion
1
Echelon
0.5
sortie du processus
10
12
14
16
18
20
Temps discret
Chapitre 13
560
Les paramtres Kp et Ti sont affects leurs valeurs 20 et 5 dans laction lie la transition par dfaut.
Durant lactivation de ltat PID_analogique, on calcule la drive du signal de commande u et on
affecte sa valeur au signal de sortie u_out.
Les lignes de commande suivantes permettent de lire le fichier binaire et de tracer les diffrents signaux
de consigne, commande et sortie du processus continu.
Dans un graphe Stateflow, les variables dont les drives interviennent, ne peuvent tre ni des entres, ni
des sorties mais uniquement locales.
Pour sortir une de ces variables, on cre une variable (output) laquelle on affecte la valeur de la
variable locale correspondante;
Les lignes de commande suivantes permettent dobtenir les rsultats de ce type de rgulation.
load cuy, close all
plot(ans(1,:),ans(2,:))
title('Rgulation PID analogique')
xlabel('Temps analogique')
axis([0 50 -0.2 1.4])
hold on
plot(ans(1,:),ans(3,:))
plot(ans(1,:),ans(4,:))
grid
gtext('Signal de commande')
gtext('Signal de sortie du processus')
gtext('Signal de consigne')
Stateflow
561
Grce lintgration, le signal de sortie rejoint la consigne en rgime permanent partir de linstant 25.
Comme pour le rgulateur discret, la prsence de lintgration dans lexpression du rgulateur fait que la
sortie du processus rejoint le signal de consigne en rgime permanent, soit entre les instants 4 et 5 dans
notre cas (figure prcdente). Il sen suit aussi de la stabilisation du signal de commande.
modle regulation_PID_mixte.mdl
On peut raliser une boucle de rgulation mixte (rgulateur analogique suivi dun bloqueur dordre 0 pour
attaquer le processus discret).
Si on garde le mme processus discret quauparavant, on doit modifier les paramtres du rgulateur PID
analogique pour obtenir une certaine stabilit.
Avec Kp =2 et Ti =10 s, nous obtenons les rsultats suivants :
load cuy
plot(signaux(1,:), signaux(2,:))
Chapitre 13
562
axis([0 100 0 1.4])
hold on,
stairs(signaux(1,:), signaux(3,:))
plot(signaux(1,:), signaux(4,:))
title(['Consigne, commande et sortie, rgulation mixte'])
grid
gtext('Signal de commande')
gtext('Sortie du processus')
gtext('Signal de consigne')
xlabel('Temps discret')
Consigne, commande et sortie, rgulation mixte
1.2
Sortie du processus
1
Signal de consigne
0.8
0.6
Signal de commande
0.4
0.2
10
20
30
40
50
60
Temps discret
70
80
90
100
A partir de linstant 50, la sortie du processus rejoint parfaitement le signal de consigne grce la
prsence de laction intgrale.
Avec les valeurs des paramtres utiliss dans lexpression du rgulateur, nous observons 3 dpassements
du signal de sortie du processus.
Ds quon pointe sur cette icne, il y a cration dun rectangle avec le label eM pour embedded
Matlab
Stateflow
563
A la place du point dinterrogation, on crit le label de la fonction de la mme manire que les fonctions
graphiques.
La label possde la syntaxe suivante : [prim, deriv] = prim_deriv(poly), avec poly le
paramtre dappel, prim et deriv tant les deux paramtres de retour.
On se propose dtudier un exemple qui permet de calculer la primitive et la drive dun polynme.
Cette fonction possdera alors un seul paramtre dappel (polynme) et deux paramtres de retour qui
sont les polynmes primitive et drive.
Appelons cette fonction : prim_deriv(poly), soit:
On cre un nouveau modle Simulink dont on commence prparer les diffrents blocs utiles.
On double-clique sur le graphe Stateflow dans lequel on cre une transition qui se termine par une
jonction avec laction correspondant lappel de la fonction textuelle.
564
Chapitre 13
Dans lexplorateur de chart (graphe Stateflow), on dfinit les entres/sorties du bloc Stateflow. Ce sont
les paramtres que lon trouve dans laction de la transition qui se termine par une jonction.
Stateflow
565
Comme lordre du polynme dentre est choisi gal 3, ceux de la drive et de la primitive sont
respectivement de 2 et 4, comme on le spcifie dans lexplorateur au-dessous de size.
Il ne nous reste plus qu programmer les fonctions prim et deriv.
Pour la fonction deriv, nous utilisons la fonction polyder. Comme elle ne fait pas partir des fonctions
du sous-ensemble Matlab (subset), nous la rendons disponible grce la commande :
eml.extrinsic(polyder)
>> polyder([1 2 1])
ans =
2
2
Pour la fonction prim qui calcule la primitive, nous pouvons utiliser la commande polyint.
Chapitre 13
566
>> polyint([1 2 1])
ans =
0.3333
1.0000
1.0000
Dans notre cas, nous utilisons la commande polyval de chaque coefficient du polynme valu la
valeur 1, soit :
Le modle Simulink suivant nous utilisons ces fonctions pour obtenir la drive et la primitive du
polynme : x 2 + 2 x + 1
Nous obtenons la drive : 2 x + 2 et la primitive 0.3333 x3+2 x2 + x.
Dans la partie du bas, nous valuons ces polynmes rsultats par une rampe de pente unit.
Nous obtenons finalement le rsultat escompt, comme le montre la figure prochaine o nous retrouvons
le polynme dorigine, ainsi que sa drive et sa primitive.
modle prim_deriv_embedded
Nous avons valu tous les polynmes, celui de lentre et les deux de sortie grce au bloc Polynomial
de la libraire Math Operations de Simulink.
Stateflow
567
x 3/3+x 2+x
600
20
120
500
18
100
16
400
14
80
300
12
60
10
200
40
100
20
2 x+2
22
4
0
10
10
10
de la palette de Stateflow.
568
Chapitre 13
On peut transformer un tat en un box, en cliquant droit en choisissant loption Box du menu Type et
inversement.
Un autre avantage des box consiste grouper un ensemble de fonctions eM (embedded Matlab).
Dans le graphe suivant nous avons rassembl les fonctions Temp et VitFan dans le mme box nomm
Temp_Fan.
Ds lentre dans ltat Temp, on fait appel la fonction MeasureTemp qui se trouve dans le box
Temp_Fan do la syntaxe Temp_Fan.MeasureTemp().
Si la temprature dpasse 80C, on valide la transition qui fait passer ltat Fan/.
Stateflow
569
Ds lentre dans cet tat, on active le ventilateur en faisant appel la fonction VitFan du box labellis
Temp_Fan avec la syntaxe Temp_Fan.VitFan().
De la mme faon, on peut grouper des tats. Dans le box Etat_Clim, nous avons 2 tats en
dcomposition parallle, Temperature et Pressure. Selon la valeur de la temprature, on passe de
ltat Froid ltat Chaud et inversement.
Chapitre 13
570
Nous avons galement 2 fonctions eM pour refroidir ou chauffer ainsi que 2 autres pour augmenter ou
baisser la vitesse dun ventilateur afin dagir sur la valeur de la pression.
Dans le cas de la couleur de la Led de temprature, elle est initialement bleue.
La condition labellisant la jonction :
[in(Etat_Clim.Temperature.Froid]
teste si lon est dans ltat Froid/ de ltat Temperature du box Etat_Clim.
Si lon est dans cet tat, on met la Led la couleur rouge et on actionne la fonction eM de chauffage
FctWarm.
Il en est de mme pour le cas de cette temprature et des 2 tats de la pression.
Les tats Temperature et Pressure sont prioritaires car ils sont dans un box.
Stateflow
571
Au dpart, ltat ON/ est activ. 5 secondes de simulation aprs, la transition vers ltat OFF/ est valide.
Ltat ON/ est dsactiv et OFF/ activ.
10 secondes de simulation aprs, il y a passage de ltat OFF/ vers ltat ON/. Il y a rptition de ces
actions et transitions jusqu la fin de la simulation.
Chapitre 13
572
Supposons que lon fasse les transformations pour un signal x sinusodal pour obtenir le signal y selon
lalgorithme suivant :
if x< 0
elseif
else
y=-x
x>= 0.5
y=0.5;
y=x;
/* redressement
/* valeur constante = 0.5 ;
/* signal inchang
En double cliquant sur le rectangle, on fait apparatre lditeur de la table, dans lequel on note les
conditions et les actions raliser.
Stateflow
573
modle redressement_limitation.mdl
La figure suivante montre le signal sinusodal dorigine et le rsultat obtenu aprs son redressement et sa
limitation 0.5.
Redressement - Limitation
Sinusode d'origine
1
0.8
0.6
0.4
0.2
Temps
modle pwm_table_verite.mdl
10
574
Chapitre 13
Lorsque le rapport cyclique est plus grand que le signal triangulaire, on ralise laction A1 consistant
mettre la sortie pwm 1.
Dans le cas contraire, on ralise laction par dfaut de mettre pwm la valeur 0.
Stateflow
575
Nous avons utilis le bloc repeating sequence pour gnrer une monte puis une descente en
temprature ambiante Tamb.
Chapitre 13
576
MA (Marche/Arrt),
ltat de la vitesse du ventilateur, vit
la temprature ambiante Tamb.
MA
vit
Tamb
577
Stateflow
Dans lexemple suivant, on se propose de calculer le dterminant dune matrice A et ensuite de linverser.
Les lments de cette matrice sont entrs directement dans le graphe Stateflow.
Pour vrification du rsultat, on ralise dabord cette inversion dans MATLAB.
>> A = [1 2 ; 3 4]
A =
1
2
3
4
>> determ=det(A)
determ =
-2
>> x=inv(A)
x =
-2.0000
1.5000
1.0000
-0.5000
Comme dans le langage C, le premier indice des tableaux est 0, contrairement Matlab o lindice
commence 1.
Ainsi llment (1,1) de la matrice A est not A[0][0].
Comme dans le langage C, les commentaires, de couleur verte commencent soit par 2 slashs // ou
insrs entre /* et */ . Les commentaires peuvent aussi tre insrs dans le langage Matlab aprs le
symbole pourcentage % .
Comme elle est entirement dfinie dans le graphe Stateflow, la matrice A est dfinie comme une variable
locale de taille [2 2].
Le dterminant determ et la matrice inverse x sont des sorties vers SIMULINK.
Toutes ces variables sont de type double et la mise jour de fait de faon discrte (Update Method).
Pour utiliser les commandes inv et det de Matlab, nous avons besoin de les prcder par loprateur
ml.
578
Chapitre 13
Comme nous lobservons dans le modle SIMULINK suivant, nous obtenons bien les mmes valeurs de
matrice inverse et du dterminant.
Stateflow
579
Lutilisation de cette variable dans un graphe Stateflow dans une expression mathmatique telle que :
y = 3*x2, se fait comme dans le graphe Stateflow et le modle Simulink suivants :
On prcde la fonction power de Matlab ainsi que la variable x dfinie dans lespace de travail Matlab
par loprateur ml suivi dun point.
On ne dfinit que la variable de sortie y car x est dj dfinie dans lespace de travail Matlab, comme on
le voit dans lexplorateur suivant.
Dans le cas gnral, lappel dune fonction Matlab se fait selon la syntaxe suivante :
[arg_ret1,arg_ret2,...]= matlab_funct(arg_apel1, arg_apel2,...)
580
Chapitre 13
Arg_ret1, arg_ret2 sont les arguments de retour de la fonction Matlab matlab_funct qui sont
aussi des datas de Stateflow, dfinies dans lexplorateur.
Les arguments dappel, arg_apel1, arg_apel2 peuvent tre des donnes Stateflow ou des variables
de lespace de travail Matlab, donc prcder, dans ce cas, imprativement par loprateur ml.
XVI.2. Rsultat dun calcul prcdent de loprateur ml
Si le rsultat dun calcul ou le retour dune fonction est prcd de loprateur ml, il est automatiquement
cr dans lespace de travail Matlab.
Dans le graphe Stateflow ci-dessus le rsultat de la commande randn est enregistr dans la variable x.
Comme cette variable est prcde de loprateur ml, elle est automatiquement envoye vers lespace de
travail Matlab.
Dans lexplorateur, nous ne trouvons que la variable de sortie y, de type double.
Stateflow
>> whos
Name
ans
simout
tout
x
xy
581
Size
1x2
1x1
51x1
1000x1000
1x1
Bytes
16
328042
408
8000000
328042
Class
double
struct
double
double
struct
Attributes
Nous vrifions bien quil sagit dune matrice de 1000 lignes et 1000 colonnes.
Nous vrifions bien le caractre gaussien centr et de variance unit de la distribution des valeurs de la
matrice x.
Le tableau suivant donne la valeur de la moyenne et de la variance de cette distribution.
moyenne
variance
>> mean(x(:))
>> cov(x(:))
ans =
9.4576e-004
ans =
0.9994
Pareil pour les tableaux, ds quon remplit un lment par un retour de calcul ou de fonction, celui-ci est
automatiquement cr dans lespace de travail Matlab.
Chapitre 13
582
y =
(:,:,1) =
0.1160
0.0980
0.5571
0.8164
(:,:,2) =
0.7023
0.6916
0.7156
0.8079
ml.w =
(:,:,1) =
0.4011
(:,:,2) =
0.8104
0.2579
0.6952
0.5694
0.6324
0.7292
0.6654
0.8091
0.4281
0.4011
0.7404
0.8104
0.5002
0.9248
0.6537
0.7277
0.6267
Stateflow
583
XVII. Fonction ml
La fonction ml permet de faire appel des fonctions Matlab sous forme dvaluation dune chane de
caractres.
Sa syntaxe est la suivante :
ml(ChaineAevaluer, arg1, arg2, );
ChaineAevaluer est une chane de caractres qui sera value dans lespace de travail Matlab.
Elle peut contenir, une ou une suite de commandes Matlab, spares par des points-virgules.
Exemples :
Chapitre 13
584
Dans la transition par dfaut, on effectue la transition action qui permet de crer la matrice alatoire x.
Dans ltat moy_var, le calcul de la moyenne se fait en imbriquant 2 fois la commande ml.mean(x)
car la premire calcule la moyenne des colonnes, la seconde ralise celle du vecteur ligne obtenu (vecteur
des moyennes de chaque colonne).
On cre ensuite le vecteur v, 2 lignes et 1 colonne, dans lespace de travail Matlab dans lequel on
sauvegarde les valeurs de la moyenne et de la variance.
>>
v=
v
5.9998
0.3333
On recopie le vecteur v dans le vecteur moy_var qui servira de sortie pour afficher la moyenne et la
variance dans lafficheur.
Dans les lignes de commandes suivantes, on vrifie bien les valeurs de la moyenne et de la variance
obtenues dans Stateflow
>>
>>
>>
>>
x=5+2*rand(1000);
moy=mean(x(:));
var=cov(x(:));
[moy ; var]
ans =
5.9995
0.3338
On retrouve bien les mmes valeurs que celles obtenues par Stateflow.
3. Utilisation simultane de loprateur ml et de la fonction ml.
Dans le graphe suivant on utilisera loprateur ml pour le calcul de cos(2) et la fonction ml pour
sin(/6); on affichera les 2 valeurs ainsi que leur somme qui devra donner 1.5.
Le calcul du x=cos(2) et de y=sin(/6) se sont respectivement par lappel des fonctions Matlab cos
et sin en les prcdant par loprateur ml.
La valeur de est obtenue par la fonction ml, ml('pi') comme on le voit dans les expressions de x et
de y.
Stateflow
585
Les variables x et y tant des variables locales pour les sortir vers Simulink, nous avons besoin de crer
dautres variables cos2pi et SinPIsur6 que nous dfinissons comme variables de sorties dans
lexplorateur. La variable z est une somme de 2 expressions dans lesquelles on utilise loprateur ml
dans lune et la fonction ml dans lautre.
On obtient bien sin(/6)=0.5, cos(2)=1 et la matrice carre (4*4) qui est randn(2) laquelle on ajoute
tous les lments le logarithme de la valeur de la variable y.
586
Chapitre 13
a, b et s sont des variables de Stateflow (2 entres et 1 sortie). Lappel dune fonction Matlab se fait
grce loprateur ml.
Chapitre 14
Traitement du signal
I. Traitement numrique des signaux dterministes
I.1. Synthse des filtres numriques
I.1.1. Rponse impulsionnelle
I.1.2. Rponse en frquences
I.2. Rponse en frquences d'un filtre numrique
I.3. Applications
I.3.1. Filtrage de signaux
I.3.2. Analyse spectrale
II. Signaux stochastiques
II.1. Caractristiques statistiques du filtrage numrique
II.1.1. Signaux stochastiques monodimensionnels
II.1.2. Systmes et signaux stochastiques multidimensionnels
II.2. Estimation de signaux et de modles de systmes discrets
II.2.1. Algorithme des moindres carrs rcursifs
II.2.2. Filtrage de Kalman
II.2.2.1. Application 1 : Estimation d'une constante
II.2.2.2. Estimation de l'tat d'un processus dynamique
II.2.2.3. Extraction d'une sinusode noye dans du bruit
III. Signal Processing Toolbox & Signal Processing Blockset
III.1. GUI de la boite outils Signal Processing Toolbox
III.1.1. GUI sptool et FDATool
III.1.2. Quelques fonctions de la boite outils Signal
Processing Toolbox
III.2. Etude de quelques blocs de la librairie Signal
Processing Blockset
III.2.1. Librairie Estimation
III.2.2. Librairie Filtrage
III.2.3. Librairie Math Functions
III.2.4. Librairie Signal Management
Chapitre 14
588
I.1.1. Rponse impulsionnelle
La rponse impulsionnelle du filtre numrique passe bande de gabarit suivant, est donne
par la formule :
h( k ) =
1
1 1
H () e jk d =
H () e jk d + H () e jk d
2
2
1
2
qui donne
2 sin c( k 2 ) 1 sin c( k 1 )
En spcifiant des valeurs particulires aux pulsations normalises 1 et 2 , on peut
synthtiser des filtres de types passe bas et passe haut.
Nous allons, dans ce qui suit, programmer une fonction qui accepte comme arguments
d'appel, les deux pulsations normalises 1 et 2 et retourne la rponse impulsionnelle
h( k ) =
Traitement du signal
589
Nous obtenons les valeurs suivantes de la rponse impulsionnelle tronque par une fentre
rectangulaire.
fichier hfiltbas.m
alpha1 = 0; alpha2 = pi/2;
N = 10;
h = nfrepimp(alpha1,alpha2,N);
k = -N:N; stem(k, h)
title('rponse impulsionnelle du filtre passe bas')
xlabel('n k d''chantillon h(k)')
axis([-10 10 -0.2 0.7])
grid
La fonction rpfreqfn, dont le code est donn ci-aprs, permet de calculer le rponse en
frquences d'un filtre numrique de type RIF (rponse impulsionnelle finie) ou RII
(rponse impulsionnelle infinie) dans une bande de pulsations normalises qui peut
s'tendre de .
num et den sont le numrateur et le dnominateur de la fonction de transfert du filtre et
omega la bande de pulsations normalises. Un filtre RIF est considr par cette fonction
comme un filtre RII dont le dnominateur est gal l'unit.
Chapitre 14
590
fichier rpfreqfn.m
function ampl = rpfrqfn(num,den,omega)
% retourne les valeurs du module de la rponse en frquences
% d'un filtre numrique numrique
% ampl : valeurs retournes du module
% num, den : numrateur et dnominateur du filtre
% omega : bande de pulsations normalises
if nargin == 2
omega = -pi:pi/10:pi;
end
if nargin == 1
den = [1 zeros(1:length(num)-1)]; omega = -pi:pi/10:pi;
end
pulse = exp(-j*omega);
h = polyval(num,pulse)./polyval(den,pulse);
H1 = rpfreqfn(0.5*[1 1]);
plot(-pi:pi/10:pi,abs(H1)); grid
xlabel('pulsations normalises')
title('Module de la rponse en frquences du filtre H1')
Traitement du signal
591
fichier pasbnd4.m
% fonction de transfert en z
num = [0.2066
0.0000
-0.4131
0.0000
0.2066];
den = [1.0000
0.0000
0.3695
0.0000
0.1958];
H2 = rpfreqfn(num,den);
omega = -pi:pi/10:pi;
plot(omega ,abs(H2));
grid
xlabel('pulsations normalises')
title('Module de la rponse en frquences du filtre H2')
H ( j) = h( k ) e
k =N
jk
592
Chapitre 14
La comparaison des temps d'excutions par les deux fonctions pour le calcul de la rponse
en frquences du filtre indique bien l'importance de la modification.
(temps d'excution sur PC Pentium IV, 512 Mo).
>> tic;
>> H = repfreq(h,omega);
>> toc;
Elapsed time is 0.003831 seconds.
>> tic;
>> H1 = repfreq2(h,omega);
>> toc;
Elapsed time is 0.000525 seconds.
Traitement du signal
593
rponse du filtre passe-bas
1.2
0.8
0.6
0.4
0.2
0
-4
-3
-2
-1
A partir du gabarit d'un filtre passe bande pour lequel on spcifie les pulsations
normalises 1 et 2 , on peut synthtiser les filtres suivants :
filtre passe bas ( 1 = 0 , 2 : pulsation de coupure)
La synthse d'un filtre coupe bande peut se faire en considrant que son gabarit (ou sa
rponse impulsionnelle) est la somme de ceux des filtres passe bas et passe haut.
Nous allonsdans ce qui suit, programmer une fonction qui permet la synthse de tels filtres
partir du type passe bande. Cette fonction que l'on nommera filtnum possde la
syntaxe suivante :
[g,h] = filtnum(alpha1,alpha2,fen,N)
594
Chapitre 14
Traitement du signal
595
La fonction windows permet de gnrer une fentre temporelle avec laquelle on multiplie
la squence de la rponse impulsionnelle afin d'attnuer les oscillations de Gibbs.
Nous avons considr les fentres les plus couramment utilises : fentre rectangulaire,
triangulaire, fentres de Hamming, de Hanning et de Blackman.
fichier windows.m
function W = windows(fen,N)
% gnration d'une fentre temporelle de troncature de la
% rponse impulsionnelle d'un filtre numrique
if nargin == 1
N = 10; % largeur par dfaut
end
k = -N/2:N/2;
if fen == 'hamm' % fentre de Hamming
W = 0.54+0.46*cos(k*pi/N);
end
if fen = 'hann' % fentre de Hanning
W = .5*(1+cos(k*pi/N));
end
if fen == 'rect' % fentre rectangulaire
W = ones(size(k));
end
if fen == 'tril' % fentre triangulaire
W = [2*(-N/2:0)/N+1 -2*(1:N/2)/N+1];
End
if fen == 'blak' % fentre de Blackman
W = 0.42+0.5*cos(k*pi/N)+ 0.08*cos(2*k*pi/N);
end
Si l'on veut visualiser une de ces fentres, par exemple celle de Blackman, il suffit de
faire appel cette fonction en spcifiant le type 'black' et sa largeur.
Les commandes suivantes permettent de gnrer et de tracer les diffrentes fentres
voques prcdemment dans la mme fentre graphique.
fichier plt_wind.m
wrect
whamm
whann
wtril
wblak
=
=
=
=
=
windows('rect');
windows('hamm');
windows('hann');
windows('tril');
windows('blak');
k = -5:5;
plot(k,wrect,k,whamm,k,whann,k,wtril,k,wblak), grid
title('fentres de troncature de largeur 10')
xlabel('n d''chantillon'), axis([-5 5 0 1.2])
Chapitre 14
596
, , avec troncature de la
2
rponse impulsionnelle par la fentre de Hamming de largeur N = 20.
On dsire synthtiser un filtre passe haut de bande passante,
H()
1
Traitement du signal
597
Chapitre 14
598
Traitement du signal
599
I.3. Applications
I.3.1. Filtrage de signaux
0.2
z 0.8
Chapitre 14
600
I.3.2. Analyse spectrale
La transforme de Fourier d'un signal discret x(k) est calcule par la commande fft
(algorithme TFR) avec la syntaxe :
fft(x) :
fft(x,N) :
Si la longueur du vecteur x est plus petite que N, des zros sont ajouts. Dans le cas
contraire, le signal x est tronqu. On peut calculer directement la transforme de Fourier de
plusieurs signaux dont les vecteurs formeront les colonnes de la matrice x. Des exemples
de transforme de Fourier peuvent tre consults en lanant les fichiers de dmonstration:
fft, fft2 (transforme de Fourier bidimensionnelle), fftdemo (analyse spectrale
FFT, de la boite outils "Signal").
Comme exemple, on s'intressera la synthse d'un filtre passe bande pour rcuprer un
signal sinusodal partir d'une somme de 3 sinusodes. On utilisera pour ceci des
commandes disponibles dans la boite outils de traitement de signal "Toolbox Signal".
On s'intressera plus particulirement la synthse d'un filtre passe bande de type
Butterworth, ralise grce la commande butter de syntaxe :
[b,a] = butter(n,[f1 f2])
b, a :
numrateur et dnominateur de la fonction de transfert en z du filtre,
f1, f2 : frquences limitant la bande passante du filtre,
n :
fixe l'ordre 2n du filtre.
Traitement du signal
601
fichier apl_fft.m
fe = 100; % frquence d'chantillonnage
t = (1:fe)/fe;
% diffrents signaux sinusodaux
x1 = sin(2*pi*t*40)
x2 = sin(2*pi*t*25);
x3 = sin(2*pi*t*10);
% signal somme
xtot = x1+x2+x3;
figure(1)
plot(t,xtot);
title('somme de 3 sinusodes de frquences 10, 25 et 40 Hz');
xlabel('frquences normalises')
grid
602
Chapitre 14
grid
xlabel('frquences en Hz')
title('module de la fft de la somme x1+x2+x3')
Dans le spectre obtenu, on retrouve bien les frquences de 10, 25 et 40 Hz. On observe la
f
priodicit frquentielle de priode e , f e tant la fquence d'chantillonnage.
2
fichier apl_fft.m (suite)
% filtrage par un passe bas de Butterworth du 2nd ordre
% frquences de coupure 20 et 30 Hz
% calcul du numrateur B et du dnominateur A
% de la fonction de transfert en z du filtre passe bande
% de Butterworth d'ordre 2
[B,A] = butter(2,[20 30]/(fe/2));
% filtrage du signal somme
s_filt = filter(B,A,xtot);
figure(3)
plot(t,x2)
title('signal de 25 Hz d''origine')
axis([t(1) t(length(t)) -1.5 1.5]), grid
figure(4)
Traitement du signal
603
604
Chapitre 14
Traitement du signal
605
Chapitre 14
606
B( z 1)
A( z 1)
: Moyenne de x et y,
: chantillon n k des fonctions d'intercorrlation de x y et de y x,
Rxx ( k ), Ryy ( k )
S xx ( w), S yy ( w)
Sxy ( w)
Nous rappelons les relations permettant le calcul de ces diffrents paramtres, dans le cas
du filtrage d'un signal x(t) par un filtre numrique de fonction de transfert H(z) et de sortie
y(t).
La valeur moyenne du signal de sortie est gale celle de l'entre multiplie par le gain
statique du filtre :
y = H (1) x
L'chantillon n k de la fonction de corrlation de x y est donn par :
N k
1
Rxy ( k ) =
x( j ) y( j + k )
N k 1 j = 1
Traitement du signal
607
fichier correlxy.m
function corr_scale = correlxy(x,correlation, k)
nbre_max = ceil(length(x)/4);
k = k*(k<=nbre_max)+nbre_max*(k>nbre_max);
correlation = correlation(length(x):length(x)+
k)./(length(x)-1-(0:k));
corr_scale = [fliplr(correlation(2:length(correlation)))
correlation];
608
Chapitre 14
Avec un nombre d'chantillons de 1000, le signal gnr par la fonction randn est proche
d'un bruit blanc, sa fonction d'autocorrlation est proche d'une impulsion de Dirac
(autocorrlation dun bruit blanc).
fichier correl.m (suite)
% Corrlation du bruit d'entre au bruit de sortie
correl_xy = conv(x,fliplr(y));
corr_scale = correlxy(x, correl_xy, k)
% Trac de la fonction dintercorrlation de part et dautre
% de lchantillon zro
figure(2)
stem(-k:k,corr_scale)
hold on
% Trac de traits entre les pics des chantillons
plot(-k:k,corr_scale,':')
title('Corrlation entre le bruit d''entre x au bruit de
sortie y')
grid
Traitement du signal
609
Chapitre 14
610
Lorsqu'on filtre un bruit blanc, on obtient toujours un bruit color. Dans ce cas particulier,
en raisonnant dans le domaine temporel, nous avons :
R
yx
( k ) = E [ x (t ) y (t + k ) ] =
yx
(k ) =
1
E x ( t ) [ x ( t + k ) + x ( t 1+ k ) ]
2
1 2
1
(pour k = 0) + 2x (pour k = 1)
2 x
2
1
E [ x(t + k ) + x (t 1 + k )] [ x(t + k ) + x(t 1 + k )]}
4 {
Traitement du signal
611
Ryy ( k ) =
1 2
1
(pour k = 0) + 2x (pour k = 1)
2 x
4
La densit spectrale de puissance d'un signal x(t) est le module de la rponse en frquences
du filtre RIF de rponse impulsionnelle Rxx ( k ) . On peut l'obtenir l'aide de la fonction
rpfreqfn.
Dans le cas particulier du filtre moyenneur H(z) prcdent, l'autocorrlation de son signal
de sortie est la rponse impulsionnelle du filtre :
G(z) =
1 1 1
+ z
2 4
Chapitre 14
612
La densit spectrale de puissance du signal de sortie du filtre peut aussi tre calcule par le
filtrage de la densit spectrale de son signal d'entre :
Z S yy ( k ) = H ( z) H ( z 1) Z S xx ( k )
Filtre RII
Pour un filtre d'ordre 1, de fonction de transfert gnrale H ( z) =
b
( a 1 ),
1 a z 1
attaqu par un bruit blanc de variance 2x , le calcul thorique de la DSP du signal de sortie
donne :
b2
S yy () =
2x
2
1 + a 2 a cos
Considrons comme exemple, un filtre RII de premier ordre de fonction de transfert H(z) ,
attaqu par un bruit blanc de variance unit.
H(z)=
1
10.2 z 1
Traitement du signal
613
fichier derivate.m
% filtre drivateur avec entre RND
% tude des caractristiques statistiques du bruit en sortie
% rponse en frquences du filtre drivateur
num = [1 -1]; omega = -pi:pi/10:pi;
h = rpfreqfn(num);
figure(1), plot(omega,abs(h))
grid, title('Rponse en frquences du filtre drivateur')
Rxx = 1; dsp = dspfn(Rxx,num);
figure(2), plot(omega,abs(dsp));
grid, title('DSP de la sortie du filtre drivateur')
614
Chapitre 14
Les figures suivantes reprsentent la rponse en frquences du filtre dans la bande des
pulsations normalises [, ] et la densit spectrale nergtique de son signal de sortie.
Traitement du signal
615
Un systme discret d'ordre n, peut tre dcrit par le modle d'tat suivant :
x(t + 1) = A x(t ) + B u(t ) + w(t )
y (t ) = C x (t ) + v (t )
o x(t), u(t) et y(t) sont respectivement les vecteurs d'tat, de commande et de sortie. Les
vecteurs w(t ) et v(t ) reprsentent les bruits de modlisation et de mesure, leurs matrices
de variances sont notes Q et R.
On dsire dterminer les caractristiques statistiques de l'tat x(t) et d'en dduire celles de
la mesure y(t), dans le cas particulier o l'entre est dterministe et centre.
D'aprs l'quation d'tat, les valeurs moyennes de l'tat et du signal de sortie sont :
x = ( I A) 1 w
y = C ( I A) 1 w + v
Py = C Px C T + R
y( k ) = C x( k )
avec
.
05
A=
w(t)
1
z- 02
.
1
0
, B = , C = (1 1)
0.2
1
x2(t )
1
z- 05
.
x1(t ) +
+
y(t)
Chapitre 14
616
clear all
close all
% modle d'tat
A = [0.5 1;0 0.2];
B = [0;1];
C = [1 1];
% Gnration du bruit de modlisation
N = 100;
w = sqrt(2)*randn(1,N);
sigma2w = std(w)^2; % variance de bruit de modlisation
% volution de l'tat
y(1) = 0;
x = [0 0]';
for i = 2:N
x(:,i) = A*x(:,i-1)+B*w(i);
y(i) = C*x(:,i);
end
% volution de la matrice de variance de l'tat
Px = zeros(2,2); Py = 0;
for i = 1:N
Px = A*Px*A'+B*B'*sigma2w;
Py(i) = C*Px*C';
% lments de la matrice P
P1(i) = Px(1,1); P2(i) = Px(2,2); P3(i) = Px(2,1);
end
disp('Rgime permanent :')
disp(['variance de x1
: ' num2str(P1(i))]);
disp(['variance de x2
: ' num2str(P2(i))]);
disp(['coefficient de corrlation
: '
num2str(P3(i)/sqrt(P1(i)*P2(i)))]);
% trac des lments de la matrice P
plot(P1), grid, hold on, plot(P2)
plot(P3./sqrt((P1.*P2)))
gtext('variance de x1')
gtext('variance de x2')
gtext('Coefficient de corrlation de x1 et x2')
% trac de l'volution de la variance de la mesure
figure(2), plot(Py),grid
gtext('variance de la mesure')
% trac de l'volution de l'tat du systme
figure(3), plot(x(1,:)), hold on
plot(x(2,:),':'), grid
gtext('tat x1 : _'), gtext('tat x2 :..')
% trac de l'volution de la sortie du systme
figure(4)
plot(y), grid
gtext('sortie du systme')
Rgime permanent :
Variance de x1
: 3.6387
Traitement du signal
Variance de x2
Coefficient de corrlation
617
: 2.2328
: 0.17408
Les courbes suivantes donnent lvolution dans le temps des variances des composantes
dtat, le coefficient de corrlation entre les 2 tats et la variance du signal de mesure.
618
Chapitre 14
Les courbes suivantes reprsentent, respectivement, lvolution temporelle des deux tats
ainsi que celle de la sortie du systme.
Traitement du signal
619
La mthode des moindres carrs rcursifs est utilise pour rechercher, en temps rel, un
modle numrique d'un processus physique ou d'un signal. Le principe consiste
minimiser un critre quadratique correspondant au carr de l'erreur, l'instant courant,
entre la sortie du modle et la valeur de la sortie du processus ou celle du signal que l'on
veut modliser.
Identification d'un modle de processus dynamique
La sortie l'instant courant t est lie aux entres-sorties prcdentes par l'quation de
rcurrence suivante :
T (t ) = [a1 b1 b2 ]
(t 1) = [ y (t 1) u(t 1) u(t 2)]T
t
2
Jt ( ) = 1 y( k ) ( k )T ( k 1)
2 k = 1
Le minimum du critre J est obtenu par le jeu de paramtres qui annule sa drive dans
l'espace paramtrique.
t
dJt ( )
= y( k ) ( k )T ( k 1) ( k 1)T = 0
d
k = 1
Chapitre 14
620
Ceci donne
t
t
( k 1) y ( k ) = ( k 1) ( k 1)T
k =1
k =1
soit
1 t
( k 1) y( k )
k = 1
(t ) = ( k 1) ( k 1)T
k
=1
t
= P(t ) ( k 1) y( k )
k =1
t
(t ) = P(t ) ( k 1) y( k ) = P(t ) (t 1) y(t ) + ( k 1) y( k )
k =1
k =1
d'o :
or
( t ) = P (t ) P(t 1) 1 (t 1) + (t 1) y (t )
P(t ) 1 = P(t 1) 1 + (t 1) (t 1) T
(t ) = (t 1) + P(t ) (t 1)
y (t ) T (t 1) (t 1)
1 + (t 1) T P(t 1) (t 1)
Pour exciter tous les modes du processus, on lui applique un signal riche en frquences,
proche d'un signal blanc.
On choisit pour cela une squence pseudo-alatoire de longueur L.
Traitement du signal
621
Le fichier script mcr.m propos ci-aprs, implmente cet algorithme pour la recherche du
modle suivant :
1
1
y(t ) z (b1 + b2 z ) z 1 (1 0.5 z 1)
=
=
u( t )
. z 1
1 a1 z 1
1 08
On choisit une squence pseudo-alatoire de longueur 1023 comme signal d'entre. On
ajoute un bruit blanc, gaussien, de variance unit au signal de sortie de ce modle afin de
simuler un processus rel.
fichier mcr.m
% Identification par MCR
% Modle du processus identifier
% y(t) = a1*y(t-1)+b1*u(t-1)+b2*u(t-1)+v(t)
% v(t) : bruit gaussien centr de variance unit
a1 = 0.8; b1 = 1; b2 = -0.5; % paramtres retrouver
param = [a1 b1 b2];
% vecteur paramtres
N = 1000;
% nombre de points
np = 3;
% nombre de paramtres
% Gnration de la squence SBPA
u = 1:10; u = (-1).^u;
% initialisation
for i = 11:N
u(i) = -u(i-7)*u(i-10);
end
% trac de la squence SBPA
plot(1:N,u), axis([0 100 -1.2 1.2])
title('Squence d''entre SBPA, L=1023'), grid
622
Chapitre 14
Traitement du signal
623
624
Chapitre 14
Traitement du signal
625
Un modle est valid si l'autocorrlation du rsidu est proche de celle d'un bruit blanc.
C'est le cas du modle obtenu prcdemment.
Le calcul de l'autocorrlation fait appel la fonction corrxy suivante :
fichier corrxy.m
function corr = corrxy(x,y,k)
% x,y : signaux dont on calcule la corrlation
% k
: tendue de la fonction d'autocorrlation
% si k n'est pas prcis, l'tendue de la fonction
% d'autocorrlation est la mme que celle des signaux x et y.
% corr : fonction d'autocorrlation normalise
if length(x)~=length(y)
error('les 2 signaux doivent tre de mmes dimensions')
end
Chapitre 14
626
x = x-mean(x);
y = y-mean(y);
% calcul de l'autocorrlation normalise
corr = conv(x,fliplr(y));
if nargin==3
if k>length(x)-1
k = length(x)-1;
end
corr = corr(length(x)-k:length(x)+k);
end
Le filtre de Kalman permet de dterminer l'tat x(t ) d'un systme dynamique partir de
ses entres-sorties (connaissance a posteriori) et de son modle d'tat (connaissance a
priori). L'estimation de l'tat s'effectue en minimisant la variance de l'erreur d'estimation
x~(t ) .
E ~
x (t ) T ~
x (t ) = E [ x(t ) x$(t )]
[ x(t ) x$(t )] }
y (t ) = C x (t ) + v ( t )
+ w(t )
( k ) : symbole de Kronecker
Traitement du signal
627
x$ t 1/ t 1
TU
Pt 1/ t 1
x$t / t 1
x$t / t
Pt / t 1
Pt / t
MU
Pt / t 1 = E x(t ) x$t / t 1
L'cart entre la sortie mesure et celle prdite par le modle est multipli par le gain K(t)
pour s'ajouter l'tat prcdent pour sa remise jour.
La matrice de variances de l'erreur d'estimation dcrot pendant cette tape de remise jour
puisque l'apport d'une nouvelle information se traduit par une meilleure connaissance de
l'tat.
1
Pt / t = Pt / t 1 Pt / t 1 C T R + C Pt / t 1 C T C Pt / t 1
Une grandeur constante x est mesure au moyen de deux capteurs 1 et 2 qui mesurent les 2
composantes du vecteur y. Les mesures dlivres par les capteurs 1 et 2 sont de qualits
diffrentes, de variances 1 et 4 respectivement.
Le modle d'tat correspondant est alors le suivant.
Chapitre 14
628
x(k + 1) =
y(k + 1) =
x(k)
C x(k) + v(k)
1
avec C = .
1
0 4
La matrice de transition A tant une matrice identit, il n'y a pas dans ce cas d'tape TU
pour l'tat. Comme il n'y a pas de bruit de modlisation, la matrice P de variances ne varie
pas dans l'tape TU.
fichier kalman1.m
t = 0:1000;
cste = 5; % constante estimer
% bruits des capteurs
v1 = randn(size(t)); v2 = 2*randn(size(t));
% mesures des 2 capteurs
y = cste+[v1; v2];
figure(1)
plot(t,y(1,:))
grid
title('Mesure du capteur 1')
figure(2)
plot(t,y(2,:))
grid
title('Mesure du capteur 2')
Traitement du signal
figure(4)
plot(k,correl2);
grid
title('Autocorrlation du signal du capteur 2')
629
Chapitre 14
630
On suppose que l'on dispose du modle du processus discrtis, c'est--dire que l'on
connat les matrices A, B et C du modle interne suivant :
x(t + 1) = A x(t ) + B u(t ) + w(t )
y( t ) = C x ( t ) + v ( t )
On a besoin d'estimer l'tat du processus pour diffrentes raisons, entre autres, parce que
les diffrentes composantes sont intressantes du point de vue physique et que l'on ne
connat pas de capteurs susceptibles de fournir l'information ou bien que les capteurs sont
trop chers ou peu fiables.
On considre un processus constitu d'un moteur courant continu pour lequel on dispose
d'un capteur pour mesurer la position angulaire. Le filtre de Kalman servira estimer en
temps rel la vitesse angulaire sans avoir utiliser de capteur spcifique.
Le modle analogique du moteur ayant comme entres-sorties, la position angulaire (t )
et la tension u(t ) applique son induit.
Traitement du signal
631
k
( p)
=
U ( p) p ( p + a )
R
est la constante de temps du systme ayant comme sortie la vitesse angulaire.
L
R et L sont respectivement la rsistance et la self d'induit.
a=
032
.
p +1
&( p)
1
p
( p)
En posant,
x& (t ) = x1(t )
2
x& (t) 1
1 =
x& (t) 1
2
+ 0.32 u(t )
x (t)
0 x 1 (t) 0.32
+
u(t) = A 1 + B u(t)
x (t)
0 x 2 (t) 0
2
Le signal de sortie tant identique la deuxime variable d'tat, l'quation d'observation est
:
y(t) = x2 (t) = ( 0
x (t)
x (t)
1 ) 1 + 0 u(t) = C 1 + D u(t)
x (t)
x (t)
2
2
Chapitre 14
632
>> mod_etat
A =
0.8187
0.1813
B =
0.0580
0.0060
C =
0
1
D =
0
0
1.0000
y(t) = x2 (t) = ( 0
x (t)
0 x1 (t) 01813
.
+
u(t) = A 1 + B u(t)
x (t)
1 x 2 (t) 0.0187
2
x (t)
x (t)
0.32 ) 1 + 0 u(t) = C 1 + D u(t)
x (t)
x (t)
2
2
Dans la suite, on appliquera au systme un signal de commande carr. On suppose que l'on
dispose d'un capteur de position qui fournit la valeur du signal de sortie chaque priode
d'chantillonnage. Le filtre de Kalman permettra de fournir une estimation de la vitesse
angulaire.
Pour simuler la mesure de la position, on a besoin du modle discret du processus. Ce
modle peut tre obtenu directement partir du modle d'tat par la fonction ss2tf de la
boite outils "Signal Toolbox".
>> [num,den] = ss2tf(A,B,C,D)
num =
0
0.0060
0.0056
den =
1.0000
-1.8187
0.8187
Traitement du signal
633
fichier kalman2.m
%
%
N
n
634
Chapitre 14
Traitement du signal
635
Le filtre de Kalman permet d'estimer la deuxime composante d'tat (vitesse) partir des
mesures bruites de la position (premire composante d'tat).
Trs souvent, dans les algorithmes de commande de ce type de procds, on estime la
vitesse par la drive de la position.
Dans notre cas, si x(t) et y(t) dsignent respectivement la position et la vitesse de l'arbre
moteur, on aurait :
y ( t ) 1 z 1
=
x (t )
T
soit
y (t ) =
x(t ) x(t 1)
0.2
Cette mthode n'est valable que si la position x(t) n'est pas bruite. En effet, si x2 dsigne
la variance de la position, celle de la vitesse devient :
2y =
2
2x = 50 2x
(0.2)2
636
Chapitre 14
Si la position n'est pas bruite, l'approximation par la drive reste acceptable. Dans notre
cas, cette mthode donne lieu une trs mauvaise estimation.
Dans la partie suivante du fichier script kalman2.m, nous comparons la vitesse
approxime par la drive de la position non bruite et celle estime prcdemment par le
filtre de Kalman partir de la position bruite.
deriv_pos(1) = 0;
y(1: 2) = [0 0];
for i = 3:N
y(i)=1.819*y(i-1)-0.819*y(i-2)+0.006*u(i-1)+0.00561*u(i-2);
deriv_pos(i) = (y(i)-y(i-1))/T;
end
% trac de la drive de la position
figure(6)
plot(1:N,deriv_pos)
grid
hold on
plot(1:N,x(1,:),'-.')
txt1 = 'Drive de la position non bruite et ';
txt2 = 'vitesse estime par kalman';
title([txt1, txt2])
gtext('kalman')
gtext('drive')
Traitement du signal
637
L'estimation par le filtre de Kalman est de meilleure qualit en prsence de bruit que par la
mthode de la drive en l'absence de bruit.
II.2.2.3. Extraction d'une sinusode noye dans du bruit
Un signal sinusodal est gnr par une quation diffrentielle du second ordre. Le modle
d'tat est ainsi du second ordre.
La premire composante d'tat x1(t ) est le signal estimer.
Le choix de la seconde composante d'tat n'est pas impos.
Considrons le signal sinusodal suivant :
y(t ) = a cos wt
La deuxime composante d'tat est du type :
x2 (t ) = a sin wt
Ce choix n'est pas limitatif, mais une fois impos, la matrice de transition est unique. Si T
dsigne la priode d'chantillonnage, nous avons, avec a = 1 :
x1(t + T) = cos w(t + T) = cos wT cos wt sin wT sin wt
Chapitre 14
638
avec
cos wT
A=
sin wT
x (t + 1) = A x(t )
y (t ) = C x (t )
sin wT
coswT
C = (1 0)
Traitement du signal
639
La figure suivante reprsente le signal estim par le filtre de Kalman durant les 150
premires itrations.
640
Chapitre 14
Traitement du signal
641
La figure suivante reprsente le signal bruit, partir duquel on rcupre la sinusode grace
au filtrage de Kalman.
Chapitre 14
642
volution
P(1,1) :
P(2,1) :
P(2,2) :
de la matrice de variance P
variance de x1
covariance de x1 et x2
variance de x2
Le signal d'erreur, cart entre le signal estim et le signal non bruit est reprsent par la
figure suivante :
fichier kalman3.m (suite)
% erreur d'estimation
err = cos(w*t) - x(1,:);
figure(6)
plot(t,err)
title('erreur d''estimation de la sinusode'), grid
axis([0 500 -.5 .5])
Traitement du signal
643
La figure suivante reprsente lerreur entre la sinusode relle et celle estime par le filtre
de Kalman partir du signal bruit.
Aprs un rgime transitoire, lerreur devient trs faible, sa moyenne et sa variance sont trs
faibles.
MATLAB propose la boite outils Signal Processing Toolbox qui regroupe des
fonctions MATLAB, ddies au traitement du signal dterministe ou alatoire, mono ou
multidimensionnel. SIMULINK possde plusieurs bibliothques de blocs dans la librairie
644
Chapitre 14
Signal Processing Blockset qui agissent sur les signaux, telle lestimation,
le filtrage, les fonctions mathmatiques, etc.
La commande filtdemo ouvre un GUI qui permet le design dun certain nombre de
filtres dont on spcifie les caractristiques (bande passante, frquences de coupure, etc.).
Le cas prcdent concerne un filtre elliptique dordre 5. Le bouton Info permet dafficher
laide correspondante.
Traitement du signal
645
Linterface utilisateur FDATool est un autre GUI spcialis pour le design et lanalyse des
filtres. Lorsque le filtre est cr, nous pouvons rcuprer le code du fichier M
correspondant.
On peut choisir dans cette interface, le type de filtre, sa nature IIR (rponse impulsionnelle
infinie) ou FIR, son ordre et ses frquences spcifiques.
, nous
Grce aux boutons suivants,
visualiser :
- les spcifications du filtre en terme dattnuation ou de bande passante,
- le module de la rponse en frquences,
- la phase,
- le gain et la phase simultanment,
- les rponses impulsionnelle et indicielle,
- les coefficients du filtre, etc.
pouvons
Pour gnrer le code du script MATLAB, nous devons utiliser loption Generate
M-file du menu File de cette interface.
Cette interface, avec toutes les caractristiques spcifies, peut tre enregistre sous la
forme dun fichier dextension fda.
Les valeurs des coefficients du filtre ainsi obtenu, peuvent tre exportes vers lespace de
travail de MATLAB. Dans le cas dun filtre FIR, ces coefficients seront dans la variable
num qui dsigne le numrateur de sa fonction de transfert.
Chapitre 14
646
Cette interface est gre par une autre, appele SPTool ainsi que 3 autres GUI dont
Signal Browser, Filter Designer, FVTool, et Spectrum Viewer. Cette
interface souvre grce la commande suivante:
>> sptool
III.1.2. Quelques fonctions de la boite outils Signal Processing Toolbox
lsim
La commande lsim permet de simuler un systme LTI pour nimporte quel signal
dentre.
On gnre, laide de la commande gensig, un signal carr de priode 500, sur une
dure de 1000s quon chantillonne 0.1s.
Le systme LTI (voir Systmes LTI du chapitre Contrle de processus , le systme LTI
rsultant est compos des 2 systmes ci-dessus.
La commande lsim(H,u,t) simule le systme LTI durant la dure t lorsquon lui
applique lentre u.
[u,t] = gensig('square',500,1000,0.1);
H = [tf(1,[20 1]) ; tf(1,[50 10 1])]
lsim(H,u,t)
Transfer function from input to output...
1
#1: -------20 s + 1
#2:
1
----------------50 s^2 + 10 s + 1
De la mme faon que pour les tableaux, le fait de mettre un point-virgule ; entre les 2
fonctions tf correspondent la mise en parallle des 2 fonctions de transfert, avec une
entre et 2 sorties : un systme du premier ordre de constante de temps de 20s et un
Traitement du signal
systme
du
second
647
ordre
de
pulsation
propre
w =1 / 50 et
0
un
coefficient
damortissement = 5 / 50 .
648
Chapitre 14
FVTool est une interface graphique utilisateur, GUI, qui permet lanalyse de filtres
numriques.
Grce au menu Analysis on peut choisir le type de rponse que lon veut analyser
comme la rponse indicielle, la rponse en phase, ou lensemble du module ou de la phase
par rapport la pulsation normalise.
Traitement du signal
649
firls
La commande firls (n, f,a) permet de gnrer un filtre FIR (rponse
impulsionnelle finie) dordre n (n+1 coefficients) partir dun gabarit spcifi par une liste
de frquences f et de modules a (amplitudes) au sens des moindres carrs (ls : least
squares).
>> h=firls(30,[0 .1 .2 .3 .4 .5 .6 .7 .8 .9],[1 1 1 1 1 1 1 0 0 0]);
Cette commande retourne les (n+1) coefficients du filtre. Grce loutil danalyse
fvtool, nous pouvons voir ses diffrentes caractristiques temporelles ou frquentielles.
Nous avons ainsi ralis un filtre passe-bas dont la rponse indicielle est la suivante :
650
Chapitre 14
Traitement du signal
651
La commande zplane donne le trac des ples et des zros du filtre comme vu dans la
figure prcdente.
La commande zp2tf permet de passer du mode zros-ples la fonction de transfert.
>> [b,a] = zp2tf(zer,pol,1);
>> tf(b,a)
Transfer function:
s + 0.8
---------------------s^2 + 1.537 s + 0.9025
freqz
La commande freqz permet de tracer lamplitude et la phase dun filtre en spcifiant le
numrateur et le dnominateur de sa fonction de transfert.
>> freqz([1 0.8],[1 1.537 0.9025])
>> title('Amplitude et Phase')
Comme le montre la figure suivante, nous retrouvons la mme rponse en frquences que
prcdemment pour le mme filtre dont nous avons spcifi les ples et les zros.
Chapitre 14
652
Les filtres IIR sont du type ARMA, c'est--dire que la fonction de transfert possde un
dnominateur, contrairement aux filtres FIR, type MA (Moving Average).
La partie AR (AutoRgressive) contient les ples (solutions du dnominateur) et est
responsable de la stabilit du filtre.
Grce aux fonctions de spcification des filtres IIR, nous pouvons avoir des filtres de type
Butterworth, Chebychev, Elliptique, etc.
Les fonctions butter, ellip, etc. possdent beaucoup doptions pour dsigner ces
diffrents filtres.
Nous allons tudier la mise en uvre de filtres de Butterworth, un passe-bas et un
passe-bande.
Pour un passe-bas, il suffit de spcifier lordre n et la frquence de coupure normalise wc.
[b,a] = butter(4,0.3); % Butterworth passe-bas d'ordre 4
H=tf(b,a)
fvtool(b,a)
Transfer function:
0.01856 s^4 + 0.07425 s^3 + 0.1114 s^2 + 0.07425 s + 0.01856
-----------------------------------------------------------s^4 - 1.57 s^3 + 1.276 s^2 - 0.4844 s + 0.0762
Traitement du signal
653
0.5516
Chapitre 14
654
Les coefficients du numrateur b et du dnominateur a sont dans les vecteurs retourns par
la fonction butter. Ils sont affichs dans la fentre de loutil fvtool en choisissant
Filter Coefficients du menu Analysis.
>> b'
>> a'
ans =
ans =
0.0179
0
-0.0896
0
0.1793
0
-0.1793
0
0.0896
0
-0.0179
1.0000
-3.1498
5.2969
-6.3254
6.0559
-4.5844
2.7193
-1.2546
0.4474
-0.1083
0.0149
Traitement du signal
655
>> tf(b,a)
Transfer function:
0.01793 s^10 - 0.08963 s^8 + 0.1793 s^6 - 0.1793 s^4 +
0.08963 s^2 - 0.01793
------------------------------------------------------------s^10 - 3.15 s^9 + 5.297 s^8 - 6.325 s^7 + 6.056 s^6 - 4.584
s^5 + 2.719 s^4 - 1.255 s^3 + 0.4474 s^2 - 0.1083 s + 0.01491
Nous avons des exemples de traitement adaptatif, audio, analyse spectrale, etc.
Comme SIMULINK, loutil Signal Processing Blockset possde des librairies
contenant des bibliothques de blocs ddis des fonctions particulires.
Comme le montre la figure suivante, il y a 4 librairies principales :
-
Estimation,
Filtrage,
Fonctions mathmatiques,
Gestion de signaux.
656
Chapitre 14
Traitement du signal
657
Estimateur de Yule_Walker
>> A
A =
1
1
1
1
1
1
1
1
>> G
G =
1.0000
0.2500
0.0625
0.0156
0.0039
0.0010
0.0002
0.0001
G
p
1 + a(2) z 1 + .... + a( p + 1) z
Chapitre 14
658
Ci-dessous nous traons la sortie du filtre numrique et celui estim par lalgorithme de
Yule Walker.
Sortie du filtre z/z+0.5 et filtre de Yule Walker
0.8
0.6
0.4
0.2
-0.2
-0.4
10
20
30
40
50
60
70
80
90
100
Traitement du signal
659
Dans lexemple qui suit, nous gnrons une sinusode laquelle on superpose un bruit.
Le bruit est choisi de hautes frquences par le filtrage FIR hautes frquences dun bruit
uniforme.
Ce bruit HF est ajout une sinusode de frquence 75 Hz pour former une sinusode
bruite.
Cette dernire est ensuite filtre par un passe bas de type FIR.
Les numrateurs des filtres FIR sont spcifis dans le Callback InitFcn (voir chapitre
Callbacks).
660
Chapitre 14
Nous avons choisi des signaux de 50 chantillons par trame. Le Vector Scope
reprsente les signaux de la sinusode dorigine, la sinusode bruite et le signal de sortie.
Traitement du signal
661
Chapitre 14
662
>>
>>
>>
>>
err=reshape(erreur,1, length(erreur))
plot(err), axis([0 50 -1 1]), grid
xlabel('Temps d''estimation')
title('Evolution de l''erreur d''estimation')
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
>>
>>
>>
>>
10
15
20
25
30
Temps d'estimation
35
40
45
50
Coeffs=reshape(coeffs(:,:,101),1, size(coeffs))
stem(Coeffs)
title('Coefficients du filtre LMS')
xlabel('Temps d''estimation')
Coefficients dufiltreLMS
0.3
0.25
0.2
0.15
0.1
0.05
0
-0.05
-0.1
-0.15
10
15
20
Temps d'estimation
25
30
35
Traitement du signal
663
664
Chapitre 14
Nous avons utilis le bloc qui permet davoir une matrice carre inversible ATA et du bloc
Matrix Multiply de Math Functions and Linear Algebra/Matrix
Operations.
AT
Traitement du signal
665
Cette librairie contient des bibliothques de gestion des signaux, comme les switchs
(interrupteurs) pour diriger le signal, indexer les vecteurs et matrices, etc.
Nous allons utiliser les proprits dindexation pour le calcul de la factorielle du nombre 5.
666
Chapitre 14
Pour le calcul de la factorielle, nous utilisons le bloc de produit cumulatif (cumulative Row
Product) auquel on applique son entre le vecteur allant de 1 5. Nous obtenons ainsi le
vecteur des 5 valeurs : 1, 2, 6, 24 et 120. Cette dernire valeur qui est la valeur de la
factorielle de 5, doit tre alors indexe
Traitement du signal
667
Dans cet exemple, nous gnrons une sinusode bruite en ajoutant un bruit une
sinusode pure.
Nous filtrons cette sinusode bruite laide dun filtre dont nous dterminons les
caractristiques laide du GUI FDATool.
668
Chapitre 14
On se propose dextraire une sinusode de la somme avec deux autres, grce un filtrage
de la somme par un filtre analogique de Butterworth.
Nous avons choisi un filtre dordre 2 pour limiter le temps de rponse donc du rgime
transitoire.
Traitement du signal
>> plot(yout)
>> title('Sinusode de 250 Hz et sortie du filtre')
>> xlabel('Temps continu'), title('Somme des 3 sinusodes'
fichier filtre_butter_FFT.m
clc, close all
t=0:0.01:1;
x1=2*sin(20*pi*t);
x2=10*sin(50*pi*t);
x3=5*sin(80*pi*t);
xtot=x1+x2+x3;
fe = 100; % frquence d'chantillonnage
% Parties MA et AR du filtre passe-bande
% bande passante [9 11] Hz et dordre 2
[B,A] = butter(2,[9 11]/(fe/2));
printsys(B,A,'z')
y=filter(B,A,xtot);
subplot(211)
plot(y)
hold on
plot(x1)
669
Chapitre 14
670
title('Sinusode de 10 Hz et celle extraite')
xlabel('temps discret')
axis([0 100 -2.2 2.2])
subplot(212)
plot(xtot)
axis([0 100 -15 15])
title('Somme des 3 sinusodes')
xlabel('temps discret')
hold off
% erreur de filtrage
err_filt=x1-y;
figure
plot(err_filt)
grid
10
20
30
10
20
30
40
50
60
70
temps discret
Somme des 3 sinusodes
80
90
100
80
90
100
10
0
-10
40
50
60
temps discret
70
Dans cet exemple, nous avons rcupr, par la fonction Butter, le numrateur B et
dnominateur A de la fonction de transfert du filtre passe bas de Butterworth dordre
2. Le filtrage du signal total se fait grce la fonction filter laquelle on transmet la
fonction de transfert du filtre.
La sortie du filtre rejoint la sinusode au bout de 50 chantillons environ.
La commande printsys de la boite outils Control System Toolbox
permet dafficher la fonction de transfert du filtre.
Traitement du signal
671
num/den =
0.0036217 z^4 - 0.0072434 z^2 + 0.0036217
---------------------------------------------------------z^4 - 3.0987 z^3 + 4.2276 z^2 - 2.8348 z + 0.83718
Erreur defiltrage
2
1.5
1
0.5
0
X: 96
Y: -0.213
-0.5
-1
-1.5
-2
20
40
60
80
100
120
Temps discret
On remarque leffet du rgime transitoire du filtre et lerreur rsiduelle en rgime
permanent qui devient assez faible.
Ces 2 effets sont dus lordre du filtre et la largeur de la bande passante qui est de 2 Hz de
part et dautre de la frquence rcuprer.
Le trac de la FFT montre bien un pic avec une dispersion aussi faible que lordre du filtre
est grand.
Linconvnient dans ce cas sera lallongement du temps de rponse.
>>
>>
>>
>>
plot(abs(fft(xtot)))
grid
title('FFT du signal total')
xlabel('Frquences')
Chapitre 14
672
FFT du signal total
500
450
400
350
300
250
200
150
100
50
0
20
40
60
Frquences
80
100
120
Nous retrouvons le pic 10 Hz et un autre symtrique cette frquence par rapport laxe
fe/2.
FFT du signal filtr
80
70
60
50
40
30
20
10
0
20
40
60
Frquences
80
100
120
Chapitre 15
Chapitre 15
674
Considrons un systme du premier ordre de modle discret :
B(z) z
=
A(z)
1 (b + b z 1 )
2
1
1a1 z 1
Pour faire apparatre l'incrment de la commande, on drive les deux termes de cette
expression pour obtenir le nouveau modle prdicteur.
y (t + 1)=(1+ a ) y (t ) a y (t 1)+b u (t ) + b u (t 1)
1
1
1
2
En dsignant par r (t + 1) la consigne future, l'erreur e(t+1) est estime par :
e(t + 1) = r (t + 1) y$ (t + 1) .
La minimisation du critre permet d'aboutir l'incrment de commande optimal suivant :
b2
u (t )= 21 r (t + 1)(1+a1 ) y (t )+ a1 y (t 1)
b1 + R
b12
R
+R
Le gain statique est gal l'unit grce la prsence de l'intgration, la dynamique est du
second ordre de coefficient d'amortissement et de pulsation non amortie 0 .
Ces 2 paramtres vrifient les relations suivantes :
(1+ a1) = 2 e
a1 = e
0T
2 0T
cos ( 0T 1 2 )
Contrle de procds
675
1+ a1
T
= 2 e 0 cos( 0T 1 2 )
a1
C'est une relation non linaire en 0T que l'on peut rsoudre facilement par MATLAB.
La deuxime relation permet le calcul du coefficient de rglage R.
R=
a1 e
b12
2 0T
fichier R_w0T
% Calcul des paramtres w0T et R de la commande LQI
z = sqrt(2)/2;
% coefficient d'amortissement
Chapitre 15
676
droite(w0T,-0.5,w0T,0.5);
% calcul du coefficient de pondration R
R = (b1*b1)/(a1*exp(2*z*w0T)-1);
% affichage des valeurs des paramtres
text(0.21,0.7,['w0T = ' num2str(w0T)])
text(0.21,0.6,['R
= ' num2str(R)])
hold off
Dans le cas gnral, le modle du processus est reprsent par la fonction de transfert :
1
z
(b1 + b2 z 1 + ... + bm z m + 1 )
B( z)
=
1
A( z)
1 a1 z
a 2 z 2 ... a n z n
Par extension du cas particulier prcdent, la loi de commande, dans ce cas gnral, s'crit
:
u( t ) =
n 1
m
b1
r ( t + 1) ( a + 1) y ( t ) + [ ( a
a ) y ( t i )] a y ( t n) b u( t i + 1)
1
i +1 i
n
i
b12 + R
i =1
i=2
Contrle de procds
677
A = [a1 a2 ... an ]
B = [ b1 b2 ... bm ]
Le terme entre crochets peut tre mis sous la forme du produit scalaire T avec :
= [ a1 + 1 a2 a1 a3 a2 ... an an1 an ]
y(t)=A* [y(t -1) y(t - 2)...y(t - n)]'+ B*[u(t 1) u(t 2)...u(t m)]'
= A * y_t_1' + B * u_t_1'
Les composantes des vecteurs y_t_1 et u_t_1 sont les valeurs prcdentes de la sortie
et de la commande.
Les composantes du vecteur sont les valeurs prcdentes de y(t).
La partie faisant intervenir les incrments de commande prcdents est programme
comme suit :
m
bi u(t i + 1) = [b2 ... bm ]*[ u(t 1) ... u(t m + 1)]'
i =2
= B(1,2:m)*du_t_1'
Chapitre 15
678
[y,u] = lqi(a,b,r,N,R,u_min,u_max)
a, b :
r, N :
R :
u_min, u_max :
Contrle de procds
679
680
Chapitre 15
Contrle de procds
681
Si le modle d'un processus n'est pas du type prcdemment tudi, le calcul du coefficient
R peut tre dtermin a posteriori par simulation.
Un utilisateur pourrait choisir la valeur de R qui donne, soit le meilleur temps de rponse,
soit des incrments de commande plus faibles, etc.
On va considrer le cas d'un modle de processus du second ordre suivant :
B(z)
0.5 z 1
=
A(z) 1 0.76 z 1 + 0.3 z 2
682
Avec R = 1, on obtient :
Chapitre 15
Contrle de procds
683
Le temps de rponse est trs faible, en contre partie les variations de la commande sont trs
grandes lors des changements de consigne.
Pour obtenir un temps de rponse raisonnable tout en adoucissant la commande, on est
amen augmenter le coefficient de pondration R.
Pour R = 10, la variation de la commande est beaucoup moins pondre par rapport
l'erreur de poursuite, la sortie du processus suit le signal de rfrence avec une dynamique
beaucoup plus faible que prcdemment.
Dans un cas rel, on choisira une valeur du coefficient R qui satisfait des critres de
temps de rponse, de limitation de la commande ou de ses incrments.
Nous obtenons les rsultats suivants qui peuvent tre satisfaisants dans un cas rel.
Les valeurs statiques de la commande sont les mmes quelque soit la valeur du coefficient
de pondration R.
Il en est de mme de l'erreur statique, nulle grce la prsence de l'intgration dans la loi
de commande.
La courbe suivante reprsente les signaux de consigne et de sortie pour une valeur du
coefficient R = 10.
Chapitre 15
684
Contrle de procds
685
H ( z 1) =
1
1
B( z 1) z (b1 + b2 z )
=
1 a1 z 1
A( z 1)
1
r (t + 1) p1 r (t ) (1+ a1 p1) y (t ) + a1 y (t 1) (b2 + b1) u(t 1) + b2 u(t 2)
b1
Lorsqu'il s'agit de consignes telles l'chelon ou le signal carr, il est prfrable de les filtrer
pour donner le signal de rfrence r (t ) .
On choisit gnralement un filtre du premier ou du second ordre de gain statique unit.
Le filtre de rfrence du second ordre est de la forme :
Hr ( z 1) =
1 1 2
1 1 z 1 2 z 2
1 = 2 e
0T
2 = e
cos ( 0T 1 2 )
2 0T
Chapitre 15
686
%z=sqrt(2)/2;
z=3;
w0T = 0.8;
alpha1
alpha2
r(1) =
r(2) =
= 2*exp(-z*w0T)*cos(w0T*sqrt(1-z*z));
= -exp(-2*z*w0T);
c(1);
c(2);
% signal de rfrence
for i = 3:N
r(i) = alpha1*r(i-1)+alpha2*r(i-2)+(1-alpha1-alpha2)*c(i);
end
% modle du processus
num = [1 -.5];
den = [1 -0.8];
%polynme de rgulation du 1er ordre de pole 0.5
Preg = [1 -.8]; % p1 = 0.5
% valeurs limites de la commande
u_min = 0; u_max = 10;
% initialisation des variables
u(2) = r(2)*sum(den)/sum(num); u(1) = u(2);
y(1) = r(1);
y(2) = r(2);
du1 = 0;
for i = 3:N-1
% calcul de la sortie du modle du processus
y(i) = -den(2)*y(i-1)+num*[u(i-1) u(i-2)]';
du2 = ([r(i+1) r(i)]*Preg'-[1-den(2)+Preg(2) den(2)]*[y(i)
y(i-1)]'-num(2)*du1)/num(1);
u(i) = u(i-1)+du2;
du1 = du2;
% cration de perturbations
y(i) = y(i)-(i == 110)+(i == 210);
%limitation de la commande entre 0 et 10
cde = u(i);
cde = (cde >= u_max)*u_max+(cde <= u_min)*u_min+((cde <
u_max)& (cde>u_min))*cde;
u(i) = cde;
end
plot(y), hold on, plot(r,'-.');
title('signaux de consigne, de rfrence et de sortie')
xlabel('instants d''chantillonnage')
axis([0 N-10 2 8])
hold off, grid
Contrle de procds
687
Aux instants d'chantillonnage 50, 110 et 250, nous avons cre des perturbations de
valeurs respectives -0.5, -2 et 1. Elles sont rejetes avec une dynamique du premier ordre
de ple 0.5 (attnuation de 2 chaque instant d'chantillonnage) alors que la sortie suit
parfaitement le signal de rfrence obtenu par le filtrage de la consigne avec une
dynamique du second ordre.
Les dynamiques de poursuite et de rgulation sont bien indpendantes
La loi de commande dite 3 branches R, S et T est dcrite par le schma suivant :
r(t+1)
T ( z 1)
1
S ( z 1)
H ( z 1)
y(t)
R( z 1)
Le filtrage de la consigne c(t) donne le signal de rfrence r(t) qui dfinit la dynamique de
poursuite.
c(t+1)
Hr ( z 1)
r(t+1)
1 1
T ( z ) r (t + 1) R( z 1) y(t )
S ( z 1)
Chapitre 15
688
max(n, l )
i=2
[(ai ai 1) pi ] zi an zn
diff(A)-P(2:length(P))-A(length(A))]
diff(B)
-B(length(B)]
Contrle de procds
689
fliplr[y(i-q:y(i))]'-S(2:s)*fliplr(u(i-s:i-1) )/B(1);
Le fichier fonction rst.m permet d'implmenter cette commande dans le cas le plus
gnral de type de modle de processus et de polynme de rgulation.
[y,u] = rst(aa,bb,r,N,Preg,den_Hr,u_min,u_max);
aa, bb :
polynmes A et B du modle du processus,
r, N :
signal de rfrence et nombre d'chantillons,
Preg :
paramtres du polynme de rgulation,
den_H :
dnominateur du modle de rfrence,
u_min,u_max : valeurs limites de la commande,
y, u :
vecteurs des signaux de sortie et de commande.
fichier rst.m
function [y,u] = rst(aa,bb,r,N,Preg,den_Hr,u_min,u_max);
% Commande intgrale et prdictive 1 pas
% sans paramtres, les rsultats correspondent :
% modle du processus aa = [1 -0.74]; bb = [1 -0.5];
% nombre d'chantillons N = 600
% polynme de rgulation du 1er ordre Preg = [1 -0.5]
% limitation de commande entre u_min = 0 et u_max = 10
% consigne crneau 5 +/- 2
% dnominateur du modle de rfrence den_Hr = [1 -.8];
if nargin ~= 8
help rst;
disp('Appuyer sur une touche pour voir rsultats d''un
exemple')
pause
% consigne chelon
N = 600;
c = [3*ones(1,N/3) 7*ones(1,N/3) 3*ones(1,N/3)];
% valeurs limites de la commande
u_min = 0; u_max = 10;
% polynme de rgulation
Preg = 0.5;
% modle de rfrence
den_Hr = [1 -0.9 0];
% modle du processus
aa = 0.5; bb = [1 -0.5];
% gnration du signal de rfrence
num_Hr = sum(den_Hr);
r(1) = c(1);
Chapitre 15
690
r(2) = c(2);
for i = 3:N
r(i) = -den_Hr(2:3)*r(i-2:i-1)'+num_Hr*c(i);
end
[y,u] = rst(aa,bb,r,N,Preg,den_Hr,u_min,u_max)
return
end
-...
1
B(z)
=
A(z) 1 0.76 z 1 + 0.3 z 2
Contrle de procds
691
Chapitre 15
692
signaux de rfrence, de consigne et de sortie
7.5
7
6.5
6
5.5
signal de consigne
signal de sortie
4.5
4
3.5
3
2.5
100
200
300
400
500
600
instants d'chantillonnage
signal de commande
3.5
2.5
1.5
100
200
300
400
instants d'chantillonnage
500
600
Contrle de procds
693
On suppose un systme linaire ou linaris dcrit par une quation d'tat discrte rsultant
de la discrtisation du processus continu.
Un rgulateur a pour objet de maintenir la sortie la valeur 0 en prsence de perturbations.
Le signal de commande s'exprime par un retour de l'tat, sous la forme : u(t ) = F x (t )
Si le processus possde p entres et si mon modle d'tat est d'ordre n, la matrice F de
coefficients de retour d'tat est de dimensions (p, n).
La loi de commande par retour d'tat est schmatise comme suit :
u(t)
-
x(t)
A
F
Le comportement du systme boucl par la matrice F est donn par l'quation matricielle
suivante :
x(t + 1) = ( A B F ) x(t )
Cette quation permet de suivre l'volution de l'tat du systme partir de conditions
initiales non nulles ou suite l'application d'une perturbation.
Si le processus est commandable, on peut placer les ples du systme en boucle ferme
(par retour d'tat) n'importe o dans le plan z.
Ces ples sont les solutions de l'quation caractristique suivante :
. f 2 = 14
.
2 0.005 f1 01
. f 2 = 0.48
1 + 0.005 f1 01
>> F = inv([-0.005 -0.1;0.005 -0.1])*[-0.6; -0.52]
F =
8.0000
5.6000
Chapitre 15
694
B0 ( p)
1
p
x 2 (t )
x1 ( t )
1
p
5,6
8
+
Les matrices du modle d'tat discret du processus analogique prcd du bloqueur d'ordre
0 sont obtenues par la commande c2dt connaissant celles du systme analogique et la
priode d'chantillonnage.
Matrices du modle d'tat analogique
>> A = [0 1; 0 0]; B = [0;1]; C = [1 0]; D = 0;
fichier retetat.m
% matrices d'tat du sysme discret
A = [1.0000 0.1000;0 1.0000]; B = [0.0050;0.1000]; C = [0 1];
N = 100; % horizon de commande
F = [8 5.6]; % matrice des coefficients du retour d'tat
% algorithme de commande
u = []; u(1) = 0; x(:,1) = [1 0]'; % conditions
for i = 2:N
x(:,i) = A*x(:,i-1)+B*u(i-1); u(i) = -F*x(:,i);
% perturbation sur la vitesse
if i==N/2, x(2,i) = x(2,i)-1;
end
end
figure(1), plot(1:N,x(1,:)), hold on
plot(1:N,x(2,:),'-.'), hold off
title('Evolution du vecteur d''tat');
Contrle de procds
695
gtext('x1'), gtext('x2')
gtext('perturbation sur la vitesse')
figure(2), stairs(1:N,u)
title('Signal de commande par retour d''tat')
Evolution du vecteur d'tat
0.5
x1
-0.5
x2
-1
perturbation sur la vitesse
-1.5
10
20
30
40
50
60
70
80
90
100
8
6
4
2
0
Si
-2
-4
-6
-8
10
20
30
40
50
60
70
80
90
100
Chapitre 15
696
l'on veut revenir zro le plus rapidement possible, il suffit de mettre tous les ples
l'origine, ce qui correspond aux valeurs suivantes des coefficients du retour d'tat.
f 1 = 100
f = 15
, 2
-2
-4
-6
-8
-10
10
20
30
40
50
60
70
80
90
100
100
80
60
40
20
0
-20
-40
-60
-80
-100
10
20
30
40
50
60
70
80
90
100
Contrle de procds
697
La commande optimale dans l'espace d'tat est base sur la minimisation d'un critre
quadratique, le plus gnral tant
1
1 N 1
J = x ( N ) T H x ( N ) + x (t ) T Q x (t ) + u(t ) T R u(t )
2
2 t =0
N dsigne l'instant auquel on atteint l'objectif qui est l'annulation de l'tat dans le cas d'une
rgulation autour d'une consigne nulle.
Q et H sont des matrices de pondration, symtriques. La matrice H ou terme de
pondration terminal permet de pnaliser plus ou moins l'cart final par rapport la cible
cherche.
Q est une matrice de pondration de l'tat intermdiaire. R est une matrice de pondration
des signaux de commande.
Dans le cas d'un systme p entres dont le modle d'tat est d'ordre n, les matrices H, Q
et R sont carres, symtriques et d'ordres n et p respectivement.
Le problme consiste minimiser le critre J sous la contrainte suivante
x (t + 1) = A x (t ) + B u(t )
La minimisation du critre quadratique entre les tapes (N-1) et N sous la contrainte
prcdente permet d'obtenir.
u( N 1) = R + BT P( N ) B
BT P( N ) A x( N 1)
= F ( N 1) x( N 1)
1
P( N 1) = AT P( N ) P( N ) B R + B T P( N ) B B T P( N ) A + Q
(quation de RICCATI)
La dtermination du retour d'tat F(N-1) est base sur le principe et optimalit dont
l'nonc est d BELLMAN (1962).
Chapitre 15
698
u(t)
1
p
x2(t )
1
p
x1(t )
fichier cde_opt1.m
% commande optimale par retour d'tat
% rgulation autour d'une consigne non nulle
% matrices du modle d'tat analogique
A=[0 1; 0 0]; B=[0;1]; C=[0 1]; D=0;
% matrices du modle d'tat discret
[A,B,C,D]=c2dt(A,B,C,0.1,0);
N=100; % horizon de commande
% matrices de pondration
H=[1 0;0 0]; Q=H; R=0.01;
% calcul des coefficients du retour d'tat optimal
P=H;
for i=N:-1:2
F(i-1,:)=inv(B'*P*B+R)*B'*P*A;
P=A'*(P-P*B*inv(B'*P*B+R)*B'*P)*A+Q;
end
% trac des coefficients du retour d'tat
figure(1), plot(1:N-1,F(:,1)), hold on
plot(1:N-1,F(:,2)),hold off
title('Coefficients du retour d''tat optimal')
gtext('f1'), gtext('f2')
Contrle de procds
699
Le retour d'tat est constant sauf au voisinage du point d'arrive. Le rgime permanent
correspond la solution permanente de l'quation de RICCATI. Le plus souvent on
implante le rgime permanent.
fichier cde_opt1.m (suite)
% algorithme de commande
u(1)=0; x(:,1)=[1 0]';
for i=2:N-1
x(:,i)=A*x(:,i-1)+B*u(i-1);
u(i)=-F(i,:)*x(:,i);
if i==N/2
x(2,i)=x(2,i)-1;
end % perturbation sur la vitesse
end
figure(2)
plot(1:N-1,x(1,:))
hold on
plot(1:N-1,x(2,:),'-.')
grid
hold off
title('Evolution du vecteur d''tat, retour optimal');
gtext('x1'),
gtext('x2'), gtext('perturbation sur la vitesse')
Evolution du vecteur d'tat, retour optimal
0.5
x1
0
x2
-0.5
-1
perturbation sur la vitesse
-1.5
10
20
30
40
50
60
70
80
90
100
Chapitre 15
700
-2
-4
-6
-8
0
10
20
30
40
50
60
70
80
90
100
Les figures suivantes reprsentent les rsultats de cette commande lorsqu'on implante la
solution permanente de l'quation de RICCATI.
fichier cde_opt1.m (suite)
% retour d'tat permanent
%-----------------------% coefficients du retour d'tat permanent
F = [F(1,1) F(1,2)];
u(1)=0; x(:,1)=[1 0]';
for i=2:N-1
x(:,i)=A*x(:,i-1)+B*u(i-1);
u(i)=-F*x(:,i);
if i==N/2
x(2,i)=x(2,i)-1;
end % perturbation sur la vitesse
end
Contrle de procds
701
figure(4)
plot(1:N-1,x(1,:))
hold on
plot(1:N-1,x(2,:),'-.')
grid
hold off
title('Evolution du vecteur d''tat, retour permanent');
gtext('x1')
gtext('x2')
gtext('perturbation sur la vitesse')
0.5
x1
-0.5
x2
-1
-1.5
10
20
30
40
50
60
70
80
90
100
Chapitre 15
702
-2
-4
-6
-8
0
10
20
30
40
50
60
70
80
90
100
Dans le programme suivant, on implante le retour d'tat permanent pour une rgulation
autour d'une consigne constante de position. La deuxime composante du vecteur d'tat est
nulle.
L'tat correspondant est reprsent par le vecteur :
5
x _ ref =
0
F
-
u(t)
fichier cde_opt2.m
% commande optimale par retour d'tat
% rgulation autour d'une consigne non nulle
clear all
% matrices du modle d'tat discret du processus
A =[1.0000 0.1000;0 1.0000];
B =[0.0050;0.1000];
x(t)
Contrle de procds
C =[1 0];
% horizon de commande
N=100;
% matrices de pondration
H=[1 0;0 0];
Q=H;
R=0.1;
% initialisation de la matrice P
P=H;
% calcul du retour d'tat et de la matrice P
for i=N:-1:2
F(i-1,:)=inv(B'*P*B+R)*B'*P*A;
P = A'*(P-P*B*inv(B'*P*B+R)*B'*P)*A+Q;
end
% tat de consigne
x_ref=[5 0]';
% algorithme de commande
u(1)=0;
x(:,1)=[1 0]';
y(1)=0;
for i=2:N-1
% sortie position
x(:,i)=A*x(:,i-1)+B*u(i-1);
% signal de commande
u(i)=-[F(1,1) F(1,2)]*(x(:,i)-x_ref);
% signal de sortie
y(i)=C*x(:,i);
end
figure(1)
plot(1:N-1,y);
grid
title(['signal de sortie, R = ' num2str(R)])
703
704
Chapitre 15
Contrle de procds
705
Chapitre 15
706
La dynamique est plus lente que prcdemment cause d'une plus forte pondration de la
commande.
Rgulation autour d'une consigne variant dans le temps
En gnral la loi de commande permettant de rguler autour d'une consigne r(t) non nulle,
u( t ) = q r ( t ) F x ( t ) ,
comporte un retour d'tat et une commande anticipative.
r(t)
u(t)
x(t)
y(t)
A
F
L'galit entre la sortie et la consigne en rgime permanent est obtenue avec la valeur
suivante de l'anticipation :
q = C ( I A + B F ) 1 B
fichier cde_opt3.m
% commande optimale par retour d'tat
% rgulation autour d'une consigne non nulle
%
A
B
C
Contrle de procds
P = H;
for i = N:-1:2
F(i-1,:) = inv(B'*P*B+R)*B'*P*A;
P = A'*(P-P*B*inv(B'*P*B+R)*B'*P)*A+Q;
end
F = [F(1,1) F(1,2)];
% calcul de l'anticipation
q = inv(C*inv(eye(2)-A+B*F)*B);
% algorithme de commande
u(1) = 0;
x(:,1) = [1 0]';
y(1) = 0;
for i = 2:N-1
x(:,i) = A*x(:,i-1)+B*u(i-1);
u(i) = -F*x(:,i)+q*ref(i);
y(i) = C*x(:,i); % sortie position
end
figure(1)
plot(1:N-1,y);
title('Signal de sortie')
hold on
plot(ref)
figure(2)
stairs(1:N-1,u)
grid
title('Signal de commande par retour d''tat')
707
Chapitre 15
708
1
)
Ti p
1
1
Contrle de procds
709
D( z 1 ) =
Kp 1 + Ti Ti z 1
Ti
1 z 1
a = 0,8
b1 z 1
Avec 1
1 a1 z 1
b1 =1
1 = 2 e cos( 1 2 )
2 = e 2
Les expressions du gain K p et de la constante de temps Ti du rgulateur sont :
Kp =
a1 e 2
b1
1 + Ti a1 + 1 2 e cos( 1 2 )
=
Ti
K p b1
On se propose de calculer ces valeurs pour = 0.5 et =
2
2
Chapitre 15
710
F ( z 1 ) =
b1 [1 + Ti Ti z 1 ] z 1
Ti
1
+
Ti
1 + [ K p b1 (
) a1 1] z 1 + (a1 K p b1 ) z 2
Ti
Kp
fichier KT_pid.m
a=0.8; b=1; w0=0.5; z=sqrt(2)/2;
K= (a-exp(-2*z*w0))/b;
x=(a+1-2*exp(-z*w0)*cos(w0*sqrt(1-z*z)))/(K*b);
T=1/(x-1);
>> K
K =
0.3069
>> T
T =
1.7484
Contrle de procds
711
Les paramtres du rgulateur sont entrs dans la boite de dialogue du masque du PID (voir
chapitres Masques et sous-systmes).
Chapitre 15
712
n1
Moteur
Charge
n2
Les paramtres du systme sont :
Ke = 6 10-2 V/(rad/s)
Kg = 5 10-2 V/(rad/s)
Km = 5 10-1 N.m/A
R = 10 , L = 10 mH
N = n2/n1 = 20
Jm = 10-4 kg m2
Jc = 0.15 kg m2
On s'intresse l'tude du systme en boucle ouverte ayant comme sortie la tension u(t)
applique l'induit et comme sortie la vitesse w de l'arbre moteur.
En dsignant par I, Cm et Cp, respectivement le courant d'induit du moteur, le couple
moteur et le couple perturbateur, on dduit, partir des quations lectromcaniques, le
schma bloc suivant :
Cp
U +
-
1
R+Lp
Km
Ke
Ke
Cm
+
1
Jm p
Jm
Contrle de procds
713
1
R+Lp
Km
1
Jmp
Jm
fichier moteur.m
% asservissement de la vitesse de la
charge
% paramtres lectromcaniques
Km = 5e-1; Kg = 0.05; Ke = 6e-2;
R = 10; L = 1e-2;
Jm = 1e-4; Jc = 0.15;
N = 20;
% inertie ramene sur l'arbre moteur
Jt = Jm + Jc/(N^2);
% fonction de transfert H1
% vitesse angulaire du moteur sans charge
% fonction de transfert Hcd de la chane directe
[num_cd, den_cd] = series(1, [L R], Km, [Jm 0]);
[num_cd, den_cd] = minreal(num_cd, den_cd);
disp('[transfert de la chane directe Hcd :')
printsys(num_cd,den_cd,'p')
0 pole-zero(s) cancelled
[transfert de la chane directe Hcd :
num/den =
500000
-----------p^2 + 1000 p
0 pole-zero(s) cancelled
Chapitre 15
714
Nd(p)
X
-
Dd(p)
Nr(p)
1
Jm
Dr(p)
En notant Nd, Dd, Nr, et Dr, les polynmes des chanes directe et de retour, le numrateur
et le dnominateur de H(p) sont obtenus par cette commande en spcifiant le paramtre '-1' de la contre raction.
[numH,denH]= feedback(Nd,Dd,Nr,Dr,-1)
Contrle de procds
715
Step Response
18
16
14
Amplitude
12
10
8
6
4
2
0
0.05
0.1
0.15
0.2
0.25
Time (sec)
Km
Ke Km + R Jm p + L Jm p2
num/den =
5e+005
--------------------s^2 + 1000 s + 3e+004
Chapitre 15
716
Step Response
18
16
14
12
10
8
6
4
2
0
0.05
0.1
0.15
0.2
0.25
temps (sec)
1
R+Lp
Km
Ke
Ke
1
Cp
JtJmp
1/N
Contrle de procds
717
Le gain statique Gs est gal celui du moteur sans charg, divis par le rapport de
rduction N.
La constante de temps est le temps au bout duquel, la rponse impulsionnelle atteint 63%
de la valeur statique. On utilisera la commande zoom pour mesurer la valeur de ce
paramtre.
fichier moteur.m (suite)
% rponse indicielle, vitesse charge
rep_ind = step(numH2,denH2);
t = 0:length(rep_ind)-1;
% trac de la rponse indicielle
figure(2), plot(t,rep_ind), hold on
title('rponse indicielle, vitesse de la charge')
xlabel('temps en secondes')
ylabel('vitesse de la charge (rad/s)')
718
Chapitre 15
Contrle de procds
719
Chapitre 15
720
Les rponses impulsionnelles des modles rel et simplifi tant semblables, le systme
complet peut tre alors dcrit parla fonction de transfert
H ( p) =
0833
.
1+ 6 p
La possibilit de simplification du modle initial peut tre montre en calculant les valeurs
de ses ples.
>> disp('Ples du modle rel :'),
>> roots(denH2)
Ples du modle rel :
ans =
-993.6438
-6.3562
6.3562 t
993.6438 t
Contrle de procds
721
Bode Diagram
0
Magnitude (dB)
-10
-20
-30
Phase (deg)
-40
0
-45
-90
-2
10
-1
10
10
10
Frequency (rad/sec)
On peut aussi calculer le module et la phase pour les tracer ensuite avec des units semi logarithmiques par semilogx.
[mod,phase,w] = bode(num, den) : retourne le module, la phase et l'tendue
des pulsations.
Les diagrammes de Bode servent essentiellement mesurer les marges de gain et de phase.
La commande margin(mod,phase,w) trace les diagrammes de Bode et affiche les
marges de gain et de phase.
Les tracs des diagrammes de Nyquist et de Nichols sont obtenus respectivement par
les fonctions nyquist et nichols.
nyquist (num,den) et nichols(num,den)
nyquist(0.833,[6 1])
grid
title('diagramme de Nyquist du modle simplifi')
xlabel('axes rel')
ylabel('axe imaginaire')
Chapitre 15
722
Km
R+Lp
+
+
1
Jmp
Jt
1/N
Wc
Ke
Ke
Contrle de procds
723
On dsire asservir la vitesse angulaire de l'arbre moteur par l'intermdiaire d'un retour
tachymtrique de coefficient Kg.
Le systme boucl par retour tachymtrique est :
Wr
U +
-
Km
-
Wm
1/N
Jt p(R+Lp)
Wc
Ke
Ke
Kg
Ke
Chapitre 15
724
Fonction de transfert Wc/Wr :
num/den =
0.5
---------------------------0.000095 p^2 + 0.095 p + 1.1
gain_stat =
0.4545
Nous dsirons corriger la vitesse de la charge l'aide d'un rgulateur numrique. Nous
allons utiliser le modle simplifi du premier ordre obtenu prcdemment pour la synthse
du correcteur.
Pour obtenir le modle discret partir du modle analogique chantillonn une cadence
T, on utilise la commande c2dm. Avec la syntaxe suivante :
[numd,dend] = c2dm(numa,dena,T,'zoh')
Contrle de procds
725
rponse impulsionnelle
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
10
15
temps discret
20
25
Les diagrammes de Nyquist et de Bode d'un modle discret peuvent tre obtenus et tracs
en utilisant les fonctions dnyquist et dbode.
>> dbode(nd,dd,2)
On spcifie la priode dchantillonnage Ts, qui est choisie gale 2s dans ce cas.
Cette fonction accepte aussi un modle dtat par la forme :
>> dbode(A,B,C,D,Ts,IU)
Chapitre 15
726
+
-
1
DJm
(z 1)
1
H (z1)
Jm
Wc
(1 a) z 1
1 a z 1
Contrle de procds
727
H (z 1 ) =
b1 z 1
0 .2 3 61
=
z 0 .7 1 6 5
1 a z 1
l'expression du correcteur peut tre obtenue par l'expression suivante, obtenue aprs le
calcul de la fonction de transfert en boucle ferme.
D (z 1 ) =
F (z 1 )
1
H (z
) [ 1 F (z 1 )]
(1 ) (1 a z 1 )
b1 ( 1 z 1 )
Ce correcteur compense les ples et les zros du processus et introduit une intgration.
Pour raliser un retour unitaire, MATLAB dispose de la fonction cloop, de syntaxe :
cloop(num, den, signe)
num, den :
signe :
1 pole-zeros cancelled
Fonction de transfert en boucle ferme :
num/den =
Chapitre 15
728
0.2
------z - 0.8
Nous nous intressons dans ce qui suit, la mise en oeuvre du rgulateur, lorsqu'on
spcifie un signal de consigne carr.
Pour gnrer un signal carr, on dispose de la fonction square ayant les syntaxes :
square(x) :
x,
square(x,rc) :
Pour gnrer une priode, nous pouvons utiliser les expressions logiques. Nous nous
intressons l'criture d'une fonction permettant de gnrer un signal carr, que l'on
nommera carre.
Les paramtres d'appel sont la longueur de la priode, les valeurs minimale et maximale du
signal et le nombre de priodes.
fichier carre.m
function x = carre(xmin,xmax,per,N_per,flag)
% gnration d'un signal carr
% x
: signal gnr
% xmin, xmax
: valeurs min et max du signal
% per
: priode du signal
% N_per
: nombre de priodes
% flag
: 0 pour que commence par sa valeur min
%
: 1 pour que x commence par sa valeur max
x =[];
% gnration de la priode
t = 0:per-1;
xP = (~(t<=floor(per/2)-1))+ flag*(~(t>floor(per/2)-1));
for k = 0:N_per-1
x = [x xP];
end
% mise l'chelle des amplitudes
x = xmin*(x == min(x))+xmax*(x == max(x));
Contrle de procds
729
1 2 z 1
1 z
0.8471 0.6069 z 1
1 z 1
fichier commande.m
clc
% Implantation du rgulateur
% Gnration du signal de consigne carr
r = carre(-5,5,100,2,0);
% coefficients du rgulateur
alfa1 = 0.8471; alfa2 = 0.6069;
% coefficients du modle du procd
a1 = 0.7165; b1 = 0.2361;
% initialisations
err(1) = 0;
u(1) = r(1)/ddcgain(b1,[1 -a1]);
du(1) = 0;
y(1) = r(1);
for i = 2:length(r)-1
% sortie du processus
y(i) = a1*y(i-1) + b1*u(i-1);
% erreur
err(i) = r(i+1) - y(i);
% calcul de la commande
du(i) = alfa1*err(i) - alfa2*err(i-1);
u(i) = u(i-1) + du(i);
end
% trac des signaux de consigne et de sortie
figure(1), plot(r,'-.')
hold on
plot(y)
xlabel('temps discret')
title('signaux de consigne et de sortie')
axis([0 length(r) min(r)-1 max(r)+1])
figure(2) % trac du signal de commande
stairs(u), xlabel('temps discret'),
title('signal de commande')
730
Chapitre 15
Contrle de procds
731
Dans MATLAB, un systme LTI peut tre dfini par sa fonction de transfert, ses quations
dtat, ses zros, gain et ples ainsi que par sa rponse en frquences.
V.2.1. Fonction de transfert
H ( p) =
1 + 2
p2
2
0
z=sqrt(2)/2 ;
w0=0.01;
num = [1];
den = [1/w0^2 2*z/w0 1];
sys = tf(num,den)
step(sys)
Step Response
1.4
1.2
Amplitude
0.8
0.6
0.4
0.2
100
200
300
400
500
600
700
800
900
Time (sec)
Notons que step donne la rponse indicielle quelque soit la dfinition de sys (quation
dtat, ou autre).
Chapitre 15
732
V.2.2. Zro-Ple-Gain
H ( p) =
1
( p + 2) ( p + 3)
Impulse Response
0.16
0.14
0.12
Amplitude
0.1
0.08
0.06
0.04
0.02
0.5
1.5
2.5
Time (sec)
3.5
4.5
Contrle de procds
733
Nous dfinissons le systme par la commande ss pour laquelle nous transmettons ces
matrices dtat.
>> sys=ss(A,B,C,D)
a =
x1
x2
x1
-5
2.449
x2
-2.449
0
b =
x1
x2
u1
1
0
c =
x1
0
y1
x2
0.4082
d =
y1
u1
0
Continuous-time model.
Chapitre 15
734
0.4082
Dd =
0
1
----------------------10000 s^2 + 141.4 s + 1
Nous trouvons les 2 rponses indicielles suivantes par la mme commande step.
>> step(sys)
Contrle de procds
735
Step Response
To: Out(1)
0.8
0.6
0.4
Amplitude
0.2
To: Out(2)
0
1.5
0.5
100
200
300
400
500
600
700
800
900
Time (sec)
Un systme LTI cr par tf, zpk, est un objet qui possde des proprits.
Limplmentation des objets obit la programmation orient Objets de MATLAB. Les
objets sont des structures (Voir Chapitre Tableaux multidimensionnels) avec un flag qui
indique leur classe (tf, zpk, ss, frd) et des champs appels proprits des objets.
Pour les objets LTI, ces proprits comprennent :
Les fonctions oprant sur un objet particulier sont appeles mthodes . Certaines
oprations peuvent tre effectues sur des LTI, comme laddition, multiplication ou
concatnation. Ces oprations sont dites surcharges en ce sens quelles
sappliquent au LTI avec la mme syntaxe que pour les matrices, mais adaptes aux objets
LTI. Les objets LTI obtenus aprs ces oprations sont hrites des objets LTI utiliss.
Selon la classe des objets LTI, ces derniers possdent une priorit, ou obissent aux rgles
de prcdence.
On peut ajouter deux objets LTI de classes diffrentes mais la classe de lobjet LTI
rsultant sera de la classe ayant plus de priorit.
Si sys1 est obtenu par tf, sys2 obtenu par ss, alors lobjet : sys1+sys2 sera de la
classe ss.
Chapitre 15
736
Pour viter ces rgles de prcdence, on peut forcer la classe de lobjet rsultant, comme
par sys = sys1 + tf(sys2), ou sys = tf(sys1 + sys2).
Le tableau suivant rsume les rsultats des oprations arithmtiques ralises sur les objets
LTI.
sys = sys1+sys2
sys = sys1-sys2
sys = sys1*sys2
Les objets LTI possdent tous, des proprits gnriques mais chaque classe
correspondent des proprits spcifiques.
Proprits gnriques :
InputDelay
InputGroup
InputName
Notes
OutputDelay
OutputGroup
OutputName
Ts
UserData
Vecteur
Structure
Cellule de chanes
Texte
Vecteur
Structure
Cellule de chanes
Scalaire
Type arbitraire
Contrle de procds
737
Pour retrouver la valeur dune proprit, on utilise la commande get (Voir Chapitre
handle Graphics) en spcifiant la proprit que lon recherche.
Ci-dessous, on recherche le nom du signal dentre et les notes sur le modle.
>> get(sys,'InputName')
ans =
'Tension (V)'
>> get(sys,'Notes')
ans =
'modle d'un moteur CC'
La commande get(sys) permet davoir toutes les valeurs spcifies des proprits de
lobjet.
>> get(sys)
num:
den:
ioDelay:
Variable:
Ts:
{[0 1]}
{[1 5]}
0
's'
0
Chapitre 15
738
InputDelay:
OutputDelay:
InputName:
OutputName:
InputGroup:
OutputGroup:
Name:
Notes:
UserData:
0.5
0
{'Tension (V)'}
{'Vitesse (rad/s)'}
[1x1 struct]
[1x1 struct]
''
{'modle d'un moteur CC'}
[]
Zros
Tableau de cellules en
vecteurs colonnes.
Ples
Tableau de cellules en
vecteurs colonnes.
Gain
Matrice relle
Variable de la function de Texte
transfert :
Retards sur les entres et Matrice
les sorties
p
k
variable
ioDelay
Pour voir comment sont implmentes ces proprits pour le mme exemple prcdent,
nous forons sa classe celle du zpk. Le nouvel objet sera appel sys_zpk.
>> sys_zpk=zpk(sys)
Zero/pole/gain from input "Tension (V)" to output "Vitesse
(rad/s)":
1
exp(-0.5*s) * ----(s+5)
{[0x1 double]}
{-5}
1
0
'roots'
's'
0
Contrle de procds
739
InputDelay:
OutputDelay:
InputName:
OutputName:
InputGroup:
OutputGroup:
Name:
Notes:
UserData:
0.5
0
{'Tension (V)'}
{'Vitesse (rad/s)'}
[1x1 struct]
[1x1 struct]
''
{'modle d'un moteur CC'}
[]
Tension (V)
1
c =
Vitesse (rad
x1
1
d =
Vitesse (rad
Tension (V)
0
Matrice 2D
Matrice 2D
Matrice 2D
Matrice 2D
Matrice 2D
Vecteur
Vecteur de cellules
0 pour faux, 1 pour vrai
Chapitre 15
740
b:
c:
d:
e:
Scaled:
StateName:
InternalDelay:
Ts:
InputDelay:
OutputDelay:
InputName:
OutputName:
InputGroup:
OutputGroup:
Name:
Notes:
UserData:
1
1
0
[]
0
{''}
[0x1 double]
0
0.5
0
{'Tension (V)'}
{'Vitesse (rad/s)'}
[1x1 struct]
[1x1 struct]
''
{'modle d'un moteur CC'}
[]
Dans le cas de ce modle du 1er ordre, les matrices dtat sont des scalaires.
Frequency
ResponseData
Donnes en frquences
Rponse en frquences
Vecteur rel
Tableau multidimensionnel
de valeurs complexes.
Units
Units de frquence
Chane : rad/s ou Hz
Le mode frd concerne la rponse en frquences du systme (uniquement des donnes en
frquences).
Considrons un simple systme du 1er ordre de fonction de transfert :
1
H ( p) =
p+5
Nous cherchons la rponse en frquences de ce systme dans la bande de frquences de 0
100 Hz.
>> sys=tf(1,[1 5]);
>> sys = frd(sys,0:100,'Units','Hz')
Response
-------2.000e-001 + 0.0000i
7.755e-002 - 0.0974i
2.734e-002 - 0.0687i
1.315e-002 - 0.0496i
7.614e-003 - 0.0383i
4.941e-003 - 0.0310i
3.457e-003 - 0.0261i
2.552e-003 - 0.0224i
Contrle de procds
8
9
10
741
1.960e-003 - 0.0197i
1.551e-003 - 0.0175i
1.259e-003 - 0.0158i
H ( p) =
1
20 p + 1
Dans le champ LTI system variable, nous pouvons utiliser les commandes vues
prcdemment.
Nous dfinissons les matrices dtat dun systme dfini par la mthode zros-ples-gain.
>> [A,B,C,D]=zp2ss([],[-2 -3],[1])
A =
-5.0000
-2.4495
2.4495
0
Chapitre 15
742
B =
1
0
C =
0
0.4082
D =
0
Contrle de procds
743
Les fonctions MATLAB, excutes sont celles o lon spcifie ces matrices.
Nous obtenons les mmes courbes du signal dentre et de sortie sur loscilloscope.
V.2.6. LTI viewer
Le LTI viewer est un outil qui permet de spcifier les caractristiques des objets LTI.
Cest un interface graphique (GUI : graphical user interface) qui simplifie
lanalyse dun systme LTI.
Il permet de comparer plusieurs rponses en mme temps, tudier leffet de paramtres sur
la rponse dun systme, tudier la stabilit, les marges de gain et de phase, le temps de
rponse, etc.
Pour ouvrir cet diteur, nous pouvons utiliser la commande suivante :
>> ltiview
744
Chapitre 15
Pour ouvrir LTI viewer afin dtudier un exemple de LTI, nous pouvons le spcifier
entre parentheses.
MATLAB permet la sauvegarde de systmes LTI, sous forme de fichiers binaires quon
ouvre grce la commande load, comme par exemple sys_dc.
>> load ltiexamples
>> whos
Name
Size
G
Gcl1
Gcl2
Gcl3
Gservo
clssF8
diskdrive
frdF8
frdG
freq
gasf
1x1
1x1
1x1
1x1
1x1
2x2
1x1
2x2
1x1
5x1
4x6
Bytes
Class
2526
2526
2526
2526
2812
2993
2860
2806
2330
40
11429
tf
tf
tf
tf
zpk
ss
zpk
frd
frd
double
ss
Attributes
745
Contrle de procds
hplant
m2d
respF8
respG
ssF8
sys_dc
1x1
4-D
2x2x5
5x1
2x2
1x1
10589
6850
320
80
2993
2385
ss
tf
double
double
ss
ss
complex
complex
Nous avons diffrents systmes LTI de diffrentes classes, ss, tf, zpk ou frd.
Pour tudier ce systme dans LTI viewer, nous le spcifions entre parenthses.
>> ltiview(sys_dc)
746
Chapitre 15
>> ctrlpref
Par dfaut, les frquences sont spcifies en rad/s, les amplitudes en dB et les phases en
degrs.
Comme les amplitudes sont en dB, lchelle est alors logarithmique.
Chapitre 16
I. Principe fondamental
II. Etapes de mise en uvre dun contrleur flou
II.1. Etape de fuzzification
II.2. Etape dinfrence
II.3. Etape de dfuzzification
III. Linterface graphique de la bote outils Fuzzy Logic TOOLBOX
IV. Cration dun systme flou laide de commandes de la bote outils
IV.1. Fuzzification des variables dentre et de sortie
IV.2. Edition des rgles floues
IV.3. Dfuzzification
IV.4. Utilisation du rgulateur dans une loi de commande
V. Utilisation du rgulateur flou dans SIMULINK
VI. Mthode de Sugeno
VI.1. Ralisation dun rgulateur flou par linterface graphique
VI.2. Ralisation dun rgulateur flou par les commandes de la bote outils
VII. Bloc Fuzzy Logic Controller with Ruleviewer
I. Principe fondamental
La notion densemble flou permet de dfinir une appartenance graduelle dun lment une
classe, cest dire appartenir plus ou moins fortement cette classe. Lappartenance dun
objet une classe est ainsi dfinie par un degr dappartenance entre 0 et 1.
Pour mettre en vidence cette notion, un exemple intressant est lge dune personne, pour
lequel on dfinit 3 classes, jeune , ge moyen et g dans lintervalle allant de 0
100 ans.
degr d'appartenance
1
0.8
0.2
0
30
40
60
70
100 ges
38
Selon cette logique, un individu g de 38 ans est 20% jeune et 80% dge moyen, soit des
degrs dappartenance de 0.2 lensemble flou J et 0.8 lensemble flou M.
Les ensembles flous J, M et A sont reprsents par des fonctions dappartenance (en Z pour
lensemble J, trapzodale pour M et en S pour A).
Chapitre 16
748
M
M
Il existe 3 tapes essentielles dans la mise en uvre dun rgulateur flou comme le montre le
schma ci-dessous :
Entres
relles
Fuzzification
Infrence
Dfuzzification
Sorties
relles
e(t)
Contrleur flou
1 z
Processus
y(t)
749
e( t ) = y ( t )
e(t ) = y (t ) y (t 1)
On considre que le pendule nest pas rcuprable sil sort du domaine [-20, 20], que la
variation maximale de langle est de 10 en valeur absolue. On dfinit chacune de ces
variables par 3 ensembles flous dfinis par des fonctions dappartenance triangulaires (N pour
ngative, Z pour zro et P pour positive).
Si la tension applique linduit du moteur, qui est la sortie du rgulateur, est limite
lintervalle [-10V; 10V], on choisit de la dfinir par 5 ensembles flous (NG : ngative grande,
N : ngative, Z : zro, P : positive et PG : positive grande) de formes triangulaires. Ltape de
fuzzification consiste avoir une dfinition floue des entres-sorties.
Lerreur sera lcart angulaire entre le signal de sortie et le signal de consigne impos (angle
nul). La variation de lerreur est la diffrence entre lerreur linstant courant kT celle de
linstant prcdent (k-1)T.
Si on estime que les valeurs maximales, en valeur absolue, de lerreur et de sa variation, sont
respectivement gales 20 et 10, nous obtenons les ensembles flous suivants qui dfiniront
les entres-sorties du rgulateur.
N
-20
NG
-10
20
-5
-10
10
PG
10
Cest ltape o lon tablit les rgles floues qui permettent daboutir la commande en
fonction des valeurs de lerreur et de sa variation.
En gnral, la commande dpend non seulement de lerreur mais aussi de sa variation. Dans
le cas du pendule, il faut le ramener la position de consigne dautant plus nergiquement
quil sen loigne et que sa vitesse est grande.
Les rgles floues lient la variable de sortie aux variables dentre afin de tirer des conclusions
ou dductions floues.
Chapitre 16
750
Une rgle floue comporte une prmisse du genre Si lerreur est ngative ET la variation de
lerreur est ngative et une dduction floue du type Alors u est positive grande . Dans le
cas o les deux variables dentre sont dfinies, chacune, par 3 ensembles flous, on aboutit 9
rgles floues, lesquelles, dans le cas particulier du pendule invers sont donnes par la table,
dite dinfrence, suivante.
PG
NG
Il faut remarquer que dans le cas de cette table, le rgulateur flou fournit un incrment de
commande que lon ajoute, chaque pas dchantillonnage, la commande applique
prcdemment. Les 3 cas o la commande est Z, sont ceux o lon doit garder la mme
commande, soit :
lerreur est Z et sa variation est Z (pendule la position de consigne),
lerreur est P mais sa variation est N,
lerreur est N mais sa variation est P.
Dans les 2 derniers cas, le pendule revient de lui-mme la position de consigne.
Aprs ldition des rgles, il reste calculer les degrs dappartenance de la variable de sortie
tous les ensembles flous qui lui sont associs.
Aux 5 ensembles flous de la variable de sortie correspondent 5 dductions floues.
1. Si ( e est N) ET ( e est N) ALORS u est PG,
2. Si {( e est N) ET ( e est Z)} OU {( e est Z) ET ( e est N)} ALORS u est P,
3. Si {( e est Z) ET ( e est Z)} OU {( e est P) ET ( e est N)} OU {( e est N) ET ( e est P)}
ALORS u est Z,
4. Si {( e est P ET ( e est Z)} OU {( e est Z) ET ( e est P} ALORS u est N
5. Si ( e est P) ET ( e est P) ALORS u est NG.
Chaque rgle est compose de prmisses lies par les oprateurs ET, OU et donne lieu une
implication par loprateur ALORS.
La mthode de Mamdani consiste utiliser loprateur min pour le ET et loprateur max
pour le OU.
Plusieurs rgles peuvent tre actives en mme temps, i.e. que chacune de leurs prmisses
possde un degr dappartenance non nul. Ceci dpend des types de fonctions dappartenance
utilises ; en loccurrence toutes les rgles sont, chaque instant dchantillonnage, plus ou
moins actives si lon choisit des fonctions dappartenance de forme gaussienne.
751
Lagrgation de ces rgles, opration qui doit aboutir une seule valeur de la variable de
sortie, se fait par loprateur max , comme si les rgles taient lies par loprateur OU.
Cette mthode peut tre illustre, comme suit, dans le cas de lagrgation des rgles 1 et 2.
Chaque prmisse de la rgle 1 est mise en vidence par lcrtage de la fonction
dappartenance PG soit par le degr dappartenance de e lensemble N, soit par celui de e
lensemble N.
Comme les clauses de la prmisse de la rgle sont lies par loprateur ET, on crte
lensemble PG de la variable u par le minimum des 2 degrs dappartenance, comme le
montre la figure suivante :
N
-20
20 e
-10
NG
10 e
-10
-5
min
PG
10 u
La rgle 2 possde 2 prmisses lies par loprateur OU. Pour chacune de ces prmisses, on
ralise la mme opration que pour la rgle 1.
Loprateur OU tant remplac par loprateur max, on prendra le maximum des 2 surfaces
obtenues.
N
-20
-20
20 e
Z
20 e
-10
-10
10 e
Z
10 e
NG
-10
NG
-10
NG
-5
-5
5
Z
P min PG
P min PG
10 u
10 u
PG
max
-10
-5
10 u
Chapitre 16
752
NG
-10
-5
NG
-10
-5
NG
5
Z
PG
10 u
PG
10 u
PG
max
-10
-5
10 u
Lors de la fuzzification, pour chaque variable dentre relle, on calcule ses degrs
dappartenance aux ensembles flous qui lui sont associs.
Dans ltape de dfuzzification, on ralise lopration inverse, savoir, obtenir une valeur
relle de la sortie partir des surfaces obtenues dans ltape dinfrence.
Il existe plusieurs mthodes de dfuzzification, dont la plus utilise est celle du centre de
gravit.
La bote outils Fuzzy
dfuzzification :
'centroid'
'bisector'
'mom'
'som'
'lom'
:
:
:
:
:
Logic
753
1
0.8
0.6
0.4
0.2
0
-10
centroid
lom
-5
10
0
mthodes de dfuzzification
10
1
0.8
0.6
0.4
mom
bisector
som
0.2
0
-10
-5
Parmi ces mthodes, les plus utilises sont la mthode du centre de gravit centroid et
celle de la moyenne des maximas mom.
La mthode centroid calcule le centre de gravit de la surface obtenue aprs ltape
dinfrence et le projette sur laxe horizontal. On ralise ainsi la moyenne de toutes les
valeurs de la variable de sortie, chacune pondre par son degr dappartenance.
La mthode mom ou la moyenne des maximas correspond un simple calcul de moyenne
arithmtique des valeurs ayant le plus grand degr dappartenance (1 dans le cas de la figure
prcdente pour toutes les valeurs allant de -8 -4 par pas de 0.1).
Les mthodes som et lom consistent prendre, respectivement, le plus petit et le plus grand
des maximas, qui sont, dans le cas prcdent, les valeurs -8 et -4.
Ces 2 dernires mthodes, ne requirent aucune opration en virgule flottante car il sagit
seulement de la recherche des valeurs maximales dont on prend le min ou le max; en
contrepartie les valeurs sont trs imprcises car il ny a quune seule valeur qui est retenue (la
plus faible ou la plus leve).
La mthode la plus prcise o toutes les valeurs de lunivers de discours interviennent plus ou
moins fortement suivant le degr dappartenance est celle du centre de gravit.
La figure suivante montre que le nombre doprations en virgule flottante augmente
linairement avec la prcision du rsultat de la dfuzzification en partant du type mom,
moyenne des maximas celui du centre de gravit, centroid.
754
Chapitre 16
nombre d'oprations en virgule flottante par type de dfuzzification
700
604
600
centre de gravit
500
400
bissecteur
329
300
200
100
som
lom
1
44
1.5
mom
2
2.5
3.5
4.5
755
Menu File
New FIS
Import
:
:
Export
Print
Close
:
:
Menu Edit
Undo
:
Add Variable
:
Remove Selected Variable :
Membership Functions
Rules
Chapitre 16
756
Menu View
Rules
dfuzzification,
Surface
Les diffrentes fentres de ldition dun systme flou seront tudies sur lexemple suivant
o lon ralise un contrleur flou pour rguler un processus du premier ordre.
On considre un processus de fonction de transfert :
0.8 z 1
H(z) =
1 0.5 z 1
que lon veut rguler en logique floue, afin que la sortie y(t) suive la consigne r(t).
Le rgulateur aura 2 entres : lerreur de poursuite e(t) et sa variation e(t),
e( t ) = y ( t ) r ( t )
e( t ) = e( t ) e( t 1)
On dfinit pour chacune des entres, dnommes respectivement erreur et d_erreur, 3
ensembles flous avec des fonctions gaussiennes sur lintervalle de valeurs [-10 ; 10].
Dans la fentre FIS Editor : Untitled, ouverte par la commande fuzzy, on ajoute
une deuxime entre par loption Add input du menu Edit.
Pour chacune de ces entres ou sorties, slectionne la souris, on a la possibilit de spcifier
un nom et de choisir entre les mthodes max-min, som-prod, etc.
En double-cliquant sur lune delles, on ouvre la fentre ddition des fonctions
dappartenance dans laquelle on peut choisir le nombre et le type de ces fonctions, lintervalle
de valeurs de cette variable.
La slection la souris de chacune des fonctions dappartenance permet de lui donner un nom
auquel on fera rfrence dans les rgles floues.
757
La fentre suivante montre que la variable erreur est dfinie sur lintervalle [-10 ; 10]
sur lequel on spcifie 3 fonctions dappartenance gaussiennes, nommes respectivement
Negative, Nulle et Positive.
Lorsque toutes les variables dentre et de sortie sont compltement dfinies, on ouvre la
fentre Rule Editor par loption Edit Rules.
Dans la fentre suivante, un nouveau menu, Options, permet de choisir la langue dans
laquelle on crit les rgles.
Chaque rgle peut tre pondre par un coefficient que lon crit la fin et entre parenthses.
Par dfaut ce coefficient vaut 1.
Tous les ensembles flous des diffrentes variables sont affichs ; il suffit de cliquer sur
lensemble adquat pour chacune des rgles.
Dans le cas affich ci-dessus, il sagit de la rgle 8 :
Si erreur est Positive ET d_erreur est Nulle Alors cde est N
758
Chapitre 16
Loption Edit FIS properties permet de revenir la fentre FIS Editor, de mme
pour que pour Membership Functions pour la fentre ddition des fonctions
dappartenance de la variable (entre ou sortie) considre.
759
On sauvegarde ensuite le systme sous forme dun fichier dextension .FIS, reg_flou
dans le cas de notre exemple. La lecture de ce fichier laide de lditeur-dboggeur intgr
permet davoir la description textuelle du rgulateur.
>> edit reg_flou.fis
[System]
Name='reg_flou'
Type='mamdani'
NumInputs=2
NumOutputs=1
NumRules=9
AndMethod='min'
OrMethod='max'
ImpMethod='min'
AggMethod='max'
DefuzzMethod='centroid'
[Input1]
Name='erreur'
Range=[-10 10]
NumMFs=3
MF1='Negative':'gaussmf',[4.247 -10]
MF2='Nulle':'gaussmf',[4.247 0]
MF3='Positive':'gaussmf',[4.247 10]
[Input2]
Name='d_erreur'
Range=[-10 10]
NumMFs=3
MF1='Negative':'gaussmf',[4.247 -10]
MF2='Nulle':'gaussmf',[4.247 0]
MF3='Positive':'gaussmf',[4.247 10]
[Output1]
Name='cde'
Range=[-10 10]
NumMFs=5
MF1='N':'trimf',[-10 -5 0]
MF2='GN':'trimf',[-15 -10 -5]
MF3='Z':'trimf',[-5 0 5]
MF4='P':'trimf',[0 5 10]
MF5='GP':'trimf',[5 10 15]
[Rules]
1 1, 5 (1)
1 2, 4 (1)
1 3, 3 (1)
2 1, 4 (1)
2 2, 3 (1)
2 3, 1 (1)
:
:
:
:
:
:
1
1
1
1
1
1
Chapitre 16
760
3 1, 3 (1) : 1
3 2, 1 (1) : 1
3 3, 2 (1) : 1
Size
1x1
Bytes
8096
Class
struct
Attributes
'reg_flou'
'mamdani'
'min'
'max'
'centroid'
'min'
'max'
[1x2 struct]
[1x1 struct]
[1x9 struct]
Les entres, les sorties et les rgles floues sont aussi dfinies comme des structures. Si lon
veut voir les entres, on excute les diffrentes commandes suivantes :
>> reg_flou.input
ans =
1x2 struct array with fields:
name
range
mf
>> reg_flou.input.name
ans =
erreur
ans =
d_erreur
>> reg_flou.rule
761
Ces 2 rsultats correspondent au cas o les 2 variables correspondent leur premier ensemble
(N) et la sortie (cde) son cinquime (GP).
IV. Cration dun systme flou laide des commandes de la bote outils
:
:
nom_syst
type
:
:
:
:
:
:
:
Chapitre 16
762
agg_method
deffuz_method
On se propose, dans ce qui suit, de crer le mme type de rgulateur que celui ralis partir
de linterface graphique.
IV.1. Fuzzification des variables dentre et de sortie
Le fichier prog_flou.m permet la gnration dun contrleur flou de type Mamdani, tel
que celui ralis laide de linterface graphique, en utilisant cette fois-ci les commandes
MATLAB.
Aprs la dfinition des diffrentes variables dentre et de sortie par la commande addvar,
les diffrentes fonctions dappartenance sont spcifies par la commande addmf.
sys_fuz = addvar(nom, 'type', sys_fuz,intervalle);
sys_fuz
type
nom
intervalle
:
:
:
:
:
:
:
:
:
:
fichier prog_flou.m
% programmation d'un systme flou dans un fichier M
% cration d'un nouveau systme flou
sys_flou = newfis('regul_flou');
% dfinition des variables d'entre : l'erreur et sa variation
interv_err = [-10 10];
interv_derr = [-10 10];
sys_flou = addvar(sys_flou,'input','err',interv_err);
% dfinition des ensembles flous des entres
763
Nulle
degrs d'appartenance
Positive
0.8
0.6
0.4
0.2
0
-10
-8
-6
-4
-2
err
10
Chapitre 16
764
degrs d'appartenance
>>
>>
>>
>>
>>
GP
0.8
0.6
0.4
0.2
0
-10
-8
-6
-4
-2
cde
10
765
On peut supprimer soit une des variables dentre ou de sortie, soit une de ses fonctions
dappartenance.
Les commandes suivantes suppriment respectivement la premire entre du systme
sys_fuzzy et la deuxime fonction dappartenance de la premire entre.
sys_fuzzy = rmvar(sys_fuzzy,'input',1);
sys_fuzzy = rmmf(sys_fuzzy,'input',1,'mf',2);
IV.2. Edition des rgles floues
Pour un systme flou possdant m entres et n sorties, lensemble des rgles floues est dfini
par une matrice de rgles possdant autant de lignes que densembles flous de chacune des
entres et (m+n+2) colonnes.
La premire rgle floue, rappele ci-aprs, constitue la premire ligne de cette matrice.
Si lerreur est ngative (1er ensemble nomm N) ET la drive de lerreur ngative (1er
ensemble nomm N) alors la commande est grande positive (5me ensemble nomm GP).
Cette rgle est pondre par 1.
Le dernier chiffre symbolise loprateur liant les clauses des 2 prmisses (1 pour ET, 2 pour
OU).
Si err est N ET d_err est N Alors cde est GP (1)
Ldition des rgles floues peut tre aussi directement faite de faon linguistique sous forme
de chane de caractres. La commande parsrule permet ensuite de lajouter sous le format
adquat la matrice des rgles.
Chapitre 16
766
Par le choix de la langue, le franais dans notre cas, cette commande reconnat les mots cls :
Si, Alors, Est, Et, Ou et NON.
Il suffit de rentrer les diffrentes rgles sous forme dun vecteur de chanes de caractres, en
faisant attention rajouter des blancs certaines dentre elles pour quelles aient la mme
taille.
regles = ['si
'si
'si
'si
'si
'si
'si
'si
'si
err
err
err
err
err
err
err
err
err
est
est
est
est
est
est
est
est
est
Negative
Negative
Negative
Nulle et
Nulle et
Nulle et
Positive
Positive
Positive
is GP) (1)
P) (1)
is Z) (1)
P) (1)
(1)
N) (1)
is Z) (1)
N) (1)
is GN) (1)
caractristiques de la sortie
>> getfis(sys_flou,'output',1)
Name =
cde
NumMFs =
5
MFLabels =
GN
N
Z
P
GP
Range =
[-10 10]
ans =
Name: 'cde'
NumMFs: 5
mf1: 'GN'
mf2: 'N'
mf3: 'Z'
mf4: 'P'
mf5: 'GP'
range: [-10 10]
767
Chapitre 16
768
AndMethod = min
OrMethod = max
ImpMethod = min
AggMethod = max
DefuzzMethod = centroid
ans =
regul_flou
Dans ce cas, cette commande indique que la premire fonction dappartenance de la premire
entre, dnomme Negative, est de forme gaussienne dcart type 5 et centre sur -10.
Name
Type
Inputs/Outputs
NumInputMFs
NumOutputMFs
NumRules
AndMethod
OrMethod
ImpMethod
AggMethod
DefuzzMethod
InLabels
OutLabels
InRange
regul_flou
mamdani
[2 1]
[3 3]
5
9
min
max
min
max
centroid
err
d_err
cde
[-10 10]
[-10 10]
769
OutRange
InMFLabels
OutMFLabels
InMFTypes
OutMFTypes
InMFParams
OutMFParams
Rule Antecedent
Rule Consequent
[-10 10]
Negative
Nulle
Positive
Negative
Nulle
Positive
GN
N
Z
P
GP
gaussmf
gaussmf
gaussmf
gaussmf
gaussmf
gaussmf
trimf
trimf
trimf
trimf
trimf
[5 -10 0 0]
[5 0 0 0]
[5 10 0 0]
[5 -10 0 0]
[5 0 0 0]
[5 10 0 0]
[-15 -10 -5 0]
[-10 -5 0 0]
[-5 0 5 0]
[0 5 10 0]
[5 10 15 0]
[1 1]
[1 2]
[1 3]
[2 1]
[2 2]
[2 3]
[3 1]
[3 2]
[3 3]
5
4
3
4
3
2
3
2
Chapitre 16
770
59.
51. Rule Weight
52.
53.
54.
55.
56.
57.
58.
59.
51. Rule Connection
52.
53.
54.
55.
56.
57.
58.
59.
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
(err
(err
(err
(err
(err
(err
(err
(err
(err
is
is
is
is
is
is
is
is
is
is GP) (1)
P) (1)
is Z) (1)
P) (1)
(1)
N) (1)
is Z) (1)
N) (1)
is GN) (1)
On peut aussi nafficher que quelques rgles, sous une autre forme, symbolique par exemple.
La commande suivante affiche les rgles n 1, 4, 3, 9, 7 et 2 dans lordre, sous forme
symbolique.
>> aff_regles = showrule(sys_flou,[1 4 3 9
aff_regles =
1. (err == Negative) & (d_err == Negative)
4. (err == Nulle) & (d_err = =Negative) =>
3. (err == Negative) & (d_err == Positive)
9. (err == Positive) & (d_err == Positive)
7. (err == Positive) & (d_err == Negative)
2. (err == Negative) & (d_err == Nulle) =>
7 2],'symbolic')
=> (cde =
(cde = P)
=> (cde =
=> (cde =
=> (cde =
(cde = P)
GP) (1)
(1)
Z) (1)
GN) (1)
Z) (1)
(1)
771
cde
-5
10
5
10
5
-5
derr
-5
-10
-10
err
Langle de vue de la surface obtenue par gensurf peut-tre modifi par la commande view
en spcifiant lazimut et laltitude adquats.
>>
>>
>>
>>
AZ = 45 ;
EL = 30;
gensurf(sys_flou)
view(AZ,EL),
Chapitre 16
772
commande en fonction de l'erreur et de sa variation
cde
-5
-10
10
-5
5
0
0
5
-5
10
-10
err
derr
err (3)
regulflou
(mamdani)
9 rules
cde (5)
derr (3)
773
IV.3. Dfuzzification
La commande ruleview affiche la fentre Rule Viewer dans laquelle on peut observer la
dfuzzification par la mthode max-min. A laide de la souris, on peut choisir des valeurs
quelconques pour chacune des entres et observer la fonction dappartenance de la variable de
sortie obtenue par la mthode max-min.
Par dfaut, la dfuzzification est ralise par la mthode du centre de gravit.
Pour les valeurs 0.4545 et 7.727, respectivement de lerreur et de sa drive, la commande
issue du rgulateur flou est de -3.44.
Ce rsultat peut tre obtenu par la commande evalfis.
Si la matrice reprsentant le rgulateur flou nest pas prsente dans lespace de travail, sa
lecture se fait par la commande readfis.
>> sys_flou = readfis('reg_flou');
>> x = [0.4545 7.727];
>> y = evalfis(x,sys_flou)
y =
-3.4380
>> ruleview(sys_flou)
774
Chapitre 16
A laide de la souris, on peut dplacer le curseur des valeurs des entres (lerreur et sa
variation) et observer au fur et mesure la valeur de la variable de sortie, la commande cde.
IV.4. Utilisation du rgulateur dans une loi de commande
fichier cde_flou.m
% Utilisation du rgulateur flou dans une loi de commande
close all
% programme de dfinition du rgulateur
prog_flou
% signal de consigne
r = (0:60)/12; triangle = [r fliplr(r)];
carre = [zeros(1,100) 5*ones(1,100) zeros(1,100)];
triangle = triangle+sin(0.2*( 0:length(triangle)-1));
r = 2+[triangle carre];
% initialisation de la commande
u = ones(1,2);
y = r; err = zeros(1:2);
% gain multiplicatif de la sortie du rgulateur flou
Gain = 1.8;
for i = 3:length(r)-1
% lecture de la sortie du processus
y(i) = 0.7*y(i-1)+0.3*u(i-1)+0.05*u(i-2);
% erreur et drive de l'erreur
err(i) = y(i)-r(i+1);
d_err(i) = err(i)-err(i-1);
% commande appliquer
x = [err(i) d_err(i)];
du(i) = evalfis(x,sys_flou);
u(i) = u(i-1)+Gain*du(i);
end
% affichage des rsultats
% signal de consigne
plot(r,':'), axis([0 length(r) 0 9]), hold on
% sortie du processus
plot(y)
grid
775
9
8
consigne
7
6
5
4
3
2
sortie
1
0
50
100
150
200
250
temps discret
300
350
400
Chapitre 16
776
signal de commande appliqu
9
8
7
6
5
4
3
2
1
0
-1
50
100
150
200
250
300
350
400
450
350
400
450
temps discret
4
3
2
1
0
-1
-2
-3
-4
50
100
150
200
250
300
temps discret
On vrifie bien quen rgime statique, le rgulateur flou gnre une commande nulle du fait
que lintgration permet dannuler lerreur.
777
-5
0
50
100
150
200
250
300
350
400
300
350
400
drive de l'erreur
5
-5
0
50
100
150
200
250
temps discret
Avec un gain multiplicatif de 0.8, on observe une erreur pour un signal de consigne variant
dans le temps, le dpassement et le temps de monte la poursuite dun chelon sont plus
faibles que prcdemment (avec un gain de 1.8). Lerreur statique est toujours nulle grce la
prsence dune intgration dans la loi de commande du fait que le rgulateur flou gnre une
variation de commande que lon ajoute la commande prcdente avant de lappliquer au
processus.
rgulation par logique floue -signaux de consigne et de sortie
9
8
7
6
consigne
5
4
3
2
sortie
1
0
50
100
150
200
250
temps discret
300
350
400
778
Chapitre 16
Le mme fichier cde_flou.m, avec un gain de 0.3, donne les rsultats suivants.
La dynamique du systme en boucle ferme peut ainsi tre dtermine, soit par les intervalles
de dfinition des variables dentre et de sortie, soit par le gain multiplicatif, ce qui laisse un
degr de libert dans le choix des intervalles de dfinition de lerreur et de sa variation,
inconnus a priori.
779
Comme le rgulateur possde 2 entres, lerreur et sa variation, ces dernires doivent tre
multiplexes.
La commande applique au processus est la somme de la sortie du rgulateur et celle
applique linstant dchantillonnage prcdent.
Les signaux de consigne et de sortie sont multiplexs pour tre affichs simultanment dans
une fentre doscilloscope et stocks dans le fichier cs.mat.
780
Chapitre 16
fichier lect_fic.m
% commande par rgulateur flou
% lecture des entres/sorties et affichage des rsultats
load cde.mat, load cs.mat
t = cs(1,:);
% temps discret
ut = cde(2,:); % commande applique au processus
uf = cde(3,:); % sortie du rgulateur flou
781
% sortie
% consigne
1.5
0.5
-0.5
-1
Gain k = 0.2
-1.5
100
200
Gain k = 0.8
300
temps discret
400
500
600
Chapitre 16
782
1.5
0.5
-0.5
-1
Gain k = 0.2
-1.5
100
200
Gain k = 0.8
300
400
500
600
temps discret
Avec un signal de consigne sinusodal, un gain de 0.8 permet de rduire lerreur de poursuite.
Signaux de consigne et de sortie
1.5
0.5
-0.5
-1
Gain k = 0.2
Gain k = 0.8
-1.5
100
200
300
temps discret
400
500
600
783
Pour appliquer directement la commande u(k), sans ajouter les ses variations, nous
envoyons u(k-1) vers un bloc Terminator et nous ajoutons la sortie dun bloc Ground
la commande u(k).
Grce au mme fichier lect_fic.m, on trace les mmes courbes de consigne, commande et
sortie du processus pour les 2 valeurs du gain k, 0.2 et 0.8.
En labsence de lintgration dans la commande, lerreur statique nest pas nulle, mais
nanmoins, elle est aussi petite que le gain est grand.
Chapitre 16
784
Sortie du rgulateur flou et commande applique
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
Gain k = 0.8
-0.6
Gain k = 0.2
-0.8
-1
100
200
300
400
500
600
temps discret
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
Gain k = 0.2
Gain k = 1
-0.8
-1
100
200
300
temps discret
400
500
600
785
2
1.5
1
0.5
0
-0.5
-1
Gain k = 0.2
Gain k = 1.8
-1.5
-2
100
200
300
400
500
600
temps discret
Chapitre 16
786
Ces constantes sont dfinies dans linterface graphique par le vecteur ligne Params dans la
fentre Membership functions Editor pour la variable de sortie. Le fait de choisir des
singletons revient mettre zro les composantes p et q du vecteur Params.
VI.1. Ralisation dun rgulateur flou par linterface graphique
Le rgulateur est dfini dans le fichier reg_sug.fis que lon peut ouvrir dans linterface
graphique par edit from disk du menu file ou dont on peut visualiser les
caractristiques par la commande edit sous forme dun texte ASCII.
Les commandes suivantes tracent les fonctions dappartenance qui dfinissent les ensembles
flous de lerreur et de sa variation.
% lecture du systme flou
fismat = readfis('reg_sug');
% affichage de la fonction dappartenance de la 1re variable
% dentre
plotmf(fismat,'input',1)
title('ensembles flous de l''erreur')
ylabel('Rgulateur par Sugeno'), grid
% affichage de la fonction dappartenance de la 2me variable
% dentre
figure(2), plotmf(fismat,'input',2)
title('ensembles flous de la variation de l''erreur')
ylabel('Rgulateur par Sugeno'), grid
ensembles flous de l'erreur
Neg
Pos
0.8
0.6
0.4
0.2
0
-10
-8
-6
-4
-2
err
10
787
0.8
0.6
0.4
0.2
0
-1
-0.8
-0.6
-0.4
-0.2
0.2
0.4
0.6
0.8
derr
Comme il y a 2 ensembles flous pour chacune des 2 entres, la variable de sortie sera dfinie
sur 4 ensembles flous, comme schmatis ci-dessous :
&
NN
NP
PN
PP
Dans chacun des cas, la valeur de la sortie est une combinaison linaire des entres :
Cas NN ou PP :
cde = (2)*err+(1)*d_err+(0), do le vecteur Params = [2 1 0]
Cas NP ou PN :
cde = (1)*err+(1)*d_err+(0), do le vecteur Params = [1 1 0]
788
Chapitre 16
Suivant lappartenance de lune des entres aux ensembles flous dfinis, la valeur de la sortie
sera une combinaison linaire de celles-ci.
Considrons le cas particulier o lerreur err = 1 et sa variation d_err = -0.5.
Les lignes de commandes suivantes permettent le calcul des degrs dappartenance de
chacune de ces variables aux diffrents ensembles flous.
input = [1 -0.5];
errN = evalmf(input(1),[8.5 -10],'gaussmf')
errP = evalmf(input(1),[8.5 10],'gaussmf')
d_errN = evalmf(input(2),[0.85 -1],'gaussmf')
d_errP = evalmf(input(2),[0.85 1],'gaussmf')
errN =
0.4328
errP =
0.5709
d_errN =
0.8411
d_errP =
0.2107
789
Neg
Pos
0.8411
0.5709
0.4328
0.2107
-10
10
err
-1
-0.5
d_err
La bote outils Fuzzy Logic TOOLBOX prvoit, dans le cas de la mthode de Sugeno, 2
mthodes de dfuzzification : wtsum et wtaver.
La valeur du singleton de sortie dpend de celles des entres. Avant sa pondration par les
degrs dappartenance, il vaut dans chaque cas :
cas NN ou PP :
cas PN ou NP :
Dans le cas o loprateur ET est ralis, dans chaque rgle, par le min, nous obtenons les
coefficients de pondration du singleton comme suit :
Pos
Neg
0.8411
0.5709
0.4328
-10
10
err
-1
-0.5
d_err
La valeur finale du singleton est calcule, dans la mthode wtsum par la somme pondre :
cde = 0.6492+0.1054+0.2854+0.3160 = 1.3560
Chapitre 16
790
Dans la colonne cde, les traits fin et gros reprsentent, respectivement, le singleton avant et
aprs pondration.
Si lon choisit la mthode wtaver, on divise le rsultat obtenu par wtsum par la somme des
degrs dappartenance :
cde =
La figure suivante montre la surface gnre par la variable de sortie en fonction des entres.
>>
>>
>>
>>
figure
fismat = readfis('reg_sug.fis');
gensurf(fismat)
title('surface engendre par la sortie du rgulateur')
791
20
cde
10
0
-10
-20
1
0.5
10
5
-0.5
derr
-5
-1
-10
err
Chapitre 16
792
% commande appliquer
u(i) = u(i-1)+0.2*du(i);
% perturbation t = 150
y(i) = y(i)+(i == 150);
end
% affichage des rsultats
plot(r,':'), axis([0 length(r) 0 9])
hold on, plot(y), grid
titre1 = 'rgulation par logique floue - ';
titre2 = 'signaux de consigne et de sortie';
title(strcat(titre1,titre2));
xlabel('temps discret'), ylabel('Mthode de Sugeno')
figure(2), stairs(u), xlabel('temps discret'), grid
title('signal de commande appliqu');
figure(3), stairs(du);
title('sortie du rgulateur flou')
xlabel('temps discret'), grid
figure(4), subplot(211), plot(err)
axis([0 length(err) -6 6])
title('erreur'), grid, subplot(212)
plot(d_err), axis([0 length(d_err) -6 6])
title('drive de l''erreur'), grid
xlabel('temps discret')
fuzzy regulation, target and process output signals
9
8
Sugeno's method
7
6
set-point
5
4
3
2
output
1
0
50
100
150
200
250
300
350
400
discrete time
A linstant discret t = 150, la perturbation est rejete avec un lger dpassement. Le signal de
commande appliqu au processus, par le rgulateur flou, est donn par la figure suivante.
793
4
3.5
3
2.5
2
1.5
1
0.5
0
-0.5
50
100
150
200
250
300
350
400
450
discrete time
La sortie du rgulateur flou (variations de commande) est reprsente par la courbe suivante :
fuzzy regulator output
15
10
-5
-10
-15
50
100
150
200
250
300
350
discrete time
400
450
Chapitre 16
794
6
4
2
0
-2
-4
-6
50
100
150
200
250
300
350
400
300
350
400
6
4
2
0
-2
-4
-6
50
100
150
200
250
discrete time
VI.2. Ralisation dun rgulateur flou par les commandes de la bote outils
795
err
err
err
err
est
est
est
est
Neg
Neg
Pos
Pos
et
et
et
et
d_err
d_err
d_err
d_err
est
est
est
est
N
P
N
P
alors
alors
alors
alors
cde
cde
cde
cde
1
1
1
1
est
est
est
est
0]);
0]);
0]);
0]);
NN';
NP';
PN';
PP'];
sys_flou = parsrule(sys_flou,regles,'verbose','francais');
Size
1x1
Bytes
5996
Class
struct
Attributes
Le singleton de sortie peut tre une constante au lieu de dpendre linairement des valeurs des
entres.
Dans ce cas, on choisit un nombre de valeurs suffisant dans lintervalle de dfinition de la
variable de sortie.
On se propose dans ce qui suit de modifier la nature du singleton de sortie, en considrant les
4 ensembles flous constants suivants :
GN = -10, N = -5, P = 5 et GP = 10
796
Chapitre 16
sys_flou = addmf(sys_flou,'output',1,'GN','constant',-10);
regles =['si err est Neg et d_err est Negat alors cde est GN';
'si err est Neg et d_err est Posit alors cde est N ';
'si err est Pos et d_err est Negat alors cde est P ';
'si err est Pos et d_err est Posit alors cde est
GP'];
sys_flou = parsrule(sys_flou,regles,'verbose','francais');
% sauvegarde sur disque du systme flou : reg_sug2.fis
writefis(sys_flou,'reg_sug3')
797
:
:
:
:
1
1
1
1
Le fichier cde_sug.m, dans lequel on fait appel la matrice reg du rgulateur flou
reg_sug3.fis, par la commande reg = readfis('reg_sug3), donne les
rsultats de poursuite suivants :
fuzzy regulation, target and process output signals
9
8
7
Sugeno's method
6
5
4
sortie
3
2
consigne
1
0
50
100
150
200
250
300
350
400
discrete time
Chapitre 16
798
applied control signal
2.5
1.5
0.5
50
100
150
200
250
300
350
400
450
discrete time
fuzzy regulator output
8
6
4
2
0
-2
-4
-6
-8
100
200
300
400
500
600
discrete time
Avec les mmes intervalles de dfinition des variables dentre, la commande est moins
stable quavec un singleton de sortie dpendant linairement des entres. On remarque, sur la
figure prcdente, une petite oscillation du signal de sortie du rgulateur, lors du rejet de la
perturbation et au changement de type du signal de consigne.
799
Pour avoir une commande plus stable, il faut augmenter le nombre densembles flous des
entres et celui des singletons de sortie. On considrera le fichier prog_flou5.m, dans
lequel on dfinit lerreur et sa variation dans lintervalle [-10 ; 10] avec 3 fonctions
dappartenance gaussiennes.
La variable de sortie sera ainsi dfinie par 5 singletons, rgulirement rpartis dans
lintervalle [-10 ;10].
fichier prog_flou5.m
% cration d'un rgulateur flou de type Sugeno
sys_flou = newfis('reg_sug4','sugeno');
% dfinition des variables d'entre : l'erreur et sa variation
interv_err = [-10 10];
interv_derr = [-10 10];
sys_flou = addvar(sys_flou,'input','err',interv_err);
% dfinition des ensembles flous des entres
% gaussiennes d'cart-type 8.5, centrs sur -10, 0 et 10
sigma = 8.5;
sys_flou = addmf(sys_flou,'input',1,'Neg','gaussmf',...
[sigma min(interv_err)]);
sys_flou = addmf(sys_flou,'input',1,'Nul','gaussmf',...
[sigma mean(interv_err)]);
sys_flou = addmf(sys_flou,'input',1,'Pos','gaussmf',...
[sigma max(interv_err)]);
% ajout de la 2me variable d'entre : drive de l'erreur
sys_flou = addvar(sys_flou,'input','d_err',interv_derr);
% gaussiennes d'cart-type 0.5, centrs sur -10, 0 et 10
sys_flou = addmf(sys_flou,'input',2,'Negat','gaussmf',...
[sigma min(interv_derr)]);
sys_flou = addmf(sys_flou,'input',2,'Zero','gaussmf',...
[sigma mean(interv_derr)]);
sys_flou = addmf(sys_flou,'input',2,'Posit','gaussmf',...
[sigma max(interv_derr)]);
% dfinition de la variable de sortie du rgulateur
interv_cde = [-10 10];
sys_flou = addvar(sys_flou,'output','cde',interv_cde);
% dfinition des 5 singletons constants de sortie
sys_flou = addmf(sys_flou,'output',1,'GN','constant',-10);
sys_flou = addmf(sys_flou,'output',1,'PN','constant', -5);
sys_flou = addmf(sys_flou,'output',1,'ZZ','constant',0);
sys_flou = addmf(sys_flou,'output',1,'PP','constant',5);
sys_flou = addmf(sys_flou,'output',1,'GP','constant',10);
Chapitre 16
800
regles=['si err est Neg et d_err est Negat alors cde est GN ';
'si err est Neg et d_err est Zero alors cde est PN ';
'si err est Neg et d_err est Posit alors cde est ZZ ';
'si err est Nul et d_err est Negat alors cde est PN ';
'si err est Nul et d_err est Zero alors cde est ZZ ';
'si err est Nul et d_err est Posit alors cde est PP ';
'si err est Pos et d_err est Negat alors cde est ZZ ';
'si err est Pos et d_err est Zero alors cde est PP ';
'si err est Pos et d_err est Posit alors cde est GP
'];
sys_flou = parsrule(sys_flou,regles,'verbose','francais');
% sauvegarde sur disque du systme flou : reg_sug2.fis
writefis(sys_flou,'reg_sug4')
% suppression des variables intermdiaires
clear sigma interv_cde regles base interv_derr base1
interv_err
On utilise le fichier de commandes cde_sug.m dans lequel on fait appel au rgulateur flou
reg_sug4.fis.
Avec un gain multiplicatif de 0.2, on observe une bonne poursuite de lchelon, contrairement
la partie fortement variable de la consigne.
Lerreur statique est nulle quelle que soit la valeur de ce gain, grce la prsence de
lintgration dans la loi de commande.
fuzzy regulation, target and process output signals
k=0.2
Sugeno's method
7
6
consigne
sortie
4
3
2
1
0
50
100
150
200
250
300
350
discrete time
400
801
k=0.7
8
Sugeno's method
7
6
5
4
3
2
1
0
50
100
150
200
250
300
350
400
discrete time
Si le signal de consigne est carr, plusieurs valeurs de ce gain permettent de modifier dans
une large mesure le temps de rponse.
Le fichier sugen_cde.m permet dillustrer leffet du gain multiplicatif de la sortie du
rgulateur, sur le temps de rponse du systme boucl.
fichier sugen_cde.m
% Rgulateur flou de Sugeno
% effet du gain sur le temps de rponse du systme boucl
close all
% lecture du rgulateur de Sugeno
reg = readfis('reg_sug4');
t = 0:600;
% signal de consigne carr
r = [zeros(1,50) 5*ones(1,100) zeros(1,50)];
r = [r r r]+2;
% diffrentes valeurs du gain multiplicatif
k =
0.1*(t<=200)+0.2*((t>200)&(t<=400))+0.9*((t>400)&(t<=600));
% initialisation de la commande et de lerreur
u = ones(1,2);
Chapitre 16
802
y = r;
err = zeros(1:2);
for i = 3:length(r)-1
% lecture de la sortie du processus
y(i) = 0.8*y(i-1)+u(i-1)-0.5*u(i-2);
% erreur et drive de l'erreur
err(i) = r(i+1)-y(i);
d_err(i) = err(i)-err(i-1);
% commande appliquer
x = [err(i) d_err(i)];
du(i) = evalfis(x,reg);
u(i) = u(i-1)+k(i)*du(i);
end
% affichage des rsultats
figure(1)
plot(r,':')
axis([0 length(r) 0 9])
hold on
plot(y)
grid
titre1 = 'rgulation par logique floue - ';
titre2 = 'signaux de consigne et de sortie';
title(strcat(titre1,titre2))
xlabel('temps discret')
ylabel('Mthode de Sugeno')
figure(2)
stairs(u)
xlabel('temps discret')
grid
title('signal de commande appliqu')
figure(3)
stairs(du)
title('sortie du rgulateur flou')
xlabel('temps discret')
grid
803
9
8
k=0.1
Sugeno's method
k=0.9
k=0.2
7
6
5
4
3
2
1
0
100
200
300
400
500
600
discrete time
regulator output
4
3
2
k=0.9
k=0.2
k=0.1
1
0
-1
-2
-3
-4
100
200
300
discrete time
400
500
600
Chapitre 16
804
applied control signal
4
3.5
3
k=0.9
k=0.2
k=0.1
2.5
2
1.5
1
0.5
0
-0.5
100
200
300
400
500
600
discrete time
Avec ce contrleur, nous avons la possibilit dobserver en temps rel, les variations des
variables du systme flou dans la fentre Ruleviewer.
Nous pouvons spcifier le nom du systme flou ainsi que la vitesse de rafrachissement.
805
Chapitre 17
Rseaux de neurones
I. Introduction
II. Rseaux de neurones linaires adaptatifs
II.1. Architecture
II.2. Loi dapprentissage
II.3. Quelques domaines dapplication
II.3.1. Identification de processus
II.3.2. Prdiction de signal
II.3.3. Suppression dinterfrence
III. Rseaux couches caches, rtropropagation
de lerreur
III.1. Principe
III.2. Fonctions de transfert
III.3. Algorithme de rtropropagation
IV. Commande par modle inverse neuronal
IV.1. Premire architecture
IV.2. Deuxime architecture
V. Prdiction de signal
I. Introduction
Les neurones, au nombre dune centaine de milliards, sont les cellules de base du systme
nerveux central. Chaque neurone reoit des influx nerveux travers ses dendrites
(rcepteurs), les intgre pour en former un nouvel influx nerveux quil transmet un neurone
voisin par le biais de son axone (metteur).
dendrites
axone
synapse
corps cellulaire
La modlisation des neurones biologiques par des neurones formels, datant des annes
quarante, a t faite par Mac Culloch et Pitts.
808
Chapitre 17
Le neurone formel reoit et met des signaux binaires (0/1). La somme pondre de toutes ses
entres est compare un seuil . Si ce seuil est dpass, le neurone sactive, sinon il ne
transmet aucun signal.
x1
W1
x2
W2
Wi xi
Wn
xn
1 si Wi xi >
s = f (Wi xi ) =
0 si Wi xi
Suivant le type de donnes traites (rel ou binaire), la fonction ralise (modlisation,
reconnaissance de formes, classification, etc.), il existe plusieurs types de rseaux. Le rseau
dit Perceptron peut tre considr comme le premier rseau de neurones spcialis pour la
classification.
Cet ouvrage, ne traitant que des applications lies au traitement du signal, nous ntudions
que les rseaux dit linaires adaptatifs (Adaline) et les rseaux couches caches.
1
W1
x2
xn
W2
Wi xi + b
Wn
Le neurone de type Adaline ralise une somme pondre des signaux quil reoit, laquelle il
ajoute un biais.
Cette activation passe travers une fonction de transfert linaire.
Rseaux de neurones
809
Lapprentissage du rseau consiste modifier, chaque pas, les poids et les biais afin de
minimiser la somme des carrs des erreurs en sortie en utilisant la loi de Widrow-Hoff.
A chaque pas dapprentissage, lerreur en sortie est calcule comme la diffrence entre la
cible recherche t et la sortie y du rseau.
La quantit minimiser, chaque pas dapprentissage k, est la variance de lerreur en sortie
du rseau.
1 T
T
T
E k = ekT ek = (t k y k ) T
k (t k y k ) = 2 (t k t k + y k y k 2 y k t k )
Le gradient de cette quantit par rapport la matrice de poids W est donn par :
1
E k / W = y kT y k 2 y kT t k
2
/W
Ce gradient peut se calculer comme suit :
E k / W =
E k E k yk
=
W
yk W
Ek
= yk t k
yk
(W x k + b) T
= xk
W
La mise jour se faisant dans le sens inverse du gradient, la matrice de poids W de ltape
future (k+1) est :
W ( k + 1) = W ( k ) E k / W = W ( k ) + (t k y k ) x kT
b( k + 1) = b( k ) E k / b = b( k ) + (t k y k )
Dans le cas gnral, un rseau de type Adaline possde une seule couche de S neurones.
Si le vecteur dentre est de taille R, la matrice de poids W est de dimensions (S, R). A
chaque pas dapprentissage, on calcule lerreur entre la sortie y = W x + b et le vecteur cible t
pour servir dans la rgle dapprentissage.
810
Chapitre 17
(R,1)
b
(S,1)
x
(S,R)
(S,1)
y
-
(R,1)
La bote outils Neural Network TOOLBOX propose la fonction learnwh pour
limplmentation de cette loi.
[dw, db] = learnwh(x,e,eta)
e
x
eta
dw
db
:
:
:
:
:
Les rseaux comportant des neurones de type Adaline sont capables de rsoudre des systmes
linaires. La commande
[w, b] = solvelin(x,t)
permet de dterminer un rseau de type Adaline en calculant les poids w et les biais b par une
mthode algbrique. Considrons le cas de lidentification dun modle ARMA dun
processus du type :
b1 + b2 z 1
H ( z ) = z 1
1 a1 z 1
Lquation de rcurrence liant la sortie y(t) lentre u(t),
y (t ) = a1 y (t 1) + b1 u(t 1) + b2 u(t 2)
peut tre mise sous la forme :
y (t 1
y (t ) = a1 b1 b2 u(t 1)
u(t 2)
Rseaux de neurones
811
A linstant dchantillonnage t = kT, la sortie y(t) peut tre considre comme la cible dun
neurone linaire comme suit :
1
y(t-1)
u(t-1)
Wx+b
y(t)
u(t-2)
avec :
812
Chapitre 17
2.5
2
1.5
1
0.5
0
-0.5
-1
-1.5
-2
10
20
30
40
50
60
70
80
90
100
samples
Nous obtenons exactement les valeurs, respectivement de a1, b1 et b2 comme les lments de
la matrice W de poids du neurone linaire.
Le biais correspondant au terme constant est ngligeable.
w =
1.0000
-0.5000
0.8000
b =
-5.9217e-017
Dans certains cas, cette commande utilisant des calculs matriciels, notamment linversion,
naboutit pas des rsultats ; il faut dans ce cas programmer lapprentissage de la loi de
Widrow-Hoff en utilisant la commande learnwh.
Rseaux de neurones
fichier adal_ident2.m
% neurone Adaline, loi de Widrow-Hoff
clear all, close all, clc
% Paramtres du modle chercher
A = conv([1 -0.8],[1 0]); B = [1 -0.5];
% signal SBPA d'entre (longueur 1023)
u = (-1).^(1:10);
N = 500; % nombre de points
for i = 11:N
u(i) = -u(i-7)*u(i-10);
end
y = (dlsim(B,A,u))' ;
% initialisation des poids et du biais
[W,b] = rands(1,3);
poids_W = cat(3,W);
biais_b = cat(3,b);
eta = 0.1;
% gain d'apprentissage
for i = 3:length(u)-1
% stimulus n i
p = [y(i-1) u(i-1) u(i-2)]';
% sortie du neurone
o = W*p + b;
% erreur
e = y(i) - o;
% calcul des variations des poids et du biais
[dw,db] = learnwh(p,e,eta);
% mise jour des matrices de poids W et de biais b
W = W + dw;
b = b + db;
% sauvegarde des poids et biais
poids_W = cat(3,poids_W,W);
biais_b = cat(3,biais_b,b);
end % boucle for
813
814
Chapitre 17
1.2
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
50
100
150
200
250
300
350
400
450
500
samples
Rseaux de neurones
815
fichier pred_adal.m
% prdiction de signal 1 pas
clear all
close all
clc
time = 0:0.05:10;
r = 0.5 + sin(time*2*pi);
% Initialisation alatoire des poids W et du biais b
S = 1;
% un neurone adaline
R = 5;
% nombre d'entres
[W,b] = rands(S,R);
% valeurs initiales des poids et biais
poids_W = cat(3,W);
biais_b = cat(3,b);
eta = 0.1;
% gain d'apprentissage
for i = 5:length(r)-1
% stimulus ni
x = [r(i) r(i-1) r(i-2) r(i-3) r(i-4)] ;
% sortie
y = W*x+b;
dr_est(i+1) = y;
r_est(i+1) = dr_est(i+1)+r(i);
% remise jour des poids et biais
e = r(i)-r(i-1)-dr_est(i);
% mise jour des matrices de poids W et de biais b
W = W+eta*e*x'; b = b+eta*e;
% sauvegarde des poids et biais
poids_W = cat(3,poids_W,W);
biais_b = cat(3,biais_b,b);
end % boucle for
disp(['valeurs finales des poids et du biais :']); W, b
% trac des diffrents signaux
figure(1)
hold on
plot(time, r_est)
plot(time,r,':')
title(['Signaux rel et prdit,
816
Chapitre 17
figure(2)
plot(e)
title(['erreur de prdiction,
hold on
plot(r-r_est)
hold off
= 0.1
2.5
2
1.5
1
0.5
0
-0.5
-1
temps
10
Rseaux de neurones
817
erreur de prdiction, = 0.1
1.5
0.5
-0.5
-1
-1.5
-2
0
10
time
0.4507
1.5
0.5
-0.5
-1
20
40
60
80
100
120
Echantillons
140
160
180
200
818
Chapitre 17
Evolution du biais, = 0.1
0.2
0.1
-0.1
-0.2
-0.3
-0.4
-0.5
20
40
60
80
100
120
140
160
180
200
Echantillons
Dans beaucoup de cas industriels, un signal utile x nest pas transmis correctement. Un signal
parasite p est cause dune interfrence. Le signal transmis est form du signal utile x auquel
sajoute un lment parasite proportionnel au bruit p.
x
x+kp
+
p
Le principe consiste prsenter lentre du neurone linaire le bruit p afin de reconstituer le
signal bruit. Comme le neurone est linaire, il cherchera la partie du signal cible
proportionnelle au bruit p : cest linterfrence. Lerreur entre la cible et la sortie du neurone
constituera le signal utile x que lon cherche extraire.
1
b
p
Wp+b
t = x +k p
^x
Rseaux de neurones
819
Cest le cas, par exemple, dune personne qui parle au tlphone dans un milieu bruyant
(atelier mcanique, message dun pilote, ...). On dsire transmettre un signal le plus proche
possible du message utile x.
Dans le cas o la totalit du signal est connue, on peut utiliser la fonction adaptwh de
syntaxe :
[y, e, W, b] = adaptwh(W, b, x, t, eta)
[y, e, W, b]
W, b, x, t, eta
:
:
fichier sup_interf1.m
% suppression d'une interfrence
clear all, close all, clc
temps = 0:0.1:10;
r = sin(temps*4*pi);
%
R
S
%
p
% signal bruit
t = r + 0.833*p;
% initialisation de W et b
[W,b] = initlin(p,t);
figure(1), plot(temps,t)
title('cible prdire = signal bruit'), xlabel('temps')
[y,e] = adaptwh(W,b,p,t,0.1);
figure(2)
plot(r,':')
hold on
plot(e)
title('signal utile = signal d''erreur')
hold off
figure(3)
plot(r-e)
title('erreur = signal utile - signal reconstruit')
xlabel('temps')
% poids et biais finaux
w, b
820
Chapitre 17
cible prdire = signal bruit
-1
-2
-3
0
10
temps
signal utile = signal d'erreur
3
2.5
2
1.5
1
0.5
0
-0.5
-1
-1.5
-2
20
40
60
80
100
120
Rseaux de neurones
1.5
821
erreur = signal utile - signal reconstruit
0.5
-0.5
-1
-1.5
-2
0
20
40
60
80
100
120
temps
fichier sup_interf2.m
% suppression d'une interfrence
clear all
close all, clc
temps = 0:0.05:20;
r = sin(temps*pi);
%
S
R
%
p
% signal bruit
t = r + 0.833*p;
822
Chapitre 17
% initialisation de W et b
W = randn(1,1);
b = randn(1,1);
poids_W = W;
biais_b = b;
figure(1)
plot(temps,t)
title('cible prdire = signal bruit')
xlabel('temps')
eta = 0.02;
for i = 1:length(temps)
% sortie du neurone
y(i) = W*p(i)+b;
% erreur en sortie
e(i) = t(i) - y(i);
[dW,db] = learnwh(p(i),e(i),eta);
% mise jour des matrices de poids W et de biais b
W = W+dW;
b = b+db;
% sauvegarde des poids et biais
poids_W = [poids_W,W];
biais_b = [biais_b,b];
end
figure(2)
plot(temps,r,':')
hold on
plot(temps,e)
title('signal utile = signal d''erreur')
hold off
figure(3)
plot(temps,r-e)
title('erreur = signal utile - signal reconstruit')
hold on
plot(temps,zeros(size(t)))
xlabel('temps')
Rseaux de neurones
823
cible prdire = signal bruit
-1
-2
-3
0
10
12
14
16
18
20
16
18
20
temps
signal utile = signal d'erreur
1.5
0.5
-0.5
-1
-1.5
-2
0
10
12
14
824
Chapitre 17
erreur = signal utile - signal reconstruit
1.2
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
10
12
14
16
18
20
temps
Ce type de rseau possde une ou plusieurs couches intermdiaires, dites couches caches.
1
x1
h1
o1
h2
o2
x2
hL
xI
I cellules
couche d'entre
oJ
L cellules
couche cache
J cellules
couche de sortie
Les cellules de la couche dentre propagent le stimulus vers la couche cache via des
connexions. Le vecteur dentre de la couche cache est donn, sous forme matricielle, par :
h _ in = W x + w0
Rseaux de neurones
825
o = g ( Z h + z0)
Les matrices de poids W, Z et les vecteurs biais w0, z0 sont initialiss des valeurs alatoires.
Le vecteur de sortie du rseau est ensuite compar au vecteur cible t que lon cherche
obtenir et lon dduit lerreur ( t o ) en sortie du rseau. Cette erreur sera rtropropage dans
le rseau afin de mettre jour les matrices de poids et les vecteurs de biais suivant un
algorithme dit de rtropropagation de lerreur qui minimise la somme des carrs des erreurs
commises sur lensemble des stimuli.
III.2. Fonctions de transfert
f 1 ( x) =
1
1+ e x
sigmode unipolaire
f 1' ( x ) = f 1 ( x ) 1 f 1 ( x )
sigmode bipolaire
f 2 ( x) =
1 e x
= 2 f 1 ( x ) 0.5
1 + ex
f 2' ( x ) =
1
1 + f 2 ( x) 1 f 2 ( x)
2
][
tangente hyperbolique
f 3 ( x) =
ex ex
e x + ex
826
Chapitre 17
f 3' ( x ) =
4
(e x + e x ) 2
Le fichier f_activ.m permet de tracer les fonctions dactivation les plus couramment
utilises.
fichier f_activ.m
close all
x = -6:0.1:6;
% sigmode unipolaire
sigm_unip = logsig(x);
% tangente hyperbolique
tnh = tanh(x);
% sigmode bipolaire
sigm_bip = 2*logsig(x)-1;
plot(n,tnh)
grid
gtext('tangente hyperbolique')
hold
plot(x,sigm_unip,':')
gtext('sigmode unipolaire')
plot(x,sigm_bin,'--')
gtext('sigmode bipolaire')
title('diffrentes fonctions d''activation')
diffrentes fonctions d'activation
1
0.8
0.6
0.4
sigmode unipolaire
sigmode bipolaire
0.2
0
-0.2
-0.4
-0.6
tangente hyperbolique
-0.8
-1
-6
-4
-2
Rseaux de neurones
827
Lutilisation de lune de ces fonctions impose des conditions sur lamplitude des signaux
dentre et de sortie du rseau. Pour cela, on dfinit une fonction sigmodale dont on peut
modifier la pente et les valeurs extrmes.
Si lon veut modifier seulement la pente, on considre la fonction
f 4 ( x ) = f 1 ( x ) =
1
1 + e x
g ( x ) = f 4 ( x )
qui permet davoir g ( x ) = et g ( x ) = .
Si lon veut que les valeurs de la fonction soient symtriques m , il faut choisir = 2 .
La drive, comme pour les autres fonctions sigmodales, sexprime facilement par
lexpression de la fonction de transfert :
g '( x ) =
[ + g( x)][ g( x)]
828
Chapitre 17
abs2 = [4 2 1];
[g2,gp2] = sig_param(x,abs2);
plot(x,g2,':')
text(-2,-1.5,'\alpha = 4, \beta= 2, \sigma= 1 \rightarrow
',...
'HorizontalAlignment','right')
abs3 = [3 1 0.5];
[g3,gp3] = sig_param(x,abs3);
plot(x,g3,'-.')
text(-1.6,0,'\alpha=3, \beta=1, \sigma = 0.5 \rightarrow ',...
'HorizontalAlignment','right')
axis([-10 10 -2.5 2.5])
title('sigmode de pente et de valeurs extrmes variables')
xlabel('activation x')
gtext('g(x) = \alpha/(1+e^{-\sigma x}) - \beta')
% trac des drives de ces sigmodes
figure(2)
plot(x,gp1), hold on
plot(x,gp2,':'), plot(x,gp3,'-.')
title('drives des sigmodes')
xlabel('activation x')
axis([-10 10 0 2.4])
gtext('g''(x) = \alpha [\beta + g(x)] [\alpha-\beta - g(x)]')
Rseaux de neurones
2.5
829
g(x) = /(1+e ) -
1.5
1
0.5
0
-0.5
-1
-1.5
= 4, = 2, = 1
=4, = 2, = 2
-2
-2.5
-10
-8
-6
-4
-2
10
10
activation x
1.5
0.5
0
-10
-8
-6
-4
-2
activation x
La bote outils Neural Network TOOLBOX propose les fonctions de transfert suivantes :
830
Chapitre 17
:
:
:
logsig
tansig
purelin
sigmode unipolaire,
tangente hyperbolique,
fonction de transfert linaire.
Pour chacune de ces fonctions, la drive est calcule, respectivement par deltalog,
deltatan et deltalin.
deltalog(o)
On note :
X
xk
T
tk
hk
ok
W
:
:
:
:
:
:
w0
Z
:
:
z0
Rseaux de neurones
831
rtropropagation de lerreur
Lapprentissage du rseau consiste modifier, chaque pas dapprentissage, les poids et les
biais afin de minimiser la somme des carrs des erreurs en sortie. La mthode de
rtropropagation est base sur la technique du gradient.
La quantit minimiser, chaque pas dapprentissage k, est la variance de lerreur en sortie
du rseau.
1
Ek = ekT ek = ( t kT t k + okT ok 2 okT t k )
2
1
E k / Z = [okT ok 2 okT t k ] / Z
2
Si lon considre des fonctions de transfert identiques pour les 2 couches (f g), la sortie du
rseau est donne par :
ok = f Z hk + z 0
Ek Ek
ok
( Z hk + z 0)
=
Z
ok ( Z hk + z0)
Z
Ek
= ok t k
ok
La deuxime drive partielle dpend du type de fonction de transfert utilise. Dans le cas de
la sigmode unipolaire, la deuxime drive partielle a pour expression :
ok
= f ( Z hk + z 0) .*[1 f ( Z hk + z 0)] = ok .*(1 o k )
( Z hk + z0)
avec 1 reprsentant un vecteur unitaire de mme taille que le vecteur de sortie ok et
loprateur .* dfinit le produit terme terme ou produit de Hadamard.
La troisime drive partielle est simple calculer :
( Z hk + z0) T
= hk
Z
La mise jour se faisant dans le sens inverse du gradient, la matrice de poids Z de ltape
future (k+1) est :
Z ( k + 1) = Z ( k ) E k / z = Z ( k ) + ( t k ok ) .* ok .* (1 ok ) hkT = Z ( k ) + s hkT
832
Chapitre 17
et
w0( k + 1) = w0( k ) E k / w 0 = w0( k ) + Z ( k )T s .* hk .* (1 hk ) = w0( k ) + h
La bote outils Neural Network TOOLBOX propose des fonctions pour le calcul de la
drive de lerreur en sortie dune couche quelconque du rseau et en celle de la couche
cache prcdente. Si lon considre le rseau prcdemment dfini, avec une seule couche
cache, ces fonctions dites delta, permettent de calculer les erreurs s et h .
deltalog(o)
deltalog(o,e)
deltalog(h,ds,Z) :
Ces diffrentes syntaxes propres la fonction sigmode unipolaire, sont les mmes pour les
fonctions de transfert deltatan et deltalin.
Rseaux de neurones
833
z 1 (0.3 + 0.05 z 1 )
1 0.7 z 1
auquel on appliquera un signal de commande u(t), form dune squence binaire pseudoalatoire de hauteur 1 et de longueur 1023 que lon superpose une valeur constante gale
5, correspondant un point de fonctionnement du processus.
A partir du fichier contenant u(t) et y(t), on calcule les variations u(t ) = u(t ) u(t 1) et
y(t ) = y(t ) y(t 1) .
Avec lutilisation de la sigmode unipolaire, on doit normaliser les diffrents signaux,
u( t ), y ( t ), u( t ) et y ( t ) entre les valeurs limites 0.1 et 0.9.
w0
y N (t + 1)
z0
y N (t )
u N (t )
y N (t )
y N (t 1)
u N (t 1)
u N (t 1)
834
u = 5*ones(1,temps);
% gnration de la squence SBPA
sbpa = (-1).^(1:10);
for i = 11:length(u)
sbpa(i) = -sbpa(i-10)*sbpa(i-7);
end
u = u+sbpa;
% calcul de la sortie du modle
num = [0.3 0.05];
den = conv([1 0],[1 -0.7]);
y = (dlsim(num,den,u))';
% suppression des rgimes transitoires
u(1:10) = []; y(1:10) = [];
% trac du signal de commande et de la sortie du modle
stairs(u)
hold on
h = plot(y);
set(h,'LineWidth',2)
title('Signal de commande et sortie du modle')
xlabel('temps discret'), grid, hold off
axis([0 length(u) 3.5 7])
gtext('commande S.B.P.A.')
gtext('sortie')
% suppression des variables inutiles
clear num den h i sbpa temps
Chapitre 17
Rseaux de neurones
835
Signal de commande et sortie du modle
sortie
6.5
5.5
4.5
4
commande S.B.P.A.
3.5
0
20
40
60
80
100
120
140
160
180
temps discret
Daprs la structure prcdente du rseau, nous avons besoin de normaliser les signaux
dentre et de sortie ainsi que leurs variations. Le fichier es_norm1.m normalise ces
diffrents signaux et les stocke dans le fichier es_N1.mat. Les coefficients de
normalisation, qui seront utiles dans la loi de commande, sont sauvegards dans le fichier
ab_norm1.mat.
fichier es_norm1.m
% variation de l'entre et de la sortie
du = diff(u); dy = diff(y);
% suppression de la dernire valeur de u et y
u(length(u)) = []; y(length(y)) = [];
% Normalisation des diffrents signaux entre 0.1 et 0.9
[du_N,a_du,b_du] = normalis(du,0.1,0.9);
[dy_N,a_dy,b_dy] = normalis(dy,0.1,0.9);
[u_N,a_u,b_u] = normalis(u,0.1,0.9);
[y_N,a_y,b_y] = normalis(y,0.1,0.9);
% sauvegarde dans fichier "signaux.mat"
es_N1 = [dy_N;y_N;u_N;du_N]; save signaux es_N1
% coefficients a et b de normalisation des E/S
save ab_norm1 a_du b_du a_dy b_dy a_y b_y a_u b_u
clear all
836
Chapitre 17
Nous utilisons le fichier fonction normalis.m pour normaliser un signal entre les valeurs
alpha et beta, et retourner les coefficients a et b de la droite de normalisation.
fichier fonction normalis.m
function [xN,a,b] = normalis(x,alpha,beta)
a = (beta-alpha)/(max(x)-min(x));
b = beta-a*max(x);
xN = a*x+b;
Rseaux de neurones
837
Les matrices de poids et les vecteurs de biais sont sauvegards dans le fichier
weights1.mat sous forme de tableaux multidimensionnels o chaque page reprsente le
rsultat obtenu chaque itration.
Dans le fichier lire_poids.m, on trace lvolution des poids W1k (k=1 5), liant la
premire cellule dentre toutes celles de la couche cache, tous les biais des cellules de la
couche cache ainsi que tous les lments de la matrice Z et le biais z0 de la cellule de sortie.
fichier lire_poids.m
clear all
load weights1
N = length(poids_W)
W = poids_W(:,:,N), w0 = biais_w0(:,:,N)
Z = poids_Z(:,:,N), z0 = biais_z0(:,:,N)
% trac de l'volution des poids W11, W12, W13 et W14
Nb_Iu = 6; Nb_Hu = 7; Nb_Ou = 1;
for k = 1:Nb_Hu
x = poids_W(k,1,1:100);
plot(x(:))
hold on
end
838
Chapitre 17
A la fin de lapprentissage, on obtient les matrices suivantes des poids W et Z ainsi que les
biais w0 et z0.
Comme les poids et les biais sont initialiss de faon alatoire, on nobtient jamais les mmes
valeurs finales chaque apprentissage.
W =
-1.6033
2.9130
-2.3355
1.2532
-0.6187
0.8187
0.4436
w0 =
-0.1236
-0.2509
0.1125
0.0375
0.4022
-0.3227
0.1946
0.4364
-1.5538
1.2993
-0.0377
0.5576
-0.1380
-0.6641
0.2059
0.2580
-0.1474
0.4334
-0.3808
-0.1528
0.0232
-0.2863
0.1130
0.0618
-0.0441
0.3577
0.3798
0.2985
0.0839
-0.2805
0.3341
-0.5160
-0.2688
-0.2569
-0.0241
1.2180
-0.9558
0.6473
-0.6047
0.6438
0.0907
-0.2073
Rseaux de neurones
Z =
-1.9933
0.6931
839
3.5470
-2.8655
1.2070
-1.0029
0.6890
z0 =
-0.1336
Lvolution des poids et des biais chaque itration de lapprentissage est donne par les
courbes suivantes.
volution des poids W1k
-1
-2
-3
10
20
30
40
50
60
70
80
90
100
itrations
Au bout dune cinquantaine ditrations, on obtient une bonne convergence des poids et des
biais. Malgr la valeur assez leve du gain dadaptation, les diffrents poids et biais ne
varient plus au-del de la 100me itration.
840
Chapitre 17
volution des biais des cellules de la couche cache
0.6
0.5
0.4
0.3
0.2
0.1
0
-0.1
-0.2
-0.3
-0.4
10
20
30
40
50
60
70
80
90
100
70
80
90
100
itrations
volution des poids Z
-1
-2
-3
0
10
20
30
40
50
itrations
60
Rseaux de neurones
841
volution du biais de la cellule de sortie
0
-0.02
-0.04
-0.06
-0.08
-0.1
-0.12
-0.14
-0.16
-0.18
10
20
30
40
50
60
70
80
90
100
itrations
Pour vrifier la qualit de lapprentissage, on utilisera les mmes signaux normaliss que lon
applique au rseau dont les poids et les biais sont figs aux valeurs finales. La comparaison de
la variation de commande normalise en sortie du rseau et celle du fichier, permet de
montrer la qualit didentification du modle inverse.
fichier ver_app1.m
clear all; close all
% lecture du fichier E/S normalises
load signaux
dy_N = es_N1(1,:);
y_N = es_N1(2,:);
u_N = es_N1(3,:);
du_N = es_N1(4,:);
% lecture du fichier des poids et biais
load weights1
N = length(poids_W)-1
W = poids_W(:,:,N)
w0 = biais_w0(:,:,N)
Z = poids_Z(:,:,N)
z0 = biais_z0(:,:,N)
clear poids_W poids_Z biais_w0 biais_z0
for i = 2:length(es_N1)-1
% stimulus n i
842
Chapitre 17
Au bout des 300 itrations, on obtient une similitude quasi parfaite entre la rponse du rseau
et le signal rel apprendre.
rponses relle et dsire du rseau aprs 300 itrations
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
10
20
30
40
50
60
70
80
90
100
Rseaux de neurones
843
0.2
0.15
0.1
0.05
0
-0.05
-0.1
-0.15
-0.2
10
20
30
40
50
60
70
80
90
100
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
10
20
30
40
50
60
70
80
90
100
844
Chapitre 17
erreur d'apprentissage aprs 5itrations
0.2
0.15
0.1
0.05
0
-0.05
-0.1
-0.15
-0.2
10
20
30
40
50
60
70
80
90
100
Pour raliser un systme de commande avec le modle inverse neuronal, la premire cellule
de la couche dentre recevra la valeur normalise de lcart entre la valeur future r (t + 1) de
la consigne et la valeur courante de la sortie, y (t ) , du processus.
-
r (t + 1) +
u N (t )
y N (t + 1)
u(t )
u N (t )
DN
+
+
H(z)
y (t )
u( t )
N
u(t 1)
y N (t )
Rseaux de neurones
fichier cde_nr1.m
% commande par modle inverse neuronal
clear all; close all, clc
load weights1 % lecture des poids
N = length(poids_W);
W = poids_W(:,:,N); w0 = biais_w0(:,:,N);
Z = poids_Z(:,:,N); z0 = biais_z0(:,:,N);
clear poids_W poids_Z biais_w0 biais_z0
% lecture des coefficients de normalisation
load ab_norm1
% gnration de la consigne
palier1 = 5*ones(1,100); palier2 = 6*ones(1,100);
r1 = [palier1 palier2];
t = 0:pi/100:2*pi; r2 = 6+sin(0.8*t);
r = [r1 r2]; y = r; % initialisation de la sortie du modle
u = 5*ones(size(r)); y_N = a_y*y+b_y;
du_N = zeros(size(r)); u_N = a_u*u+b_u;
for i = 3:length(r)-1
% lecture de la sortie du processus
y(i) = 0.7*y(i-1)+0.3*u(i-1)+0.05*u(i-2);
% normalisation de l'erreur
err = a_dy*(r(i+1)-y(i))+b_dy;
% normalisation de l'incrment de sortie
dy_N = a_dy*(y(i)-y(i-1))+b_dy;
% normalisation de la sortie
y_N(i) = a_y*y(i)+b_y;
% stimulus n i
x = [err dy_N y_N(i) y_N(i-1) u_N(i-1) du_N(i-1)]';
% activation des cellules de la couche cache
h_in = W*x+w0;
h_in = h_in.*(-5<=h_in<=5)-5.*(h_in<-5)+5.*(h_in>5);
% sortie des cellules de la couche cache
h_out = logsig(h_in);
% activation des cellules de la couche cache
o_in = Z*h_out+z0;
o_in = o_in.*(-5<=o_in<=5)-5.*(o_in<-5)+5.*(o_in>5);
% sortie des cellules de la couche cache
du_N(i) = logsig(o_in);
% rponse des cellules de la couche de sortie
u(i) = ((du_N(i)-b_du)/a_du)*0.1+u(i-1);
u_N(i) = a_u*u(i)+b_u;
% cration d'une perturbation k=300
y(i) = y(i)-(i==300)/2;
end
% boucle for
% trac des diffrents signaux
figure(1), plot(y), hold, plot(r,'-.')
title('Consigne et sortie')
xlabel('temps discret'), axis([0 400 4.5 7.2])
text(110,5.7,'\leftarrow signal de sortie',...
'HorizontalAlignment','left')
845
846
Chapitre 17
6.5
consigne
signal de sortie
5.5
4.5
50
100
150
200
250
300
350
400
temps discret
A linstant discret t = 300, on a cr une perturbation sur la sortie du modle. Comme pour la
poursuite de lchelon, cette perturbation est rejete avec un lger dpassement.
signal de commande
6
5.5
4.5
50
100
150
200
250
temps discret
300
350
400
Rseaux de neurones
847
Une autre structure de rseau modlisant le modle inverse du processus est la suivante.
1
w0
y N (t + 1)
z0
y N (t )
u N (t )
y N (t 1)
y N (t 2)
u N (t 1)
u N (t 2)
848
Chapitre 17
fichier apprent2.m
% Apprentissage du rseau
clear all, close all
% lecture du fichier E/S normalises
load signaux
u_N = es_N2(1,:);
y_N = es_N2(2,:);
% Nombre de cellules d'entre (6), caches(7) et de sortie (1)
Nb_Iu = 6; Nb_Hu = 7; Nb_Ou = 1;
% Initialisation alatoire des poids W, Z et des biais w0 et
z0
W = rand(Nb_Hu,Nb_Iu)-0.5; w0 = rand(Nb_Hu,1)-0.5;
Z = rand(Nb_Ou,Nb_Hu)-0.5; z0 = rand(Nb_Ou,1)-0.5;
N_iter = 300; % nombre d'itrations
eta = 0.8;
% gain d'apprentissage
k = 0;
while k<=N_iter
k = k+1;
for i = 3:length(es_N2)-1
% stimulus n i
x=[y_N(i+1) y_N(i) y_N(i-1) y_N(i-2) u_N(i-1) u_N(i2)]';
% rponses des cellules de la couche cache
h = logsig(W*x+w0);
% rponses des cellules de la couche de sortie
o(i) = logsig(Z*h+z0);
% erreur en sortie du rseau
e(i) = u_N(i)-o(i);
% erreur rtropropager
delta(i) = o(i).*(ones(Nb_Ou,1)-o(i)).*e(i);
% mise jour des matrices de poids Z et de biais z0
Z = Z+eta*delta(i)*h'; z0 = z0+eta*delta(i);
% erreur en couche cache
dh = h.*(ones(size(h))-h).*(Z'*delta(i));
% mise jour des matrices de poids W et de biais w0
W = W+eta*dh*x';
w0 = w0+eta*dh;
end % boucle for
poids_W(:,:,k) = W; poids_Z(:,:,k) = Z;
Rseaux de neurones
849
Les diffrentes matrices des poids et des biais sont affiches en excutant le fichier
lire_poids.m dans lequel on remplace la premire ligne de commande load
weights1 par load weights2.
W =
-1.6033
2.9130
-2.3355
1.2532
-0.6187
0.8187
0.4436
0.4364
-1.5538
1.2993
-0.0377
0.5576
-0.1380
-0.6641
0.2059
0.2580
-0.1474
0.4334
-0.3808
-0.1528
0.0232
-0.2863
0.1130
0.0618
-0.0441
0.3577
0.3798
0.2985
0.0839
-0.2805
0.3341
-0.5160
-0.2688
-0.2569
-0.0241
1.2180
-0.9558
0.6473
-0.6047
0.6438
0.0907
-0.2073
3.5470
-2.8655
1.2070
-1.0029
0.6890
w0 =
-0.1236
-0.2509
0.1125
0.0375
0.4022
-0.3227
0.1946
Z =
-1.9933
0.6931
z0 =
-0.1336z0 =
-0.5345
Les courbes dvolution des diffrents poids et des biais sont reprsentes par les figures
suivantes, dans lesquelles on observe une convergence, comme dans le cas prcdent, au bout
dune cinquantaine ditrations.
850
Chapitre 17
volution des poids W1k
-1
-2
-3
10
20
30
40
50
60
70
80
90
100
itrations
volution des biais des cellules de la couche cache
0.6
0.5
0.4
0.3
0.2
0.1
0
-0.1
-0.2
-0.3
-0.4
10
20
30
40
50
itrations
60
70
80
90
100
Rseaux de neurones
851
volution des poids Z
-1
-2
-3
0
10
20
30
40
50
60
70
80
90
100
90
100
itrations
0
-0.02
-0.04
-0.06
-0.08
-0.1
-0.12
-0.14
-0.16
-0.18
10
20
30
40
50
itrations
60
70
80
852
Chapitre 17
Rseaux de neurones
853
'itrations'])
disp(['erreur maximale : ' num2str(max(erreur))])
disp(['variance de l''erreur : ' num2str(std(erreur)^2)])
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
10
20
30
40
50
60
70
80
90
100
854
Chapitre 17
erreur d'apprentissage aprs 100itrations
0.2
0.15
0.1
0.05
0
-0.05
-0.1
-0.15
-0.2
10
20
erreur maximale
variance de l'erreur :
30
40
50
60
70
80
90
100
: 0.011183
: 0.016032
La variance de lerreur est sensiblement gale sa valeur maximale en valeur absolue, soit
approximativement 10-2
Cette erreur a lieu seulement sur les paliers de la commande, ce qui entranera ncessairement
une erreur de poursuite en rgime permanent, dans la mesure o la loi de commande, du fait
de la structure du rseau, ne contiendra pas dintgration.
Dans la loi de commande, la premire cellule de la couche dentre reoit la valeur future du
signal de consigne, ce qui a pour effet, comme dans le cas prcdent, de supprimer le retard
dun pas dchantillonnage de la sortie sur la consigne.
Aprs sa dnormalisation, la rponse du rseau constituera le signal de commande qui sera
directement appliqu au processus.
Rseaux de neurones
855
Modle inverse neuronal
r (t + 1)
N
u N (t )
Processus
DN
y (t )
u( t )
N
y N (t )
856
Chapitre 17
Rseaux de neurones
857
Consigne et sortie
6.5
perturbation en sortie
5.5
4.5
50
100
150
200
250
300
350
400
300
350
400
temps discret
signal de commande
6
5.5
4.5
50
100
150
200
250
temps discret
858
Chapitre 17
Pour supprimer cette erreur en rgime permanent, on peut, soit inclure une commande
intgrale que lon ajoute celle fournie par le rseau, soit mettre jour les matrices de poids
et de biais des 2 couches du rseau chaque priode dchantillonnage (commande
adaptative).
Commande adaptative
r (t + 1)
u N (t )
z 1
Processus
DN
y (t )
u( t )
Rseaux de neurones
% gain d'adaptation des poids
eta = 0.2;
% gnration de la consigne
palier1 = 5*ones(1,100);
palier2 = 6*ones(1,100);
r1 = [palier1 palier2];
t = 0:pi/100:2*pi;
r2 = 6+sin(t);
r = [r1 r2];
y =
u =
y_N
u_N
859
860
Chapitre 17
u(i) = (u_N(i)-b_u)/a_u;
% cration d'une perturbation k = 300
y(i) = y(i)-(i==300)/2;
% remise jour des poids et biais
e = r(i)-y(i);
% erreur rtropropager
delta = o.*(ones(1,1)-o).*e;
% mise jour des matrices de poids Z et de biais z0
Z = Z+eta*delta*h';
z0 = z0+eta*delta;
% erreur en couche cache
dh = h.*(ones(size(h))-h).*(Z'*delta);
% mise jour des matrices de poids W et de biais w0
W = W+eta*dh*x';
w0 = w0+eta*dh;
Rseaux de neurones
861
xlabel('temps discret')
% trac de l'volution des biais de la couche cache
figure(4)
for k = 1:5
x = biais_w0(k,1,:);
plot(x(:)), hold on
end
hold off
grid
title('biais de la couche cache')
xlabel('temps discret')
% trac de l'volution des poids Z par adaptation
figure(5)
for k = 1:5
x = poids_Z(1,k,:);
plot(x(:))
hold on
end
hold off, grid
title('poids Z')
xlabel('temps discret')
% trac de l'volution du biais z0 par adaptation
figure(6)
plot(biais_z0(:)
grid
title('biais de la cellule de sortie')
xlabel('temps discret')
Les diffrents poids et les biais sont initialiss aux valeurs obtenues lors de ltape
dapprentissage.
On remarque que lerreur statique est compltement annule, mais comme pour la commande
avec intgration, la perturbation est rejete avec dpassement.
Le temps de rponse, ainsi que le dpassement, dpendent du gain dadaptation des poids et
des biais.
Avec un gain dadaptation de 0.2, la perturbation est rejete sans trop de dpassement.
862
Chapitre 17
Consigne et sortie, Gain = 0.2
7
6.5
5.5
4.5
50
100
150
200
250
300
350
400
350
400
temps discret
5.5
4.5
50
100
150
200
250
temps discret
300
Rseaux de neurones
863
Les figures suivantes reprsentent lvolution des diffrents poids et biais du rseau,
initialiss aux valeurs obtenues lors de ltape dapprentissage.
poids W1k
8
6
4
2
0
-2
-4
-6
-8
50
100
150
200
250
300
350
400
450
350
400
450
temps discret
biais de la couche cache
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
50
100
150
200
250
temps discret
300
864
Chapitre 17
poids Z
8
6
4
2
0
-2
-4
-6
-8
50
100
150
200
250
300
350
400
450
350
400
450
temps discret
biais de la cellule de sortie
1.4
1.39
1.38
1.37
1.36
1.35
1.34
1.33
50
100
150
200
250
300
temps discret
Les poids W et Z ne varient pas beaucoup, contrairement aux biais, car lerreur annuler est
plutt statique. Avec un gain de 0.8, le temps de rponse est plus faible mais le rejet de la
perturbation saccompagne dun dpassement.
Rseaux de neurones
865
Cons igne et s ortie, G ain = 0.8
6.5
5.5
4.5
50
100
150
200
250
tem ps dis c ret
300
350
400
1 + 1 + 2
c( t )
1 + 1 z 1 + 2 z 2
avec :
1 = 2 e w T cos( 1 2 w0 T )
0
2 = e 2 w T
0
866
Chapitre 17
Rseaux de neurones
% normalisation de la consigne future
r_N = a_y*r(i+1)+b_y;
% normalisation de la sortie actuelle
y_N(i) = a_y*y(i)+b_y;
% stimulus n i
x = [r_N y_N(i) y_N(i-1) y_N(i-2) u_N(i-1) u_N(i-2)]';
% activation des cellules de la couche cache
h_in = W*x+w0;
h_in = h_in.*(-5<=h_in<=5)-5.*(h_in<-5)+5.*(h_in>5);
% sortie des cellules de la couche cache
h = logsig(h_in);
% activation des cellules de la couche de sortie
o_in = Z*h+z0;
o_in = o_in.*(-5<=o_in<=5)-5.*(o_in<-5)+5.*(o_in>5);
% rponse des cellules de la couche de sortie
o = logsig(o_in);
% signal de commande normalis
u_N(i) = o;
% dnormalisation de la commande
u(i) = (u_N(i)-b_u)/a_u;
% remise jour des poids et biais
e = r(i)-y(i);
% erreur rtropropager
delta = o.*(ones(1,1)-o).*e;
% mise jour des matrices de poids Z et de biais z0
Z = Z+eta*delta*h';
z0 = z0+eta*delta;
% erreur en couche cache
dh = h.*(ones(size(h))-h).*(Z'*delta);
% mise jour des matrices de poids W et de biais w0
W = W+eta*dh*x'; w0 = w0+eta*dh;
% sauvegarde des poids et biais
poids_W = cat(3,poids_W,W);
biais_w0 = cat(3,biais_w0,w0);
poids_Z = cat(3,poids_Z,Z);
biais_z0 = cat(3,biais_z0,z0);
end % boucle for
867
868
Chapitre 17
Avec un gain dapprentissage de 0.1, le temps de rponse est assez lev, ce qui se traduit par
une erreur entre le signal de sortie et celui de rfrence.
Rseaux de neurones
869
Consigne et sortie, Gain = 0.1
6.4
6.2
6
5.8
5.6
5.4
5.2
5
50
100
150
200
250
temps discret
300
350
400
450
Une valeur plus leve du gain dadaptation permet de rduire le temps de rponse et
damliorer la qualit de la poursuite. La figure suivante montre que les signaux de rfrence
et de sortie sont quasiment confondus avec un gain de 0.5.
Consigne et sortie, Gain = 0.5
6.4
6.2
6
5.8
5.6
5.4
5.2
5
50
100
150
200
250
temps discret
300
350
400
450
870
Chapitre 17
signal de commande, Gain = 0.5
5.2
4.8
4.6
4.4
4.2
3.8
50
100
150
200
250
300
350
400
450
temps discret
On peut remarquer que les poids liant la couche dentre la couche cache ne varient
presque pas par rapport leurs valeurs obtenues lors de lapprentissage hors ligne. Il en est
presque de mme pour les poids reliant la couche cache la cellule de sortie. Par contre, les
biais subissent des variations suivant la forme du signal de rfrence poursuivre.
biais de la couche cache, Gain = 0.5
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
50
100
150
200
250
temps discret
300
350
400
450
Rseaux de neurones
871
biais de la cellule de sortie, Gain = 0.5
1.375
1.37
1.365
1.36
1.355
1.35
1.345
1.34
1.335
1.33
0
50
100
150
200
250
300
350
400
450
temps discret
V. Prdiction de signal
On se propose dutiliser un rseau de neurones afin de prdire, chaque instant
dchantillonnage t=kT, la valeur future dun signal (prdiction 1 pas).
Le rseau darchitecture suivante apprend en temps rel pour estimer la variation future du
signal.
r(t)
r(t)-r(t-1)
r(t-1)
^r (t + 1) = r^( t + 1) r ( t )
r(t-1)-r(t-2)
En ajoutant la valeur disponible linstant t, on dduit la valeur future estime, comme le
montre le schma suivant.
Lerreur entre la variation du signal linstant t et celle prdite linstant (t-1) sera
rtropropage dans le rseau pour permettre lapprentissage.
872
Chapitre 17
r (t )
+
z
r^(t + 1)
+
-
fichier pred.m
% prdiction de signal 1 pas
clear all;
close all;
clc
% Nombre de cellules d'entre (4), caches(5) et de sortie (1)
Nb_Iu = 4;
Nb_Hu = 5;
Nb_Ou = 1;
% Initialisation alatoire des poids W, Z et des biais w0 et
z0
W = rand(Nb_Hu,Nb_Iu);
w0 = rand(Nb_Hu,1);
Z = rand(Nb_Ou,Nb_Hu);
z0 = rand(Nb_Ou,1);
% signal prdire
t = 0:0.01:3;
r = 0.5*abs(sin(5*t).*exp(-.5*t)+cos(2*t)) ;
r_est = r;
% valeurs initiales des poids et biais
poids_W = cat(3,W,W,W);
biais_w0 = cat(3,w0,w0,w0);
poids_Z = cat(3,Z,Z,Z);
biais_z0 = cat(3,z0,z0,z0);
eta = 5; % gain d'apprentissage
for i = 3:length(r)-1
% stimulus n i
x = [r(i) r(i)-r(i-1) r(i-1) r(i-1)-r(i-2)]';
Rseaux de neurones
% variation future estime par le rseau
h = logsig(W*x+w0);
o = logsig(Z*h+z0);
dr_est(i+1) = o;
% valeur future estime du signal
r_est(i+1) = dr_est(i+1)+r(i);
% erreur d'estimation
e(i) = r(i)-r(i-1)-dr_est(i);
% erreur rtropropager
delta = o.*(ones(1,1)-o).*e(i);
% mise jour des matrices de poids Z et de biais z0
Z = Z+eta*delta*h';
z0 = z0+eta*delta;
% erreur en couche cache
dh = h.*(ones(size(h))-h).*(Z'*delta);
% mise jour des matrices de poids W et de biais w0
W = W+eta*dh*x';
w0 = w0+eta*dh;
% sauvegarde des poids et biais
poids_W = cat(3,poids_W,W);
biais_w0 = cat(3,biais_w0,w0);
poids_Z = cat(3,poids_Z,Z);
biais_z0 = cat(3,biais_z0,z0);
end % boucle for
% calcul de la variation de l'erreur d'estimation
e = e(250:300);
disp('variance de lerreur d''estimation :')
var_err = std(e)^2
% trac des diffrents signaux
figure(1), hold on
h = plot(r_est);
set(h,'LineWidth',2)
plot(r)
axis([0 length(r) 0 1.7])
grid
title(['Signaux rel et prdit, Gain = ' num2str(eta)])
figure(2)
plot(r-r_est)
hold off
title('erreur de prdiction')
873
874
Chapitre 17
La figure suivante montre le signal rel et celui que le rseau prdit un pas dchantillonnage
lavance.
Signaux rel et prdit, Gain = 5
1.6
1.4
1.2
1
0.8
0.6
0.4
0.2
0
50
100
150
200
250
300
Si lon dsire que le rseau sorte directement lestimation de la valeur future, il suffit
simplement de rtropropager la diffrence entre la valeur du signal disponible linstant t et
la sortie du rseau.
Le fichier pred2.m ralise ce type destimation.
Rseaux de neurones
875
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
50
100
150
200
250
300
876
Chapitre 17
signaux, rel et prdit, Gain = 5
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
50
100
150
200
250
300
Lestimation est meilleure lorsque le rseau sort la variation, car on fait intervenir la valeur du
signal disponible linstant t que lon ajoute la variation estime.
On peut amliorer la qualit de lestimation si le rseau ralise la double drivation du signal,
i.e. que sa rponse est :
r(t 2) 2 r(t 1) r (t ) .
Pour obtenir lestime de la valeur future, on utilisera 2 valeurs relles du signal en ajoutant la
quantit 2 r (t ) r (t 1) la valeur estime par le rseau linstant prcdent.
r (t )
+
z
1
1
1
1
r^(t 1)
1
+
-
Les lignes de code du fichier pred3.m qui diffrent de celles du fichier pred.m sont :
% variation future estime par le rseau
h = logsig(W*x+w0); o = logsig(Z*h+z0); ddr_est(i+1) = o;
% valeur future estime du signal
r_est(i+1) = ddr_est(i+1)+2*r(i)-r(i-1);
e(i) = r(i)-2*r(i-1)+r(i-2)-ddr_est(i); % erreur d'estimation
Rseaux de neurones
877
Dans ce cas, le gain dapprentissage peut atteindre la valeur 10, ce qui augmente la qualit de
lestimation, sans quil y ait instabilit.
signaux, rel et prdit, Gain = 10
1.6
1.4
1.2
1
0.8
0.6
0.4
0.2
0
50
100
150
200
250
300
La variance de lerreur destimation de 10-9 environ, est 20000 fois infrieure celle obtenue
dans le cas o le rseau apprend la simple variation du signal.
Nous observons une trs rapide stabilisation des poids du rseau.
evolution des poids W1k, Gain = 10
1.4
1.2
0.8
0.6
0.4
0.2
50
100
150
200
discrete time
250
300
350
878
Chapitre 17
0.1
0.08
0.06
0.04
0.02
0
-0.02
-0.04
-0.06
-0.08
-0.1
50
100
150
200
250
300
Rfrences bibliographiques
880
Rfrences bibliographiques
Rfrences bibliographiques
881
Arago 14, Logique floue, Observatoire Franais des techniques avances, Editions
Masson, 1994
B. PORAT, Digital Processing of Random Signals, Theory & Methods, Editions Prentice
Hall Information and system sciences series, 1993
B. KOSKO, Neural Networks and Fuzzy Systems, Prentice Hall International Editions,
1992
H. T. NGUYEN, Theoritical Aspects of Fuzzy Control, Editions John Willey & Sons, Inc.,
1995
J. B. DABNEY, Mastering SIMULINK, Editions Pearson Prentice Hall, 2004
Index
A
activation, 808
adaline, 808810
adaptatif, 655
algbrique
forme, 22, 87
somme, 797
mthode, 810
algorithme
de rsolution, 46
rtropropagation, 825, 830
TFR, 600
MCR, 621, 623, 625
LMS, 661
Kalman, 633, 639
analogique
systme, 51, 380381, 472, 489, 631,
694, 724725
2nd ordre, 51, 53, 339, 340
passe bas, 101
horloge, 378
intgrateur, 379, 481, 484, 559
fonction de transfert, 55, 357
tat, 472, 474, 486, 631, 694
PID, 55, 551, 557, 560, 561
PI, 381, 557, 708, 711
Butterworth, 668
1er ordre, 551
animations, 237, 456
apostrophe, 30, 134
appartenance, 747
apprentissage, 838
approximation, 111, 120, 180
AR, 652, 657
arithmtique, 22, 69, 753
ARMA, 652, 810, 811
ASCII
code, 66, 68, 80, 261, 262, 333
fichier, 280
texte, 786, 796
autocorrlation, 422, 606, 607, 608, 611,
625
axone, 807
B
bande passante, 596, 598, 600, 644, 645,
653, 671
Basic fitting, 309
884
Index
E
cart type, 139, 140, 450, 529, 768, 778
chelles logarithmiques, 98, 100101, 196
Embedded Matlab, 562, 564, 568
encapsulation, 366, 429
ensemble flou, 747, 787
environnement, 7, 33, 60, 241, 282, 306
quations
dtat, 472, 615, 693, 706, 731, 741
de RICATTI, 697, 699700
diffrentielles, 1, 5051, 342, 344, 390,
476477, 533, 557, 637
de rcurrence, 1, 54, 335, 357361,
385386, 447459, 467468, 479,
489492, 551555, 619, 632, 674,
729, 810
linaires, 133, 175, 335, 440
non linaires, 335, 363, 386, 492
dobservation, 344, 631
caractristique, 390, 693, 709
erreur
dapprentissage, 809, 843844, 854
destimation, 119, 626627, 662,
874875
de poursuite, 673, 683, 854, 858
en couche cache, 873
statique, 381, 382, 683, 705, 730, 800,
844
dinterpolation, 118
de filtrage, 671
en rgime permanent, 673, 857
estimation
dune constante, 587, 627
dune sinusode, 642
de ltat, 587, 626, 630
du spectre, 656
de la vitesse, 632635
tat
analogique, 393, 459, 631, 698
discret, 698
interne, 523
parent, 526, 530, 575
bruit, 626
composantes, 474, 635, 637, 702
hybride, 480, 481, 483
retour, 389392, 693, 697, 699702,
704, 706
vecteur, 344, 390393, 465, 615, 699,
701702
885
Index
886
Index
outils, 336
systmes dynamiques, 335336, 409,
500, 712
systmes physiques, 456
par fonction de transfert, 461
dans Stateflow, 532533, 552
bruit de modlisation, 626, 628, 638
neuronale, 807, 832, 855
J
Jonction de lhistorique, 525, 575
Jonction, 525, 529, 536, 538, 540, 542,
544, 555, 563564, 570
K
Kalman, 626, 630, 632, 635, 636637,
639, 640641, 643
L
Laplace, 50, 99, 127, 387, 732
lgende, 28
Lemniscate, 191
linaris, 182183, 693
LineWidth, 28, 191
Lissajous, 29, 374, 546547
logique floue, 58, 748, 756
loi de commande, 383, 392, 674677,
681687, 693694, 702, 706, 726,
730, 748, 774, 777, 800, 835, 847,
854, 857
LQI, 673
LTI
systme, 646, 731, 735, 741, 743745
objets, 735736, 743
bloc, 741
Viewer, 743, 745
M
MA, 652
Mac Culloch, 807
Mamdani, 750, 754755, 761762, 768,
785
masquage, 366367, 371, 378, 406, 429, 434
Math Functions, 663, 664
matrice
alatoire, 169, 275, 584
creuse, 166, 167, 168, 169170, 248
identit, 152, 158, 163, 628
pleine, 167
de variances, 615, 620, 626, 627628
Matrix, 440, 664
Menu Start, 57, 6162
Mex, 243, 468, 471, 484
minimiser
erreur quadratique, 619, 809, 830
critre quadratique, 619620, 673, 697
Model Explorer, 517518, 531
modlisation
dtat, 380, 420, 481, 483, 615
N
Newton, 180
Nichols, 721
normale, 159, 160
normalisation, 125, 126, 835, 847
normaliser, 126, 835, 836, 847
norme, 10, 135, 311
notation
scientifique, 6, 7
exponentielle, 23
Ingnieur, 285
NumContStates, 458
NumDiscStates, 458
numrique
fonction de transfert, 46, 54, 389
horloge, 386
2nd ordre, 489
1er ordre, 46, 599
PID, 551
calcul, 4, 151, 429
afficheur, 51, 53, 376, 518
format, 66
matrice, 68, 149, 156, 158
tableau, 322
intgrale, 357
signal, 110
horloge, 378
rgulateur, 381, 712, 724
filtre, 386, 588, 589, 591, 592, 599, 600,
606, 658
valeurs, 436, 756
NumInputs, 458
NumOutputs, 458
NumSampleTimes, 458
O
objets graphiques, 31, 187, 216, 217, 236,
535, 567
onglet Discrete Update, 475
onglet, 442, 473478
optimal, 178, 497, 674, 731
outils additionnels, 57
887
Index
P
P.I., 347, 381, 383, 493, 708
Pade, 153
palette
de couleurs, 208, 227
doutils Stateflow, 515, 529, 535, 536,
562, 567
palindrome, 80
parabolode, 198, 199, 200, 202
paramtres optionnels, 451, 462, 463, 474,
491
paramtrique, 196, 619
partie
imaginaire, 89, 94, 133, 414
relle, 89, 94, 414
entire, 36, 272
dune chane, 66
Pascal
matrice, 158, 162
triangle, 162
langage, 172
permutation, 166, 305, 412
perturbation, 684, 693, 713, 722, 791, 792,
797, 798, 846, 857, 861, 864
PGCD, 124
PID mixte, 561
PID, 55, 420, 421, 516, 551557, 561,
684, 708711
Pitts, 807
poids, 809812, 819, 821, 825, 830831,
836841, 848849, 858, 860864
ple, 46, 347, 371, 500, 510, 555, 675,
685, 687, 691, 720, 726, 730, 732,
738
pondration, 678, 681, 683, 697, 705, 706,
789, 790
PPCM, 126127, 131
prdiction
linaire, 656
de signal, 814, 871878
prmisse, 750, 751
primitive, 115116, 175, 563, 565567
produit, 89, 151
profiler, 62, 277280, 295
programmation
avec MATLAB, 31, 38, 271, 499, 504
graphique, 45
orient Objets, 735
de Stateflow, 514, 524, 548, 551
du rgulateur, 559, 688
prompt, 33, 283, 369, 371, 436, 437, 442,
504, 760
888
Index
T
tableaux
bidimensionnels, 317
de cellules, 312326, 330331, 734,
738, 739
de structures, 279, 320, 326, 329331
multidimensionnels, 16, 56, 133, 144,
245, 296, 298, 303, 306, 312, 322,
735, 837
tables de vrit, 571
tachymtrique, 712, 723
Taylor, 153
TeX, 75
TFD, 105, 107
TFR, 600
TFSD, 108110
Transfert, 589, 599, 600, 606, 612, 619,
632, 645652, 670, 674709,
713727, 731734, 738756,
808, 818825
transition par dfaut, 517, 522, 523, 530,
534, 538, 540, 543, 554, 558, 560, 584
transpose, 10, 146, 150, 163, 164, 242, 832
transposition, 9, 19, 20, 47, 66, 134, 150,
413
U
User Data, 497
V
valeurs singulires, 165
varargin, 266
variance, 529, 581, 582, 583, 584, 606,
612, 621627, 635, 643, 809, 831,
854, 877
vecteur dtat, 390, 391, 456, 465, 480,
486
viewer, 646, 743, 744, 745, 756, 771, 773,
789790
visibilit, 414
volume, 205
W
Warning, 74
web, 60, 288