Sunteți pe pagina 1din 897

MATLAB R2009, SIMULINK et STATEFLOW

pour Ingenieurs, Chercheurs et Etudiants

Nadia Martaj Mohand Mokhtari

MATLAB R2009,
SIMULINK et STATEFLOW
pour Ingenieurs, Chercheurs
et Etudiants

123

Dr. Nadia Martaj


Universite Paris X
Pole Scientifique et
Technologique de
Ville DAvray
rue de S`evres 50
92410 Ville dAvray
France
nadia martaj@yahoo.fr

Dr. Mohand Mokhtari


Villa Jacquemont 5
75017 Paris
e-Xpert Engineering
France
mohand.mokhtari@gmail.com

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)

A ma mre Fatna, mon pre Bouchab


Mes surs et mes frres
Nadia MARTAJ
nmartaj@gmail.com

A mes enfants Sonia, Omar et Hachimi


Mohand MOKHTARI
mohand.mokhtari@gmail.com

Table des matires

Chapitre 1 Prise en main de MATLAB et SIMULINK


I. PRISE EN MAIN DE MATLAB .............................................................................................. 1
I.1. LAIDE DANS MATLAB........................................................................................................ 1
I.2. TYPES DE DONNES ............................................................................................................ 4
I.3. NOTIONS DE BASE DE MATLAB........................................................................................ 4
I.4. TABLEAUX ............................................................................................................................. 7
I.4.1. Vecteurs ou tableaux 1 dimension ............................................................................... 7
I.4.2. Matrices ou tableaux 2 dimensions ............................................................................. 14
I.4.3. Tableaux multidimendionnels ........................................................................................ 17
I.5. LES CHANES DE CARACTRES ........................................................................................ 19
I.6. LES NOMBRES COMPLEXES............................................................................................... 20
I.7. LES POLYNMES .................................................................................................................. 23
I.8. GRAPHIQUES 2D ET 3D ........................................................................................................ 27
I.8.1. Graphiques 2D ............................................................................................................... 27
I.8.2. Graphiques 3D ............................................................................................................... 29
I.9. LES FICHIERS ET LAPROGRAMMATION AVEC MATLAB ............................................ 31
I.9.1. Fichiers De Donnes ...................................................................................................... 31
I.9.2. Fichiers De commandes et de fonctions ......................................................................... 32
I.9.3. Instructions de contrle.................................................................................................. 36
I.9.4. Oprateurs relationnels et logiques ............................................................................... 38
II. PRAISE EN MAIN DE SIMULINK....................................................................................... 45
II.1. QUELQUES BIBLIOTHQUES ............................................................................................ 45
II.2. QUELQUES EXAMPLES ...................................................................................................... 46
II.2.1. Rponse indicielle dun systme du 1er ordre ................................................................ 46
II.2.2. Rsolution dun systme linaire surdtermin............................................................. 47
II.2.3. Solution dquation diffrentielle du 2nd ordre ............................................................. 50
II.2.4. Rsolution dquations rcurrents ................................................................................ 54
II.2.5. Rgulateur PID ............................................................................................................. 55
III. MENU START ....................................................................................................................... 57

Chapitre 2 Chanes de caractres, dates et heures


I. LES CHANES DE CARACTRES ........................................................................................ 65
I.1. GNRALITS ....................................................................................................................... 65
I.2. FONCTIONS PROPRES AUX CHANES DE CARACTRES.............................................. 66
I.2.1. Conversion de chanes en nombres ................................................................................ 66
I.2.2. Conversion de nombres en chanes ................................................................................ 68
I.2.3. Tests sur les chanes ....................................................................................................... 70
I.2.4. Concatnation de chanes de caractres ........................................................................ 71
I.2.5. oprations sur les chanes .............................................................................................. 72
I.3. FONCTIONS UTILES ............................................................................................................. 74
I.4. LECTURE ET CRITURE DE CHANS FORMATES...................................................... 77
I.5. DES PROGRAMMES UTILES ............................................................................................... 79
I.6. APPLICATIONS ...................................................................................................................... 79
I.6.1. Cryptage et dcryptage dun message ............................................................................ 79
I.6.2. Palindrome..................................................................................................................... 80
II. GESTION DES DATES ET HEURES ................................................................................... 81
II.1. DIFFRENTS FORMATS DE DATES ET HEURES ............................................................ 81
II.2. AUTRES FONCTIONS UTILES DE MESURE DU TEMPS ................................................ 83

VIII

Table des matires

Chapitre 3 Les nombres complexes


I. GNRALITS ........................................................................................................................ 87
II. OPRATIONS SUR LES NOMBRES COMPLEXES ......................................................... 89
II.1. SOMME, PRODUIT ET DIVISION DE COMPLEXES ........................................................ 89
II.2. RACINE, LOGARITHME ET EXPONENTIELLE DE COMPLEXES ................................. 90
III. FONCTIONS SPCIALES DE NOMBRES COMPLEXES .............................................. 91
III.1. REPRSENTATION GRAPHIQUE ..................................................................................... 91
III.2. FONCTIONS DE VARIABLES COMPLEXES.................................................................... 93
IV. APPLICATIONS .................................................................................................................... 95

Chapitre 4 Les polynmes


I. LES POLYNMES ................................................................................................................... 111
I.1. OPRATIONS SUR LES POLYNMES ................................................................................ 111
I.1.1. Multiplication, division et racines de polynmes ........................................................... 112
I.1.2. Manipulation de fonctions polynomials ......................................................................... 115
I.2. INTERPOLATION ET RGRESSION .................................................................................... 118
I.2.1. Interpolation au sens des moindres carrs ..................................................................... 118
I.2.2. Interpolations linaires et non linaires......................................................................... 120
II. APPLICATIONS ..................................................................................................................... 124
II.1. PUISSANCE DUN POLYNME.......................................................................................... 124
II.2. CALCUL DU PGCD DE DEUX POLYNMES.................................................................... 124
II.3. CALCUL DU PPCM DE DEUX POLYNMES.................................................................... 126
II.4. CALCUL DE LA TRANSFORME INVERSE DE LAPLACE ............................................ 127
II.5. CALCUL DE LA DRIVE N-IME DUN POLYNME .................................................. 129

Chapitre 5 Les vecteurs et matrices


I. VECTEURS ET MATRICES ................................................................................................... 133
I.1. LES VECTEURS...................................................................................................................... 134
I.1.1. Addition et soustraction ................................................................................................. 134
I.1.2. Transposition ................................................................................................................. 134
I.1.3. Oprations lment par element..................................................................................... 135
I.1.4. Gnration de vecteurs .................................................................................................. 136
I.1.5. Oprations relationnelles sur les vecteurs ..................................................................... 137
I.2. LES MATRICES ...................................................................................................................... 138
II. FONCTIONS SUR LES VECTEURS ET MATRICES ........................................................ 139
II.1. QUELQUES FONCTIONS SUR LES MATRICES ............................................................... 139
II.2. CONCATNATION ............................................................................................................... 143
II.3. EXTRACTION DUNE PARTIE DUNE MATRICE, EXTENSION DUNE MATRICE.... 144
II.4. COMPARAISON DE MATRICES ......................................................................................... 145
II.5. TYPAGE DES DONNES NUMRIQUES........................................................................... 149
II.6. TRANSFORMATIONS DE VECTEURS ET MATRICES .................................................... 150
III. FONCTIONS PROPRES AUX MATRICES ....................................................................... 151
III.1. PRODUIT DE MATRICES ................................................................................................... 151
III.2. INVERSION DE MATRICES ............................................................................................... 151
III.3. DIVISION DE MATRICES ................................................................................................... 152
III.4. EXPONENTIELLE, LOGARITHME ET RACINE CARRE DUNE MATRICE .............. 153
III.5. TEST DU TYPE DES LMENTS DUNE MATRICE....................................................... 155

Table des matires

IX

IV. MATRICES PARTICULIRES ET SPCIALES .............................................................. 158


V. FACTORISATION ET DCOMPOSITION DE MATRICES ............................................ 164
VI. MATRICES CREUSES ET FONCTIONS ASSOCIES .................................................... 166
VII. APPLICATIONS................................................................................................................... 171
VII.1. MOYENNE ET VARIANCE DUNE SRIE DE MESURES............................................. 171
VII.2. DRIVE DUNE FONCTION ........................................................................................... 172
VII.3. CALCUL DINTGRALES................................................................................................. 174
VII.4. RSOLUTION DUN SYSTME DQUATIONS LINAIRES ...................................... 175
VII.5. RSOLUTION DUN SYSTME SOUS-DIMENSIONN OU INDTERMIN ............. 176
VII.6. RGRESSION LINAIRE .................................................................................................. 177
VII.7. RGRESSION NON LINAIRE ......................................................................................... 180

Chapitre 6 Les Graphiques


I. LES GRAPHIQUES 2D ............................................................................................................ 186
I.1. GRAPHIQUES EN COORDONNES CARTSIENNES ...................................................... 186
I.2. GRAPHIQUES EN COORDONNES POLAIRES ................................................................. 191
I.3. LES DIAGRAMMES ............................................................................................................... 192
II. LES GRAPHIQUES 3D .......................................................................................................... 196
II.1. COURBES 3D ......................................................................................................................... 196
II.2. SURFACES ............................................................................................................................. 197
II.3. LES CONTOURS ................................................................................................................... 201
II.4. VOLUMES ET SURFACES DE RVOLUTION .................................................................. 203
II.5. APPARENCE DES GRAPHIQUES 3D.................................................................................. 206
III. AUTRES FONCTIONNALITS GRAPHIQUES ............................................................... 209
IV. GESTION DES HANDLES ET DES OBJETS GRAPHIQUES ......................................... 216
V. LES ANIMATIONS ................................................................................................................. 237

Chapitre 7 Programmation avec MATLAB


I. OPRATEURS ARITHMTIQUES, LOGIQUES ET CARACTRES SPCIAUX ........ 241
I.1. OPRATEURS ET CARACTRES SPCIAUX .................................................................... 241
I.1.1. Oprateurs arithmtiques............................................................................................... 241
I.1.2. Oprateurs relationnels ................................................................................................. 242
I.1.3. Caractres spciaux ....................................................................................................... 242
I.2. FONCTIONS RETOURNANT UNE VALEUR LOGIQUE .................................................... 243
II. EVALUATION DE COMMANDES EN CHANES DE CARACTRES .......................... 249
III. COMMANDES STRUCTURES ......................................................................................... 252
III.1. BOUCLE FOR ....................................................................................................................... 252
III.2. BOUCLE WHILE .................................................................................................................. 256
III.3. CONDITION IFELSE........................................................................................................ 256
III.4. CONDITION SWITCHCASE ........................................................................................... 258
III.5. INSTRUCTIONS DE RUPTURE DE SQUENCE .............................................................. 259
IV. SCRIPTS ET FONCTIONS................................................................................................... 259
IV.1. FICHIERS FONCTIONS....................................................................................................... 259
IV.1.1. Dfinitions et exemple.................................................................................................. 259
IV.1.2. Fonctions polymorphes ................................................................................................ 261
IV.1.3. Rcursivit des fonctions ............................................................................................. 267
IV.2. LES SOUS-FONCTIONS ..................................................................................................... 269

Table des matires

V. CONSEILS DE PROGRAMMATION SOUS MATLAB ..................................................... 271


VI. DBOGUAGE DES FICHIERS............................................................................................ 273
VII. LE PROFILER ...................................................................................................................... 277
VIII. LES FICHIERS DE DONNES ......................................................................................... 280
IX. LES COMMANDES ET OUTILS DE DVELOPPEMENT ............................................. 282
IX.1. COMMANDES DE GESTION DENVIRONNEMENT ...................................................... 282
IX.2. COMMANDES DAIDE LUTILISATION DE MATLAB .............................................. 286
IX.3. GESTION DES RPERTOIRES ........................................................................................... 289
X. EDITEUR DE FICHIERS M .................................................................................................. 292

Chapitre 8 Tableaux multidimensionnels Cellules et Structures


I. TABLEAUX MULTIDIMENSIONNELS ............................................................................... 297
I.1. DFINITION ET GNRATION DUN TABLEAU MULTIDIMENSIONNEL .................. 297
I.1.1. Dfinition ....................................................................................................................... 297
I.1.2. Cration dun tableau multidimensionnel ...................................................................... 298
I.1.3. Extraction dun sous-tableau ......................................................................................... 301
I.1.4. Oprations sur les tableaux............................................................................................ 302
I.1.5. Changement des dimensions dun tableau ..................................................................... 304
I.1.6. Permutation des dimensions dun tableau...................................................................... 305
I.1.7. Utilisation pratique des tableaux multidimensionnels dans lindustrie .......................... 306
II. TABLEAUX MULTIDIMENSIONNELS DE CELLULES ................................................. 312
II.1. CELLULES, TABLEAUX DE CELLULES ........................................................................... 312
II.1.1. Construction de cellules................................................................................................ 312
II.1.2. Accs aux lments des cellules, indexation ................................................................. 314
II.1.3. Concatnation de cellules ............................................................................................. 316
II.2. TABLEAUX DE CELLULES................................................................................................. 317
II.2.1. Tableaux bidimensionnels............................................................................................. 317
II.2.2. Tableaux multidimensionnels de cellules ...................................................................... 319
II.3. FONCTIONS PROPRES AUX CELLULES ET TABLEAUX DE CELLULES ................... 320
III. TABLEAUX MULTIDIMENSIONNELS DE STRUCTURES .......................................... 326
III.1. STRUCTURES ...................................................................................................................... 326
III.2. TABLEAUX DE STRUCTURES .......................................................................................... 329
III.3. CONVERTIR UN TABLEAU DE CELLULES EN TABLEAU DE
STRUCTURES ET INVERSEMENT ................................................................................... 330
III.4. FONCTIONS PROPRES AUX TABLEAUX DE STRUCTURES ....................................... 331

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

Table des matires

XI

I.2.3. Rsolution dquation rcurrente ................................................................................... 359


I.2.4. Rsolution de systmes dquations non linaires .......................................................... 363
II. MASQUAGE OU ENCAPSULATION DE SOUS-SYSTMES .......................................... 366
III. UTILISATION DES CALLBACKS ..................................................................................... 371
IV. CRATION DUNE BIBLIOTHQUE PERSONNELLE ................................................. 372
V. ETUDE DES DIFFRENTES LIBRAIRIES DE SIMULINK ............................................. 374
V.1. LIBRAIRIE SINKS................................................................................................................. 374
V.2. LIBRAIRIE SOURCES .......................................................................................................... 378
V.3. LIBRAIRIE DISCRETE ......................................................................................................... 379
V.3.1. Commande intgrale ..................................................................................................... 380
V.3.2. Commande P.I. dun systme analogique ..................................................................... 381
V.3.3. Commande P.I. avec blocage de lintgrale.................................................................. 383
V.3.4. Rsolution dune quation de rcurrence...................................................................... 385
V.4. LIBRAIRIE CONTINUOUS .................................................................................................. 387
V.5. TABLES DINTERPOLATION OU DEXTRAPOLATION LINAIRES ........................... 393
V.5.1. Table dinterpolation et dextrapolation ....................................................................... 394
V.6. LIBRAIRIE LOGIC AND BIT OPERATIONS ...................................................................... 398
V.6.1. Circuits logiques et combinatoires ................................................................................ 398
V.6.2. Somme de 2 bits avec retenue ....................................................................................... 399
V.6.3. Ralisation de fonction logique quelconque.................................................................. 400
V.6.4. Autres lments de la librairie Logic and Bit Operations ............................................. 402
V.7. LIBRAIRIE PORTS & SUBSYSTEMS ................................................................................. 404
V.8. LIBRAIRIE USER-DEFINED FUNCTIONS ......................................................................... 407
V.9. LIBRAIRIE COMMONLY USED BLOCKS ......................................................................... 409
V.10. LIBRAIRIE DISCONTINUITIES ........................................................................................ 410
V.11. LIBRAIRIE MATH OPERATIONS ..................................................................................... 412
V.12. LIBRAIRIE SIGNAL ROUTING ......................................................................................... 414
VI. SIMULINK EXTRAS............................................................................................................. 418
VI.1. LIBRAIRIE ADDITIONAL DISCRETE .............................................................................. 418
VI.2. LIBRAIRIE ADDITIONAL LINEAR ................................................................................... 420
VI.3. LIBRAIRIE ADDITIONAL SINKS ...................................................................................... 422
VI.4. LIBRAIRIES TRANSFORMATION & FLIPS FLOP .......................................................... 424

Chapitre 10 Masques et sous-systmes


I. SOUS-SYSTMES .................................................................................................................... 430
I.1. SOUS-SYSTME SINUS AMORTI ........................................................................................ 430
I.2. SOUS-SYSTME GNRATEUR DE SQUENCES BINAIRES
PSEUDO-ALATOIRES, SBPA ............................................................................................. 432
II. MASQUAGE DES SOUS-SYSTMES .................................................................................. 434
II.1. MASQUAGE DU SOUS-SYSTME SINUS AMORTI......................................................... 434
II.2. MASQUE DU SOUS-SYSTME DU GNRATEUR SBPA .............................................. 436
II.3. MASQUES DALGBRE LINAIRE ................................................................................... 440
II.3.1. Rsolution dquation linaire ...................................................................................... 440
II.3.2. Gnrateur PWM .......................................................................................................... 445
III. SOUS-SYSTMES DE LA BIBLIOTHQUE PORTS & SUBSYSTEMS ....................... 447
III.1. ITERATOR SUBSYSTEM .................................................................................................... 447
III.2. SOUS-SYSTME IF.............................................................................................................. 448
III.3. SOUS-SYSTME SWITCH CASE ....................................................................................... 449
III.4. SOUS-SYSTMES ACTIVS ET TRIGGS ....................................................................... 451

XII

Table des matires

III.4.1. Sous-systmes activs .................................................................................................. 451


III.4.2. Sous-systmes triggs ou dclenchs ........................................................................... 452
III.5. SOUS-SYSTMES CONFIGURABLES .............................................................................. 453

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 12 Les fonctions Callbacks


I. CALLBACKS ASSOCIS UN MODLE SIMULINK ..................................................... 499
I.1. MTHODE INTERACTIVE .................................................................................................... 500
I.2. PAR PROGRAMMATION AVEC LA COMMANDE SET_PARAM .................................... 504
II. CALLBACKS ASSOCIS DES BLOCS DUN MODLE SIMULINK ......................... 505
III. ETUDE DES QUELQUES CALLBACKS ........................................................................... 507
III.1. OPENFCN ............................................................................................................................. 507
III.2. COPYFCN DELETEFCN ................................................................................................... 509
III.3. AUTRES CALLBACKS........................................................................................................ 510
IV. FICHIER STARTUP.............................................................................................................. 510

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

Table des matires

XIII

II.3. COMPTEUR ........................................................................................................................... 521


II.4. CLIGNOTANT ....................................................................................................................... 522
II.5. HORLOGE .............................................................................................................................. 524
III. OBJETS DE STATEFLOW .................................................................................................. 525
III.1. LES TATS ........................................................................................................................... 525
III.2. LES TRANSITIONS.............................................................................................................. 530
III.2.1. Les transitions par dfaut ............................................................................................ 530
III.2.2. Labels des transitions .................................................................................................. 530
III.3. LES VNEMENTS ............................................................................................................. 531
III.4. LES OBJETS DATA ............................................................................................................. 532
IV. MODLISATION DE SYSTMES CONTINUS DANS STATEFLOW........................... 532
V. FONCTIONS GRAPHIQUES................................................................................................. 535
V.1. SINUS CARDINAL ................................................................................................................ 536
V.2. CARR, TIERS DE LA VALEUR ABSOLUE ...................................................................... 537
VI. FONCTIONS DE TEST IF ... THEN ... ELSE ..................................................................... 539
VII. BOUCLE FOR ...................................................................................................................... 544
VII.1. VALEUR DUNE FONCTION ............................................................................................ 544
VII.2. COURBES DE LISSAJOUS ................................................................................................ 546
VIII. GNRATION DUN SIGNAL PWM .............................................................................. 548
VIII.1. COMPARAISON DUNE CONSTANTE ET DUN SIGNAL TRIANGULAIRE ............ 548
VIII.2. CONDITION ELSE ............................................................................................................ 550
IX. RGULATION PID NUMRIQUE ET ANALOGIQUE ................................................... 551
IX.1. RPONSE IMPULSIONNELLE DUN SYSTME DISCRET DU 1ER ORDRE ................ 551
IX.2. RGULATION PID DISCRTE........................................................................................... 552
IX.3. RGULATION PID ANALOGIQUE ................................................................................... 557
X. FONCTIONS DCRITES EN LANGAGE MATLAB (EMBEDDED FONCTIONS)....... 562
XI. LES BOX ................................................................................................................................. 567
XII. FONCTIONS TEMPORELLES LOGIQUES .................................................................... 570
XIII. TABLES DE VRIT ......................................................................................................... 571
XIV. JONCTION DE LHISTORIQUE...................................................................................... 575
XV. UTILISATION DES VECTEURS ET MATRICES DANS STATEFLOW ..................... 577
XVI. UTILISATION DE FONCTIONS ET DE DONNES MATLAB,
OPRATEUR ML .. ............................................................................................................ 579
XVI.1. UTILISATION DE FONCTIONS MATLAB ..................................................................... 579
XVI.2. RSULTAT DUN CALCUL PRCDENT DE LOPRATEUR ML ............................ 580
XVII. FONCTION ML ................................................................................................................. 583
XVIII. APPEL DE FONCTIONS MATLAB .............................................................................. 586

Chapitre 14 Traitement du signal


I. TRAITEMENT NUMRIQUE DES SIGNAUX DTERMINISTES .................................. 587
I.1. SYNTHSE DES FILTRES NUMRIQUES .......................................................................... 587
I.1.1. Rponse impulsionnelle .................................................................................................. 588
I.1.2. Rponse en frquences ................................................................................................... 589
I.2. RPONSE EN FRQUENCES DUN FILTRE NUMRIQUE .............................................. 591
I.3. APPLICATIONS ...................................................................................................................... 599
I.3.1. Filtrage de signaux ........................................................................................................ 599
I.3.2. Analyse spectrale ........................................................................................................... 600

XIV

Table des matires

II. SIGNAUX STOCHASTIQUES .............................................................................................. 606


II.1. CARACTRISTIQUES STATISTIQUES DU FILTRAGE NUMRIQUE........................... 606
II.1.1. Signaux stochastiques monodimensionnels ................................................................... 606
II.1.2. Systmes et signaux stochastiques multidimensionnels ................................................. 615
II.2. ESTIMATION DE SIGNAUX ET DE MODLES DE SYSTMES DISCRETS ................. 619
II.2.1. Algorithme des moindres carrs rcursifs .................................................................... 619
II.2.2. Filtrage de Kalman ....................................................................................................... 626
II.2.2.1. Application 1 : Estimation dune constante ............................................................... 627
II.2.2.2. Estimation de ltat dun processus dynamique ......................................................... 630
II.2.2.3. Extraction dune sinusode noye dans du bruit ........................................................ 637
III. SIGNAL PROCESSING TOOLBOX & SIGNAL PROCESSING BLOCKSET.............. 643
III.1. GUI DE LA BOITE OUTILS SIGNAL PROCESSING TOOLBOX .......................... 644
III.1.1. GUI sptool et FDATool ............................................................................................... 644
III.1.2. Quelques fonctions de la boite outils Signal Processing Toolbox ....................... 646
III.2. ETUDE DE QUELQUES BLOCS DE LA LIBRAIRIE SIGNAL
PROCESSING BLOCKSET................................................................................................ 655
III.2.1. Librairie Estimation .............................................................................................. 656
III.2.2. Librairie Filtrage ................................................................................................... 658
III.2.3. Librairie Math Functions ...................................................................................... 663
III.2.4. Librairie Signal Management ................................................................................ 665

Chapitre 15 Rgulation et contrle de procds


I. COMMANDE LINAIRE QUADRATIQUE LQI................................................................. 673
II. COMMANDE RST .................................................................................................................. 684
III. COMMANDE ASYMPTOTIQUE ET COMMANDE OPTIMALE
DANS LESPACE DTAT................................................................................................... 693
III.1. COMMANDE ASYMPTOTIQUE PAR PLACEMENT DE PLES .................................... 693
III.2. COMMANDE OPTIMALE DANS LESPACE DTAT ..................................................... 697
IV. LA RGULATION PID ......................................................................................................... 708
V. LA BOITE OUTILS CONTROL SYSTEM TOOLBOX .............................................. 712
V.1. ETUDE DUN SYSTME DUN MOTEUR AVEC CHARGE............................................. 712
V.2. LE SYSTME LINAIRE ET INVARIANT DANS LE TEMPS, LTI .................................. 731
V.2.1 Fonction de transfert...................................................................................................... 731
V.2.2. Zro-Ple-Gain ............................................................................................................. 732
V.2.3. Espace dtat................................................................................................................. 733
V.2.4. Les objets LTI et leurs proprits .................................................................................. 735
V.2.5. Les systmes LTI dans SIMULINK................................................................................ 741
V.2.6. LTI viewer ..................................................................................................................... 743

Chapitre 16 Contrle par logique floue


I. PRINCIPE FONDAMENTAL .................................................................................................. 747
II. ETAPES DE MISE EN UVRE DUN CONTRLEUR FLOU ....................................... 748
II.1. ETAPE DE FUZZIFICATION ................................................................................................ 748
II.2. ETAPE DINFRENCE.......................................................................................................... 749
II.3. ETAPE DE DFUZZIFICATION .......................................................................................... 752
III. LINTERFACE GRAPHIQUE DE LA BOTE OUTILS
FUZZY LOGIC TOOLBOX ................................................................................................ 754

Table des matires

XV

IV. CRATION DUN SYSTME FLOU LAIDE DES


COMMANDES DE LA BOTE OUTILS ......................................................................... 761
IV.1. FUZZIFICATION DES VARIABLES DENTRE ET DE SORTIE ................................... 762
IV.2. EDITION DES RGLES FLOUES ....................................................................................... 765
IV.3. DFUZZIFICATION ............................................................................................................ 773
IV.4. UTILISATION DU RGULATEUR DANS UNE LOI DE COMMANDE.......................... 774
V. UTILISATION DU RGULATEUR FLOU DANS SIMULINK ......................................... 778
VI. MTHODE DE SUGENO ..................................................................................................... 785
VI.1. RALISATION DUN RGULATEUR FLOU PAR LINTERFACE GRAPHIQUE ......... 786
VI.2. RALISATION DUN RGULATEUR FLOU PAR LES COMMANDES
DE LA BOTE OUTILS .................................................................................................... 794
VII. BLOC FUZZY LOGIC CONTROLLER WITH RULEVIEWER ............................. 804

Chapitre 17 Rseaux de neurones


I. INTRODUCTION ..................................................................................................................... 807
II. RSEAUX DE NEURONES LINAIRES ADAPTATIFS .................................................. 808
II.1. ARCHITECTURE ................................................................................................................... 808
II.2. LOI DAPPRENTISSAGE ...................................................................................................... 809
II.3. QUELQUES DOMAINES DAPPLICATION ....................................................................... 810
II.3.1. Identification de processus ........................................................................................... 810
II.3.2. Prdiction de signal ...................................................................................................... 814
II.3.3. Suppression dinterfrence ........................................................................................... 818
III. RSEAUX COUCHES CACHES, RTROPROPAGATION DE LERREUR ......... 824
III.1. PRINCIPE .............................................................................................................................. 824
III.2. FONCTIONS DE TRANSFERT............................................................................................ 825
III.3. ALGORITHME DE RTROPROPAGATION ..................................................................... 830
IV. COMMANDE PAR MODLE INVERSE NEURONAL .................................................... 832
IV.1. PREMIRE ARCHITECTURE ............................................................................................. 833
IV.2. DEUXIME ARCHITECTURE............................................................................................ 847
V. PRDICTION DE SIGNAL .................................................................................................... 871

Rfrences bibliographiques ............................................................. 879


Index .................................................................................................... 883

AVANT-PROPOS

MATLAB est un systme interactif et convivial de calcul numrique et de visualisation


graphique destin aux ingnieurs et scientifiques. Il possde un langage de programmation
la fois puissant et simple d'utilisation. Il permet d'exprimer les problmes et solutions
d'une faon aise, contrairement aux autres langages de programmation.
MATLAB intgre des fonctions d'analyse numrique, de calcul matriciel, de traitement de
signal, de visualisation graphique 2D et 3D, etc. Il peut tre utilis de faon interactive ou
en mode programmation. En mode interactif, l'utilisateur a la possibilit de raliser
rapidement des calculs sophistiqus et d'en prsenter les rsultats sous forme numrique ou
graphique. En mode programmation, il est possible d'crire des scripts (programmes)
comme avec d'autres langages. L'utilisateur peut aussi crer ses propres fonctions pouvant
tre appeles de faon interactive ou par les scripts. Ces fonctions fournissent MATLAB
un atout ingalable : son extensibilit. Ainsi, l'environnement MATLAB peut tre
facilement tendu.
Dans MATLAB, l'lment de base est la matrice. L'utilisateur ne s'occupe pas des
allocations mmoire ou de redimensionnement comme dans les langages classiques. Les
problmes numriques peuvent tre rsolus en un temps record, qui ne reprsente qu'une
fraction infime du temps passer avec d'autres langages comme le Basic, C, C++ ou le
Fortran.
MATLAB s'impose dans les mondes universitaire et industriel comme un outil puissant de
simulation et de visualisation de problmes numriques. Dans le monde universitaire
MATLAB est utilis pour l'enseignement de l'algbre linaire, le traitement du signal,
l'automatique, ainsi que dans la recherche scientifique. Dans le domaine industriel, il est
utilis pour la rsolution et la simulation de problmes pratiques d'ingnierie et de
prototypage.
MATLAB est une abrviation de MATrix LABoratory. Ecrit l'origine, en fortran, par
Cleve Moler, MATLAB tait destin faciliter l'accs au logiciel matriciel dvelopp dans
les projets LINPACK et EISPACK. La version actuelle, crite en C par The MathWorks
Inc., existe en version "professionnelle" et en version "tudiant". Sa disponibilit est
assure sur plusieurs plates-formes : Sun, Bull, HP, IBM, compatibles PC, Macintosh, et
plusieurs machines parallles.
MATLAB est confort par une multitude de botes outils (toolboxes) spcifiques des
domaines varis. Un autre atout de MATLAB, est sa portabilit ; la mme portion de code
peut tre utilise sur diffrentes plates-formes sans la moindre modification.

XVIII

AVANT-PROPOS

En complment de MATLAB, l'outil additionnel SIMULINK est propos pour la


modlisation et la simulation de systmes dynamiques en utilisant une reprsentation de
type schmas blocs.
Ce livre s'adresse tant aux dbutants qu'aux programmeurs confirms. Il permet aux
dbutants d'acqurir les notions de base de programmation. Ils y trouveront une approche
que nous avons voulu mthodique pour en permettre une assimilation rapide. Ceux qui
utilisent dj MATLAB dcouvriront ici une vision cohrente du langage. L'approche
pdagogique est concrte : chaque chapitre permet d'acqurir de nouvelles notions de
programmation et de les appliquer immdiatement sur des cas pratiques. Les exemples,
nombreux et inspirs de situations relles, servent dmontrer les mcanismes de
raisonnement et de programmation.
La premire partie de cet ouvrage est une prise en main rapide de MATLAB. La syntaxe du
langage et les oprations lmentaires ainsi que les fonctions de base sont dcrites. Elle
permet d'apprhender le langage, de le situer et de matriser ce qui est indispensable.
La deuxime partie est un approfondissement du langage MATLAB, les immenses
possibilits de MATLAB sont prsentes et approfondies. La subdivision en chapitres
fournit au lecteur un accs rapide aux fonctionnalits dsires. Dans cette partie, on dcrit
la manipulation des vecteurs et matrices et les oprations matricielles spcialises. La
syntaxe dtaille, les techniques de programmation et de dboguage, l'interfaage avec
d'autres langages de programmation tels que C et Fortran et la ralisation d'interfaces
graphiques sont fournis ainsi que les extraordinaires possibilits de visualisation graphique
de MATLAB.
Un chapitre complet est consacr aux nouveauts de la version 5 de MATLAB, tels que les
tableaux multidimensionnels, la programmation oriente Objets et les nouveaux outils
d'dition, de dboguage et de ralisation d'interfaces graphiques.
Cette partie se termine par la description et des applications de l'outil additionnel
SIMULINK dans des domaines varis.
La troisime partie, prsente des applications du monde rel extraites de diffrents
domaines tels que l'analyse numrique, les probabilits et statistiques, la classification, le
contrle de procds et le traitement numrique des signaux dterministes et alatoires.
Dans les applications de traitement de signal, de contrle de procds et de classification,
nous avons utilis quelques fonctions extraites des botes outils "Signal Processing
Toolbox", "Control System Toolbox" et "Neural Networks Toolbox".
Dans sa version R2009, MATLAB sest enrichi de plusieurs outils additionnels et boites
outils.

Chapitre 1

Prise en main de MATLAB et SIMULINK

I. Prise en main de MATLAB


I.1. L'aide dans MATLAB
I.2. Types de donnes
I.3. Notions de base de MATLAB
I.4. Tableaux
I.4.1. Vecteurs ou tableaux 1 dimension
I.4.2. Matrices ou tableaux 2 dimensions
I.4.3. Tableaux multidimendionnels
I.5. Les chanes de caractres
I.6. Les nombres complexes
I.7. Les polynmes
I.8. Graphiques 2D et 3D
I.8.1. Graphiques 2D
I.8.2. Graphiques 3D
I.9. Les fichiers et la programmation avec MATLAB
I.9.1. Fichiers de donnes
I.9.2. Fichiers de commandes et de fonctions
I.9.3. Instructions de contrle
I.9.4. Oprateurs relationnels et logiques
II. Prise en main de SIMULINK
II.1. Quelques bibliothques
II.2. Quelques exemples
II.2.1. Rponse indicielle dun systme du 1er ordre
II.2.2. Rsolution dun systme linaire surdtermin
nd
II.2.3 Solution dquation diffrentielle du 2 ordre
II.2.4. Rsolution dquations rcurrentes
II.2.5. Rgulateur PID
III. Menu Start

I. Prise en main de MATLAB


I.1. Laide dans MATLAB
Le premier cran de MATLAB prsente quelques commandes :
intro, demo, help help, help, info.
intro
help
help help
info

:
:
:
:

lance une introduction MATLAB,


produit une liste des fonctions MATLAB par catgorie,
informations sur l'utilisation de l'aide,
informations sur les botes outils (Toolboxes) disponibles,

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_1, Springer-Verlag Berlin Heidelberg 2010

Chapitre 1

demo :

programme de dmonstration donnant une prsentation des fonctionnalits de base de MATLAB.

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.

Cette commande, applique devant un nom de certaines instructions MATLAB (script,


fonction), affiche laide correspondante.
>> help filter
FILTER One-dimensional digital filter.
Y = FILTER(B,A,X) filters the data in vector X with the
filter described by vectors A and B to create the
filtered
data Y. The filter is a "Direct Form II Transposed"
implementation of the standard difference equation:
a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(nnb)
a(2)*y(n-1) - ... - a(na+1)*y(n-na)
If a(1) is not equal to 1, FILTER normalizes the filter
coefficients by a(1).
FILTER
always
operates
along
the
first
non-singleton
dimension,
namely dimension 1 for column vectors and non-trivial
matrices,
and dimension 2 for row vectors.
[Y,Zf] = FILTER(B,A,X,Zi) gives access to initial and final
conditions, Zi and Zf, of the delays.
Zi is a vector of
length
MAX(LENGTH(A),LENGTH(B))-1, or an array with the leading
dimension
of
size
MAX(LENGTH(A),LENGTH(B))-1
and
with
remaining
dimensions
matching those of X.

Prise en main de MATLAB

FILTER(B,A,X,[],DIM) or FILTER(B,A,X,Zi,DIM) operates along


the dimension DIM.
See also filter2 and, in the signal Processing Toolbox.
La commande filter appartient la boite outils de traitement de signal (Signal
Processing Toolbox).
>> which filter
built-in C:\Program
Files\MATLAB\R2009a\toolbox\matlab\datafun\@single\filter)
single method

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 :

Prise en main de MATLAB

>> 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

Prise en main de MATLAB

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

Autre faon de saisir un vecteur ligne


>>

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

De mme pour avoir le vecteur w = [1 6 4 7 1 2 8], nous avons deux possibilits :


>> w = [1 v]
w =
1
6

>> 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

Prise en main de MATLAB

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

Si on omet de spcifier ce pas, celui-ci est pris par dfaut 1.


>> x=3:6
x =
3

L'addition et la soustraction de vecteurs de mmes dimensions se font lment par lment.


>>
>>
>>
ans

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

:
:
:
:

somme des composantes d'un vecteur,


produit des composantes d'un vecteur,
racines carres des composantes d'un vecteur,
moyenne des composantes d'un vecteur.

>> sum(x)
ans =
7

Prise en main de MATLAB

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

La mthode de Cramer permet dutiliser les oprations de calcul matriciel. En cherchant le


modle suivant : y = a eb x, nous passons au modle linaire en considrant le
nouveau signal : z = log(y)= b x + log a = x +

12

Chapitre 1

Le calcul des paramtres et se fera par les formules suivantes :

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')

Prise en main de MATLAB

13

Nous obtenons les paramtres suivants :


>> alpha
alpha =
-0.1238
>> beta
beta =
-0.2080

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

La figure suivante montre les donnes de mesures et leur modle exponentiel.

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

I.4.2. Matrices ou tableaux 2 dimensions

La matrice ou tableau 2 dimensions est un type de base de MATLAB.


Saisie dune matrice
La saisie dune matrice peut tre faite de diffrentes faons.
-

Vecteurs lignes spars par un saut de ligne ( ;)

>> matrice=[5 7 9; 1 4 2]
matrice =
5
7
9
1
4
2
-

Vecteurs spars par un retour la ligne

>> 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.

Prise en main de MATLAB

15

Soit les matrices A et B suivantes :


>> A =[5 7 3;2 9 4]
A =
5
2

7
9

3
4

>> B = [5 3 0; 7 1 6]
B =
5
7

3
1

0
6

La concatnation horizontale se fait comme suit :


>> ConcatHoriz = [A B]
ConcatHoriz =
5
2

7
9

3
4

5
7

3
1

0
6

La concatnation verticale se fait en faisant suivre A par un retour la ligne (pointvirgule).


>> ConcatVert = [A; B]
ConcatVert =
5
2
5
7

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

La concatnation selon la dimension 3 produit un tableau 3 dimensions, o chaque


matrice formera une page (Se rfrer au chapitre Tableaux multidimensionnels ).
Indexation dune matrice
Pour extraire un lment dune matrice, il suffit de spcifier lindice de la ligne et celui de
la colonne o se trouve cet lment.
Llment de la 2me ligne et 4me colonne est :
>> MatConcatH(2,4)
7

Elment de la 2me ligne et des colonnes 4 6 :


>> MatConcatH(2,4:6)
ans =
7

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

Suppression de lignes ou de colonnes


On peut supprimer une ou plusieurs lignes ou colonnes dune matrice en les remplaant par
un ensemble vide symbolis par deux crochets [].
Si lon veut supprimer la 2me colonne de MatConcatV :
>> MatConcatV(:,2)=[]
MatConcatV
5
2
5
7

=
3
4
0
6

Le signe : signifie toutes les lignes.


Pour tudier dautres proprits et oprations matricielles, on se rfrera au chapitre
Vecteurs et matrices .

Prise en main de MATLAB

17

I.4.3. Tableaux multidimendionnels

Un tableau 3 dimensions est une succession, en profondeur, de matrices appeles pages.

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

Ce tableau possde ainsi 3 pages, chacune ayant 4 lignes et 3 colonnes.


On indexe un lment de ce tableau selon la rgle :
tableau(num_ligne, num_colonne, num_page).

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

La cration dun tableau 3 dimensions se fait par la concatnation selon la direction 3 de


matrices de mmes dimensions.
>> page1=ones(3);
>> page2=eye(3);
>> mat2=cat(3,page1,page2)

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

Selon la direction 2, on ralise une concatnation horizontale.


Lajout dun scalaire un tableau multidimensionnel consiste lajouter tous ses
lments.
>> mat2+0.5
ans(:,:,1) =
1.5000
1.5000
1.5000

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

Le symbole : transforme tout tableau en un vecteur colonne. Grce cette


transformation, une seule commande sum suffit pour faire la somme de tous les lments
dun tableau multidimensionnel.
>> sum(mat2(:)+0.5)
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 :

Prise en main de MATLAB

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

Les dimensions de la chane de caractres sont donnes par la commande size.


>> [n, m] = size(ch)
n =
1
m =
6

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

Son conjugu, not z1c, est :


>> z1c = conj(z1)
z1c =
4.0000 + 3.0000i

Le conjugu peut aussi se calculer par la transposition du nombre complexe.


>> z1'
ans =
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

Addition de deux complexes


>> z1+z2
ans =
6

Prise en main de MATLAB

21

Multiplication
>> z1*z2
ans =
17.0000 + 6.0000i
>> z1*z1c
ans =
25

Division
>> z1/z2
ans =
-0.0769 - 1.3846i

Elvation une puissance


>> z2^3
ans =
-46.0000 + 9.0000i

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]

r et theta sont respectivement le module et l'argument de z.


La connaissance de l'une de ces formes permet d'aboutir l'autre.

Prise en main de MATLAB

23

>> z = r*(cos(theta)+i sin(theta))


ans =
4.0000 - 3.0000i

Il est aussi possible d'utiliser la notation exponentielle.


>> r*exp(j*theta)
ans =
4.0000 - 3.0000i

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

Transformation en vecteur colonne


>> Z(:)
ans =
4.0000 - 3.0000i
2.0000 + 3.0000i
0
6.0000

Somme de tous les lments de la matrice


>> sum(sum(Z))
ans =
12
I.7. Les polynmes

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( x ) = x 2 6 x + 9, est reprsent par le tableau 1

P = [1 -6 9]

P =
1

-6

Le nombre d'lments du tableau est gal au degr du polynme +1.

24

Chapitre 1

Le polynme Q( x ) = x 3 + 2 x 2 3 est reprsent par :


>>

Q = [1 2 0 -3]

Q =
1

-3

Racines d'un polynme

On peut dterminer les racines des polynmes P et Q l'aide de la fonction roots.


>> roots(P)
ans =
3
3

Ceci est exact car P( x ) = ( x 3) 2 .


>> roots(Q)
ans =
-1.5000 + 0.8660i
-1.5000 - 0.8660i
1.0000

Le polynme Q pouvant tre mis en facteur comme suit :


Q( x ) = ( x 1)( x 2 + 3x + 3)
3
3
3
3
ses racines sont bien : 1 ; i
; +i
.
2
2
2
2
Evaluation de polynmes

Pour valuer un polynme en un point, on utilise la fonction polyval.


Valeur du polynme P en 1 et celle du polynme Q en 0
>> polyval(P,1)
ans =
4
>> polyval(Q,0)
ans =
-3
Dtermination d'un polynme partir de ses racines

On peut aussi dterminer les coefficients d'un polynme partir de ses racines en utilisant
la fonction poly.

Prise en main de MATLAB

25

On cherche, par exemple, le polynme qui a pour racines : 1, 2 et 3.


Celles-ci peuvent tre dfinies comme les lments d'un vecteur r.
>> r = [1 2 3]
r =
1
2

Le polynme recherch est alors :


>> K = poly(r)
K =
1
-6
11

-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.

On vrifie bien que les racines du polynme K sont 1, 2 et 3.


>>

racines = roots(K);

>>

racines

racines =
3.0000
2.0000
1.0000
Reprsentation graphique

Pour tracer la reprsentation graphique du polynme K(x), dfinissons un domaine pour


la variable x qui contient les racines de K.
Domaine des valeurs de la variable x et valuation du polynme K
>>
>>

x = 0:0.1:4;
y = polyval(K,x);

Trac de la fonction y = 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

trac d'une reprsentation graphique,


affiche une grille,
attribue un titre au graphique,
attribue un texte l'axe des abscisses,
attribue un texte l'axe des ordonnes.

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

La multiplication et la division de polynmes peuvent tre ralises facilement avec


MATLAB. Soient deux polynmes P1 et P2 dfinis par :
P1 ( x ) = x + 2
P2 ( x ) = x 2 2 x + 1

>> P1 = [1 2]
P1 =
1
2
>> P2 = [1 -2 1]
P2 =
1
-2
1

Prise en main de MATLAB

27

Le rsultat de la multiplication de P1 par P2 est le polynme P3 qui s'obtient avec la


fonction conv.
>> P3 = conv(P1,P2)
P3 =
1
0
-3

La division de deux polynmes se fait par la fonction deconv. Le quotient Q et le reste R


de la division peuvent tre obtenus sous forme d'lments d'un tableau.
>>

[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

R est le polynme nul si la division est exacte.


I.8. Graphiques 2D et 3D

MATLAB peut produire des graphiques couleurs 2D et 3D impressionnants. Il fournit


aussi les outils et moyens de personnaliser et de modifier pratiquement tous leurs aspects,
facilement et de manire parfaitement contrle.
Pour avoir un aperu des possibilits de MATLAB, il est conseill de consulter le
programme de dmonstration en entrant la commande demo la suite de l'invite ">>".
>> demo matlab graphics
I.8.1. Graphiques 2D

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')

La taille du trait peut tre modifie graphiquement en le slectionnant la souris puis un


clic droit en choisissant loption LineWidth aprs avoir slectionn la flche ddition
graphique.
De mme, on peut modifier la taille et la police des caractres du titre et du label de laxe
des x et y ainsi que celles du texte lintrieur de la fentre graphique.
La commande figure(gcf) permet de passer du mode interactif la fentre graphique
courante. Vous pouvez aussi utiliser le menu "Window" et slectionner la fentre
graphique.
Au graphique courant vous pouvez ajouter un titre, une grille, une lgende pour les axes ou
du texte sur le graphique grce aux commandes : title, grid, xlabel, ylabel,
text et gtext.
On peut aussi tracer des courbes paramtriques.

Prise en main de MATLAB

>>
>>
>>
>>
>>
>>
>>
>>

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

Soit l'exemple suivant d'une fonction 2 variables :


z=

sin( x 2 + y 2 )
,
x2 + y2

pour x et y variant de - avec un pas de /10.


>> alpha = -pi:pi/10:pi;

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);

On value la fonction z et on stocke les donnes dans la variable Z.


>>

Z = sin(X.^2+Y.^2)./(X.^2+Y.^2);

On dessine la surface reprsentative de la fonction.


>>

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).
>>
>>
>>

xlabel('angle \alpha = -\pi : \pi')


ylabel('angle \beta = -\pi : \pi')
title('sin (\alpha^2+\beta^2)/(\alpha^2+\beta^2)')

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 = - :

Prise en main de MATLAB

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).

I.9.1. Fichiers de donnes

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

On sauvegarde la variable t dans le fichier fic_t,


>>

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

MATLAB ne connat plus la variable t.


>> t
??? Undefined function or variable t.

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

Cette vrification peut se faire, soit par l'appel de cette variable,


>> t
t =
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

On a la possibilit d'effacer une ou plusieurs variables de l'espace de travail. Si l'on veut,


par exemple, effacer uniquement certaines variables, on excutera la commande clear
suivie des noms de ces variables.
Exemple
>>
>>
>>

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

On dcide d'effacer les variables x et t.


>>

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

I.9.2. Fichiers de commandes et de fonctions

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".

Prise en main de MATLAB

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.

Les fichiers de commandes (scripts)

Un fichier de commandes ou script est une squence d'instructions MATLAB. Les


variables de ces fichiers sont locales l'espace de travail.
Les valeurs des variables de votre environnement de travail peuvent tre modifies par les
instructions des fichiers scripts.
Les fichiers de commandes (scripts) sont aussi utiliss pour la saisie de donnes. Dans le
cas de grandes matrices, l'utilisation de scripts vous permet de corriger facilement et
rapidement les erreurs de saisie.
Un fichier script peut appeler un autre ou s'appeler lui mme de faon rcursive.
Nous proposons, dans ce qui suit, un exemple de script, stock dans un fichier appel
courbe1.m, dont le code permet de tracer la courbe de la fonction y = x2+5, sur
l'intervalle [-5, 5].

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

Lditeur de la version R2009a de MATLAB permet de dboger le programme, facilite


ldition en affichant des couleurs diffrentes selon le type de donnes (commentaires en
vert, chanes de caractres en violet, etc.).
Ceci permet dabord de sauvegarder le fichier puis de lexcuter.

34

>>

Chapitre 1

courbe1

L'excution de ce script permet de tracer la courbe de parabole suivante :


trac de y=x 2+5
30

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

Prise en main de MATLAB

35

b=a+1; % seule commande excute


while 0
b=a+5;
end

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 de fonctions

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);

Lorsquon sauvegarde ce programme, MATLAB propose de donner le mme nom que


cette fonction. Il est prfrable de garder ce nom. Cet exemple sera ainsi stock dans un
fichier appel randint.m.
La premire ligne dclare le nom de la fonction (randint.m), les arguments d'entre (n,
max) et les arguments de sortie (valeurs retournes par la fonction, res). Sans cette
premire ligne, le fichier M correspond plutt un fichier script.
On peut remarquer que, contrairement aux langages classiques, les fonctions MATLAB
peuvent donner en retour plusieurs arguments et de diffrents types.
Pour invoquer une fonction, il suffit de l'appeler suivant la syntaxe suivante :
resultat = nom_fonction(liste des arguments d'appel)

L'exemple suivant gnre un vecteur alatoire d'entiers, nomm "nb_alea", de longueur


10 et dont toutes les valeurs sont comprises entre 0 et 50.

36

Chapitre 1

>> nb_alea = randint(10,50)


nb_alea =
8
49

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

% 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

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)

I.9.3. Instructions de contrle

MATLAB dispose des instructions de contrle suivantes : for, while et if.


La syntaxe de chacune de ces instructions est semblable celles des langages classiques.
Il est important de savoir que beaucoup d'oprations ncessitent ces instructions dans des
langages classiques tels que C et Fortran, alors que dans MATLAB, on peut s'en
affranchir. Les oprations sur les matrices (addition, multiplication, etc.) sont les exemples
les plus vidents.

Prise en main de MATLAB

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 :

retourne le reste de la division de deux nombres,


affiche le message spcifi sous forme d'une chane de caractres.

I.9.4. Oprateurs relationnels et logiques

Des expressions relationnelles et logiques peuvent tre utilises dans MATLAB


exactement comme dans les autres langages de programmation tels que le Fortran ou le C.
Oprateurs relationnels

Les oprateurs relationnels sont :

<, <=, >, >=, ==, ~=

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.

Prise en main de MATLAB

39

Exemples d'expressions logiques

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));

u_limite = expr1 * u_max + expr2 * u_min + expr3*u;

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;

une valeur correcte du signal doit tre conserve


>> sature(6.5,u_min,u_max)
ans =
6.5000

une valeur du signal qui doit tre limite u_max


>> sature(10.5,u_min,u_max)
ans =
10

une valeur du signal qui doit tre limite u_min


>> sature(-1.5,u_min,u_max)
ans =
0

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

Prise en main de MATLAB

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')

Prise en main de MATLAB

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

La commande edit nom_fic ouvre lditeur pour modification du code du fichier


nom_fic .

Prise en main de MATLAB

45

II. Prise en main de SIMULINK


SIMULINK est un langage de programmation graphique qui permet de modliser et de
simuler des systmes dynamiques.
II.1. Quelques bibliothques

SIMULINK souvre lorsquon clique sur le bouton


Les librairies sont des ensembles de blocs rpartis selon la catgorie de fonctions ralises.
Parmi ces librairies, nous trouvons, entre autres, les plus utilises :
Sources
Sinks
Signal Routing
Math Operations
Continuous
Discrete
Ports & Subsystems
Logic and Bit
Operations
Discontinuities
Additional Math &
Discrete

Gnrateurs de signaux, lecture dans fichiers de donnes.


Blocs daffichage, enregistrement dans fichiers de donnes.
Routage des fils de liaison entre blocs.
Operations mathmatiques.
Blocs continus.
Blocs discrets.
Blocs permettant de raliser des sous-systmes.
Blocs doprations logiques et binaires.
Blocs discontinus (hystrsis, seuil, etc.).
Blocs additionnels doprations mathmatiques et de
systmes discrets.

Ci-dessous, nous prsentons la librairie Sources.

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

II.2. Quelques exemples


II.2.1. Rponse indicielle dun systme du 1er ordre

Le modle exo1.mdl permet de simuler la rponse indicielle dun systme numrique du


premier ordre de ple 0.5 et de gain statique unit.
H(z) = 0.5/(1 0.5 z-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).

En double-cliquant sur les blocs, on peut les paramtrer : dition du numrateur et


dnominateur de la fonction de transfert, hauteur de lchelon, ainsi que le type de variable
y, structure ou tableau (Array).
Avec loption Configuration Parameters du menu Simulation, nous pouvons
spcifier les paramtres de la simulation : dure de la simulation, algorithme de rsolution,
etc.
Dans ce qui suit, nous allons tudier dautres exemples qui nous permettront dtudier
dautres fonctionnalits de SIMULINK.
La courbe suivante de loscilloscope, montre lentre et la sortie du systme discret du
premier ordre. Nous vrifions bien le gain statique unit obtenu pour z=1, soit :
H(1) = 0.5/(1-0.5) = 1

Prise en main de MATLAB

47

II.2.2. Rsolution dun systme linaire surdtermin

Le modle suivant permet de rsoudre un systme sur dtermin (ou dtermin) de la


forme A x = B.
On programme la rsolution dun systme sur dtermin par la mthode des moindres
carrs :
x = (AT A)-1 AT B

Pour la transposition, nous utilisons le bloc Math Function


de la librairie Math Operations.
Dans le menu droulant Function on choisit loption transpose. Le bloc prend
alors la forme

48

Chapitre 1

Quant la multiplication, linversion ou le produit matriciel, nous utilisons le mme bloc


Product (produit)
que nous paramtrons sous sa forme matricielle avec
autant dentres que lon dsire.
On peut raliser linversion par la division matricielle en crivant le symbole / dans la
case Number of inputs. Ainsi le bloc ne possdera quune entre (la matrice
inverser) sur laquelle est note Inv.

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

>> A=[2 10;1 2;4 20];


>> B = [0 2 1]';
>> inv(A'*A)*A'*B
ans =
3.2000
-0.6000

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.

Prise en main de MATLAB

49

Dans le cas dtermin, de 2 quations 2 inconnues, nous vrifions la solution suivante :


2 x1 + 3 x2 = 8
x1 2 x2 = 3

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

La matrice A et le vecteur B sont spcifis dans le callback InitFcn.

50

Chapitre 1

II.2.3. Solution dquation diffrentielle du 2nd ordre

On se propose de trouver la solution de lquation diffrentielle du 2nd ordre suivante :


s" = w 2 (u s) 2 w s'
0
0
En prenant la transforme de Laplace, on remarque que cette solution est la sortie du
1
systme du 2nd ordre de fonction de transfert : S ( p) =
U ( p)
2
p2
1+
p+
w
w2
0
0
Le systme est programm ci-dessous sous la forme de son quation diffrentielle du
second degr. La pulsation propre w0 et le coefficient damortissement sont spcifis dans
le
callback
InitFcn
(tape
dinitialisation
du
modle
SIMULINK
syst_2nd_ordre_equa_diff.mdl .). Le signal dentre du systme est form
dun chelon unit jusqu linstant 100 puis on le suit par une rampe de pente 0.05 et de
valeur initiale nulle. Afin dviter le croisement des fils, nous avons envoy le signal
dentre dans une tiquette Goto nomme [u] que lon rcupre plus loin par ltiquette
From de mme nom. Les valeurs de w0 et de sont les suivants :

Prise en main de MATLAB

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

Prise en main de MATLAB

53

Bien que le multiplexeur possde uniquement 2 entres, le signal enregistr possde 3


lignes et autant de colonnes que le nombre dchantillons temporels.
>> size(es)
ans =
3
84

Par dfaut, MATLAB ajoute toujours la variable temps en dbut de fichier, soit le vecteur
es(1, :) dans notre cas ici.
>>
>>
du
>>
>>
>>

plot(es(1,:), es(2,:), es(1,:), es(3,:))


title(Rponse indicielle et une rampe dun Systme
2nd ordre)
xlabel(Temps continu)
gtext(Signal de sortie)
gtext(Signal dentre)

Le bloc numrique display de la bibliothque sinks affiche les valeurs instantanes


du signal de sortie du systme du 2nd ordre analogique.
Nous obtenons les mmes signaux que ceux affichs sur loscilloscope.
Rponse indicielle et une rampe dun Systme du 2nd ordre
10
9
8
Signal de sortie

7
6
5
4

Signal d'entre

3
2
1
0

20

40

60

80
100
120
Temps continu

140

160

180

200

Aprs quelques oscillations du fait du faible coefficient damortissement, le signal de


sortie rejoint le signal dentre car le gain statique est gal 1.

54

Chapitre 1

II.2.4. Rsolution dquations rcurrentes

Considrons lquation rcurrente du second ordre suivante :


x =1 + 0.8 x
0.5 x
n
n 1
n2
Nous ralisons les retards par des blocs Unit Delay que nous retournons via des gains
et un sommateur vers lentre xn.
La solution est visualise sur le Display et la valeur finale de la courbe sur
loscilloscope.

Grce lexistence de la constante 1, nous pouvons initialiser les retards purs 0.


Nous pouvons obtenir la mme solution en transformant cette quation en fonction de
transfert numrique.
1
X ( z) =

1
1 0 .8 z + 0 .5 z 2

Prise en main de MATLAB

55

II.2.5. Rgulateur PID

On se propose de raliser une rgulation PID du processus du 1er ordre de fonction de


transfert :
0.8
H ( p) =
1 + 20 p
Le systme contrler est du premier ordre de constante de temps = 20 s et de gain
statique gal 0.8.

Le PID est ralis sous forme de la somme des 3 actions :


-

Proportionnelle, P
1
Intgrale,
avec un gain I.
p
du
Drive,
, prcde du gain D.
dt

Le gain Drive est choisi gal 0, le rgulateur a pour expression :

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'

Les signaux sont sauvegards dans la structure nomme signaux_es.

56

Chapitre 1

>> isstruct(signaux_es)
ans =
1

La commande isfield retourne 3 valeurs logiques vraies, signaux_es est bien


une structure 3 champs : time, signals, blockName.
>>f=isfield(signaux_es,{'time','signals','blockName'})
f =
1

Les 3 valeurs 1 (vraies) de la rponse f de la commande isfield indiquent que time,


signals et blockName sont des champs de la structure signaux_es.
Les structures seront tudies dans le chapitre des tableaux multidimensionnels.
>> plot(signaux_es.signals.values)

En rgime permanent le signal de sortie suit parfaitement le signal de consigne. Nous


observons ces mmes signaux sur loscilloscope.

Prise en main de MATLAB

57

III. Menu Start


A partir de la version R2009, MATLAB dispose du menu Start qui permet :
-

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.

Le menu Start, disponible depuis la version R2009 de MATLAB possde beaucoup de


proprits qui permettent laccs rapide, entre autres, :

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

laide tous les outils associs MATLAB et SIMULINK. Ci-dessous, nous


faisons appel laide sur la boite outils de logique floue (Fuzzy Logic
Toolbox).

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).

Prise en main de MATLAB

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.

Check for Updates

Permet la recherche des mises jour en se connectant au site de Mathworks.

60

Chapitre 1

Web

Raccourcis (Shortcuts)

Les raccourcis permettent demmener MATLAB dans un environnement prcis. Dans le


champ Label, on crit le nom du raccourci et dans celui du Callback on liste un
certain nombre de commandes excuter lorsquon fait appel ce raccourci.
Dans notre exemple, il sagit :
-

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.

Prise en main de MATLAB

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.

Il ne se retrouve plus dans loption Shortcuts du menu Start.

Help

On a, grce cette option du menu Start, accs laide disponible sur tous les outils
associs MATLAB.

62

Chapitre 1

Simulink, Toolboxes, MATLAB

- MATLAB

Dans loption MATLAB du menu Start, nous avons accs :


-

au profiler (voir chapitre Programmation ),


des dmos de MATLAB,
de laide de MATLAB,
des outils de trac de courbes, etc.

Prise en main de MATLAB


- Simulink

Block

63

Chapitre 2
Chanes de caractres, dates et heures

I. Les chanes de caractres


I.1. Gnralits
I.2. Fonctions propres aux chanes de caractres
I.2.1. Conversion de chanes en nombres
I.2.2. Conversion de nombres en chanes
I.2.3. Tests sur les chanes
I.2.4. Concatnation de chanes de caractres
I.2.5. Oprations sur les chanes
I.3. Fonctions utiles
I.4. Lecture et criture des chanes formates
I.5. Des programmes utiles
I.6. Applications
I.6.1. Cryptage et dcryptage dun message
I.6.2. Palindrome
II. Gestion des dates et heures
II.1. Diffrents formats de dates et heures
II.2. Autres fonctions utiles de mesure du temps

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).

I. Les chanes de caractres


I.1. Gnralits
Une chane de caractres est toute suite de caractres placs entre guillemets.
>> Chaine = 'MATLAB R2009'
Chaine =
MATLAB R2009
Comme pour les polynmes, une chane de caractres est considre par MATLAB comme un vecteur
ligne dont on peut calculer la taille, la longueur, la transposer, etc.

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_2, Springer-Verlag Berlin Heidelberg 2010

66

Chapitre 2

Extraction dune partie de la chane


>> SousChaine=Chaine(8:length(Chaine))
SousChaine =
R2009
La longueur dune chane est gale au nombre des caractres, y compris les blancs (espaces) si elle
possde.
Taille
>> size(SousChaine)
ans =
1
6
Transposition
>> SousChaine'
ans =
R
2
0
0
9
I.2. Fonctions propres aux chanes de caractres
I.2.1. Conversion de chanes en nombres
Comme dans les fonctions, on a la possibilit de tester le type des arguments dentre, certaines de cellesci sappliquent autant aux vecteurs de numriques quaux chanes de caractres, comme la fonction abs
qui retourne le module dun complexe ou le code ascii dun caractre.
abs
>> abs('MATLAB')
ans =
77
65
84

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

Les chanes de caractres, dates et heures


Double

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

I.2.2. Conversion de nombres en chanes


char
Convertit un tableau dentiers non ngatifs en caractres (les 127 premiers sont les codes ascii de ces
caractres).
>> char([77
ans =
MAT

65

84])

>> char([77 65 84 129 206])


ans =
MAT
setstr
Rciproquement, connaissant les codes ASCII des caractres d'une chane, on peut obtenir la chane de
caractres correspondante par la fonction setstr.
>> Code=abs('SIMULINK')
Code =
83
73
77
85

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 =

Les chanes de caractres, dates et heures


1

69

19

Le rsultat est bien une seule chane de caractres de 19 caractres.


str2num
Effet inverse de la commande num2str. Transforme un nombre vu comme une chane en nombre.
>> Ch='1+3.14'
Ch =
1+3.14
En transformant la chane en nombre, lopration arithmtique est effectue.
>> str2num(Ch)
ans =
4.1400
>> strcat(strvcat('cos(3.14)','exp(log(2.71))'))
ans =
cos(3.14)
exp(log(2.71))
>> str2num(ans)
ans =
-1.0000
2.7100
int2str
Convertit un entier en chane de caractres.
>> int2str([23 56;21 9])
ans =
23 56
21
9
>> isstr(ans)
ans =
1
dec2hex
Conversion d'un nombre entier en un nombre hexadcimal donn sous forme d'une chane de caractres.
>> dec2hex(77)
ans =
4D
dec2bin
Convertit en binaire sous forme dune chane lentier donn en argument.

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

Le 4me caractre de la chane est un espace.


isstr, ischar
Ces 2 commandes retournent 1 si largument est une chane de caractres et 0 autrement.
>> isstr('MATLAB est un langage de programmation de haut niveau')
ans =
1
>> isstr('MATLAB')==ischar('SIMULINK')
ans =
1
isletter
Retourne un tableau de 0 et 1 ; 1 pour les lettres de l'alphabet y compris les lettres avec accents, et 0 pour
le reste des caractres.
>> Chaine=['5f87';'yfg']
Chaine =
5f87
yfg
>> isletter(Chaine)
ans =
1
1

0
1

1
1

0
1

0
1

Les chanes de caractres, dates et heures

71

I.2.4. Concatnation de chanes de caractres


Pour concatner horizontalement des chanes de caractres, il suffit de les mettre comme des lments
dun vecteur ligne.
>> ChaineConcat=['MATLAB ' 'est un langage ' 'de haut niveau']
ChaineConcat =
MATLAB est un langage de haut niveau
strcat
Concatne une suite de chanes donnes en argument.
>> strcat('MATLAB',' R2009a')
ans =
MATLAB R2009a
La concatnation verticale comme lments dun vecteur colonne impose que ces chanes soient de mme
longueur.
>> strvcat('MATLAB & SIMULINK','R2009a')
ans =
MATLAB & SIMULINK
R2009a
On doit rajouter des blancs la chane la plus petite.
>> ['MATLAB & SIMULINK';'R2009a

']

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

I.2.5. Oprations sur les chanes


strcmp
Compare 2 chanes de caractres donnes en arguments.
>> TestEgalite=strcmp('MATLAB','matlab')
TestEgalite =
0
Les 2 chanes de caractres ne sont pas identiques.
strncmp
Compare les N premiers caractres de chanes.
>> Chaine1='MATLAB';
>> Chaine2='MATlab';
>> TestIdentN=strncmp(Chaine1, Chaine2,3)
TestIdentN =
1
Les 3 premiers caractres des 2 chanes sont identiques. Les 4 premiers ne le sont pas cause de la lettre l
qui est une fois en majuscule et une autre en minuscule.
>> TestIdentN=strncmp(Chaine1, Chaine2,4)
TestIdentN =
0
strcmpi
Compare les chanes en ignorant les types majuscule et minuscule.
>> TestIdent=strcmpi('MATLAB','matlab')
TestIdent =
1
findstr.
Recherche dune chane dans une autre.
>> Chaine1='TLAB';
>> Chaine2='MATLAB';
>> findstr(Chaine1, Chaine2)
ans =
3
La rponse est que la chane Chaine1 est lintrieur de Chaine2 et quelle commence la 3me
position.

Les chanes de caractres, dates et heures

73

On vrifie bien cette chane par indexation de la chane Chane2.


>> Chaine2(1,ans:length(Chaine2))
ans =
TLAB
strfind
Recherche les indices o se trouve une chane dans une autre.
>> findstr(Chaine2,'A')
ans =
2
5
La chane A se trouve bien dans la chane MATLAB aux positions 2 et 5.
upper, lower
Transforme respectivement une chane en majuscules et en minuscules.
>> Maj=upper('MATlab')
Maj =
MATLAB
>> Minus=lower('MATlab')
Minus =
matlab
strrep
Ch = strrep(Ch1,Ch2,Ch3) remplace toutes les occurrences de la chane Ch2 dans Ch1 par la
chane Ch3.
>> Ch=strrep('Ceci est un exemple de niveau moyen','moyen','trs bon')
Ch =
Ceci est un exemple de niveau trs bon
strtrim
Supprime les blancs avant la chane.
>> Chaine='
MATLAB R2009 et SIMULINK'
Chaine =
MATLAB R2009 et SIMULINK
>> Chaine2=strtrim(Chaine)
Chaine2 =
MATLAB R2009 et SIMULINK
>> length(Chaine)

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

Les chanes de caractres, dates et heures

75

>> Chaine = 'exp(-det(sin(x)))'


Chaine =
exp(-det(sin(x)))
>> eval(Chaine)
ans =
2.3774
poly2str
Retourne un polynme sous forme dune chane de caractres.
>> p=poly2str([1 -2 4],'x')
p =
x^2 - 2 x + 4
texlabel
Permet dafficher les caractres TeX pour des labels dans les graphiques par exemple..
x=-2*pi:pi/10:2*pi;
plot(x, sinc(x))
f1=texlabel('sin(sqrt(lambda^2+gamma^2))/sqrt(lambda^2+gamma^2)');
gtext(f1)
f2=texlabel('angle : -2\pi : 2\pi')
xlabel('angle : -2\pi : 2\pi')
title('Trac du sinus cardinal')
Tracdusinus cardinal
1

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

Les chanes de caractres, dates et heures

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
%

entier dcimal sign,


entier dcimal sign,
entier octal non sign,
entier dcimal non sign,
entier hexadcimal non sign (avec a, b, c, d, e et f),
entier hexadcimal non sign (avec A, B, C, D, E et F),
nombre flottant sign de la forme [-] dddd.dddd,
nombre flottant sign de la forme [-] d.dddd e [+/-] ddd,
nombre flottant sign de type e ou f, suivant la valeur et la prcision donnes. Les zros et le
point dcimal ne figurent que s'ils sont ncessaires,
nombre flottant, comme e, mais l'exposant est la lettre E,
nombre flottant, comme g, mais l'exposant est la lettre E,
caractre simple,
chane de caractres. Affiche les caractres jusqu' la rencontre d'un caractre nul d'arrt ou
jusqu' ce que la prcision soit atteinte,
le caractre de pourcentage % est affich.

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

matrice de donnes rcupres,


nombre d'lments lus correctement,
message d'erreur dans le cas o une erreur est rencontre (chane vide autrement),
chane dans laquelle la lecture est ralise,
instructions de formatage analogues celles du langage C (voir sscanf),
argument optionnel, pose une limite au nombre d'lments lus partir de la chane.

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

Les chanes de caractres, dates et heures

79

I.5. Des programmes utiles


Dans cette section, nous proposons au lecteur, des fonctions de traitement de chanes de caractres qui
complteront celles fournies par MATLAB.
fonction JourDatee.m
function JDate = JourDate(Date)
% extraction des informations jour, mois et Anne
% partir d'une date
% sous forme d'une chane de caractres avec les formats
% 'jj-mm-aa' ou 'jj/mm/aa'
% r_date = [Jour Mois Anne];
if nargin ~= 1;
error('nombre d''arguments incorrect');
end;
Delim = ['-' '/'];
% dlimiteurs pour une date
[Jour Reste] = strtok(Date,Delim);
[Mois Reste] = strtok(Reste,Delim);
[Annee Reste] = strtok(Reste,Delim);
% conversions chanes --> nombres
Jour = str2num(Jour);
Mois = str2num(Mois);
Annee = str2num(Annee);
% Affichage du jour
[n,j]=weekday(datestr(Date));
JDate = num2str([Jour Mois Annee]);
JDate = [j ' ' JDate];
Quelques exemples d'appel de cette fonction donnent :
>> DateDuRetour=JourDate('31/08/2009')
DateDuRetour =
Thu 31
8 2009
>> DateNaissance=JourDate('13/10/1977')
DateNaissance =
Thu 13
10 1977
I.6. Applications
I.6.1. Cryptage et dcryptage d'un message
On se propose d'crire un programme permettant de lire un texte, et de l'afficher sous une forme code, en
mettant en uvre un dcalage du jeu de caractres.

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.

Les chanes de caractres, dates et heures

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

II. Gestion des dates et heures


II.1. Diffrents formats de dates et heures
MATLAB gre la date sous 3 types de format diffrents :

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

Les chanes de caractres, dates et heures

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

On peut spcifier le mois et lanne sous forme de scalaires.


>> calendar(1977, 10)
Oct 1977
S
M
Tu
W
0
0
0
0
2
3
4
5
9
10
11
12
16
17
18
19
23
24
25
26
30
31
0
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;

Les chanes de caractres, dates et heures

85

disp('Temps mis en secondes :')


dt=cputime-t1
Nous affichons le temps t1 depuis le dbut de la session et la dure dt pour lexcution de cette suite
dinstructions.
t1 =
81.4063
Temps mis en secondes :
dt =
0.2031
etime
La commande etim(t2,t1) retourne, en secondes, la diffrence des temps t2 et t1 spcifis sous le
format vecteurs.
x = rand(1000000, 1); t = clock;
TempsMis = etime(clock, t)
TempsMis =
0.3120

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

Les nombres complexes

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

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_3, Springer-Verlag Berlin Heidelberg 2010

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

somme de deux matrices reprsentant les parties relle et imaginaire


>> X = [1 0; 1 1]+i*[2 3; 1 -1];
Toutes les oprations sur les matrices valeurs relles restent valables pour les matrices de
nombres complexes.

Complexes

89

>> det(X) % dterminant de X


ans =
6.0000 - 2.0000i
La fonction complex(A,B) permet la cration du complexe A+iB.
>> abs(X)
ans =
2.2361
1.4142

% matrice des modules des lments de X


3.0000
1.4142

II. Oprations sur les nombres complexes


Les oprations sur les nombres complexes sont ralises de la mme faon que sur les
nombres rels.
II.1. Somme, produit et division de complexes
Addition
L'addition de nombres complexes s'effectue comme suit :
z = Re(z ) + i Im(z )
k
k
k

>>(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.

III. Fonctions spciales de nombres complexes


MATLAB propose des fonctions spcialises pour la manipulation des nombres
complexes.
III.1. Reprsentation graphique
La fonction plot applique un nombre complexe, trace son image dans le plan
cartsien.
fichier plt_cplx.m
% trac des images d'un vecteur de complexes
z = [1 -0.5-3i -2+0.5i];
plot(z,'o')
grid
axis([-3 2 -4 2])
for k = 1:length(z)
gtext(['image de z = ' num2str(z(k))])
end
xlabel('partie relle')
ylabel('partie imaginaire')
Reprsentation des nombres complexes
2

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

Pour reprsenter le module et l'argument, on utilise la fonction compass qui trace un


segment orient partant de l'origine du plan vers l'image du complexe.
L'application au vecteur z contenant les racines 3-imes de l'unit donne la reprsentation
suivante :
>> z = [1.0000 -0.5000-0.8660i -0.5000+0.8660i];
>> compass(z)
>>
>>
>>
>>

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

La commande feather(z) reprsente chaque lment complexe du vecteur z par un


segment orient dont l'origine est sur l'axe des abscisses.
Ces segments ont pour longueurs et angles (par rapport l'axe des abscisses),
respectivement les modules et arguments des complexes.
Les origines des segments sont rgulirement espaces.

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

III.2. Fonctions de variables complexes


La fonction cplxgrid(n) permet de diviser l'espace en plusieurs domaines dans le
systme de coordonnes polaires.
>> s = cplxgrid(3)
s =
Columns 1 through 3
0
0
-0.3333 - 0.0000i -0.1667 - 0.2887i
-0.6667 - 0.0000i -0.3333 - 0.5774i
-1.0000 - 0.0000i -0.5000 - 0.8660i
Columns 4 through 6
0
0.3333
0.6667
1.0000

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

La commande plot(s) donne la mme courbe que ci-dessus.


La fonction cplxmap permet de tracer une fonction variable complexe y = f(z) en
coordonnes polaires dans un disque unit. La partie relle du complexe y fixe la hauteur
de la surface et sa partie imaginaire rgle la couleur du trac.
>> z = cplxgrid(20);
>> cplxmap(z,z.^3)
>> title(' fonction y = z^3')

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

Racines n-imes d'un nombre complexe

Si l'on considre le nombre complexe z sous la forme exponentielle


z = r exp( j )

on obtient l'expression de ses racines n-imes

z=

r exp [ j (

+2 k
n

)]

avec k = 0, 1, ..., n-1.


Dans ce qui suit, nous crons un fichier fonction qui retourne les racines n-imes d'un
nombre complexe.
fichier nracine.m
function Res = nracine(z,n)
% racine n-ime d'un nombre complexe
% Res : tableau des racines

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

son logarithme, dfini 2k prs, a pour expression :


w = log( z ) = log + j ( + 2 k )

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

Log = conj(log(abs(z))*ones(1,k)+j*(angle(z)* ...


ones(1,k)+2*(0:k-1)*pi))';

Appliquons cette fonction au calcul du logarithme du nombre z = 1 + i avec k = 3 (racines


3-imes).
>> logcplx(1+i,3)
ans =
0.3466 + 0.7854i
0.3466 + 7.0686i
0.3466 +13.3518i

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

On peut vrifier ce rsultat par son lvation la puissance 3.


>> racines.^3
ans =
1.0000 + 1.0000i
1.0000 + 1.0000i
1.0000 + 1.0000i

Nous obtenons 3 fois la mme valeur 1.

Etude d'un circuit lectrique RLC

Le circuit RLC suivant est attaqu par un signal sinusodal e(t ) = e


L

R
C

ve
avec

R = 100 , L = 01
. H , C = 1m F

et un domaine de pulsations allant de 0 100 rad/s.

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.

fichier circuit_ rlc.m (suite)


% coordonnes logarithmiques
figure(3), semilogx(w,180*angle(H)/pi)
grid, title('Phase en coordonnes semi-logarithmiques')

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

En remplaant jw par le paramtre p de la transforme de Laplace, on obtient une fonction


de transfert dont le numrateur et le dnominateur s'expriment sous forme de polynmes en
p. La fonction de transfert prcdente devient :
V ( p)
1
=
H ( p) = s
Ve ( p) LC p 2 + RC p + 1
Nous allons programmer une fonction qui permet de tracer la rponse en frquences
(module et phase) pour toute fonction de transfert H(p) en utilisant les notations
complexes.
fichier rpfrqfa.m
% retourne les valeurs du module de la rponse en frquences
% num, den : numrateur et dnominateur
% de la fonction de transfert
% omega : bande de pulsations
% type :
'lin' : chelles linaires
%
'log' : chelles logarithmiques
if nargin ~= 4
help rpfreqfa
error('Nombre de paramtres incorrect !')
end
jw = omega*j; H = polyval(num,jw)./polyval(den,jw);
switch type
case 'log'

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')

Phase en coordonnes semilogarithmiques


-45
-50
-55
-60
-65
-70
-75
-80
-85
-90
0
10

10

10

Synthse d'un filtre de Butterworth passe bas analogique d'ordre n

La fonction de transfert d'un filtre passe bas analogique de Butterworth d'ordre n a


pour expression :
1
H ( jw) =
w
1 + j ( )n
wc
Son attnuation en dcibels correspond :

A = 20 log 1 + (

w 2n
)
wc

wc : pulsation de coupure -3 dB.


Ci-aprs, nous nous imposons un gabarit dans lequel lattnuation du filtre doit sinscrire.
Nous obtiendrons un certain nombre de filtres qui respectent ce gabarit.

Chapitre 3

102

On se donne le gabarit suivant :

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

La mthode de synthse consiste, en posant A( f 1 ) = Amax , calculer, partir de n = 1,


l'ordre n et la frquence de coupure f c satisfaisant, pour la premire fois, la deuxime
condition sur l'attnuation.
On considre le cas particulier, correspondant un filtre passe bas tel que :
Amax = 1 dB
Amin = 46 dB

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)]);

Ordre et frquence de coupure


n = 9 ; fc =1.078e+004 Hz
Attnuation en dB aux frquences f1 et f2
1.0000
48.3172

Les figures suivantes reprsentent lattnuation dun filtre de Butterworth dordre 9,


frquence de coupure fc = 10,78 kHz.

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

La phase de ce filtre est reprsente par la figure suivante:


Filtre passe bas de Butterworth, n=9, fc=10.78 KhZ
0
-10
-20

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

Transforme de Fourier discrte (TFD)

La transforme de Fourier discrte X d'un signal chantillonn x de longueur N, a pour


expression
2 j n k
N 1
N , pour k = 0,..., N 1
X ( k ) = x ( n) e
n=0
On considre le signal discret x(k) dfini par :
0
k <0
x( k ) =
. )k k 0
(08

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

chantillons de la phase (rad) de la TFD


0
-0.1
-0.2
-0.3
-0.4
-0.5
-0.6
-0.7
-0.8
-0.9
-1

10
15
n d'chantillon frquentiel

20

25

Chapitre 3

108

Transforme de Fourier (TFSD)

La transforme de Fourier X d'un signal x, chantillonn la cadence T, de longueur N, a


pour expression

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

chantillons du module de la TFSD


5
4.5
4
3.5
3
2.5
2
1.5
1
0.5
-4

-3

-2

-1
0
1
n d'chantillon frquentiel

chantillons de la phase (rad) de la TFSD


1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
-4

-3

-2

-1
0
1
n d'chantillon frquentiel

Chapitre 3

110

La figure suivante, nous permet d'observer la priodicit frquentielle du spectre d'un


signal chantillonn ( = [-3, 3]).
chantillons du module de la TFSD
5
4.5
4
3.5
3
2.5
2
1.5
1
0.5
-10

-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

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_4, Springer-Verlag Berlin Heidelberg 2010

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

Exemple: fonctions de transfert en cascade


Considrons le systme suivant constitu de deux fonctions de transfert mises en cascade.
H ( p)
1

H ( p)
2

avec
3p +1
H1 ( p) =
2
p +2p+3

H 2 ( p) =

p + 0.5
p ( p + 0.2)

La fonction de transfert globale est le produit des fonctions de transfert lmentaires :

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

>> den_H = conv([1 2 3],conv([1 0],[1 0.2]))


den_H =
1.0000

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

Si l'on veut, par exemple, retrouver le dnominateur de H1 ( p) , on utilisera la fonction


deconv.
>> den_H1 = deconv(den_H,den_H2)
den_H1 =
1

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

On s'intresse au quotient et au reste de la division de P par S.


>> P = [1 0 1 -1];
>> S = [1 3 -4];
>> [Q, R] = deconv(P,S)
Q =
1
-3
R =
0
0
14
-13

Chapitre 4

114

On obtient ainsi, un quotient Q et un reste R donns par :

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

Ce qui correspond la dcomposition suivante :


P( x )
S ( x)

x3 

.
138
0.2

x  4 x 1

Racines d'un polynme

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

Le polynme caractristique de la matrice A est alors :


p = x2 5 x 2
Les racines de ce polynme sont les valeurs propres de la matrice A que l'on peut aussi
obtenir directement par la fonction eig.

Racines du polynme caractristique de A


racines = roots(p)
racines =
5.3723
-0.3723

Valeurs propres de la matrice A


val_prop = eig(A)
val_prop =
-0.3723
5.3723
I.1.2. Manipulation de fonctions polynomiales

Beaucoup de fonctions mathmatiques s'expriment ou peuvent tre approximes par des


polynmes. On trouve dans MATLAB une varit de commandes pour la manipulation de
fonctions polynomiales.
polyval(f,x) :
polyder(f) :

valuation de la fonction polynomiale f(x) pour un ensemble donn


de valeurs de la variable x, exprim sous forme d'un vecteur,
calcul de la drive de la fonction polynomiale f(x).

Le script poly_di.m, propos ci-dessous, prsente un exemple d'utilisation des fonctions


polynomiales polyval, polyder ainsi que de la fonction polyquad dont on propose
le code dans la suite. Cette dernire calcule les primitives de fonctions polynomiales.

Chapitre 4

116

Considrons, par exemple, la fonction polynomiale f ( x ) = 2 x 2 2 x + 1 . On calculera sa


drive et la primitive s'annulant en 0, dont on tracera les courbes reprsentatives.

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

Nous obtenons ainsi :

fonction f(x), sa drive f'(x) et sa primitive


1
0.9

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

fichier polyquad.m (utilis par poly_di.m)


function quad_p = polyquad(p,a)
% polyquad(P) retourne l'intgrale du polynme dont les
% coefficients sont les lments du vecteur P.
% p : polynme intgrer
% a : borne suprieure du domaine d'intgration
% polyquad(p) : la borne infrieure du domaine est 0
if nargin == 1
a = 0;
end
if nargin == 0
help polyquad
return
end
i = fliplr(find(~isnan(p)));
quad_p = p./i;
a0 = polyval([quad_p 0],a);
quad_p = [quad_p -a0];

Chapitre 4

118
I.2. Interpolation et rgression
I.2.1. Interpolation au sens des moindres carrs

Dans le domaine de l'analyse de donnes, on a souvent besoin d'tablir un modle


mathmatique liant plusieurs sries de valeurs exprimentales. L'interpolation consiste
approcher la courbe liant deux sries de mesures par un polynme. Les coefficients
optimaux de ce polynme sont ceux qui minimisent la variance de l'erreur d'interpolation.
Ce principe est connu sous le nom de la mthode des moindres carrs.
La commande p = polyfit(x,y,n) retourne le polynme p de degr n permettant
d'approcher la courbe y = f(x) au sens des moindres carrs. Afin d'en dduire l'erreur
entre la courbe exprimentale et le modle obtenu, on dispose de la fonction
polyval(p,x) qui retourne la valeur du polynme p pour toutes les composantes du
vecteur ou de la matrice x. Pour appliquer ces fonctions, nous allons simuler une courbe
exprimentale par une sigmode laquelle nous superposons un bruit gaussien.

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])

On obtient les rsultats suivants avec un polynme d'interpolation d'ordre 1.


polynme d'interpolation
p =
0.1274

0.5025

variance de l'erreur d'interpolation : 0.011978


>> sig_reg

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.

Suite fichier sig_reg.m


% utilisation de la fonction errorbar
figure(2)
err = y-polyn
errorbar(x,y,err)
title('sigmode, polynme et erreur d''interpolation')
sigmode, polynme et erreur d'interpolation
1.4
1.2
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-6

-4

-2

Chapitre 4

120

Avec un polynme d'interpolation d'ordre 5, on obtient une trs bonne approximation de la


sigmode comme le montrent les rsultats suivants :
fonction sigmode bruite, polynme d'interpolation d'ordre 5
1.2

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

I.2.2. Interpolations linaires et non linaires

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

La fonction interp2 ralise l'interpolation dans l'espace 3D.

10

123

Les polynmes

L'interpolation de donnes peut se faire dans le domaine frquentiel par la mthode de la


FFT (transforme de Fourier rapide). La commande interpft(x,n) retourne un
vecteur de longueur n par interpolation dans le domaine frquentiel (Transforme de
Fourier du vecteur x).

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

La commande interpft, sans paramtres, ralise une dmonstration de ce type


d'interpolation.

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

Exemple d'excution : lvation au carr d'un polynme


p( x ) = x + 1
q ( x ) = [ p ( x )]

= 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

L'application au calcul du PGCD des polynmes prcdents donne :

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);

Sans normalisation, le calcul prcdent du PGCD donne :


>> pg = pgcd([1 0 -1],[1 3 2])
pg =
0
-3
-3

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

Le PPCM s'obtient partir du PGCD par une formule du type :

A( x ) B( x ) = PGCD( A, B). PPCM ( A, B )


Le PPCM est lui aussi dfini un coefficient rel prs.

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);

Exemple d'excution : calcul du PPCM des polynmes


A(x) = x 2 1
B(x) = x 2 + 3 x + 2

>> 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.

II.4. Calcul de la transforme inverse de Laplace

On se propose d'crire un programme qui permet, partir de l'expression d'une transforme


de Laplace, d'obtenir les valeurs du signal correspondant, dans un intervalle de temps. On
se limitera des transformes ples simples.
Les transformes de Laplace des signaux causaux s'expriment sous la forme d'une fraction.
Par une division polynomiale, on peut dcomposer cette fraction en lments simples,
r
N ( p)
= i
D( p)
i p pi
avec deg(N) < deg(D).
L'expression temporelle du signal est alors :
pt
x (t ) = ri e i
i

La dcomposition en lments simples est obtenue par la fonction residue de


MATLAB.

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);

Dans ce qui suit, on applique ce script sur un signal x(t) de transforme :


X ( p) =
>>
>>
>>
>>
>>

1
( p + 1) ( p + 2)

num = 1; den = conv([1 1],[1 2]);


t = 0:.01:10;
x = laplinv(num,den,t);
plot(t,x), grid
title('signal de transforme X(p) = 1/(p+1)(p+2)');
signal de transforme X(p) = 1/(p+1)(p+2)
0.25

0.2

0.15

0.1

0.05

10

129

Les polynmes

La commande [r,p,k] = residue(N,D)dcompose la transforme en lments


simples du premier ordre.
rk
r
r
N ( p)
= 1 + 2 + ...+
+ ...
p pk
D( p) p p1 p p2
A cette somme d'lments du premier ordre s'ajoute le vecteur k constituant le terme direct.
Ce terme constitue un vecteur vide dans le cas o deg(N) < deg(D).
L'expression temporelle du signal est alors la somme des transformes inverses des
lments obtenus.
p t
p t
p t
x (t ) = r1 e 1 + r2 e 2 + ... + rk e k + ...
Dans le cas de l'exemple prcdent, on obtient :
>> [r,p,k] = residue(1,conv([1 1],[1 2]))
r =
-1
1
p =
-2
-1
k =
[]

L'expression littrale du signal x(t) est alors :


x (t ) = e

2 t

II.5. Calcul de la drive n-ime d'un polynme

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

% function pdn = polydern(p,n)


pdn = 0;
n = (n <= length(p))*n; % si n>degr de p alors pdn=0 et n=0
for i = 1:n
pdn = polyder(p);
p = pdn;
end

Application l'exemple prcdent


>> p = [2 -3 0 2 0 -5];
>> polydern(p,3)
ans =
120
-72
0

La commande polyint permet lintgration analytique des polynmes.


1
Considrons le polynme p( x) = x1 , dont lintgrale vaut p( x) = x 2 x + K
2
>> p = [1 -1]
p =
1
-1
>> polyint(p)
ans =
0.5000
-1.0000

On peut spcifier la valeur de cette constante, par polyint(p, K).


>> polyint(p, 5)
ans =
0.5000
-1.0000

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

Les vecteurs et matrices

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.

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_5, Springer-Verlag Berlin Heidelberg 2010

Chapitre 5

134
I.1. Les vecteurs
I.1.1. Addition et soustraction

L'addition et la soustraction de vecteurs de mmes dimensions se font lment par lment.


Soit les vecteurs lignes x et y suivants :
>> x = [0 5 2];
>> y = [3 5 7];
Les oprations lmentaires sur ces vecteurs se font tout simplement comme suit :
>> x-y
ans =
-3

-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

Les vecteurs et matrices

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

I.1.3. Oprations lment par lment


Les oprateurs sont prcds du signe "point" lorsqu'on veut raliser des oprations entre
les lments de deux vecteurs, pris un un.
>> x = [-1 4 3]; y = [5 4 -3];

Chapitre 5

136

>> z = x.*y
z =
-5
16
>> x./y
ans =
-0.2000
>> x.^2
ans =
1

-9

1.0000

16

-1.0000

I.1.4. Gnration de vecteurs


La commande linspace permet de gnrer un ensemble de n lments (vecteur ligne)
en spcifiant la premire et la dernire valeur. La commande suivante gnre un vecteur de
5 composantes quidistantes allant de 0 1.
>> t = linspace(0,1,5)
t =
0
0.2500
0.5000

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

Si on ne spcifie pas la valeur du pas, il est choisi, par dfaut, gal 1.


>> w = 0:4
w =
0
1

Si on omet de spcifier le pas, la commande linspace(x1,x2) gnre 100 valeurs


galement espaces entre x1 et x2.
>> length(linspace(0,5)) % length : longueur du vecteur
ans =
100
Si on dsire un espacement logarithmique, on dispose de la commande :
logspace (d1,d2,N)
qui gnre N valeurs espaces d'un pas logarithmique entre 10d1 et 10d2, si N est omis sa
valeur par dfaut est 50.

Les vecteurs et matrices

137

>> t = logspace(1,2.5,5)
t =
10.0000
23.7137
56.2341

133.3521

316.2278

I.1.5. Oprations relationnelles sur les vecteurs


La commande isvector retourne la valeur 1 si largument est un vecteur (ligne ou
colonne) et fausse (valeur 0) dans le cas contraire (matrice). Les dimensions doivent tre 1
x n ou n x 1 avec n>=0.
>> isvector(z)
ans =
1
On vrifie que mme si z possde 2 dimensions, lune delles vaut toujours 1 comme le
donne la commande size.
>> ndims(z)
ans =
2
>> size(z)
ans =
1
3

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

La premire composante est bien une valeur finie et pas la deuxime.


>> isreal(w)
ans =
0
>> isinf(w)
ans =
0 1
La deuxime composante est infinie et pas la premire.
Un vecteur peut contenir une valeur vide, symbolise par la valeur [].
>> x = [];
>> isempty(x)
ans =
1
Le vecteur x est bien vide.

I.2. Les matrices


Le tableau 2 dimensions est l'lment de base de MATLAB. Un vecteur n'est autre
qu'une matrice une ligne ou une colonne.
Un simple scalaire est vu comme une matrice 1 ligne et 1 colonne.
>> x=5.3;
>> size(x)
ans =
1
1
Une matrice peut tre crite comme une suite de vecteurs lignes, spars par des pointsvirgules qui symbolisent des sauts de ligne.
>> x = [0 5; 3 5; 6 1]
x =
0
5
3
5
6
1
>> size(x)
ans =
3
2
>> [m, n]=size(x)
m =
3
n =
2

Les vecteurs et matrices

139

La variable x est une matrice 3 lignes et 2 colonnes.


>> length(x)
ans =
3

% plus grande taille de la matrice x

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

II. Fonctions sur les vecteurs et matrices


II.1. Quelques fonctions sur les matrices
MATLAB dispose de fonctions qui oprent directement sur les vecteurs ou les colonnes
d'une matrice. Parmi celles-ci, on peut citer :
mean
:
std
:
sum
:
cumsum :
cumprod :
min
:
max
:
diff
:
prod
:
sort
:

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.

Considrons la matrice rectangulaire X suivante :


>> X = [1 2 3;4 5 6]
X =
1
4

2
5

3
6

Chapitre 5

140

La moyenne et l'cart type de chaque colonne sont :


>> moyenne = mean(X)
moyenne =
2.5000
3.5000

4.5000

>> ecart_type = std(X)


ecart_type =
2.1213
2.1213

2.1213

Les fonctions sappliquent aux lments des colonnes dune matrice


Si l'on dsire calculer, par exemple, la moyenne, la somme, l'cart type de l'ensemble des
lments de la matrice, il faut, au pralable, transformer cette dernire en un vecteur
colonne par l'oprateur ":". Cette mme transformation doit tre ralise pour l'utilisation
des fonctions sum, min et max. Nous pouvons aussi, dans certains cas, appliquer deux
fois la mme fonction.
>> X(:)'
ans =
1

>> ec_type_X = std(X(:))


ec_type_X =
1.8708
>> moy_X = mean(X(:))
moy_X =
3.5000
Cette valeur peut-tre obtenue directement en doublant la fonction mean :
>> mean(mean(X)
ans =
3.5000
Produit scalaire de 2 vecteurs
>> c = [1 4 3]; d = [5 2 1];
>> dot(c,d)
ans =
16
Quelque soit le type ligne ou colonne de lun ou des deux vecteurs le rsultat ne change
pas.
>> dot(c',d)
ans =
16

Les vecteurs et matrices

141

Valeurs minimale et maximale de chaque colonne de X


>> mn = min(X)
mn =
1
2
>> mx = max(X)
mx =
4
5

3
6

Comme prcdemment, le minimum et le maximum de toutes les valeurs de la matrice sont


calculs des deux faons suivantes :
>> min_max1 = [min(X(:)) max(X(:))]
min_max1 =
1
6
>> min_max2=[min(min(X)) max(max(X))]
min_max2 =
1
6
Somme des lments de chaque colonne de X
>> som = sum(X)
som =
5
7

Somme des lments de X


>> somX = sum(sum(X))
somX =
21
L'application des fonctions min, max et sum au vecteur X(:) donne les mmes rsultats.
Il en est de mme pour la somme qui sapplique dabord tous les lments de chaque
colonne. La somme de tous les lments de la matrice se fait comme prcdemment.
Lexpression relationnelle dgalit suivante, valant 1, dmontre lgalit des deux
expressions :
>> sum(X(:))==sum(sum(X))
ans =
1
La fonction prod donne le produit des lments d'un vecteur. On peut s'en servir, par
exemple, pour calculer directement la factorielle d'un entier n.
n ! = n (n-1) ... 1
Factorielle de 5
>> n = 5;
>> fact_5 = prod(1:n)

Chapitre 5

142
fact_5 =
120

Ce mme calcul peut tre ralis en utilisant la rcursivit de la factorielle n ! = n (n-1) !


(voir chapitre Programmation ).
Une majeure partie des fonctions MATLAB est prvue pour accepter directement comme
arguments d'appel, des vecteurs ou matrices. Les arguments de retour peuvent tre alors,
des vecteurs ou des matrices de dimensions analogues aux arguments d'entre. Ceci est
illustr par l'exemple qui suit.
fichier vect_poly.m
% domaine de variation, vecteur x
x = 0:pi/100:2*pi;
% vecteur y de la fonction
y = x.^2./(1.5+cos(x)); % argument d'appel : vecteur x
% trac de la courbe de f
plot(x,y), grid
title('Fonction y = f(x) = x^2/(1.5+cos(x))')
xlabel('Abscisse x')
ylabel('Ordonne y')
Fonction y = f(x) = x 2/(1.5+cos(x))
25

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.

Les vecteurs et matrices

143

Produit cumul des lments dun vecteur


Considrons le vecteur x suivant :
>> x = [2
x =
2

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

La concatnation peut se faire aussi verticalement grce un saut de ligne.


>> D = [A;B]
D =

Chapitre 5

144
1
5
0
8

5
2
6
4

3
6
7
3

La commande cat(dims, A, B) permet de concatner deux ou plusieurs matrices


selon la dimension spcifie dans lentier dims = 1 (verticalement), 2 (horizontalement) et
3 (par pages, voir tableaux multidimensionnels).
>> C = cat(1,A,B)
C =
1
5
3
5
2
6
0
6
7
8
4
3
Les concatnations, horizontale et verticale, peuvent tre effectues par les commandes
horzcat et vertcat.
C =
1
5

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

II.3. Extraction d'une partie d'une matrice, extension d'une matrice


A partir d'une matrice, on peut extraire une autre matrice, un vecteur ou l'un de ses
lments.
>> x = [0 1 2;3 4 5];
x =
0
1
2
3
4
5
L'lment de la deuxime ligne et de la troisime colonne peut tre rcupr en crivant :
>> x(2,3)

Les vecteurs et matrices

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

II.4. Comparaison de matrices


La comparaison de deux vecteurs ou matrices de mmes dimensions donne un vecteur ou
matrice de dimensions analogues, composs de 0 et de 1. Cette opration se fait lment
par lment. Le rsultat de la comparaison de deux lments est 1 lorsque la condition est
vrifie et 0 dans le cas contraire.
Considrons les deux matrices A et B suivantes :
>> A = [1 2; 4 5];
>> B = [3 6; 0 7];
>> A < B
ans =
1
0

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];

La commande isequal (A, C) donne 1 si les matrices A et C sont identiques et 0


autrement.
>> isequal(A,C)
ans =
0
Le test dgalit donne 1 pour chaque lment identique et 0 dans le cas contraire. Dans le
cas des matrices A et C, seuls les lments (1,2) et (2,1) sont gaux, comme le montre le
test suivant :
>> A==C
ans =
0
1

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

Les vecteurs et matrices

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

Considrons les matrices A et B suivantes :


>> A=[1 5; 3 2]
A =
1
5
3
2
>> B=[0 6; 2 7]
B =
0
6
2
7
>> A>=B
ans =
1
1

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..

Les vecteurs et matrices

149

Lorsquon utilise le ET court-circuit, le fait que b soit faux, lexpression


(randn(1000)>1) nest pas value, ce qui diminue considrablement le temps de
calcul.
>> tic;
>> x = (b ~= 0) && (randn(1000)> 1);
>> toc
Elapsed time is 0.001641 seconds.
Le temps de calcul est denviron le tiers avec le && quavec le ET simple du &.
II.5. Typage des donnes numriques
Les mmes valeurs numriques peuvent tre forces dans le type entier sign ou non sign,
cod sur 8, 16, 32 ou 64 bits point fixe ou relles virgule flottante.
La matrice A, bien que ne contenant que des entiers, est du type numrique, mais pas
entier :
>> [isnumeric(A) isinteger(A)]
ans =
1
0
Lorsquon force le type entier non sign sur 8 bits par uint8, elle devient du type entier,
toujours numrique mais pas flottant.
>> C=uint8(A)
>> [isnumeric(C) isinteger(C) isfloat(C)]
ans =
1
1
0
Pour dterminer le type dun objet, on utilise la fonction class. On peut aussi forcer le
type par la fonction cast.
>> a = int8(5);
>> b = cast(a,'uint8');
>> class(a)
ans =
int8
>> class(b)
ans =
uint8
Un nombre entier sign, cod sur n bits possde des valeurs entre 2n/2 et 2n/2 -1 et le non
sign entre 0 et 2n -1.
>> intmin(class(a))
ans =
-128

Chapitre 5

150
>> intmax(class(a))
ans =
127
II.6. Transformations de vecteurs et matrices

Les commandes fliplr et flipud ralisent respectivement un retournement de gauche


droite et de haut en bas du vecteur (ou de la matrice) donn en argument.
>> x = [1 2 3;4 5 6]
x =
1
2
3
4
5
6
>> x_lr = fliplr(x)
x_lr =
3
2
1
6
5
4
>> x_ud = flipud(x)
x_ud =
4
5
6
1
2
3
La commande rot90 ralise une rotation de 90 d'un vecteur ou matrice. Le rsultat
obtenu, diffrent de la transpose, correspond aux applications successives de la
transposition et de la commande flipud.
>> x_90 = rot90(x)
x_90 =
3
6
2
5
1
4
>> x'
ans =
1
2
3

4
5
6

On vrifie aisment que la commande flipud, applique la transpose de x correspond


sa rotation par rot90.
>> all(all(flipud(x') == rot90(x)))
ans =
1
>> isequal(flipud(x'), rot90(x))
ans =
1

Les vecteurs et matrices

151

Les rsultats de flipud(x) et rot90(x) sont identiques.

III. Fonctions propres aux matrices


MATLAB possde toutes les fonctions de calcul matriciel, qui font de lui, en plus de ses
possibilits graphiques de trs haut niveau, un langage de calcul numrique qui permet de
rsoudre, avec facilit, beaucoup de problmes rencontrs en ingnierie.
III.1. Produit de matrices
Le produit d'une matrice de dimensions (m,n) par une matrice de dimensions (p,q)
n'est possible que si n = p, le rsultat donne une matrice de dimensions (m,q).
>> A = [1 2; 3 4];
>> B = [1 2 3; 4 5 8];
>> A*B
ans =
9
19

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

III.2. Inversion de matrices


Une matrice carre est inversible si son rang est gal sa dimension.
>> x = [1 2 ; 5 3];

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

III.3. Division de matrices


L'oprateur division "/" prcd du point, "./", permet une division lment par lment
de deux matrices.
>> A = [1 2; 4 6];
>> B = [2 2; 4 3];

Les vecteurs et matrices

153

>> A_sur_B = A./B


A_sur_B =
0.5000
1.0000
1.0000
2.0000
On peut aussi utiliser l'oprateur slash "/", dans ce cas A/B correspond A*inv(B).
Ceci peut tre vrifi par l'instruction suivante :
>> isequal(A/B, A*inv(B)))
ans =
1
L'oprateur antislash "\" ralise une division gauche, A\B = inv(A)*B.
>> all(all(A\B == inv(A)*B))
ans =
1
III.4. Exponentielle, logarithme et racine carre d'une matrice
MATLAB dispose de 4 fonctions pour le calcul de l'exponentielle d'une matrice :
expm :

base des valeurs et vecteurs propres de la matrice,

expm1 :

base de l'approximation de Pade,

expm2 :

base des sries de Taylor,

expm3 :

base des valeurs et vecteurs propres de la matrice.

>> 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

>> logm(expm(x)) % on retrouve la matrice d'origine


ans =
1.0000
2.0000
0
-1.0000
On obtient le mme rsultat avec expm(logm(x)).
Matrice racine carre
La matrice racine carre rA d'une matrice A est dfinie par rA*rA = A et s'obtient par la
fonction sqrtm.
>> rX = sqrtm(x)
rX =
1.0000
1.0000 - 1.0000i
0
0 + 1.0000i
>> all(all(sqrtm(x)^2 == x))
ans =
1
Pour obtenir les racines carres des lments d'une matrice, on utilisera la fonction sqrt.
>> sqrt(x)
ans =
1.0000
0

1.4142
0 + 1.0000i

Les vecteurs et matrices

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

On obtient le mme rsultat si on applique directement la fonction expm la matrice x


par :
>> expm(x)
ans =
2.7183
0

2.3504
0.3679

III.5. Test du type des lments dune matrice


Comme nous le verrons dans les chapitres correspondants, une matrice peut-tre constitue
dlments numriques ou chanes de caractres. Seule une structure peut contenir divers
types dlments. Il existe dans MATLAB, des commandes pour tester le type des
lments dune matrice.
Soit la matrice x :
>> x=[100 1/0 0/0 ; inf/0 5 0/inf]
x =
100
Inf
NaN
Inf
5
0
Les divisions 1/0 et Inf/0 donnent la valeur Inf qui symbolise linfini tandis que 0/0 produit
la valeur NaN qui nest pas un nombre.
>> isnan(x)
ans =
0
0
0
0

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

Les vecteurs et matrices

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.

IV. Matrices particulires et spciales


Certaines matrices reviennent souvent dans les calculs scientifiques. MATLAB offre la
possibilit de gnrer ce type de matrices spciales telles que la matrice identit, le carr
magique, la matrice de Pascal, la matrice de Hadamard, etc.
Pour les matrices rectangulaires, on prcisera le nombre de lignes et de colonnes et pour les
matrices carres, on spcifiera uniquement l'ordre.
Matrice identit
Matrice identit d'ordre 3
>> identite = eye(3)
identite =
1
0
0
1
0
0

0
0
1

Les vecteurs et matrices

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.

Les vecteurs et matrices

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

Sommes des colonnes


>> sum(magic4)
ans =
34
34

34

34

>> sum(magic4')
ans =
34
34
34

34

Sommes des lignes

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

Son inverse est aussi lments entiers.


La commande pascal(n,1) cre une matrice carre d'ordre n, triangulaire infrieure et
identique son inverse (matrice involutive).

Les vecteurs et matrices

163

>> pasc_41 = pascal(4,1)


pasc_41 =
1
0
0
0
1
-1
0
0
1
-2
1
0
1
-3
3
-1
Matrice de Hadamard
Une matrice H de Hadamard d'ordre n est une matrice dont les lments sont gaux 1 ou
-1. Le produit par sa transpose donne une matrice gale n fois la matrice identit.
>> hadam4 = hadamard(4)
hadam4 =
1
1
1
1
1
-1
1
-1
1
1
-1
-1
1
-1
-1
1
>> hadam4'*hadam4
ans =
4
0
0
0
4
0
0
0
4
0
0
0

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

>> comp = compan(p)


comp =
-2
1
1
0
On vrifie bien l'galit des racines de p et des valeurs propres de la matrice compagnon
associe.
>> eig(comp) == roots(p)
ans =
1
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.

V. Factorisation et dcomposition de matrices


Factorisation de Cholesky
La factorisation de Cholesky d'une matrice A dfinie positive consiste en une
dcomposition de type :
A = B'*B
B :
B' :

matrice triangulaire infrieure rgulire,


transpose de B.

MATLAB prvoit la fonction chol pour cette factorisation.


>> A = [1 1 1 ; 1 2 3 ; 1 3 6];
>> B = chol(A)
B =
1
1
0
1
0
0

1
2
1

On vrifie bien que B' * B = A


>> B'*B == A
ans =
1
1
1
1
1
1

1
1
1

Dcomposition QR
La fonction qr produit la dcomposition QR d'une matrice A :
A = Q * R
R :
Q :

matrice triangulaire suprieure, de mmes dimensions que A,


matrice unitaire (la valeur absolue du dterminant est gal 1).

>> A = [1 5 8;3 5 6; 2 7 3];


>> [Q,R] = qr(A)
Q =
-0.2673
-0.8018
-0.5345

0.6344
-0.5639
0.5287

-0.7253
-0.1978
0.6594

Les vecteurs et matrices


R =
-3.7417
0
0

-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.

Cette dcomposition s'obtient par la fonction schur.


>> A = [2 7 8;-4 5 6;0
>> [U,T] = schur(A)
U =
-0.9542
0.2860
0.2979
0.9345
-0.0260
0.2118
T =
1.5374
-7.0207
5.0213
7.3740
0
0

3 -5];
-0.0874
-0.1947
0.9770
-4.2882
5.5319
-6.9114

Valeurs singulires d'une matrice


Pour toute matrice A, il existe deux matrices unitaires U et V et une matrice diagonale S
dont les coefficients diagonaux sont les valeurs singulires de A.
A = U*S*V'
Cette dcomposition sera obtenue par la fonction svd.
>> A = [3 4;-5 2];
>> [U,S,V] = svd(A)
U =

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 :

matrice triangulaire suprieure,


matrice triangulaire infrieure diagonale unit,
matrice de permutation.

Cette dcomposition peut tre obtenue par la fonction lu.


>> A = [1 3 2; 2 4 5
>> [L,U,P] = lu(A)
L =
1.0000
0
0.3333
1.0000
0.6667
0.5000
U =
3.0000
5.0000
0
1.3333
0
0
P =
0
0
1
1
0
0
0
1
0

; 3 5 6];
0
0
1.0000
6.0000
0.0000
1.0000

MATLAB propose d'autres mthodes de factorisation et de dcomposition de matrices,


pour cela, il vous est conseill de consulter le manuel de rfrence ou d'excuter la
commande "help matfun".

VI. Matrices creuses et fonctions associes


Dans certains problmes de modlisation de phnomnes physiques, on aboutit trs
souvent la rsolution de systmes linaires qui peuvent tre de trs grandes dimensions
mais dont la matrice possde trs peu d'lments non nuls. Une telle matrice est dite
"creuse" (sparse en anglais).
Pour rsoudre de tels systmes, il convient de mettre en oeuvre des techniques permettant
d'viter de stocker des termes nuls ou d'effectuer des oprations dont l'un des termes est
nul.
Un modle n composantes fait intervenir une matrice carre d'ordre n dont la rsolution
ncessite n2 mots mmoire et un temps de calcul proportionnel n3.
MATLAB propose un certain nombre de fonctions pour le stockage et la manipulation de
matrices creuses. Ces fonctions permettent de rduire l'espace mmoire ncessaire et le
temps de calcul.
Ci-aprs, on cre la matrice x dont les valeurs sont distribues selon la loi de Gauss.

Les vecteurs et matrices

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)

La reprsentation de x en tant que matrice creuse se fait grce la commande sparse.


>> x_creuse=sparse(x)
x_creuse =
(6,2)
1.5352
(2,4)
1.5929
(3,4)
1.0184
(8,5)
2.1122
(3,6)
1.0378
(7,6)
1.5532
(1,7)
1.9574
(3,7)
1.8645
(7,7)
1.1902

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.

Les vecteurs et matrices

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

Matrices creuses alatoires


sprandn(m,n,densite)

: gnre une matrice creuse alatoire m lignes et n


colonnes de densit spcifie. Les valeurs sont
normalement distribues autour de zro,

sprandn(x_creuse)

: gnre une matrice alatoire de mme structure que


x_creuse,

sprandsym(n,densite)

: gnre une matrice creuse, carre, symtrique et


alatoire d'ordre n.

>> 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.

Les vecteurs et matrices

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
. ]

Si m dsigne la moyenne, l'estimation non biaise de la variance est donne par :

2 =

1 n
( x m) 2
n 1i = 1 i

>> x = [1.12, 1.05, 1.25, 1.26, 1.39];


>> moy_x = sum(x)/(length(x));
moy_x =
1.2140
Centrage de toutes les composantes de x, lvation au carr, sommation et variance
>> x_centre = x-moy_x(x)
x_centre =
-0.0940
-0.1640
0.0360

0.0460

0.1760

>> x2 = x_centre.^2
x2 =
0.0088
0.0269

0.0021

0.0310

>> somme_x2 = sum(x2)

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

Les vecteurs et matrices

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

Dans le cas de fonctions polynomiales, MATLAB permet de calculer plus simplement la


drive en utilisant la fonction polyder.

Chapitre 5

174
La fonction f ( x )= x 2 1 peut tre reprsente par le polynme p suivant :
>> p = [1 0 -1];

Le polynme reprsentant la fonction drive est donn par :


>> p_deriv = polyder(p)
p_deriv =
2
0

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

Les vecteurs et matrices

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

La courbe obtenue correspond parfaitement au rsultat thorique.


La fonction polyquad, propose dans le chapitre polynmes , ralise l'intgration
d'un polynme. L'instruction suivante donne la primitive du polynme, s'annulant en
x = 0.
p( x ) = 6 x 2 + 2 x + 1

>> p_integ = polyquad([6 2 1])


p_integ =
2
1
1
0
VII.4. Rsolution d'un systme d'quations linaires

Nous proposons le systme suivant, comme exemple de rsolution de systmes linaires.


2 x1 + 3 x2 = 8

x1 2 x2 = 3

Ce systme peut tre mis sous la forme matricielle A X = B.


fichier systlin.m
% solution X = inv(A) * B ou X = A\B
A = [2 3;1 -2];
B = [8 -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

Le systme se prsente sous la forme matricielle Ax = b.


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];

Calcul du rang de la matrice A


>> rang_A = rank(A)
rang_A =
2

Construction de la matrice augmente Ab


>> Ab = [A b]

Les vecteurs et matrices

177

Ab =
2
1

1
-2

-3
1

1
2

Rang de la matrice augmente


>> rang_Ab = rank(Ab)
rang_Ab =
2

Une solution du systme est donne par :


>> X = A\b
X =
0
-1.4000
-0.8000
A\b est quivalent inv(A)*b si A inversible.
La matrice A tant rectangulaire, donc non inversible, on peut utiliser sa pseudo-inverse
donne par la fonction pinv.

On obtient alors, une autre solution pour le systme indtermin.


>> X = pinv(A)*b
X =

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

On s'intresse la recherche du modle linaire Y = f(X) liant 2 sries de mesures X et


Y.
Comme exemple, on simulera la fonction y = f(x) par la relation y = 0.5 x + 2,
laquelle on superposera un bruit gaussien centr et de variance unit.
fichier reg_lin.m
close all
x = 0:20; y = 0.5*x;
b=randn(1,21); yb=y+b; plot(x,y), hold on
plot(x,yb), plot(x,b), grid
title('y en fonction de x')
gtext('y non bruite'), gtext('y bruite')
gtext('bruit gaussien'), xlabel('Valeurs de la srie x')

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

Chaque mesure yi est lie la mesure xi par la loi yi = a xi + b.


Le modle appliqu toutes les mesures donne le systme matriciel suivant :

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

Construction de la matrice (suite du fichier reg_lin.m)


phi = ones(21,2);
phi(:,1) = x'; % 1-re colonne de phi = vecteur x

Construction du vecteur Y et du vecteur optimal (suite du fichier reg_lin.m)


Y = y';
% algorithme des moindres carrs

Les vecteurs et matrices

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

On dispose des 2 sries de mesures x et y suivantes :


x

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

1. On cherche une approximation exponentielle liant y x, sous la forme :

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.

Les vecteurs et matrices

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

2. On dsire obtenir les coefficients A et B du modle exponentiel prcdent par


application de la mthode des moindres carrs.

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

Les vecteurs et matrices

183

>> A
A =
0.9180
>> B
B =
-0.1972

3. Le systme linaris appliqu chaque couple de donnes ( xi , yi ) permet d'crire :


que l'on peut mettre sous la forme :

ln yi = ln A + B xi

fi = 1 + 2 xi

La rsolution par la mthode de Cramer permet d'avoir les paramtres 1 et 2 .


Nous nous proposons de calculer ces paramtres en programmant les relations ci-dessus.

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

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_6, Springer-Verlag Berlin Heidelberg 2010

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

Les diffrentes couleurs sont :


b
g
r
c
m
y
k
w

bleu
vert
rouge
cyan
magenta
jaune
noir
blanc

Il y a diffrents tracs selon le type des donnes x et y.


Dans la plupart des cas, cette commande est utilise pour x et y, tous deux vecteurs de
mme taille.
Si lon veut tracer le sinus cardinal pour un angle allant de -2 2 par pas de /10, nous
excutons les commandes suivantes :
>> x=-2*pi:pi/10:2*pi;
>> y=sinc(x);
>> plot(x,y,'bp')

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

La commande textlabel permet de gnrer une chane de caractres dans laquelle on


peut insrer des caractres LateX sans lanti-slash.
>> f1=texlabel('sin(sqrt(lambda^2+gamma^2))/sqrt(lambda^2+
gamma^2)')
f1 =
{sin}({sqrt}({\lambda}^{2}+
{\gamma}^{2}))/{sqrt}({\lambda}^{2}+{\gamma}^{2})
>> f2='{\lambda}_{3} e^{-{sqrt}{(\alpha})}'
f2 =
{\lambda}_{3} e^{-{sqrt}{(\alpha})}
Il suffit dutiliser la commande gtext pour insrer ces caractres dans un graphique.
>> gtext(f1)
>> ylabel(f2)

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')

Sinus cardinal entre 0 et 2

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

Pour choisir la taille du trait, on slectionne la courbe et on clique droit. On choisit


LineWidth 3.
Pareil pour les textes libres ou le titre, on choisit Font la valeur 12. La flche est insre
grce au menu Insert Arrow.
Il faut auparavant activer la flche du menu.
Courbes paramtriques
La procdure de trac de courbes paramtriques est identique celles de courbes de
fonctions.
fichier lemniscate.m
% courbes paramtriques
t = -100:0.1:100;
x = (2*t)./(1+t.^4);
y = (2*t.^3)./(1+t.^4);
plot(x,y)
title('lemniscate de Bernoulli')
xlabel('x')
ylabel('y')
grid
lemniscate de Bernoulli
1.5

0.5

-0.5

-1

-1.5
-1.5

-1

-0.5

0
x

0.5

1.5

I.2. Graphiques en coordonnes polaires


Le trac de courbes en coordonnes polaires sera ralis par la fonction polar, qui obit
la syntaxe suivante :
polar(theta, rho, 'type')

Chapitre 6

192

Le type de courbe correspond la nature du trac (continu, discontinu, etc.) et sa couleur.


Les diffrentes possibilits sont identiques celles de la fonction plot.
Nous allons dans ce qui suit, tracer les graphiques en coordonnes polaires suivants : une
cardiode (limaon), une rosace quatre lobes et la spirale d'Archimde.
>> t = 0:.01:2*pi;
>> polar(t,sin(2*t).*cos(2*t),'--r')

90
120

0.5
0.4

60

0.3
150

30

0.2
0.1

180

210

330

240

300
270

I.3. Les diagrammes


Le trac d'histogrammes se fera l'aide de la commande hist.
hist(x,N) :
[n,x] = hist(y,N) :

trace l'histogramme des valeurs du vecteur x en N classes,


retourne des valeurs utiliser avec la fonction bar.

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

Au lieu de spcifier directement le nombre de classes pour la commande hist, nous


pouvons indiquer un vecteur qui reprsente l'intervalle du trac ainsi que la largeur des
classes. La commande bar(x,y)dessine un diagramme sous forme de barres des valeurs
de y en fonction de celles de x.
>> x = -2*pi:pi/10:2*pi;
>> y = sinc(x); bar(x,y), grid
>> title('Diagramme des valeurs du sinus cardinal')
La commande stairs(x,y) trace les valeurs discrtes de y en fonction de celles de x
sous forme de marches d'escaliers.
Diagramme des valeurs du sinus cardinal
1.2

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

La fonction stem permet le trac d'une squence de valeurs discrtes.


>> stem(x,y), grid, title('Diagramme en btons')
Diagramme en btons
1.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')

Trac avec 2 axes d'ordonnes diffrents


2

0.5

-2

0
7

On peut tracer des courbes en chelles logarithmiques avec loglog, ou semilogarithmiques avec semilogx, semilogy.

II. Les graphiques 3D


II.1. Courbes 3D
Le trac de courbes dans l'espace se fera l'aide de l'instruction plot3 qui obit une
syntaxe analogue celle de plot.
plot3(x,y,z)
Tout comme la fonction plot, plot3 permet de tracer plusieurs courbes la fois et
retourne une liste de pointeurs (handles) sur les diffrentes courbes du graphique.
Nous proposons comme exemple, le trac d'une hlice circulaire dfinie par une quation
paramtrique.
fichier helice_circulaire.m
% Courbe gauche : Hlice circulaire
t = -5*pi:pi/10:5*pi;

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;

On gnre deux matrices carres X et Y qui dfinissent le domaine de calcul de Z ; on


utilisera pour ceci la fonction meshgrid.
>> [X,Y] = meshgrid(x,y);

Chapitre 6

198

On value la fonction z, puis on stocke les donnes dans la variable Z,


>> Z = X.^2 + Y.^2;

On dessine ensuite la surface reprsentative de la fonction deux variables, avec une


reprsentation en "fil de fer".
>> mesh(X,Y,Z)

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

Une application l'exemple prcdent donne ce qui suit :


>>
>>
>>
>>
>>

meshc(X,Y,Z), grid
title('Parabolode avec contours')
xlabel('x')
ylabel('y')
label('z')

Parabolode avec contours

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

II.3. Les contours

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 :

matrice reprsentant les contours,

H :

vecteur colonne de pointeurs (handles) sur les lignes du contour,

N :

nombre de lignes des contours.

>> 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')

Lignes de contours d'un parabolode

200

150

100
50

0
10
5

10
5

-5
y

-5
-10

-10

La commande contour(X,Y,Z) trace les contours de Z en utilisant X et Y pour le


contrle des axes.
Cette commande utilise la fonction contourc qui calcule les contours d'une surface et les
renvoie sous la forme d'une matrice.
>>
>>
>>
>>
>>

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

II.4. Volumes et surfaces de rvolution

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 :

vecteur reprsentant les variations du rayon (courbe gnratrice), il doit tre


rgulirement espac,
entier reprsentant le nombre de points sur la circonfrence pour un rayon donn.
La rsolution du trac est d'autant meilleure que N est grand.

La visualisation de la surface se fera avec surf(x,y,z), le cylindre gnr a pour


hauteur l'unit. Si N n'est pas spcifi, la valeur 20 est prise par dfaut. De mme, si aucun
argument de sortie n'est demand, la commande surf(x,y,z) est excute
automatiquement.
Dans l'exemple suivant, nous utiliserons comme courbe gnratrice une fonction sinus
amortie par une fonction exponentielle.
fichier cylindre.m
% courbe gnratrice de la surface de rvolution
t = -2*pi:pi/10:2*pi;
r = sin(t).*exp(-0.1*t);

Chapitre 6

204

% coordonnes des points de la surface


N = 15; % nombre de points sur une circonfrence
[x,y,z] = cylinder(r,N);
% trac de la surface
surf(x,y,z)
title('surface de rvolution gnre par un sinus amorti')
grid, xlabel('x'), ylabel('y'), zlabel('z')
% palette de couleur en niveaux de gris
colormap(gray)
surface de rvolution gnre par un sinus amorti

1
0.8

0.6
0.4
0.2
0
2
1

2
1

-1
y

-1
-2

-2

Sphres

La commande [x, y, z] = sphere(N) gnre trois matrices carres x, y, z d'ordre


N+1 qui reprsentent la sphre de rayon unit. L'instruction surf(x, y, z) produit le
graphique de la sphre.
Si N n'est pas prcis, la valeur 20 est prise par dfaut.
fichier sphere.m
% sphre de rayon unit pour N = 20
N = 20;
[x1, y1, z1] = sphere(N);
figure(gcf)
surf(x1,y1,z1)
grid, title('Sphre de rayon unit, N = 20'), colormap(gray)

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 :

coordonnes des points gnrs par meshgrid (x,y,z), o x,


y et z reprsentent les domaines de variation des coordonnes,
plans des coupes suivant les diffrents axes,
longueur du vecteur x.

Dans ce qui suit, nous prsentons un exemple d'utilisation de cette commande.


fichier volume.m
% domaines de variation des coordonnes
x = -1.5:0.5:1.5; y = -2:0.5:2; z = -2:0.5:2;
% gnration du volume
[X,Y,Z] = meshgrid(x, y, z);
V = X.* exp(-X.^2 - Y.^2 - Z.^2);
% plans de coupes
XI = [1.5]; YI = [2]; ZI = [0 -1];
% trac des plans de coupes du volume
slice(X,Y,Z,V,XI,YI,ZI,length(x))
% documentation du graphique
title('plans de coupes d''un volume')
xlabel('x'), ylabel('y'), zlabel('z')

Chapitre 6

206
plans de coupes d'un volume

0
-1

-2
2
1

2
1

-1

-1
-2

-2

II.5. Apparence des graphiques 3D

Fixer un "point de vue"

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

% intervalles des variables x et y


x = -pi:pi/10:pi; y = x;
[X,Y] = meshgrid(x,y);
Z = sinc(X.^2+Y.^2);

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')

vue 1 : azimut = 45, lvation = 45


>> vue(X,Y,Z,45,45)

Vue avec : azimut = 45 et lvation = 45

0.5
0
-0.5
-4

4
-2

2
0

0
2
x

vue 2, azimut = 0, lvation = 45


>> vue(X,Y,Z,0,45)

-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

III. Autres fonctionnalits graphiques

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

On donnera un encadrement de x d'amplitude 10-2.


fichier resout.m
% on ferme toutes les fentres graphiques
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);

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)')

Pour obtenir graphiquement les coordonnes du point d'intersection on activera la fonction


de "zoom" l'aide de la commande zoom.
>> zoom

On choisira plusieurs fois un rectangle de slection autour du point d'intersection, et on


s'arrtera une fois la prcision souhaite obtenue. Ne pas oublier zoom off pour
dsactiver la fonction de "zoom".
Intersection de 2 courbes

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

D'aprs le graphique obtenu, on peut donner un encadrement de l'abscisse du point


d'intersection des deux courbes.
7.25 <

< 7.26

Les graphiques

211

Utilisation de fsolve de SIMULINK

Le bloc fsolve de SIMULINK permet dobtenir la valeur de x qui annule la diffrence


des 2 fonctions f(x)= exp (-x/25) et g(x)=cos(x/10).
La diffrence f-g, programme dans le bloc MATLAB Function, entre dans le bloc
fsolve, lequel sort la valeur de x qui annule cette diffrence.
Les valeurs de f et g cette valeur de x, solution de f-g, sont programmes dans dautres
blocs MATLAB Function, pour vrifier lgalit de f et g au point de leur intersection.

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.

Rcuprer les coordonnes d'un point

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

: vecteurs des coordonnes des points slectionns,


: nombre de points que l'on dsire slectionner. Cet argument est facultatif,
s'il n'est pas spcifi, la slection des points se termine quand on appuie sur la
touche "Entre" du clavier.

>> [x,y] = ginput(1)


x =
7.2523
y =
0.7484

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

Echelles des axes

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

On en dduit un encadrement de l'abscisse du point d'intersection :


7.25 < x

< 7.26

La commande axis possde d'autres possibilits, dont certaines sont :


axis('auto')
axis('normal')
axis('off')
axis('on')
axis('square')

:
:
:
:
:

restaure les chelles de dessin par dfaut,


restaure les chelles de dessin,
supprime les axes de la fentre graphique active,
restaure les axes,
on obtient une fentre graphique carre.

Subdiviser la fentre graphique

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

subplot(m, n, p) divise la fentre graphique courante en m*n zones graphiques (m


lignes et n colonnes) et trace le graphique qui suit cette instruction dans la zone de
numro p (la numrotation se fait de gauche droite et ligne par ligne).

L'exemple suivant illustre ces possibilits.


fichier sub_plot.m
% Fentre graphique divise en 6 zones
% 1re zone : 1,1
t = -pi:pi/20:pi;
x = 2*cos(t);
y = sin(3*t);
subplot(3,2,1)
% 2 colonnes et 3 lignes , zone 1
plot(x,y)
grid
title('courbe paramtrique 2D')
% 2-ime zone : 1,2
subplot(3,2,2)
x = - 10:10;
y = x;
[X,Y] = meshgrid(x,y);
Z = X.^3 + Y.^3;
mesh(X,Y,Z)
grid
title('surface en fil de fer')
% 3-ime zone : 2,1
subplot(3,2,3)
t = -10:0.1:10;
x = 10*sin(t).*cos(t);
y = 10*sin(t).^2;
z = 10*cos(t);
plot3(x,y,z);
title('courbe paramtrique 3D')
grid
% 4-ime zone : 2,2
subplot(3,2,4)
x = - 5:5;
y = x;
[X,Y] = meshgrid(x,y);
Z = sqrt(X.^2 + Y.^2);
surfc(X,Y,Z)
grid
title('surface avec contours')
% 5-ime zone : 3,1
t = -pi:pi/10:pi;
r = sin(t)+2;
N = 40;
subplot(3,2,5)
cylinder(r,N);

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

surface avec contours

10
-10
10

50
0

-5 -5

0
-4

-2

Trac de fonctions

fplot permet le trac de la courbe d'une fonction y = f(x) dont on spcifie


l'expression sous forme d'une chane de caractres 'f(x)'.

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])
>>
>>
>>
>>

fplot('1-cos(2-x^2)', [-pi pi])


grid
title('Trac de y = 1-cos(2-x^2) avec fplot')
xlabel(x dans lintervalle [-\pi \pi])

Chapitre 6

216

La commande
fplot('expression', [xMin xMax yMIN yMAX])

contrle aussi laxe des ordonnes.


Trac de y = 1-cos(2-x 2) avec fplot
2
1.8
1.6
1.4
1.2
1
0.8
0.6
0.4
0.2
0

-3

-2

-1
0
1
x dans l'intervalle [- ]

IV. Gestion des handles et des objets graphiques


MATLAB prvoit des fonctions de haut niveau pour la gestion des graphiques, ainsi que
des fonctions de bas niveau pour une gestion complte et plus complexe des objets
graphiques. Ces fonctions de bas niveau permettent la gestion individuelle des lignes,
surfaces, axes, etc. Elles permettent de produire des graphiques sophistiqus.

Les objets graphiques

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

L'cran (la racine de la hirarchie) a un "handle" gal zro.


Celui d'une fentre graphique est un entier qui est affich par dfaut dans la barre de titre
de celle-ci. Les autres objets graphiques ont des pointeurs flottants qui contiennent une
information sur les objets pres. Il faut garder ces nombres toute leur prcision (nombre
de chiffres significatifs).
La meilleure manire de manipuler ces "handles" est de les stocker dans des variables et
de transmettre celles-ci aux fonctions ncessaires la gestion des proprits de ces objets
graphiques.
La hirarchisation en fils (children) et parents (parents) fait que ces derniers hritent
des proprits des parents et non linverse.
Les commandes les plus importantes pour la gestion des proprits des objets graphiques
sont : set (pour spcifier des proprits) et get pour les rcuprer).

Les proprits des objets graphiques

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

Nous affichons ci-dessous certaines proprits :


FixedWidthFontName = Courier New
Format = short
Language = fr_fr.windows-1252
Units = pixels
Children = [1]
Parent = []
Type = root

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)

2. Consultation des proprits modifiables de l'cran (le handle de l'cran est 0)


>> set(0)
CurrentFigure

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

La valeur du "handle" h, attribue par MATLAB la courbe est :


ht =
172.0295

Connaissant la valeur du "handle", nous pouvons consulter et modifier les proprits du


trac.
Consultation des proprits d'un objet graphique
V = get(hobj, 'NomProprit')
V
hobj
NomProprit

:
:
:

valeur de la proprit consulter,


"handle" sur l'objet,
correspond au nom de la proprit qui peut
tre indiqu en minuscules ou en majuscules.

De la courbe prcdente, on rcupre quelques proprits, comme la couleur, le style et


l'paisseur du trac.
>> get(h)

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'
''
''
''

On retrouve bien lpaisseur de 2 et la couleur rouge.


Le pointeur sur le titre est :
ht =
238.0012

Ses proprits sont :


>> get(ht)
Annotation = [ (1 by 1) hg.Annotation array]
BackgroundColor = none
Color = [0 0 0]
DisplayName =
EdgeColor = none
Editing = off
Extent = [ (1 by 4) double array]
FontAngle = normal
FontName = Helvetica
FontSize = [10]

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

Comme le pointeur a t rcupr au moment de la cration du titre, on ne retrouve pas les


modifications cres aprs, de faon graphique. On peut les rcuprer en spcifiant la
proprit que lon veut.
>> get(h,'LineWidth')
ans =
2
>> get(h,'Color')
ans =
1
0
0

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

Ce qui correspond un trac continu d'paisseur 2 et de couleur rouge.


Pour rcuprer et/ou modifier les proprits du titre, on doit utiliser la commande suivante
qui permet davoir les proprits des axes courants (gca : get current axis).
>> get(gca)
ActivePositionProperty = outerposition
ALim = [0 1]
ALimMode = auto
AmbientLightColor = [1 1 1]
Box = on
CameraPosition = [3.5 0.3 17.3205]
CameraPositionMode = auto
CameraTarget = [3.5 0.3 0]
CameraTargetMode = auto
CameraUpVector = [0 1 0]
CameraUpVectorMode = auto
CameraViewAngle = [6.60861]
CameraViewAngleMode = auto
CLim = [0 1]
CLimMode = auto
Color = [1 1 1]
CurrentPoint = [ (2 by 3) double array]
ColorOrder = [ (7 by 3) double array]
DataAspectRatio = [5 1 1.42857]
DataAspectRatioMode = auto
DrawMode = normal
FontAngle = normal
FontName = Helvetica
FontSize = [10]
FontUnits = points
FontWeight = normal
GridLineStyle = :
Layer = bottom
LineStyleOrder = LineWidth = [0.5]
MinorGridLineStyle = :
NextPlot = replace
OuterPosition = [ (1 by 4) double array]
PlotBoxAspectRatio = [1 1 1]
PlotBoxAspectRatioMode = auto
Projection = orthographic
Position = [ (1 by 4) double array]
TickLength = [0.01 0.025]
TickDir = in
TickDirMode = auto
TightInset = [ (1 by 4) double array]
Title = [238.001]

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

La rcupration des valeurs des proprits du titre se fait par :


>> get(get(gca,'title'),'FontSize')
ans =
14

Modification des proprits d'un objet graphique


set(hobj, 'NomProprit', 'ValeurProprit', ...)
hobj :

correspond au "handle" sur l'objet,

NomProprit :

correspond au nom de la proprit qui peut tre indiqu en


minuscules ou en majuscules,

ValeurProprit :

peut tre un nombre, un tableau ou une chane de caractres ;


le type est fonction de la proprit considre.

Chapitre 6

226

Nous allons modifier l'paisseur du trac.


>> set(h,'LineWidth',5)
sinus cardinal

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

Le titre Sinus cardinal est bien de taille 14 et de style gras.


La commande get(gcf) permet davoir les proprits de la figure courante
(gcf : get current figure).
Les lignes suivantes permettent de tracer une courbe et spcifier des valeurs aux proprits
du trac et du titre.
>> h=plot(x,y)
h =
3.0017
>> set(h,'Color', [0 0 1], 'LineStyle', '-', 'LineWidth', 2)
>> g=title('sin \pi x /\pi x');
>> set(g,'Fontname','Arial','Fontsize',12)

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

Trac de 2 courbes dans 2 systmes d'axes diffrents

axe de l'histogramme

20

15

10
te
tex

15

lin
inc

10

-5

10

11

12

axe de la courbe continue

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')

Grce aux proprits Name et NumberTitle nous affichons le titre de la fentre et


nous supprimons laffichage du numro de la figure.
Nous remarquons la taille de 14 du titre de la courbe du bas.
A partir de la fentre graphique on peut crer un script MATLAB qui contiendra toutes les
ventuelles modifications graphiques quon aurait fait par les menus contextuels.
a permet de gnrer le code quon peut insrer aprs dans notre script.
Ce script possde beaucoup de commentaires pour une bonne lisibilit et clart.

Les graphiques

Par le menu File, loption Generate M-File permet de crer ce fichier.


fichier createfigure_handles_2D_Graphics.m
function createfigure(X1, YMatrix1, YMatrix2)
%CREATEFIGURE(X1,YMATRIX1,YMATRIX2)
% X1: vector of x data
% YMATRIX1: matrix of y data
% YMATRIX2: matrix of y data
%

Auto-generated by MATLAB on 05-Jul-2009 16:49:30

% 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

% Create multiple lines using matrix input to plot


plot2 = plot(X1,YMatrix2,'Parent',subplot2);
set(plot2(1),'LineWidth',2,'Color',[1 0 0]);
set(plot2(2),'LineStyle',':');
% Create title
title('gestion des pointeurs des diffrentes
courbes','FontSize',14,...
'FontName','Arial');
% Create xlabel
xlabel('x allant de -2\pi 2\pi par pas de \pi/100');
Autres exemples de gestion de handles graphiques

Modification des proprits dun objet

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

clc, warning off


x=-4*pi:pi/100:4*pi;
Sinc=(x==0)+sin(x)./((x==0)+x);
Sin=sin(x);
% plotting the functions
h_sinc=plot(x,Sinc);
set(h_sinc,'Linewidth',3)
hold on
h_sin=plot(x,sin(x));
set(h_sin,'Linewidth',2,'LineStyle',':','Color','r')
title('\bf Courbe sinus \itx \rm\bf et sinus cardinal
\itx','FontName','Arial','FontSize',16)
xlabel('\bf \itangle x')
ylabel('\bf sin \itx \rm\bf et sinc \itx')
hold off
k=waitforbuttonpress
while k==0
% Handle de l'objet
handle=gco;
% type de l'objet
type=get(handle,'Type')
% affichage du type
disp(['objet de type :' type])
% affichage du dtail
oui_non=input('Voulez-vous des Dtails sur l''objet
?','s');

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:

[-15 -10 -5 0 5 10 15]


[7x3 char]
'auto'
'auto'
'left'
[0 0 0]
'normal'
'off'
175.0026
[-1 1]
'auto'
'off'
'off'
'linear'
[1x11 double]
[11x4 char]
'auto'
'auto'
[0 0 0]
'normal'
'off'
176.0026
[-1 1]
'auto'
'off'
'off'
'linear'
[-1 0 1]
''
'auto'
'auto'

type =
line
objet de type :line
Voulez-vous des Dtails sur l'objet ?

Gestion des proprits de divers objets graphiques

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)

: capture une image de l'objet graphique dont le pointeur ou


handle est h (racine, figure ou axes),

getframe(h,rect) :

on spcifie un rectangle pour la zone de capture, on indiquera


ses coordonnes dans les units par dfaut et par rapport au
coin infrieur gauche de la fentre graphique.

Nous proposons ci-aprs, un exemple d'animation qui correspond un aplatissement d'une


surface 3D.
Pour observer l'effet d'animation, nous conseillons au lecteur d'excuter le fichier script
surf_anim.m.
fichier surf_anim.m
% gnration de la surface dessiner
x = -pi/2:pi/100:pi/2;
y = x;
[X,Y] = meshgrid(x,y);
Z = sinc(X.^2+Y.^2);
% dessin en fil de fer
mesh(X,Y,Z);
title(Animation du mesh du sinus cardinal)
% pointeur sur les axes
lim = axis;
% rservation de l'espace mmoire
n = 50; % nombre d'images
Anim = moviein(n);
% fentre graphique courante en avant-plan
figure(gcf)
% on enregistre l'animation
for i = 1:n

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

Pour excuter une animation, on utilisera la commande movie(Anim), l'animation tant


stocke dans la matrice Anim.

La vitesse de dfilement des images peut tre contrle, ainsi,


movie(Anim,boucles,ips)

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

Programmation avec MATLAB


I. Oprateurs arithmtiques, logiques et caractres spciaux
I.1. Oprateurs et caractres spciaux
I.1.1. Oprateurs arithmtiques
I.1.2. Oprateurs relationnels
I.1.3. Caractres spciaux
I.2. Fonctions retournant une valeur logique
II. Evaluation de commandes en chanes de caractres
III. Commandes structures
III.1. Boucle for
III.2. Boucle while
III.3. Condition ifelse
III.4. Condition switchcase
III.5. Instructions de rupture de squence
IV. Scripts et fonctions
IV.1. Fichiers fonctions
IV.1.1. Dfinitions et exemple
IV.1.2. Fonctions polymorphes
IV.1.3. Rcursivit des fonctions
IV.2. Les sous-fonctions
V. Conseils de programmation sous MATLAB
VI. Dboguage des fichiers
VII. Le profiler
VIII. Les fichiers de donnes
IX. Les commandes et outils de dveloppement
IX.1. Commandes de gestion denvironnement
IX.2. Commandes daide lutilisation de MATLAB
IX.3. Gestion des rpertoires
X. Editeur de fichiers M

I. Oprateurs arithmtiques, logiques et caractres spciaux


I.1. Oprateurs et caractres spciaux
Le tableau suivant rsume les oprateurs arithmtiques, logiques et spciaux de MATLAB.
I.1.1. Oprateurs arithmtiques
symbole
+
*
.*
^
.^

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

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_7, Springer-Verlag Berlin Heidelberg 2010

Chapitre 7

242
\
/
./

division gauche de rels et de matrices


division droite de rels et de matrices (division classique)
division lment par lment de matrices

I.1.2. Oprateurs relationnels


==
~=
<
<=
>
>=
&
|
~
xor

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

I.2. Fonctions retournant une valeur logique


MATLAB fournit un certain nombre de fonctions qui retournent des valeurs logiques (vrai
: >=1 ou faux : 0) pour tester l'existence de variables, leur type, etc.
Nous en prsentons ci-dessous les plus importantes.
exist
val = exist('var')
Permet de tester si la variable, la fonction ou le fichier Var est dfini. Elle retourne :
0
1
2
3
4
5
6
7

si Var n'existe pas (ni fonction, ni variable),


si Var est une variable de l'espace de travail,
si Var est un fichier M qui se trouve dans un des rpertoires des chemins de
recherche de MATLAB,
si Var est un fichier MEX qui se trouve dans un des rpertoires des chemins de
recherche de MATLAB,
si Var est un modle SIMULINK (fichier .mdl),
si Var est une fonction du noyau de MATLAB (built-in function),
si Var est un fichier P trouv dans les chemins de recherch de MATLAB,
si Var est un rpertoire.

Chapitre 7

244

Il existe dautres options de spcification de la nature de la variable quon recherche.


val = exist('x',var)
ne recherche que des variables.
val = exist('x',file)
ne recherche que des variables x en tant que rpertoires.
>> clear all
>> exist('x')
ans =
0
>> x = randn(2)
x =
0.5377
-2.2588
1.8339
0.8622
>> exist('x')
ans =
1
>> exist('sol_syst_sur_determine') % modle SIMULINK
ans =
4
La fonction inv (inversion de matrices) est prsente dans le noyau de MATLAB.
>> exist('inv') % built-in function
ans =
5
>> exist('sinc2')
ans =
2

% 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

Seule la 3me colonne possde tous ses lments non nuls.

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 :

matrice ou expression logique sur des matrices,


n des lments, la numrotation se fait ligne par ligne et de gauche droite,

[I, J] :

les vecteurs I et J reprsentent respectivement les indices des lignes et des


colonnes.

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.

II. Evaluation de commandes en chanes de caractres


Des commandes peuvent tre insres dans une chane de caractres et values ensuite
par dautres commandes.
eval
eval (chane)
Evalue une chane de caractres en excutant les instructions qui la composent.
Pour rcuprer les arguments de sortie de l'expression chane, on utilisera la forme
suivante de la commande.
[x,y,z, ...] = eval (chane)
>> clear all
>> x=[1 2 ;4 7] ;
>> eval('inv(x)')
ans =
-7
4

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 :

fonction dfinie dans un fichier M (fonct.m),


arguments dappel de la fonction.

Exemple
fichier sommep.m
function a = somme(x)
% somme des lments de la matrice x
a = sum(x);

Appel direct de la fonction :

>> a=[1 2 ;4 7] ;
>> som=somme(a)
som=
14

Programmation

251

Appel en utilisant la fonction feval:

>> som2 = feval('somme',a)


som2 =
14
evalc
La commande [T, A]=evalc(chaine) est quivalente A = eval(chaine),
sauf que T reoit les ventuels messages derreur.
>> [T, A]=evalc('det(x)')
T =
''
A =
-1
Dans ce cas, le dterminant vaut -1 sans aucun message derreur.
evalin
La commande evalin permet davoir le mme rsultat comme suit :
>> evalin('base','som3= somme(x)')
som3 =
14
lasterr
Retourne le dernier message d'erreur gnr par MATLAB.
>> x = 1/0;
Warning: Divide by zero
>> xx
??? Undefined function or variable xx.
>> lasterr
ans =
Undefined function or variable xx.
Inline
Il est parfois trs utile de dfinir une fonction qui sera employe pendant la session
courante de MATLAB seulement. MATLAB possde une commande en ligne employe
pour dfinir les fonctions, dites inline ou en ligne >>.
>> g = inline('sin(2*pi*f + theta)')
g =
Inline function:
g(f,theta) = sin(2*pi*f + theta)

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'

III. Commandes structures


III.1. Boucle for
La boucle for possde la syntaxe suivante :
for k = val_init : pas : val_fin
liste des instructions
end
Le gros avantage de MATLAB est la vectorisation des donnes, ce qui permet trs souvent
dviter lutilisation de la boucle for.
Considrons lexemple suivant que lon peut raliser avec et sans boucle for. Nous
calculerons le temps de calcul et estimerons le temps que lon gagne si lon vite la boucle
for.
Nous disposons de 2 vecteurs x et y. La mthode dinterpolation de Cramer qui permet un
rgression linaire y(x) par la droite y = a x + b donne les formules suivantes pour
le calcul des coefficients a et b.
Nous considrons le cas de linterpolation de courbes relles dont le calcul des paramtres
ncessite lutilisation de calculs matriciels.

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

Considrons uniquement le numrateur du coefficient a.


N
N

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 trouvons le rsultat suivant :


num_a =
2.647694000000001e+002

En utilisant la proprit de vectorisation et les fonctions de calcul propres aux vecteurs et


matrices, on peut utiliser le script simplifi suivant :
fichier calcul_sans_for.m
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];
det_mat_num=det([sum(y) sum(x);sum(x.*y) sum(x.^2)])

Nous obtenons la mme valeur :


det_mat_num =
2.647694000000001e+002

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

appel du script calcul_avec_for.m

et
fichier temps_sans_for.m
tic
calcul_sans_for % appel du script calcul_sans_for.m
toc

Nous trouvons les rsultats suivants pour les temps de calcul.


Avec boucle for :
det_mat_num =
2.647694000000001e+002
Elapsed time is 0.001019 seconds.
Sans boucle for :
det_mat_num =
2.647694000000001e+002
Elapsed time is 0.000404 seconds.

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

Solution sans les boucles for (fichier fic_for2.m)

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)

Nous obtenons le rsultat suivant :


det_mat_num =
264.7694

Programmation

257

III.3. Condition ifelse

La syntaxe de la commande if est la suivante :


if condition1
Liste1 de commandes
elseif condition2
Liste2 de commandes
else
Liste3 de commandes
end

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

III.5. Instructions de rupture de squence

Pour quitter une boucle,


error(message).

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.

IV. Scripts et fonctions


IV.1. Fichiers fonctions
IV.1.1. Dfinitions et exemple

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

Les variables lintrieur dune fonction sont locales celle-ci.


On efface toutes les variables de lespace de travail et on fait appel la fonction sinc2,
comme prcdemment.
>> clear all
>> alpha=-4*pi:pi/100:4*pi;
>> plot(sinc2(alpha), 'LineWidth',3);

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))

en utilisant 2 variables intermdiaires quon dclarera comme globales.


fonction sinc_bruitee
function y=sinc_bruite(x)
global y1 y2
y1 = sinc(x);
y2 = 0.1*randn(size(y1))
y=y1+y2;

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 non bruit

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

IV.1.2. Fonctions polymorphes

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

Selon le nombre darguments de retour demands la fonction, le rsultat sera diffrent.


Cest le cas de la fonction butter (filtre de Butterworth) qui ralise un type diffrent
du filtre (passe bas, ) et qui retourne les matrices dtat, les ples et zros du filtre, etc.
[B,A]
butter(N,Wn,'high')
[Z,P,K] = butter(...)
[A,B,C,D] = butter(...)

= retourne la fonction de transfert

retourne les ples et zros


retourne les matrices dtat A,B,C,D

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

Ces tests sont raliss dans la fonction suivante.


fonction fonct_multiple.m
function fonct = fonct_multiple(a,b,x)
% retourne la factorielle d'un nombre entier naturel a
% si elle reoit un seul argument entier naturel
% calcul la somme des factorielles des 2 paramtres a et b si
elle
% reoit 2 paramtres d'appel.
% calcul et trace la fonction y=a*x^b si elle reoit 3
paramtres
% a, b et x.
%
% la factorielle est calcule par la fonction fact.m
utilisant la
% fonction prod.
switch nargin % test du nombre de paramtres d'appel
case 1
if ~isstr(a)
fonct=fact(a);
else
fonct=abs(a);
end
case 2
fonct=fact(a)+fact(b);
case 3
l=length(x);
if (l==1)|(isempty(l))
error ('x doit tre un vecteur des abscisses ')
end
plot(x,a*x.^b)
title(['fonction ' num2str(a) 'x^{' num2str(b) '}'])
xlabel(['x : [' num2str(x(1)) '

' num2str(x(length(x))) ']'])

otherwise
disp('Unknown method.')
return
end

Les diffrentes ralisations de la fonction fonct_multiple sont rsumes ci-aprs :


>> fonct_multiple(5)
ans =
120
>> fonct_multiple('MATLAB')
ans =
77
65
84
76
65
>> fonct_multiple(5,2,1:10)

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.

La fonction suivante ralise ces calculs de faon itrative.


function T = ChebT(n)
% Coefficients T of the nth Chebyshev polynomial of the first
kind.
% They are stored in the descending order of powers.
t0 = 1;
t1 = [1 0];
if n == 0
T = t0;
elseif n == 1;
T = t1;
else
for k=2:n
T = [2*t1 0] - [0 0 t0];
t0 = t1;
t1 = T;
end
end
>> T=chebt(5)
T =
16
0
-20
0
5

Programmation

265

Sous sa forme rcursive, elle a le code suivant :


function T=chebt_recc(n)
% Coefficients T of the nth Chebyshev polynomial of the first
kind.
% They are stored in the descending order of powers.
% Edward Neuman
% Department of Mathematics
% Southern Illinois University at Carbondale
(edneuman@siu.edu)
t0 = 1;
t1 = [1 0];
if n == 0
T = t0;
elseif n == 1;
T = t1;
else
T = [2*chebt_recc(n-1) 0]-[0 0 chebt_recc(n-2)];
end
end
>> T=chebt_recc(5)
T =
16
0
-20

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

La forme itrative est prfrable la forme rcursive des fonctions.


Clc, disp('Forme itrative:')
tic
T=chebt(5); toc
disp('---')
disp('Forme rcursive:'), tic
T=chebt_recc(5);
toc

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

>> a=1; b=2; test_vararg(a,b,'diff')


Nombre d'arguments d'appel = 3
Entres standards : 2
diff =-1
>> a=0.5; b=2; test_vararg(a,b,0:0.01:1,'-.',3)
Nombre d'arguments d'appel = 5
Entres standards : 2
0.5x2+2
2.5
2.45
2.4
2.35
2.3
2.25
2.2
2.15
2.1
2.05
2

20

40

60

80

100

120

IV.1.3. Rcursivit des fonctions

La factorielle est rcursive du fait que n ! = n. (n-1) !


fonction factorielle_recursive.m
function fact = factorielle_recursive(N)
% retourne la factorielle d'un nombre entier naturel N
% fonction factorielle rcursive fact =
factorielle_recursive(N)
% fact
: valeur retourne de la factorielle de N
% N
: entier naturel pour lequel on calcul la
%
factorielle
if nargin>1;
help factorielle_recursive
error('La fonction accepte un nombre entier naturel');
end;

268

% cas o n n'est pas un entier naturel


if (fix(N)~=N)| (N<0)
help factorielle_recursive
error('N doit tre un entier naturel')
end
if N==0
fact = 1; % condition d'arrt
else
fact = factorielle_recursive(N-1)*N; % relation de
rcurrence
end
>> factorielle_recursive(77)
ans =
1.4518e+113
>> factorielle_recursive(6.5)
retourne la factorielle d'un nombre entier naturel N
fonction factorielle rcursive fact =
factorielle_recursive(N)
fact
: valeur retourne de la factorielle de N
N
: entier naturel pour lequel on calcul la
factorielle
??? Error using ==> factorielle_recursive at 16
N doit tre un entier naturel

La factorielle est calcule par la fonction fact.m.


fichier fact.m
function factorielle=fact(N)
% Calcul de la factorielle d'un nombre entier
% naturel en utilisant la fonction prod
% la fonction admet un nombre entier naturel
if nargin>1;
clc
help fact
error('nombre d''arguments incorrect');
end;
if isstr(N)
clc
help fact
error('l''argument doit tre entier naturel');
end;
% cas o n n'est pas un entier naturel
if (fix(N)~=N)|(N<0)

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

MATLAB dispose de la fonction factorial pour calculer la factorielle dun nombre


entier.
Elle peut aussi tre calcule avec lutilisation de la fonction Gamma, soit n*gamma(n)
sauf pour n=0 pour laquelle on obtient une indtermination.
>> factorial(5)
ans =
120
IV.2. Les sous-fonctions

On se propose dtudier lvolution des valeurs de suite un suivante :


cos n
n2
un =
2 1
sin 3n
4 (1 + + 2 ) + 2
n n
n
3+

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);

Dans le fichier suivant, on calcule lexpression prcdente, en utilisant la sous-fonction


subfunction pour n allant de 1 200.
fichier use_subfunction.m
clc
clear all
n=1:200;
y=subfunction(n);
plot(n,y)
% valeur de convergence 3/4
x=3*ones(size(y))/4;
hold on
plot(n,x)
gtext('Convergence vers \pi/4')

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

La valeur de lexpression un converge vers

100

120

. 0.7854.

140

160

180

200

Programmation

271

V. Conseils de programmation sous MATLAB


Il est utile de suivre certains conseils de programmation dont, entre autres, les suivants :
x choisir des noms significatifs pour les variables et les fonctions,
x documenter les fonctions pour l'aide en ligne et la clart,
x vrifier le nombre et le type des arguments d'appel et de retour des fonctions,
x n'utiliser les boucles for et while ainsi que le if que si ncessaire, elles peuvent tre
souvent remplaces avantageusement par des oprations et fonctions vectorielles ou
matricielles,
x utiliser des indentations dans les instructions structures (for, while, if) lorsquon
est oblig de les utiliser.
x Prfrer les formes itratives des fonctions aux formes rcursives.
Lors de la programmation, il est utile parfois dignorer un bloc dinstructions afin de
localiser les erreurs.
Pour ignorer temporairement une partie d'un programme, lors de la phase de mise au point
par exemple, on pourra utiliser l'une des mthodes proposes ci-dessous :
if 0
....
instructions ignorer
....
end

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

La commande ls dunix, ou dir de DOS, retourne le seul fichier dextension .p.


>> ls *.p
factorielle_recursive2.p

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

Lexcution de ce fichier donne le mme rsultat que le fichier M dorigine.


>> factorielle_recursive2(5)
ans =
120

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

On teste si la diffrence entre ce nombre et sa partie entire est infrieure la valeur


realmin10 qui vaut 2.2251e-308.
>> isinteg(6)
ans =
1

Le chiffre 6 auquel on ajoute 10-10 nest plus entier.


>> >> isinteg(6.0000000001)
ans =
0

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

Dans ce cas, ce chiffre est bien vu comme non entier.

VI. Dboguage des fichiers


Exemple d'une session de mise au point d'un programme

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.

La commande suivante fixe un point d'arrt la ligne 10 de la fonction chebT.m


>> dbstop at 10 in chebt

274

Chapitre 7

On remarque le point darrt la ligne 10.


L'excution de la fonction chebt s'interrompt la rencontre de ce point darrt.

>> 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

Les variables peuvent tre consultes et modifies.


K>> t1
t1 =
1
0
Les variables dfinies dans l'espace de travail ne sont pas visibles pour la fonction chebt.
K>> x
??? Undefined function or variable 'x'.

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

Pour redescendre lespace de travail de la fonction, on utilise dbdown.


K>> dbdown
In workspace belonging to chebt at 11
K>> whos
Name
Size
Bytes Class
Attributes
n
1x1
8 double
t0
1x1
8 double
t1
1x2
16 double
On retrouve uniquement les variables de lespace de travail de la fonction.

276

Chapitre 7

Pour continuer l'excution de la fonction jusqu' la fin de celle-ci ou jusqu'au prochain


point d'arrt, on utilisera la commande dbcont.
K dbcont
ans =
16

-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

La fentre principale de MATLAB contient aussi le menu debug.

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

Nous avons le rsultat suivant pour sinc2 :

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')

Le profiler aboutit au rapport suivant avec la fonction sinc de MATLAB.

En utilisant sinc2.m, nous trouvons les rsultats suivants :

Avec les commandes profile on et profile off, on dmarre et on arrte


respectivement le profiler.

Programmation

279

La commande profsave sauvegarde le rapport du profiler sous le format HTML.


La commande de syntaxe

S = profile('INFO')

suspend le profiler et retourne les caractristiques du profiler dans la structure S suivante :


S =
FunctionTable: [1x1 struct]
FunctionHistory: [2x0 double]
ClockPrecision: 3.5714e-010
ClockSpeed: 2.8500e+009
Name: 'MATLAB'
Overhead: 0

Nous avons, entre autres, la prcision et la vitesse dhorloge du CPU.


Le tableau de structures FunctionTable contient des statistiques pour chaque fonction
appele.
>> SF=S.FunctionTable
SF =
CompleteName: [1x64 char]
FunctionName: 'sinc'
FileName: [1x59 char]
Type: 'M-function'
Children: [0x1 struct]
Parents: [0x1 struct]
ExecutedLines: [4x3 double]
IsRecursive: 0
TotalRecursiveTime: 0
PartialData: 0
NumCalls: 1
TotalTime: 1.3642e-004

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

Dans le rpertoire profile_results, nous trouvons le fichier HTML suivant, qui


dtaille la dure dexcution de chaque fonction et commande lintrieur de la fonction
sinc.

VIII. Les fichiers de donnes


Les donnes peuvent tre stockes dans diffrents types de fichiers :
fichiers M pour la sauvegarde dinstructions avant leur utilisation dans des
programmes
fichiers MAT ou des fichiers textes et binaires dfinis par l'utilisateur.

Donnes dans un fichier M (data.m)


% dfinition de matrices et expression de la solution de A x
= B
A = [1 2 3
4 5 6];
B = [3 4]';
x= inv(A'*A)*A'*B;

Programmation

281

Donnes dans un fichier MAT

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

Sauvegarde de la variable x et alpha dans le fichier MAT fic_mat.mat.


>> load fic_mat
>> who
Your variables are:
alpha ans
x
>> whos
Name
alpha
ans
x

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

Dans SIMULINK, le bloc to Workspace propose en premier lieu la sauvegarde


dans une structure puis dans un tableau (Array).
La commande save permet aussi la sauvegarde dans un fichier ASCII avec la syntaxe
suivante :
>> alpha = [-pi -pi/4 0 pi/4 pi];
>> save fict3.txt x alpha -ascii -double -tabs

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

Ce fichier text peut tre aussi ouvert par la commande :


>> open fict3.txt

Ces fichiers peuvent tre crits et lus par des commandes type langage C, telles fprintf
et fscanf, etc.

IX. Les commandes et outils de dveloppement


IX.1. Commandes de gestion denvironnement

quit

Permet de quitter la session de travailler et de fermer MATLAB.


Exit

Mme fonction que quit.


Fichier startup.m

Le fichier startup.m est excut automatiquement chaque ouverture de MATLAB. Il


est trs utile dans lindustrie lorsquon a besoin douvrir beaucoup dautres fichiers
dinitialisation, comme les paramtres qui interviennent dans une srie de mesures
(paramtres de rgulation, des capteurs, etc.)
Nous avons cr un fichier dans lequel on se met automatiquement dans un rpertoire de
travail spcifi et qui ouvre un script (fonction chebt). Cest utile lorsquon na pas fini
le code dun programme.

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

Excute les commandes DOS et retourne les rsultats.


>> [s, w] = dos('dir')
s =
0
w =
Le volume dans le lecteur C n'a pas de nom.
Le numro de srie du volume est 7041-B406
Rpertoire de C:\Documents and Settings\MARTAJ\Mes
documents\MATLAB\Chapitres prochains\Analyse numrique_x
26/07/2009
26/07/2009
24/07/2009
24/07/2009
24/07/2009

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

On peut utiliser directement la commande dir ou ls qui retourne peu de paramtres de


retour.
>> dir
.
fsolve_syst_nl.mdl
..
fsolve_syst_nl2.mdl
>> dos('notepad file.m &')

sol_syst_graph.m

Chapitre 7

284

Ouvre une fentre de lditeur du DOS.


system

Excute les commandes systme et retourne les rsultats.


>> [status,result] = system('dir')
status =
0
result =
Le volume dans le lecteur C n'a pas de nom.
Le numro de srie du volume est 7041-B406
Rpertoire de C:\Documents and Settings\MARTAJ\Mes
documents\MATLAB\Chapitres prochains\Programmation_x
29/07/2009
29/07/2009
25/07/2009
25/07/2009
25/07/2009
27/07/2009
28/07/2009

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

Permet lexcution des commandes Unix.


>> [s,w] = unix('MATLAB')

Lance lexcution de MATLAB.


>> pwd
ans =
C:\Documents and Settings\MARTAJ\Mes
documents\MATLAB\Chapitres prochains\Programmation_x

diary
>> diary on
>> diary('history_cmd')
>> x=randn(3);
>> chebt(5)
ans =
16

>> diary off

-20

Programmation

285

Il y a cration du fichier history_cmd dans lequel sont sauvegardes toutes les


commandes excutes partir de diary on jusqu diary off.

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

IX.2. Commandes daide lutilisation de MATLAB

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.

>> help sinc2


% aide sur la fonction sinc2.m fonction sinus cardinal
x : vecteur des abscisses
y : vecteur des ordonnes

La commande helpwin donne les mmes rsultats, ainsi que docsearch.


doc
doc fonction ouvre la fentre contenant laide de MATLAB concernant cette
fonction.
>> doc sinc

Programmation

287

demo

Donne les dmos disponibles sur un thme donn de MATLAB.


>> demo matlab graphics

>> demo toolbox signal % dmos de Signal Processing


Toolbox .

lookfor

Recherche toutes les expressions MATLAB contenant un certain mot-cl.


Pour rechercher tout ce qui contient le mot-cl chev , on utilise la commande
suivante :
>> lookfor cheb

Chapitre 7

288
chebt
polynomial of
chebt_recc
polynomial
chebyPoly_atan_fixpt
polynomial
chebyPoly_atan_fltpt
polynomial

- Coefficients T of the nth Chebyshev


the first kind.
- Coefficients T of the nth Chebyshev
the first kind.
- Calculate arctangent using Chebyshev
approximation
- Calculate arctangent using Chebyshev

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');

Ouvre le site Web de Mathworks dans une nouvelle fentre.

Programmation

289

IX.3. Gestion des rpertoires

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

La commande cd donne le nom du rpertoire de travail courant.


>> cd
C:\Documents and Settings\MARTAJ\Mes
documents\MATLAB\Chapitres prochains\Programmation_x

On peut monter ou descendre dun niveau par rapport au rpertoire courant.


>> cd ..
>> cd
C:\Documents and Settings\MARTAJ\Mes
documents\MATLAB\Chapitres prochains

On peut se dplacer de plusieurs niveaux en mme temps, comme ici de 2 niveaux :


>> cd ../..
>> cd
C:\Documents and Settings\MARTAJ\Mes documents

On peut aussi spcifier directement le nom du rpertoire auquel on veut se dplacer.


>> cd ('C:\Documents and Settings\MARTAJ\')
>> cd
C:\Documents and Settings\MARTAJ

La commande pwd donne le mme rsultat.


dir, ls

Affiche le contenu du rpertoire courant.


>> ls
.
..
calcul_avec_for.m
calcul_avec_while.m
calcul_sans_for.m

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

La commande dir donne le mme rsultat.


What
W = what(nom_repertoire)

Cette commande retourne le contenu du rpertoire sous forme dune structure.


>> W=what('C:\Documents and Settings\MARTAJ\Mes
documents\MATLAB\Chapitres prochains\Analyse numrique_x')
W =
path:
m:
mat:
mex:
mdl:
p:
classes:
packages:

[1x93 char]
{'sol_syst_graph.m'}
{0x1 cell}
{0x1 cell}
{2x1 cell}
{0x1 cell}
{0x1 cell}
{0x1 cell}

Pour avoir la liste des fichiers M ou des modles SIMULINK :


>> W.m
ans =
'sol_syst_graph.m'
>> W.mdl
ans =
'fsolve_syst_nl.mdl'
'fsolve_syst_nl2.mdl'

path

Liste tous les rpertoires du chemin de recherche de MATLAB.


>> path
MATLABPATH
C:\Documents and Settings\MARTAJ\Mes documents\MATLAB
C:\Program Files\MATLAB\R2009a\toolbox\matlab\general

C:\Program Files\MATLAB\R2009a\toolbox\shared\optimlib
C:\Program Files\MATLAB\R2009a\toolbox\symbolic

Programmation

addpath

Ajoute un rpertoire dans la liste des chemins de recherche de MATLAB.


>> addpath ('C:\Documents and Settings\MARTAJ\Mes
documents\MATLAB\Chapitres prochains')
>> path
MATLABPATH
C:\Documents and Settings\MARTAJ\Mes
documents\MATLAB\Chapitres prochains
C:\Documents and Settings\MARTAJ\Mes documents\MATLAB

Le rpertoire est ajout la liste des chemins de recherche de MATLAB.


savepath

Sauvegarde les chemins de recherche de MATLAB.


>> savepath 'C:\Documents and Settings\MARTAJ\Mes
documents\MATLAB\Chapitres prochains\pathdef.m')
>> type pathdef
function p = pathdef
%PATHDEF Search path defaults.
%
PATHDEF returns a string that can be used as input to
MATLABPATH
%
in order to set the path.
%
Copyright 1984-2007 The MathWorks, Inc.
%
$Revision: 1.4.2.2 $ $Date: 2007/06/07 14:45:14 $
% DO NOT MODIFY THIS FILE. IT IS AN AUTOGENERATED FILE.
% EDITING MAY CAUSE THE FILE TO BECOME UNREADABLE TO
% THE PATHTOOL AND THE INSTALLER.
p = [...
%%% BEGIN ENTRIES %%%
'C:\Documents and Settings\MARTAJ\Mes
documents\MATLAB\Chapitres prochains;', ...
matlabroot,'\toolbox\matlab\general;', ...
matlabroot,'\toolbox\matlab\ops;', ...

matlabroot

Affiche le rpertoire racine.


>> matlabroot
ans =
C:\Program Files\MATLAB\R2009a

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

file ... Import Data ...

Permet limportation de donnes, dun fichier txt ou mat comme fic_mat.mat

On peut choisir le type de sparateur (virgule, tabulation, ).


On peut gnrer le code dune fonction (importfile.m) de lecture de ce fichier, que
lon peut intgrer et appeler dun autre fichier.
file ... Save Workspace AS ...

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

Ce fichier est sauvegard dans un rpertoire nomm automatiquement html.


File Set Path

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

Permet de choisir les diffrentes caractristiques de MATLAB, SIMULINK, etc., comme


le choix du format daffichage des nombres, la couleur, etc.
Edit Paste to Workspace

Enregistre le contenu du fichier dans une structure appele A_pastespecial.


>> whos

Programmation
Name
Attributes
A_pastespecial

295
Size
3x1

Bytes
346

Class

cell

Si on demande sa valeur, on obtient :


>> A_pastespecial
A_pastespecial =
'clc, clear all, alpha = -2*pi:pi/100 :2*pi;'
'x = rand(4); alpha ;'
'save fic_mat x alpha'

Edit Find Files

Permet la recherche de fichiers.


Par ce menu Edit, on peut aussi effacer le contenu des diffrentes fentres de MATLAB
(Workspace, etc.).
Text Evaluate Selection (F9)

Permet dvaluer les commandes pralablement slectionnes. On peut remarquer les


diffrentes variables dans la fentre Workspace.
On peut aussi transformer des lignes de commande en commentaires ou supprimer cette
caractristique, ainsi que raliser des indentations quon peut agrandir ou diminuer.
Go

Permet de dplacer le curseur dans le fichier.


Tools

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 le dboguage du fichier en installant ou supprimant des points darrt, etc.


Window

Permet la gestion des diffrentes fentres de MATLAB (leur forme, leur disposition, etc.).

296

Chapitre 7

Help

Permet dafficher de laide, dactiver ou dsactiver sa licence MATLAB, etc.


Remarque :
Le menu Cell est tudi dans le chapitre correspondant aux cellules, structures et
tableaux multidimensionnels.

Chapitre 8

Tableaux multidimensionnels Cellules et Structures

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.

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_8, Springer-Verlag Berlin Heidelberg 2010

298

Chapitre 8

I.1.2. Cration dun tableau multidimensionnel


Par dfinir ce tableau, nous utilisons la commande cat qui ralise la concatnation des
pages selon la dimension 3.
>>
>>
>>
>>

page1=[8 7 4;6 2 9;7 3 5;1 6 3] ;


page2=[6 3 7;4 5 3; 1 4 2;3.14 8 7];
page3=[4 5 7;8 9 10;6 3 2;8 6 5];
cat(3, page1,page2,page3)

>> tableau1=cat(3, page1,page2,page3)


tableau1(:,:,1) =
8
7
4
6
2
9
7
3
5
1
6
3
tableau1(:,:,2) =
6.0000
3.0000
4.0000
5.0000
1.0000
4.0000
3.1400
8.0000

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

Tableaux multidimensionnels Cellules et Structures

299

On peut crer un tableau multidimensionnel sans utiliser la commande cat, en spcifiant


directement la page comme dans le cas suivant :
>> tableau2(:,:,1)=[2 6;4 5]
tableau2 =
2
6
4
5
>> tableau2(:,:,2)=[5 7;8 3]
tableau2(:,:,1) =
2
6
4
5
tableau2(:,:,2) =
5
7
8
3
On peut tendre un tableau en spcifiant directement les valeurs de la nouvelle page.
>> tableau2(:,:,3)=[2 4;1 7]
tableau2(:,:,1) =
2
6
4
5
tableau2(:,:,2) =
5
7
8
3
tableau2(:,:,3) =
2
4
1
7
Un tableau 4 dimensions est un tableau de tableaux.
Les lments de la 4me dimension de tableau3 sont forms de tableau1 et dun
tableau alatoire de mmes dimensions que tableau1 :
>> tableau3(:,:,:,1)=tableau1;
>> tableau3(:,:,:,2)=randn(size(tableau1)) ;
>> size(tableau3)
ans =
4
3
3

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

Nous pouvons vrifier lgalit de tableaux3 et tableau4 si les valeurs de randn


sont toujours les mmes chaque ralisation.
>> all(all(all((tableau3==tableau4))))
ans(:,:,1,1) =
1
ans(:,:,1,2) =
0
Lgalit est ralise uniquement pour les lments de la 1re page ne contenant par la
fonction randn.
Comme pour les matrices, on peut crer des tableaux particuliers en utilisant les
commandes ones, randn, zeros, etc.
>> taille=size(tableau1);
>> tableau5=ones(taille)+randn(taille);
Nous crons un tableau de mmes dimensions que tableau1, forms de 1 auxquels on a
ajout des valeurs alatoires normales, dont nous affichons la 2me page.
>> tableau5(:,:,2)
ans =
3.9080
1.8252
2.3790
-0.0582

0.5314
0.7275
2.0984
0.7221

1.7015
-1.0518
0.6462
0.1764

La commande ndims donne le nombre de dimensions qui est 4 pour tableau3.


>> ndims(tableau3)
ans =
4
La commande whos qui liste les variables de lespace de travail donne :
>> whos
Name
ans
page
page1
page2
page3
tableau1
tableau2
tableau3
taille

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

Tableaux multidimensionnels Cellules et Structures

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

Tableaux multidimensionnels Cellules et Structures

303

Il faut combiner la commande mean en autant de dimensions du tableau pour avoir la


moyenne de tous ses lments.
>> moyenne=mean(mean(mean(tableau5)))
moyenne =
0.5814
Le moyen le plus simple de calculer cette moyenne est de lappliquer sur le vecteur
colonne obtenu en indexant le tableau par loprateur : .
>> moyenne=mean(tableau5(:))
moyenne =
0.5814
Ceci est valable pour toutes les commandes telles que sum, prod, etc.
>> size(tableau5(:))
ans =
18
1
Le vecteur obtenu est de type colonne 18 lments.
I.1.4.2. Oprations lment par lment

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

Ou en matrice 3 lignes et 6 colonnes :


>> reshape(tableau5,[3,6])
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

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

Tableaux multidimensionnels Cellules et Structures

305

I.1.6. Permutation des dimensions dun tableau


La commande permute(tableau, dims) permet de permuter les dimensions de
tableau selon les dimensions spcifies dans dims.
>> a = rand(1,2,3,4,5);
>> b=permute(a,[2,1,3,5,4]);
On passe du tableau a 5 dimensions au tableau b 4 dimensions tout en respectant
le mme nombre total dlments. Le tableau a est form de 5 tableaux eux-mmes
constitus de 4 tableaux 3 dimensions (3 pages dune ligne et 2 colonnes) et le tableau
b sera form de 4 tableaux constitus de 5 tableaux tridimensionnels 3 pages de 2
lignes et 1 colonne.
>> size(a)
ans =
1
2

>> size(b)
ans =
2
1

On donne ici la premire page des tableaux a et b de la dernire dimension 5 pour


a et 4 pour b .
>> a(:,:,1,1,1)
ans =
0.3685
0.6256
>> b(:,:,1,1,1)
ans =
0.3685
0.6256
Le retour au tableau dorigine se fait laide de la commande ipermute avec les mmes
dimensions utilises par la commande permute.
>> c=ipermute(b,[2,1,3,5,4]);
>> all(c(:)==a(:))
ans =
1
Le tableau c obtenu par la commande ipermute est identique au tableau a
dorigine.

306

Chapitre 8

I.1.7. Utilisation pratique des tableaux multidimensionnels dans lindustrie


Prenons lexemple dun banc de mesures dans lindustrie de lautomobile o lon a souvent
besoin de mesurer nombre de signaux issus de capteurs (temprature, pression, humidit,
dbit de fluide, etc.). Supposons quon fasse ces mmes mesures pour plusieurs paramtres
de lenvironnement (ex. vitesse du moteur). Dans ce cas prcis, chaque ligne du tableau
reprsente les valeurs issues de ces capteurs un instant t. Toutes les lignes comporteront
ainsi toutes les mesures pour une vitesse du moteur. Chaque colonne reprsente la valeur
dun capteur pour tous les instants de lessai. Pour une autre vitesse du moteur, les mesures
sont enregistres dans une autre page du tableau.
Pour la vitesse 1 :
Temprature (C)

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:

Le tableau multidimensionnel sera le suivant : 2 pages de 3 colonnes et 10 colonnes.

Tableaux multidimensionnels Cellules et Structures

307

>> temp_vit1=[20.1 21 21.2 21.5 21.8 21.7 21.9 22.1 22.5


22.8];
>> pression_vit1=[1.67 1.20 1.18 1.16 1.12 1.08 1.08 1.07
1.04 1.02];
>> debit_vit1=[0.48 0.50 0.52 0.55 0.57 0.60 0.62 0.64 0.67
0.68];
La concatnation selon la 2me dimension se fera pour ces vecteurs colonnes.
>> vit1=cat(2,temp_vit1,pression_vit1,debit_vit1)
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
On fait de mme pour les mesures concernant la vitesse 2 du moteur :
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
Le tableau multidimensionnel des 2 sries de mesures sobtient par concatnation selon la
dimension 3.
>> vit12= cat(3, vit1,vit2)
vit12(:,:,1) =
20.1000
1.6700
21.0000
1.2000
21.2000
1.1800
21.5000
1.1600
21.8000
1.1200
21.7000
1.0800
21.9000
1.0800
22.1000
1.0700
22.5000
1.0400

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')

Tableaux multidimensionnels Cellules et Structures

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

On ralise galement la modlisation de la courbe donnant la pression en fonction de la


temprature. On trace la courbe donnant la pression en fonction de la temprature.
>> plot(vit12(:,1,1), vit12(:,2,1))
Le menu Tools de la fentre graphique possde loutil de lissage de courbes Basic
Fitting.
Cet outil permet de tracer la courbe du polynme dinterpolation, dafficher les
coefficients du polynme de lissage et de les sauvegarder sous une forme dune structure.

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

On choisit un lissage cubique en cochant la case cubic, soit un polynme dinterpolation


du 3me degr. En cochant la case Show equations, on obtient laffichage des
paramtres du coefficient avec le nombre de digits significatifs spcifi dans le menu
Significant digits.

En cliquant sur le bouton Save to workspace, le polynme est sauvegard dans


lespace de travail MATLAB sous la forme dune structure.

Tableaux multidimensionnels Cellules et Structures

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

II. Tableaux multidimensionnels de cellules


II.1. Cellules, Tableaux de cellules
Les cellules sont des tableaux pouvant contenir des lments de diffrents types de
donnes : des chanes de caractres, des nombres, des tableaux, etc.
La cellule suivante est un tableau 2x2 contenant des tableaux de chanes de caractres, des
nombres complexes, des tableaux dentiers et une autre cellule.

II.1.1. Construction de cellules


Les lments dune cellule doivent tre mis entre accolades { }
La cellule ci-dessus doit tre crite de faon suivante :
>> Cell2={['Khadija';'Mehdi
exp(3i)]; ...
[5 7 8 ;3 4 6 ;7 9 0] Cell1}

';'Antoine']

[1+3j

5i;5+2i

Avec Cell1 prcdemment dfinie par:


>> Cell1={['Paris
';'Saint Nom';'Clichy
[3j 1+5i;3+6i 2+3i ;5+j j]}
Cell1 =
[3x9 char]
Cell2 =
[3x7 char ]
[3x3 double]

[2x2 double]

'] [3 5;7 8] ...

[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),

Tableaux multidimensionnels Cellules et Structures


-

313

Le troisime est un tableau de type double de 3 lignes et 2 colonnes.

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 }

Un autre moyen de construire des cellules est dutiliser la commande cell.


>> x=cell(2,3)
x =
[]
[]
[]
[]

[]
[]

Cette commande cre une cellule vide taille 2x3.


On peut spcifier aprs chaque lment de la cellule.
>> x{1,1}=1
x =
[1]
[]
[]
[]

[]
[]

>> x{2,3}='MATLAB R2009a'


x =
[1]
[]
[]
[]
[]
'MATLAB R2009a'
La commande cell permet de dfinir le type dobjet cellule avant de spcifier leurs
valeurs.
>> A = cell(3,1);
>> for n = 1:3
A{n} = randn(n);
A{n}
end

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

Le tableau A possde 3 cellules.


>> A
A =
[
-2.2023]
[2x2 double]
[3x3 double]
Chaque cellule est aussi un tableau de taille n. Pour accder la valeur dindices (2,3) de
la 3me cellule, on fait lindexation suivante :
>> A{3}(2,3)
ans =
0.0557
II.1.2. Accs aux lments des cellules, indexation
Pour accder un lment dune cellule, on lindexe en utilisant les accolades :
>> Cell1{1}
ans =
Paris
Saint Nom
Clichy
>> Cell1{1:2}
ans =
Paris
Saint Nom
Clichy
ans =
3
7

5
8

Tableaux multidimensionnels Cellules et Structures

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

II.1.3. Concatnation de cellules


Nous crons 2 cellules, Cell3 et Cell4 que nous allons concatner en une cellule
Cell5.
>> Cell3={[1 3;5 9] ['2 Sources
';'Saint Lazare
']}
Cell3 =
[2x2 double]
[3x17 char]

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]

Le premier lment de Cell5 est une autre cellule 2 lments.


>> Cell5{1}{1}
ans =
1
3
5
9
On peut aussi concatner les lments de ces deux cellules pour en faire les lments dune
seule. Pour a, on utilise les crochets [] au lieu des accolades {} .
>> Cell6=[Cell3 Cell4]
Cell6 =
[2x2 double]
[3x17 char]

[1x31 char]

[8667

On obtient bien une seule cellule avec un lment supplmentaire que la cellule Cell5.

Tableaux multidimensionnels Cellules et Structures

317

>> Cell6{:}
ans =
1
3
5
9
ans =
2 Sources chaudes
Saint Nom
Saint Lazare
ans =
Thermodynamique chelle finie
ans =
8667

2me lment de la 1re cellule

>> 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}

>> x2= {randn(2),'SIMULINK 7.8.5'}


x2 =
[2x2 double]
'SIMULINK 7.8.5'
>> x12 =
[2x13 char ]
[2x2 double]

[
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]

Tableaux multidimensionnels Cellules et Structures

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;

>> % Tableau 3 dimensions de cellules


>> C = cat(3, A, B);

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

Applique des fonctions MATLAB des tableaux de cellules.


>> CellNombres = {1:5, [1; 3; 2], [] inf};
>> CellNombres{:}
ans =
1
2
3
4
5
ans =
1
3
2
ans =
[]
ans =
Inf

Tableaux multidimensionnels Cellules et Structures

321

Le calcul de la moyenne et de la variance des 4 cellules du tableau se fait par application


des commandes mean et cov.
>> MoyCellNombres = cellfun(@mean, CellNombres)
MoyCellNombres =
3
2
NaN
Inf
>>
VarCellNombres
'UniformOutput', false)

>>
VarCellNombres
=
'UniformOutput', false)
VarCellNombres =
[1.5811]
[1]
[NaN]

cellfun(@std,

CellNombres,

cellfun(@std,

CellNombres,

[NaN]

Si on veut rcuprer la taille du tableau de cellules, nous utilisons la commande size.


>> [NbLignes,NbCols] = cellfun(@size, CellNombres)
NbLignes =
1
3
NbCols =
5
1

>> cellplot(CellNombres)

La cellule vide, reprsente par un carr blanc, possde 0 ligne et 0 colonne.

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

Transforme un tableau numrique en tableau de cellules.


>> A=[1 3;5 7];
>> B=num2cell(A)
B =
[1]
[3]
[5]
[7]
>> size(B)
ans =
2
2
>> iscell(B)
ans =
1
Le tableau B, 2 lignes et 2 colonnes est du type cellule.
C = num2cell(A,dims) convertit la matrice A en tableau de cellules C en crant des
cellules spares selon la dimension spcifie dans dims.
>> C=num2cell(A,1) % contenu des colonnes dans cellules
% spares
C =
[2x1 double]

[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

Tableaux multidimensionnels Cellules et Structures

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

Affiche graphiquement un tableau de cellules.


.
>> A(:,:,1)={'Saint Nom' ones(2);i+rand 'Casablanca'}
>> A(:,:,2)={'Antony' [1 3;5 7]; exp(j*[pi pi/4]) 3};
>> cellplot(A)

cell2mat

Convertit un tableau multidimensionnel de cellules en une seule matrice (tableau 2D).


>> C = {[1 5] [2 3 4 7]; [5 8; 9 7] [4 8 9 3; 1 12 20 5]};
>> C{:}

Tableaux multidimensionnels Cellules et Structures


ans =
1
ans =
5
9
ans =
2
ans =
4
1

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'

Le rsultat de la commande sort est aussi un tableau de cellules de chanes de caractres


ordonnes par ordre alphabtique.

III. Tableaux multidimensionnels de structures


III.1. Structures
Une structure avec des champs vides est obtenue par la commande struct sans remplir
les tableaux de cellules contenant les valeurs des lments des diffrents champs.
>> StructVide = struct('Champ1',{},'Champ2',{})
StructVide =
0x0 struct array with fields:
Champ1
Champ2
Considrons la description de personnes par certaines caractristiques qui sont :
- la taille,
- la couleur des yeux,
- la date de naissance,
- ladresse,
- lieu de naissance.
Une personne dnomme NomPers sera dcrite par une structure avec les 5 champs
prcdents.
>> NomPers = struct('Poids',{50},...
'CouleurDesYeux',{'noirs'},...
'DateDeNaissance', {'10 Mai 1977'},...
'Adresse', {'Alle Les Erables Saint
Nom'},...
'LieuDeNaissance',{'Sidi
Bernoussi
Casablanca'})
NomPers =
Poids: 50

Tableaux multidimensionnels Cellules et Structures

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

On peut tendre la structure en affectant directement dautres valeurs aux champs de la


structure NomPers.
Lextension de la structure peut se faire en affectant uniquement un champ, comme le
champ Poids.
>> NomPers(3).Poids=78
>> NomPers
NomPers =
1x3 struct array with fields:
Poids
CouleurDesYeux
DateDeNaissance
Adresse
LieuDeNaissance
Les autres champs non affects, retournent des valeurs vides.
>> NomPers(3).Adresse
ans =
[]
On le voit directement en affichant les champs de NomPers(3).
>> NomPers(3)
ans =
Poids: 78
CouleurDesYeux:
DateDeNaissance:
Adresse:
LieuDeNaissance:

[]
[]
[]
[]

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.

Tableaux multidimensionnels Cellules et Structures

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'

III.3. Convertir un tableau de cellules en tableau de structures et


inversement
Les fonctions struct2cell et cell2struct convertissent, respectivement, un
tableau de structures en tableau de cellules et inversement.
>> TabCell=struct2cell(TablStruct);
Le nouveau tableau TabCell est bien du type cellules.
>> isstruct(TabCell)
ans =
0
>> iscell(TabCell)
ans =
1
Cette commande convertit un tableau (m,n) de structures p champs en un tableau de
cellules de dimensions (p,m,n).
>> size(TabCell)
ans =
5
2
3

Seul le dernier lment de TabCell possde une cellule non vide.


>> TabCell(:,:,3,5)
ans =
[]
[
50]
[]
'noirs'
[]
'10 Mai 1977'
[]
[1x27 char]
[]
[1x25 char]

Tableaux multidimensionnels Cellules et Structures

331

La conversion dun tableau multidimensionnel un tableau de cellules se fait par la


commande cell2struct quon applique au tableau Tabcell.
>> Tabtruct=cell2struct(TabCell,{'Poids','CouleurDesYeux',
'DateDeNaissance', Adresse','LieuDeNaissance'},1)
Tabtruct =
2x3x5 struct array with fields:
Poids
CouleurDesYeux
DateDeNaissance
Adresse
LieuDeNaissance
III.4. Fonctions propres aux tableaux de structures

isstruct

Retourne 1 si largument est une structure et 0 autrement.


>> isstruct(NomPers)
ans =
1

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

Cette commande retourne les champs de la structure donne en argument.


>> Champs = fieldnames(NomPers)
Champs =
'Poids'
'CouleurDesYeux'
'DateDeNaissance'
'Adresse'
'LieuDeNaissance'

332

Chapitre 8

getfield

Retourne la valeur dun champ dune structure.


Si on veut avoir le lieu de naissance dans la structure NomPers :
>> ValNaissance=getfield(NomPers,'LieuDeNaissance')
ValNaissance =
Sidi Bernoussi, Casablanca
Le rsultat est le mme que celui donn par la commande suivante en pointant le champ
correspondant :
>> NomPers.CouleurDesYeux
ans =
noirs

isfield

Retourne 1 si la chane spcifie est un champ de la structure et 0 autrement.


>> isfield(NomPers,'CouleurDesYeux')
ans =
1
On peut entrer comme argument plusieurs chanes de caractres sous forme dune cellule.
>> isfield(NomPers,{'Taille','DateDeNaissance'})
ans =
0
1
La chane Taille nest pas un champ de la structure NomPers.

orderfields

Les champs sont ordonns par ordre alphabtique.


>> OrdNomPers=orderfields(NomPers)
OrdNomPers =
Adresse: 'Alle Les Erables Saint, Nom'
CouleurDesYeux: 'noirs'
DateDeNaissance: '10 Mai 1977'
LieuDeNaissance: 'Sidi Bernoussi, Casablanca'
Poids: 50
On obtient ainsi une nouvelle structure dont la liste des champs est ordonne.
>> isstruct(OrdNomPers)
ans =
1

Tableaux multidimensionnels Cellules et Structures

333

setfield

Permet de spcifier la valeur dun champ dune structure.


Ci-aprs, nous modifions la valeur du champ Adress de la structure NomPers (cest le
cas o la personne dmnage de Saint Nom lavenue de Clichy, Paris 17me).
>> NomPers2=setfield(NomPers,'Adresse','90 Avenue de Clichy,
75017 Paris')
NomPers2 =
Poids: 50
CouleurDesYeux: 'noirs'
DateDeNaissance: '10 Mai 1977'
Adresse: '90 Avenue de Clichy, 75017 Paris'
LieuDeNaissance: 'Sidi Bernoussi, Casablanca'
La mme chose est obtenue par :
>> NomPers.Adresse='90 Avenue de Clichy, 75017 Paris'

struct2array

Transforme une structure en vecteur.


>> VectNomPers=struct2array(NomPers)
VectNomPers =
2noirs10 Mai 197790 Avenue de Clichy,
Bernoussi, Casablanca

75017

ParisSidi

>> size(VectNomPers)
ans =
1
75

structfun

Applique une fonction MATLAB chaque champ dune structure.


La mise en majuscules des champs de la structure NomPers se fait par la ligne de
commandes suivante :
>> MajChamps = structfun(@(x) ( upper(x) ),
'UniformOutput', false)
MajChamps =
Poids: 50
CouleurDesYeux: 'NOIRS'
DateDeNaissance: '10 MAI 1977'
Adresse: 'ALLE LES ERABLES SAINT, NOM'
LieuDeNaissance: 'SIDI BERNOUSSI, CASABLANCA'

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

I. Prise en main rapide


I.1. Simulation de systmes dynamiques continus
I.1.1. Rponse un chelon et une rampe dun systme analogique
du 2nd ordre
I.1.2. Equation diffrentielle du second ordre
I.1.3. Modle d'tat du systme du second ordre
I.1.4. Rgulation Proportionnelle et Intgrale
I.1.5. Gnration d'un sinus cardinal
I.2. Simulation de systmes discrets
I.2.1. Filtrage d'un signal bruit par moyenne mobile
I.2.2. Rgulation intgrale numrique
I.2.3. Rsolution d'quation rcurrente
I.2.4. Rsolution de systmes d'quations non linaires
II. Masquage ou encapsulation de sous-systmes
III. Utilisation des Callbacks
IV. Cration d'une bibliothque personnelle
V. Etude des diffrentes librairies de SIMULINK
V.1. Librairie Sinks
V.2. Librairie Sources
V.3. Librairie Discrete
V.3.1. Commande intgrale
V.3.2. Commande P.I. dun systme analogique
V.3.3. Commande P.I. avec blocage de lintgrale
V.3.4. Rsolution dune quation de rcurrence
V.4. Librairie Continuous
V.5. Tables dinterpolation ou dextrapolation linaires
V.5.1. Table dinterpol ation et dextrapolation
V.6. Librairie Logic and Bit Operations
V.6.1. Circuits logiques et combinatoires
V.6.2. Somme de 2 bits avec retenue
V.6.3. Ralisation de fonction logique quelconque
V.6.4. Autres lments de la librairie Logic and Bit Operations
V.7. Librairie Ports & Subsystems
V.8. Librairie User-Defined Functions
V.9. Librairie Commonly Used Blocks
V.10. Librairie Discontinuities
V.11. Librairie Math Operations
V.12. Librairie Signal Routing
VI. Simulink Extras
VI.1. Librairie Additional Discrete
VI.2. Librairie Additional Linear
VI.3. Librairie Additional Sinks
VI.4. Librairies Transformation & Flips Flop

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_9, Springer-Verlag Berlin Heidelberg 2010

336

Chapitre 9

Simulink, outil additionnel MATLAB, permet la modlisation, la simulation et l'analyse de


systmes dynamiques linaires ou non linaires.
Ces systmes peuvent tre analogiques, discrets ou hybrides. Les systmes discrets peuvent
avoir plusieurs parties chantillonnes des cadences diffrentes.
Les paramtres rgissant le fonctionnement de ces systmes peuvent tre modifis en ligne,
soit en cours de simulation, et l'on peut observer leur effet immdiatement.
Simulink possde une interface graphique pour visualiser les rsultats sous forme de
graphiques ou de valeurs numriques en cours de simulation.
Simulink est bti autour d'une bibliothques de blocs classs par catgories (systmes discrets
ou continus, blocs linaires ou non discontinus, etc.).
Pour faire apparatre la bibliothque de Simulink, il faut cliquer sur l'icne:

On peut aussi appliquer la commande


>> simulink, dans l'espace de travail MATLAB.
Dautres outils de modlisation sont associs Simulink, tels Stateflow, Fuzzy Logic,
Neural Network, etc., comme on le voit dans la fentre suivante :

SIMULINK

337

On obtient la fentre de la librairie SIMULINK contenant les diffrents types de librairies de


blocs classs par catgorie.
Nous avons aussi Simulink Extras, reprsent comme tout autre outil additionnel avec
ses propres librairies de blocs.

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.

Blocs additionnels de Mathmatiques et blocs discrets.

I. Prise en main rapide


I.1. Simulation de systmes dynamiques continus
Afin de se familiariser rapidement avec SIMULUNK, nous proposons, travers quelques
exemples, de dcouvrir un certain nombre de blocs de cette librairie.

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

avec w0 et , respectivement, la pulsation propre et le coefficient d'amortissement.


On affecte ces 2 variables des valeurs permettant d'obtenir un systme sous amorti.
Ces variables, dfinies dans l'espace de travail de MATLAB, peuvent tre utilises par leurs
noms au niveau de SIMULINK.
>>
>>

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

Enregistrement du signal dans un fichier .mat


Oscilloscope
Bloc contenant le temps de simulation
Multiplexeur de signaux
Oprateur relationnel

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.

Pour lancer la simulation, il suffit de slectionner la flche


ou l'option Start
du menu Simulation.
Avec un double clic sur l'icne Scop dont on a modifi l'tiquette en 'signaux d'E/S', on
peut observer le signal de sortie du systme dynamique.
Les lignes de commande suivantes permettent le trac de la sortie du systme en rponse la
suite des signaux chelon et rampe.
Le temps de simulation, les signaux de commande et de sortie sont lus dans le fichier
sortie.mat.
>>
>>
>>
>>
>>
>>
>>

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

Rponse du systme et signal de commande chelon+rampe

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):

s' '(t ) = w02 [u(t )

2
s' (t ) s(t )]
w0

Le modle SIMULINK est reprsent par la fentre suivante:

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

Le systme du second ordre est dfini par l'quation diffrentielle:


s+

2
1
s' + 2 s'' = u
w0
w0

Nous pouvons le transformer en systme d'tat comme suit:


s+

2
1
s' + 2 s' ' = u
w0
w0

x1

x2

Nous obtenons ainsi le systme d'tat suivant:


x&1 = x 2
x& 2 = w02 x1 2 w0 x 2 + w02 u

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 possde un bloc pour reprsenter un systme d'tat, State-Space du bloc


Linear.
Une fois que ce bloc est transfr dans une fentre vide et aprs que les paramtres w0 et
soient affects dans l'espace de travail MATLAB, on double clique sur ce bloc pour entrer les
matrices d'tat A, B, C et D du systme d'tat continu:
X& = A X + B u
s(t ) = C X + D u
avec X le vecteur d'tat, soit
x1
X =
x2 .

SIMULINK

345

Pour ce systme, le double clic sur le bloc State-Space de la librairie Continuous


permet l'ouverture d'une fentre dans laquelle on entre les valeurs des
matrices d'tat A, B, C et D. Ces matrices sont dfinies littralement avec les paramtres w0 et
affects dans l'espace de travail MATLAB.

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.
>>
>>
>>
>>
>>
>>

subplot(211), plot(temps, entree)


axis([0 max(temps) -0.5 1.5])
title('signal d''entre du systme du second ordre')
subplot(212), plot(temps, sortie),
xlabel('temps')
title('sortie du systme du second ordre')

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

sortie du systme du second ordre

2
1
0
-1

50

100

150

200

250

temps

300

350

347

SIMULINK
I.1.4. Rgulation Proportionnelle et Intgrale

On considre un processus du 1er ordre de gain statique 0.8 et de constante de temps, = 20 s


soit la fonction de transfert:
H0
0.8
H ( p) =
=
1 + p 1 + 20 p
Nous voulons asservir ce systme pour d'une part rduire le temps de rponse d'un facteur 5 et
que la sortie du systme boucl, soit gale au signal de consigne en rgime tabli.
Pour cela, nous utilisons un rgulateur D( p) = K (1 +

1
) P.I. d'expression:
Ti p

Si l'on choisit Ti = pour compenser le ple du processus, la fonction de transfert du systme


1
F ( p) =

1+
p
K H0

boucl a pour expression:

Le systme en boucle ferme se comporte comme un systme du 1er ordre de constante de


temps gale celle du processus, divise par le facteur KH 0 que l'on doit choisir gal 5.
Dans l'espace de travail MATLAB, nous dfinissons les variables reprsentant le gain statique
et la constante de temps du processus.
>>

H0=0.8; tau=20;

La figure suivante reprsente l'expression du rgulateur avec Ti = et K = 5 / H 0 .

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.

D'autre part, en plus du signal de consigne, de la sortie du systme boucl et du signal de


commande issu du rgulateur, nous avons aussi sauvegard la rponse en boucle ouverte du
processus, dans le fichier bo_bf.mat.

SIMULINK

349

Le bloc Width de la librairie Signal Attributes permet de donner la dimension du


signal qui le traverse. Dans notre cas, il y a 4 signaux, dans l'ordre, la rponse en boucle
ouverte, le signal de consigne, la sortie du systme boucl et le signal de commande gnr
par le rgulateur.
Le script aff_signaux permet de rcuprer les signaux du fichier bo_bf.mat pour leur
trac.

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

rponse en boucle ouverte

0.6

= 18.9421 s
0.4

0.2

50

100

150

200

250

temps

suite fichier aff_signaux.m


% rponse en boucle ferme et consigne
figure(2), h=plot(t,rep_bf); set(h,'linewidth',2), hold on
plot(t,consigne), axis([0 50 0 1.2])
gtext('\leftarrow sortie du systme rgul')
xlabel('temps')
title('consigne et sortie du systme rgul')
gtext(['\leftarrow \tau = ' num2str(cste_temps) ' s'])
consigne et sortie du systme rgul

0.8

sortie du systme rgul

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.

fichier aff_signaux.m (suite)


% signal de commande
figure(3), plot(t,cde)
title('signal de commande'), grid, xlabel('temps')
signal de commande

0
0

50

100

150

200

250

temps

I.1.5. Gnration d'un sinus cardinal

On se propose de gnrer un sinus cardinal en utilisant l'expression logique suivante:

y = ( x == 0) + sin( x ) ./( x + ( x == 0))


avec x = 2 f t .
Dans le modle SIMULINK suivant les lignes sont tiquetes (commentaire aprs un double
clic). Parmi les blocs non tudis prcdemment, on remarque le bloc
(bibliothque User-Defined Functions).
La variable d'entre de cette fonction doit tre imprativement note u.
Pour l'oprateur relationnel de la bibliothque Logic and Bit Operations on choisit
dans le menu droulant l'opration '==' qui donne un sort un niveau logique 1 lorsque les 2
entres sont gales et 0 partout ailleurs.
On peut ajouter le paramtre amplitude en multipliant par sa valeur le signal de sortie du
dernier sommateur.

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:

Nous utilisons ci-aprs, le sous-systme pour gnrer un sinus cardinal d'amplitude 5 et de


frquence 1 Hz.

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 vrifie bien la priode de 1 seconde et l'amplitude de 5 correspondant la valeur initiale.


I.2. Simulation de systmes discrets
I.2.1. Filtrage d'un signal bruit par moyenne mobile

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

la variance du bruit en sortie est divise par l'ordre n.


Considrons un signal d'expression :

y (t ) = 5 sin 01
. t,

chantillonn Te = 0.02s auquel on superpose un bruit gaussien centr de variance 0.1.

354

Chapitre 9

En ralisant un filtrage de type moyenne mobile , on obtient un signal moins bruit.


Si la moyenne se fait sur un horizon n, la variance du signal filtr aura une variance n fois
plus faible que celle du signal bruit original.

Nous avons choisi un filtre d'ordre 4.


Le signal bruit ainsi que la rponse du filtre sont envoys vers l'espace de travail MATLAB
sous le nom de variable filtrage.
Le fichier filtre_ma.m permet d'afficher les diffrents signaux et de calculer leurs
variances.

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

variance du signal bruit : 0.098845


variance du signal filtr : 0.019131

Le filtrage divise par un facteur 5.1667 la variance du bruit.

70

80

90

100

357

SIMULINK
I.2.2. Rgulation intgrale numrique

Le systme analogique tudi prcdemment de fonction de transfert:


H ( p) =

H0
0.8
=
1 + p 1 + 20 p

est chantillonn une cadence de 5 secondes. Le systme chantillonn a pour modle


discret:
H ( z) =

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)

On dsire le mettre sous forme de systme d'tat.


x1 (t  1) x 2 (t )
Nous obtenons: x 2 (t  1) a x1 (t )  b u(t )
Soit sous forme matricielle:
x1 (t  1) 0 1 x1 (t ) 0
x (t  1) a 0 x (t )  b u (t )
2
2

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')

>> gtext('\leftarrow rponse en boucle ouverte')


>> gtext('\downarrow entre du systme')

systme en boucle ouverte


entre du systme
1

0.8

rponse en boucle ouverte

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.
>>

a=0.7788; b=0.177; K=0.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 .

I.2.3. Rsolution d'quation rcurrente

On se propose de chercher la valeur finale x de la l'quation rcurrente suivante.

x n = 1 0.8 x n 1 + 0.5 cos x n 2


A partir de la variable x(n) dont on cherche la loi d'volution et par consquent sa valeur
finale, on la retarde 2 fois par l'lment retard (Unit Delay de la bibliothque
Discrete).
Llment non linaire, 0.5 cos x(n-1) est ralis par le bloc MATLAB Function de
la librairie User-Defined Functions.

Chapitre 9

360

Quand on enregistre des signaux dans lespace de travail (To Workspace), on peut le faire
de 3 manires diffrentes :
-

structure avec le temps (Structure With Time),


structure simple (Structure),
tableau (Array).

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)'

Cest un tableau de 21 valeurs une dimension et son label est x(n).


Les lignes de commande suivantes permettent de tracer l'volution de la solution de l'quation
rcurrente.
Le fichier suivant permet de tracer lvolution de la solution de lquation de rcurrence.

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

La solution finale est telle que (n 1 n) lorsque n tend vers l'infini.


Si on appelle x cette solution finale, nous devons rsoudre l'quation suivante:
1.8 x -1 -0.5 cos x = 0.

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

Nous obtenons bien la mme valeur de la solution.


I.2.4. Rsolution de systmes d'quations non linaires

Cherchons les solutions du systme de 2 quations non linaires suivantes :


cos x + y = 0.5
log( x + 1) 3 arcsin y = 2.5

Grce la fonction fsolve


de la bibliothque Math Operations et
du bloc Fcn pour implmenter les fonctions cos(u), asin et log, le schma de ce systme
est reprsent comme le modle Simulink suivant.
La recherche des solutions se fera laide de 2 blocs Fsolve (Algebraic
Constraint) auxquels, on prsente leurs entres les expressions qui doivent sannuler,
savoir :

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

Les lignes de commandes suivantes permettent de tracer les courbes de y1 et y 2 en fonction


de la variable x dont le domaine de variation est fix entre 0 et 2 par pas de 0.001.
L'abscisse et l'ordonne du point d'intersection de ces 2 courbes sont respectivement la valeur
de x et celle de y , solutions du systme.

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

Les solutions ou coordonnes du point d'intersection des 2 courbes sont identiques,


symbolises par des points sur ce graphique ont les valeurs suivantes.
Les valeurs des points dintersection sont obtenues graphiquement grce aux commandes
ginput et gtext.
Les valeurs exactes de labscisse x et celles des courbes y1 et y2 sont :
>> x(i)
ans =
1.5670

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.

II. Masquage ou encapsulation de sous-systmes


Le masquage permet de rassembler un certain nombre de blocs ralisant une fonction
particulire en un seul bloc paramtrable.

SIMULINK

367

Les blocs de la librairie SIMULINK sont raliss sous forme de masques.


Dans lexemple prcdemment tudi, le sous-systme peut-tre masqu et les paramtres
utiles la simulation seront entrs dans une boite de dialogue.
Le masquage des sous-systmes est tudi dans un chapitre part, Masquage et soussystmes auquel on se rfrera pour apprendre raliser des masques.
Considrons le modle Reg_integ_discret.mdl.
On supprime le bloc chelon de consigne ainsi que loscilloscope de sortie et on en fait un
sous-systme comme dans le paragraphe Rgulation Proportionnelle et
Intgrale
Toutes les valeurs des variables dfinissant le systme sont spcifies dans lespace de travail
MATLAB.
Nous verrons quil y a une autre mthode, plus efficace, celles de Callbacks dont nous
avons aussi consacr tout un chapitre.
On slectionne lensemble des blocs et on utilise loption Create Subsystem pour
obtenir un bloc unique dont nous prsentons le contenu droite.

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).

Les variables sont affectes leurs valeurs en excutant le script suivant :

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

Ensuite on slectionne le sous-systme et on applique la commande Mask Subsystem du


menu Edit.

SIMULINK

369

Souvre alors une fentre avec 4 onglets :

Icon & Ports,


Parameters,
Initialization,
Documentation.

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.

Seule la cadence dchantillonnage a t spcifie directement par sa valeur numrique


Te=5s.
Lapplication de ce masque donne le modle et les signaux suivants :

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.

III. Utilisation des Callbacks


Pour spcifier les valeurs numriques des variables utilises dans des modles Simulink, nous
avons du le faire dans lespace de travail MATLAB, soit aprs le prompt, soit en excutant un
script.
Une autre mthode, plus efficace, est dutiliser des Callbacks qui sont des fonctions
appeles par le modle Simulink selon les diffrentes tapes de lexcution du modle.
Considrons le mme exemple du masque masq_Reg_integ_discret.mdl que
prcdemment, que nous allons appeler masq_Reg_integ_callback.mdl.
Nous allons utiliser le callback InitFcn qui appellera les mmes commandes que le script
param_masq_reg.m quon excute avant de lancer le modle Simulink.
Pour cela, on recopie lintgralit du fichier dans la partie droite du callback InitFcn,
comme on le voit dans la figure suivante.

Ces commandes, appeles lors de ltape dinitialisation du modle Simulink (Init),


consistent spcifier les valeurs numriques des paramtres du modle (ple a et paramtre b

372

Chapitre 9

de la fonction de transfert du processus) et lexpression du rgulateur (gain K et dnominateur


de sa fonction de transfert).

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.

IV. Cration d'une bibliothque personnelle


Chaque lecteur a la possibilit de crer des blocs lis son domaine d'utilisation. Ces
diffrents masques peuvent tre rassembls dans une librairie particulire.
Pour crer une bibliothque, on choisit Library lorsqu'on ouvre un nouveau fichier
SIMULINK par File/New. Dans cette fentre, on insre tous les diffrents masques crs
que lon a lhabitude dutiliser dans son travail personnel. Cela permet dviter de parcourir
toutes les librairies de Simulink chaque fois quon veut insrer un bloc, notamment
lorsquon ne se rappelle pas trs bien de la localisation de chacun deux.
Dans la fentre suivante, nous reprsentons diffrents masques tels le calcul du produit
scalaire de 2 vecteurs, linverse lment par lment dun vecteur, un gnrateur de sinus
cardinal, de PWM et transformation dun octet cod en binaire en sa valeur relle.

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

V. Etude des diffrentes librairies de SIMULINK


V.1. Librairie Sinks

Cette librairie contient :

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.

On trace une sinusode x(t ) = sin 2 t en fonction dune autre, y (t ) = sin (4 t ) .


4
La 2nde sinusode possde une pulsation double de celle de la premire mais elle est dphase
de

. Les amplitudes sont les mmes et gales lunit.

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.

est dans la librairie Logic and Bit

376

Chapitre 9

Les blocs Ground (Sources) et Terminator (Sinks) servent, respectivement tre


relis des blocs non encore utiliss afin dviter laffichage des Warnings dans lespace de
travail Matlab.
Les blocs In et Out servent essentiellement pour les sous-systmes (voir chapitre Masques
et sous-systmes).
Lafficheur numrique indique bien 3.999 pour la sortie et 1 pour lchelon unit et la
simulation sarrte ds que la condition est ralise, bien avant le temps de la simulation qui
est de 50 comme spcifi dans le menu Simulation ... Configuration
Parameters.

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

V.2. Librairie Sources

Cette librairie contient des blocs qui permettent de :

gnrer diffrents types de signaux (sinus, carr, alatoires, triangulaires,


impulsions, constante, etc.).

de disposer du temps de simulation (horloge analogique et numrique),


de lire des donnes contenues dans un fichier .mat qui peut tre pralablement
cr dans lespace de travail MATLAB.

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.

Nous allons tudier un exemple utilisant le maximum de ces blocs.

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.

V.3. Librairie Discrete

Cette librairie contient les lments discrets suivants :

retard dune priode dchantillonnage (Unit Delay) ;


1
que
p
lon discrtise par le calcul de surfaces par les rectangles (infrieurs ou suprieurs) ou
par celle des trapzes (mthode de Tustin),

un intgrateur discret provenant de la numrisation de lintgrateur analogique

les bloqueurs dordre 0 ou 1,

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,

un bloc de modlisation dans lespace dtat,


Un filtre FIR (Finite Impulse Response ou filtre rponse impulsionnelle finie),
Un bloc retard pur dont on peut spcifier le nombre de priodes.
La fentre suivante montre une rgulation par un intgrateur pur (intgration par la mthode
des trapzes ou mthode de Tustin) dun processus analogique prcd dun bloqueur dordre
0. Les signaux de consigne, de commande (issue du bloqueur) et de sortie du processus sont
stocks dans une nomme sortie. Cette variable est globale donc visible dans SIMULINK
et lespace de travail MATLAB.
V.3.1. Commande intgrale

Le fichier aff_sign_sortie.m permet de rcuprer les diffrents signaux de la variable


sortie et de les afficher.

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

Grce lintgration et aprs quelques oscillations, le signal de sortie rejoint le signal de


consigne, ce qui annule lerreur statique. Le bloqueur dordre 0 permet de bloquer la
commande issue du rgulateur numrique durant une priode dchantillonnage pour attaquer
un systme analogique.
V.3.2. Commande P.I. dun systme analogique

Dans cette fentre, nous avons programm le rgulateur PI analogique dexpression :


1
C ( p) =10 (1 + )
p

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

Lerreur statique sannule au bout de 40 secondes environ.

100

120

383

SIMULINK
Signal de commande
1000
800
600
400
200
0
-200
-400
-600

20

40

60

80

100

120

V.3.3. Commande P.I. avec blocage de lintgrale

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

V.3.4. Rsolution dune quation de rcurrence

Par le bloc Memory

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

Par un filtre numrique

On se propose de chercher la solution finale de lquation rcurrente suivante :

x(k ) = 0.3 x(k 1) + 0.7 x(k 2) = 1.5


Cette quation linaire peut tre rsolue laide dun filtre numrique de fonction de
1 .5
, dont lentre est une constante gale lunit.
transfert : H ( z 1 ) =
1 + 0.3 z 1 + 0.7 z 1

>>
>>
>>
>>
>>
>>

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

En rgime permanent, savoir k , on peut crire k k 1 k 2 , ce qui donne la


solution finale :
>> x=1.5/(1+0.3+0.7)
x =
0.7500
V.4. Librairie Continuous

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

Commande par retour dtat

On considre un systme de fonction de transfert analogique du second ordre (double


intgrateur) donne par lexpression suivante :

H ( p) =

1
p2

Avant de raliser cette commande, on tudie sa rponse indicielle afin de connatre sa


dynamique en boucle ouverte.
On utilisera le bloc Transfer Fcn qui ralise la fonction de transfert par la spcification
de la fonction de transfert du processus.

>>
>>
>>
>>
>>
>>

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

Le systme est instable.


Nous pouvons aussi utiliser la reprsentation dtat continu.
Lquation diffrentielle rgissant le processus est donne par :

&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

La commande par retour dtat est de la forme u (t ) = F X (t ) .

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 .

Les composantes f1 et f 2 du vecteur du retour dtat F sont les solutions du systme :


0.04 0.2 f 2 + f 1 = 0
0.01 0.1 f 2 + f 1 = 0

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

>> q=-inv(B'*B)*B'*(A-B*F)*[50 0]'


q =
2

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')

Evolution des composantes d'tat

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

V.5.1. Table dinterpolation et dextrapolation

Table une dimension

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

l'ordonne pour x=1 est : 0.76159


-1

-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

licne, on vrifie parfaitement ce que donne la table


x=1.

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

Table deux dimensions

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

Le ET logique de 2 bits est caractris par la table de vrit suivante :


a b
0
1

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

V.6.2. Somme de 2 bits avec retenue

Le tableau suivant rsume cette opration.


a
0
0
1
1

b
0
1
0
1

a+b
0
1
1
0

retenue
0
0
0
1

La figure suivante montre lexemple de laddition de deux 1 logiques.


En double-cliquant sur le bloc de la table de vrit, nous entrons les valeurs des 2 dernires
colonnes de droite du tableau ci-dessus.

Chapitre 9

400

V.6.3. Ralisation de fonction logique quelconque

Considrons la fonction :
x = (a+b). c b
La figure suivante montre sa ralisation en utilisant les oprateurs logiques (Logical
Operators) :

401

SIMULINK

Programmons dabord cette relation sous MATLAB :


>>
>>
>>
>>
x =

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

V.6.4. Autres lments de la librairie Logic and Bit Operations

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

Sur cette figure, nous reprsentons tout en haut la sinusode dentre.

La deuxime courbe correspond la sortie du bloc


lorsquil y a dcroissance et 0 autrement (croissance).

qui donne 1

On remarque bien ces valeurs logiques selon la drive de la sinusode.

Le deuxime bloc
sens croissant.

, donne 1 lorsquil y a passage par zro du signal dans le

, correspondant la dernire courbe donne la valeur logique 1


Le bloc
chaque variation du signal. Dans le cas de la sinusode, il y a constamment des variations, ce
qui fait que la sortie du bloc vaut toujours 1.
Tous ces blocs sortent un signal de type entier non sign sur 8 bits (uint8).
Comme la sinusode est type en double, nous avons converti, en double, les sorties des 3
blocs prs leur multiplexage.

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.

Chaque sortie sert de trigger ou dclenchement dun sous-systme


dans lequel
on programme laction raliser si cette sortie vaut 1 (vrifie). Dans notre cas, la sortie
if(u1>0) permet dlever au carr lentre du bloc (constante 5).

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

Dans le cas o lentre vaut 5, on fait la concatnation de 2 matrices, un vecteur alatoire de 3


lignes et 1 colonne avec une matrice unit de 3 lignes et 2 colonnes.
Pour spcifier les diffrents cas, ici 1 et 5, on met ces valeurs comme lments dune cellule.

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.

V.8. Librairie User-Defined Functions

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.

Cette librairie contient des blocs ncessaires beaucoup de modles Simulink.

Chapitre 9

410
V.10. Librairie Discontinuities

Switch multi-ports, quantificateur, valeur absolue et zone morte

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.

n entre de passage du signal


1
2
3
4
etc.

Le nombre de voies de ce commutateur est modifiable par un double clic la souris.


Pour que chaque type de signal passe par la voie qui lui est rserve, les seuils sont
dtermins par une expression relationnelle dpendant du temps qui est la suivante :
(u<500)+2*((500<=u)*(u<1000))+3*((1000<=u)*(u<1500))+4*((1500<=u)*(u<=2000))

411

SIMULINK

qui donne les valeurs suivantes suivant le temps :


intervalle de temps
t<500
500<t<=1000
1000<t<=1500
1500<t<=2000

valeur de lexpression logique


1
2
3
4

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

Les caractristiques des diffrents blocs sont :

le pas de quantification est choisi gal 2,


la saturation est -1 et 1,
la zone morte est entre -2 et 2.
Ci-dessous, on trace le signal dorigine en mme temps que les diffrentes transformations
dfinies prcdemment.

Utilisation d'lments non linaires


5
4
3
2
1
0
-1
-2
-3
-4
-5
0

0.2

0.4

0.6

0.8

Temps

1.2

1.4

1.6

1.8

2
4

x 10

412

Chapitre 9

V.11. Librairie Math Operations

Cette librairie contient les blocs doprations mathmatiques :

- Oprations sur les vecteurs et matrices (concatnation


dimensions, etc.)
- Oprations sur les nombres complexes
- Le bloc Algebraic Constraint
f(x)=0
- Lvaluation de polynmes
- Les fonctions trigonomtriques

Les fonctions mathmatiques

, permutation des

qui permet de rsoudre lquation

SIMULINK

413

Dans ces fonctions mathmatiques, nous retrouvons, entre autres, le logarithme,


llvation une puissance, la transposition dun vecteur, le carr, la racine carre, etc.
Nous allons tudier des exemples utilisant quelques blocs de cette librairie.

Dans cet exemple, nous disposons des 2 vecteurs [1 5 6] et [5 7 2] dont nous

414

Chapitre 9

faisons le produit scalaire (Dot Product), une concatnation vectorielle, le calcul


de la somme des lments (vecteur [5 7 2]), et une concatnation matricielle (les
vecteurs sont des colonnes de la matrice rsultat).
Lexemple suivant permet de raliser des transformations de nombres complexes
(module/Angle et linverse, partie relle/Imaginaire et repassage au nombre complexe).

V.12. Librairie Signal Routing

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

En dehors de ces sous-systmes, on affiche grce au commutateur de seuil 0.5 le signal


sinusodal suivi du signal random.

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.

VI. Simulink Extras


Dans sa partie Simulink, la version R2009 de Matlab prsente Simulink Extras comme tout
autre outil additionnel avec ses propres librairies.
VI.1. Librairie Additional Discrete

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

VI.2. Librairie Additional Linear

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

En double-cliquant sur le bloc PID, nous spcifions ses paramtres :

Gain proportionnel Kp=0.8,


Gain intgral Ki=1,
Gain de la partie Drive Kd=0).

>> 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

VI.3. Librairie Additional Sinks

Cette librairie possde des blocs de sortie additionnels pour :

laffichage de la densit spectrale de puissance,


laffichage de lautocorrlation dun signal,
raliser lanalyse spectrale, etc.

60

70

80

SIMULINK

423

Densit spectrale nergique

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

Cette librairie contient les diffrentes transformations suivantes :

coordonnes polaires coordonnes cartsiennes et inversement,


degrs Celsius degrs Fahrenheit et inversement,
coordonnes sphriques coordonnes cartsiennes et inversement,
radians degrs et inversement.

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

Cette librairie contient les bascules de type D, RS et JK.


Ralisation dun compteur 3 bits (modulo 8) partir de bascules JK
Le diagramme suivant montre la ralisation dun compteur 3 bits.
Nous avons ajout volontairement un vecteur offset au rsultat pour un affichage lisible des
diffrents bits.

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)

>> Trac du signal horloge


>> stairs(clock),
>> hold on
>> Trac de lvolution des 4 signaux : horlogz zt 3 bits du
>> >> compteur
>>
>>
>>
>>

stairs(bit1)
stairs(bit2)
stairs(bit3)
stairs(bit4)

>> axis([0 30 -3.5 3])


>> title('compteur 3 bits (modulo 8)')

La courbe suivante montre lvolution de lhorloge et des 3 bits du compteur.

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.

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_10, Springer-Verlag Berlin Heidelberg 2010

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

le sous-systme suivant que lon utilise pour gnrer le

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).

>> title('Sinus amorti - a=5,w = 2 rad/s,\phi = \pi/2; k=0.2')


>> grid
Sinus amorti - a=5, w = 2rad/ s, = / 2; k= 0.2

4
3
2
1
0
-1
-2
-3
-4
-5

10

20

30

40

50

60

I.2. Sous-systme Gnrateur de squences binaires pseudo-alatoires, SBPA

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

Le sous-systme gnrateur de SBPA, peut tre utilis de la faon suivante :

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

II. Masquage des sous-systmes


II.1. Masquage du sous-systme sinus amorti

La forme du bloc du sous-systme ne fait apparatre, ni les variables utilises, ni le type de


fonction ralise. Son masquage nous permettra de le personnaliser en traant dessus la
courbe dun sinus amorti et de crer une bote de dialogue pour spcifier les valeurs des
variables utilises.
Aprs avoir slectionn licne, on choisit loption Mask Subsystem du menu Edit.
On obtient la fentre Mask Editor (Editeur de masque), avec ses 4 menus, Icon&Ports,
Parameters, Initialization et Documentation.
Lorsquon veut modifier un masque, on utilisera loption Edit Mask du menu Edit.
Dans cette fentre on dfinit tous les paramtres du masque.
Dans longlet Icon&Ports, on peut tracer sur le bloc du masque un signal reprsentant le
signal gnr par celui-ci.
Dans notre cas, un sinus cardinal sera trac sur ce bloc.

On dispose de 5 options pour les proprits de licne du masque :


1. Block frame

: rend visible ou invisible le cadre de licne,

2. Icon transparency

: loption Transparent permet laffichage des noms de


variables dentres ou de sorties dfinies dans le soussystme (exemple de la variable x de sortie),

3. Icon Units

: Units de mesure des coordonnes du bloc, Autoscale


permet une chelle automatique

4. Icon rotation
5. Port rotation

: dfinit les proprits de rotation de licne par rapport au


texte ou la courbe dfinis sur licne.
: rotation du port

Dans la fentre Parameters, on dfinit les variables que lon spcifie comme ditables,
valuables et modifiables.

Masques et sous-systmes

435

Dans longlet Documentation, on crit de la documentation sur ce masque.


Ces variables nexistent que dans lespace de travail du masque. Une variable de MATLAB
de mme nom ne sera pas affecte par un changement de valeur dans le masque.
On dfinira mieux lensemble de ces options dans les autres exemples de masques.

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

Ce masque contenant 6 sous-systmes, permettra de gnrer 6 squences diffrentes de


longueurs 21, 63 jusqu la squence du sous-systme de la SBPA de longueur 1023. Pour
slectionner lune des 6 squences, on utilise la S-fonction sf_select pour laquelle on
passe le paramtre Te de la priode dchantillonnage et k reprsentant le numro de la
squence que lon spcifiera dans un menu droulant dans la bote de dialogue du masque
final. Cette S-fonction possde 6 entres correspondant aux 6 squences SBPA et une sortie
qui sera la squence n k.
Les sorties des blocs des 6 squences sont multiplexes puis multiplies par le gain a,
reprsentant lamplitude, avant dtre envoyes la S-fonction de slection de squence.

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

Le signal gnr est envoy dans le fichier sbpa.mat.


En double-cliquant sur le bloc SBPA, on ouvre la bote de dialogue, dans laquelle on
spcifie :
la priode dchantillonnage Te en secondes,
le numro de squence (6) dans le menu droulant,
lamplitude de 3.
La valeur de la priode dchantillonnage Te sera transmise aux blocs de niveau infrieur,
savoir la S-fonction de slection de squence et les blocs Discrete Tranfert Fcn
(with initial states) utiliss pour construire les modles de SBPA de diffrentes
longueurs.
Dans cette fentre, on reconnat le menu droulant popup pour le choix du numro de
squence.
Le menu Initialization permet de fixer les valeurs des variables indpendament de
celles que lon spcifie pour le masque. Il permet dinitialiser le sous-systme masqu dans
des priodes critiques (mise jour du modle ou dbut de simulation). Seules les valeurs
dfinies dans la boite de dialogue du masque seront prises en compte pour lexcution du
masque.

SBPA de longueur 1023, amplitude 1


1.5

0.5

-0.5

-1

-1.5

100

200

300

400

500

600

700

800

900

1000

440

Chapitre 10

II.3. Masques dalgbre linaire


II.3.1. Rsolution dquation linaire
1 2
0
Il sagit de rsoudre lquation A x = B, avec A = 4 6 et B = 5 . La solution que fera
3 6
7
le sous-systme masqu sera du type x=(ATA)-1 AT B. Cette mthode dite aussi des
moindres carrs permet de rsoudre des systmes surdimensionns.

Linversion et la multiplication matricielle sont ralises par les oprateurs simples de


multiplication et de division pour lesquels on choisit le type matrix au lieu de
element wise .
Pour raliser le sous-systme puis le masque, on supprime les constantes A et B et lafficheur,
et on cre le sous-systme par Edit Create Subsystem aprs avoir tout slectionn.

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).

Pour raliser le masque, on enlve A et B du Callback, on supprime les entres A et B et


lafficheur. On slectionne le sous-systme et on choisit le menu Edit Mask
Subsystem

Chapitre 10

442

On ouvre alors lditeur de masque avec ses diffrents onglets.

Onglet Icon & Ports

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

On peut aussi utiliser le bloc fsolve (Algebraic constraint) de la bibliothque


Math Operations qui rsout lquation A x - B = 0.

Dans longlet Parameters, et dans la colonne Variable, on crit les noms des variables
mat_A et vect_B du modle ci-dessus.

Ci-dessous, nous considrons un cas dun systme dtermin.

Masques et sous-systmes

445

II.3.2. Gnrateur PWM

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%.

Dans longlet Parameters, on spcifie la variable T et lamplitude ampl du signal PWM.

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

III. Sous-systmes de la bibliothque Ports & Subsystems


III.1. Iterator Subsystem

Ce sous-systme, de la bibliothque Ports & Subsystems, permet de raliser des calculs


itratifs dans SIMULINK.
Nous dsirons programmer lquation rcurrente suivante : x(k) = 1 0.95 x(k-1).

Nous avons rajout dans le sous-systme une sortie supplmentaire out2, qui ressort le
nombre ditrations, gal 10.

Au bout des 10 itrations, nous obtenons lvolution suivante de la variable x.

448

On vrifie bien quen rgime permanent, la valeur de x vaut :


>> x = 1/(1+0.95)
ans=
0.5128
III.2. Sous-systme If

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.

III.3. Sous-systme Switch Case

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

On spcifiera les paramtres suivants :


k
m
std
n

: type gaussien (k=1) ou uniforme (k=2),


: moyenne du signal gaussien ou valeur maximale du signal uniforme,
: cart-type du signal gaussien,
: nombre dchantillons temporels du signal.

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.

Dans les sous-systmes case


gaussien et uniforme.

{} et default{}, on insre les blocs Random

Masques et sous-systmes

451

Ci-aprs, nous avons le masque et la courbe du signal alatoire.

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

Lorsque le sous-systme est activ, on prend sa valeur absolue de la bibliothque Math


Operations.

452

Chapitre 10

Le bloc boolean de la bibliothque Signal Attributes (attributs du signal) permet de


passer dun type double ou integer (entier) au type boolen avant daller activer ou
dclencher le sous-systme.
III.4.2. Sous-systmes triggs ou dclenchs

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).

On obtient alors le sous-systme suivant qui existe aussi dans la bibliothque.

III.5. Sous-systmes configurables

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

I. Principe de fonctionnement des S-fonctions


II. Les diffrentes tapes de simulation
II.1. S-fonction code en langage M
II.1.1. S-fonction avec modle dtat discret
II.1.2. S-fonctions avec paramtres optionnels
II.1.3. S-fonction avec echantillonnage variable
II.1.4. S-fonction avec modle dfini par quations
mathmatiques
II.2. S-fonction en langage C (fichier C MEX)
III. Les S-fonctions Builder
III.1. Systme sous forme de modle dtat discret
III.2. Systme sous forme de modle dtat continu
III.3. Systme dfini par des quations mathmatiques
IV. S-fonctions hybrides
IV.1. Example 1 de systme hybride
V. S-fonctions aux tailles des signaux des entres/sorties dynamiques
V.1. Taille dynamique des vecteurs dentres/sorties
V.2. Taille dynamique du vecteur dtat
VI. Diffrents autres exemples de S-fonctions
VI.1. Systme du 2nd ordre discret, quation de rcurrence
VI.2. Solution dun systme linaire 2 inconnues
VI.3. Rsolution dune quation rcurrente non linaire
VI.4. Rgulation Proportionnelle et Intgrale P.I.
VII. User Data

I. Principe de fonctionnement des S-fonctions


Une S-fonction (fonction systme), base sur le principe du modle dtat, est une fonction, crite en
langage M ou C que lon peut intgrer dans un bloc SIMULINK pour raliser des calculs spcifiques.
Cest un moyen puissant dexcuter du code MATLAB lintrieur dun modle SIMULINK. Cest un
moyen trs puissant dtendre les possibilits de SIMULINK.
SIMULINK dispose des 3 blocs suivants pour implmenter une S-fonction la librairie des blocs UserDefined Functions .

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.

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_11, Springer-Verlag Berlin Heidelberg 2010

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 :

Lorsquon veut ajouter un bloc supplmentaire SIMULINK,


Intgrer du code C dans un modle SIMULINK,
Raliser des animations,
etc.

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 :
-

la cadence dchantillonnage ts,


une chane de caractres str,
ltat initial x0 et la variable sys dans laquelle est calcule la sortie.

Chapitre 11

458

II. Les diffrentes tapes de simulation


Selon la valeur du flag qui dtermine ltape courante, il y a excution des diffrentes fonctions
commenant toutes par mdl en rfrence lextension des fichiers SIMULINK.
Etape de simulation

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

II.1. S-fonction code en langage M


II.1.1. S-fonction avec modle dtat discret
Nous rappelons la syntaxe dune S-fonction crite en langage M de MATLAB.
function[sys,x0,str,ts] = function_name(t,x,u,flag,P1,P2,...)
t, x, u, flag
P1, P2

: temps, tat, entre, flag (variables passes par le systme la S-fonction)


: Variables optionnelles passes la S-fonction.

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

%
%
%
%
%
%

Nombre dtats continus


Nombre dtats discrets
Nombre de sorties
Nombre dentres
D est gnralement nulle (D=0)
Nombre de cadences dchantillonnage.

Sil y a 2 instants dchantillonnage, la matrice [NumSampleTimes, 2] contient la priode


dchantillonnage et loffset : [period offset],
flag = 1, la drive de ltat continu, x& , est retourne dans la variable sys,
flag = 2, la mise jour de ltat discret, x(k+1) est retourne dans sys,
flag = 3, la sortie est retourne dans sys,
flag = 4, dans le cas dun chantillonnage variable, le prochain chantillonnage est retourn dans
sys.

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

Dans le fichier Sf_2ordre_dicret_etat.m, les matrices A, B, C sont dfinies lintrieur de la Sfonction.


Le systme tant discret, nous devons choisir un solveur discret (pas dtat continu) pas fixe (type
fixed step) dans le menu Simulation Configuration Parameters.
fonction Sf_2ordre_discret_etat.m
function [sys,x0,str,ts] = Sf_2ordre_discret_etat(t,x,u,flag)
A = [0.8 1;-0.5 0];
B = [0 1]';
C = [1 0];

% 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 obtenons les signaux dentre et de sortie suivants.

II.1.2. S-fonctions avec paramtres optionnels

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.

Le code de la S-fonction est donn dans le fichier suivant.


fonction sf_2ordre_discret_etat2.m
% Simulation d'un modle d'tat discret
function
[sys,x0,str,ts]=Sf_2ordre_discret_etat2(t,x,u,flag,Te,Xinit,A,B,C)
switch flag,
case 0
% Etape d'initialisation
[sys,x0,str,ts]=Initialisation(A,Te,Xinit);
case 2
% Etape de calcul du l'tat
sys=Mise_a_jour_etat(x,u,A,B);
case 3
% Etape de calcul de la sortie
sys=CalculSorties(x,u,C);
case {1,4,9}
sys=[];

% 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;

Les signaux sont sauvegards dans le fichier uy.mat.


Le trac des diffrents signaux est ralis grce aux commandes suivantes.
>>
>>
>>
>>
>>
>>
>>

load uy, stairs(signals(1,:), signals(2,:))


hold on, plot(signals(1,:), signals(3,:))
grid
title('Signaux d''entre et de sortie')
xlabel('Temps discret')
gtext('Signal d''entre')
gtext('Signal de sortie')
Signaux d'entreet desortie
2

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 retrouvons les mmes rsultats que dans lexemple II.1.

II.2. S-fonction en langage C (fichier C MEX)

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

ssSetDirectFeedThrough(S,0); /* Pas de passage direct entre u et y */


ssSetNumSampleTimes(S,1); /* 1 seule cadence dchantillonnage */
ssSetNumSFcnParams(S,0);
ssSetNumRWork(S,0);
ssSetNumIWork(S,0);
ssSetNumPWork(S,0);
}
/* Initialisation de la priode d'chantillonnage de
0.1 s sans offset */
static void mdlInitializeSampleTimes(SimStruct *S)
{
ssSetSampleTime(S, 0, 0.1);
ssSetOffsetTime(S, 0, 0.0);
}
/* Initialisation des conditions initiales nulles */
static void mdlInitializeConditions(real_T *x0, SimStruct *S)
{
int i;
for (i=0; i<2; i++)
{
*x0++=0;
}
}
/* Calcul de la sortie */
static void mdlOutputs(real_T *y, const real_T *x, const real_T *u,
SimStruct *S, int_T tid)
{
y[0]=C[0][0]*x[0]+C[0][1]*x[1];
}
/* Mise jour de l'tat discret */
static void mdlUpdate(real_T *x, const real_T *u, SimStruct *S, int_T
tid)
{
double Xtemp[2];
Xtemp[0]=A[0][0]*x[0]+A[0][1]*x[1]+B[0][0]*u[0];
Xtemp[1]=A[1][0]*x[0]+A[1][1]*x[1]+B[1][0]*u[0];
x[0]=Xtemp[0];
x[1]=Xtemp[1];
}
/* Mise jour de l'tat continu */
static void mdlDerivatives(real_T *dx, const real_T *x, const real_T
*u, SimStruct *S, int_T tid)
{
/* Pas de code car la fonction est discrte */
}
static void mdlTerminate(SimStruct *S)
{
/* Pas de code car fonction non utilise dans ce cas */
}

S-fonctions

471

/* En-tte ncessaire pour les S_Fonctions */


#ifdef MATLAB_MEX_FILE
#include "simulink.c"
#else
#include "cg_sfun.h"
#endif

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

On obtient le fichier CMEX suivant : sf_2nd_ordre_etat_num_C.mexw32

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

III. Les S-fonctions Builder

III.1. Systme sous forme de modle dtat discret

Le Builder ou constructeur de S-fonction automatise la cration des S-fonctions en proposant la


programmation du code de chaque tape dans longlet qui lui est destin dans la boite de dialogue.

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.

Onglet Port and Parameter Properties

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 :

Onglet Calcul de la sortie


9 Cas dun systme dtat discret

9 Cas dun systme dtat analogique


y0[0]=C[0]*xC[0]+ C[1]*xC[1];

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.

Onglet Mise jour de ltat discret

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.

Onglet Calcul des drives 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

On considre un systme du second ordre de coefficient damortissement z et de pulsation propre w0, et


un gain statique unit tel quil est dfini par sa fonction de transfert H(p) :
Y ( p)
1
=
p 2
p
U ( p)
( ) + 2 ( ) +1
w0
w0
Ce qui correspond lquation diffrentielle suivante :
H ( p) =

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) :

La S-fonction est utilise dans le modle Builder_Sfonct_etat_analogique.mdl .


Nous obtenons le mme type de courbe du signal de sortie et un gain statique unit ; la sortie rejoint le
signal dentre (chelon ou rampe) en rgime permanent, comme on lobserve loscilloscope.

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.

Onglet Calcul de la sortie

Chapitre 11

478

Onglet Calcul des drives de ltat continu

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

III.3. Systme dfini par des quations mathmatiques

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

IV. S-fonctions hybrides


IV.1. Exemple 1 de systme hybride

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 =

>>
>>
>>
>>
>>
>>
>>
>>

time: [1001x1 double]


signals: [1x1 struct]
blockName: 'Sf_syst_hybride1/To Workspace'

plot(uy6.time, uy6.signals.values(:,1)), hold on


plot(uy6.time, uy6.signals.values(:,2))
axis([0 20 0 20])
title('Signaux d''entre/sortie')
xlabel('Temps discret')
grid
gtext('chelon unit d''entre')
gtext('rampe de sortie')

Signaux d'entre/ sortie


20
18
16
14

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

Signaux d'entre/ sortie


30

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.

V. S-fonctions aux tailles des signaux des entres/sorties dynamiques


Les S-fonctions peuvent supporter des tailles arbitraires des signaux. SIMULINK peut dterminer les
tailles actuelles des signaux dentre au dbut de la simulation.
La S-fonction peut utiliser les tailles de ces signaux pour dterminer le nombre dtats continus, discrets
et le nombre de sorties.
De plus, les fichiers C MEX et les blocs de S-fonction de niveau 2 peuvent avoir plusieurs ports dentre
et de sortie dont les tailles peuvent tre dtermines de faon dynamique.

S-fonctions

485

V.1. Taille dynamique des vecteurs dentres/sorties

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

SIMULINK dtermine la taille du vecteur dentre en affectant la variable size_input la taille du


vecteur u que reoit la S-fonction son entre.

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

= -1; % taille dynamique en sortie


= -1; % taille dynamique en entre

V.2. Taille dynamique du vecteur dtat

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

Les ples du systme (ou les valeurs propres de la matrice A) sont :


>> eig(A) % ples
ans =
0.3375 + 0.5825i
0.3375 - 0.5825i
-0.3751

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.

VI. Diffrents autres exemples de S-fonctions


VI.1. Systme du 2nd ordre discret, quation de rcurrence

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

VI.2. Solution dun systme linaire 2 inconnues

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

Dans ce cas prcis, on rsout le systme dquations suivant :


3 x1 x2 = 1
x1 + x2 = 3
La S-fonction qui programme la mthode des LMS est le suivant :
fonction sol_syst_lin_sf_sans_input.m
function [sys,x0,str,ts] = sol_syst_lin_sf_sans_input(t,x,u,flag,A,B)
switch flag,
case 0
% Initialisation
[sys,x0,str,ts] = mdlInitializeSizes;
case 3
sys = mdlOutputs(A,B); % Calcul de la sortie
case {1,2,4,5,9}
sys = [];

% 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

On se propose de raliser une S-fonction qui rsout lquation de rcurrence suivante :


x n = 1 0.8 x n 1 + 0.5 cos x n 2

Les retards sont raliss par le bloc discret

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

Nous obtenons la mme valeur 0.7574 que prcdemment.

VI.4. Rgulation Proportionnelle et Intgrale P.I.

Le modle propose 2 S-fonctions, sf_reg_pi.m qui programme un rgulateur de type PI et


sf_ordre_1.m qui modlise un systme discret du 1er ordre de fonction de transfert :
H ( z 1 ) =

b1 z 1
1 a1 z 1

494

Chapitre 11

qui donne la relation suivante, de rcurrence entre la sortie et la commande


y (k ) = a1 y (k 1) + b1 u (k 1)

Dans le modle SIMULINK, la S-fonction du rgulateur reoit travers un multiplexeur :


- la valeur du coefficint damortissement dsir en boucle ferme,
- la pulsation propre normalise,
- les valeurs, actuelle et prcdente de la sortie du processus, y(k) et y(k-1)
ainsi que les valeurs, actuelle et prcdente du signal de consigne.

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

Signaux deconsigne, sortieet commande


30

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.

VII. User Data


La commande gcb retourne les paramtres des blocs du modle SIMULINK rcemment utilise.
UserData sert spcifier des valeurs vers le port srie, COM1 dans lexemple suivant :
s = serial('COM1');
% On remplit les champs dune structure
valeur.valeur1 =0.25; valeur.valeur2 =-0.5;
s.UserData = valeur;

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.
>>
>>
>>
>>
>>
>>
>>

plot(cuy.time, cuy.signals.values(:,1)), hold on


plot(cuy.time, cuy.signals.values(:,3))
stairs(cuy.time, cuy.signals.values(:,2))
axis([0 150 0 2]), title('Signaux d''entre/sortie')
xlabel('Temps discret'), grid
gtext('Signal de consigne'), gtext('Signal de sortie')
gtext('Signal de commande')
Signaux d'entre/sortie
2
1.8
Signal de commande

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 fonctions Callbacks

I. Callbacks associs un modle SIMULINK


I.1.Mthode interactive
I.2.Par programmation avec la commande set_param
II. Callbacks associs des blocs dun modle SIMULINK
III. Etude des quelques callbacks
III.1. OpenFcn
III.2. CopyFcn DeleteFcn
III.3. Autres Callbacks
IV. Fichier startup

I. Callbacks associs un modle SIMULINK


Callback : commande MATLAB excute lors de loccurrence dun vnement :
-

ouvrir un modle SIMULINK


double-cliquer sur un bloc dun modle
etc.

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.

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_12, Springer-Verlag Berlin Heidelberg 2010

500

Chapitre 12

I.1. Mthode interactive


On utilise loption Model Properties du menu File.

Dans loption Configuration Parameters du menu Simulation, nous


choisissons le type fixed step , le solver Discrete (no continuous
states) ainsi que 50 pour Stop time.
Nous considrons, pour introduire quelques fonctions callback, le modle SIMULINK
suivant. Il sagit dune modlisation dun simple processus du 1er ordre dont on tracera la
rponse indicielle. Sans les callback, les valeurs du ple du modle, la hauteur de lchelon
de consigne sont dtermines dans le fichier Simulink_Callback1M.m quon doit
excuter avant la simulation du modle Simulink_Callback1.mdl.
fichier Simulink_Callback1M.m
clc, clear all, close all
% Spcification des paramtres par fichier M
% Ple du modle du processus
pole=0.8;
hauteur = 5;
% Signal de consigne
Consigne = [ones(1,50) hauteur*ones(1,50)];

501

Les fonctions Callbacks

Lorsquon slectionne loption Model Properties du menu File, on aboutit la


fentre suivante, dans laquelle on choisit le menu Callbacks.

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.

Nous pouvons trouver de laide dans SIMULINK, Creating Model Callback


Functions comme le monte lcran suivant :

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 :

Chaque callback programm possde une toile aprs son nom.


Aprs lexcution du modle SIMULINK, nous obtenons les signaux dentre/sortie
loscilloscope.

Les fonctions Callbacks

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

I.2. Par programmation avec la commande set_param


La commande set_param est trs importante dans le contrle de lexcution des
modles SIMULINK, et dans notre cas particulier, celui des callbacks.
Pour configurer le callback 'PreloadFcn' pour le modle mymodelname.mdl de
telle faon que le script expression.m soit excut, on effectue la commande suivante :
set_param('mymodelname','PreloadFcn', 'expression')
Dans le cas de notre exemple des 2 callbacks prcdents, on crit sur le prompt de
MATLAB ou dans un fichier script les 2 commandes suivantes :
set_param('Simulink_Callback1','InitFcn', 'prog_callback_Init')
set_param('Simulink_Callback1','StopFcn', 'prog_callback_Stop')

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')

Les fonctions Callbacks

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 :

II. Callbacks associs des blocs dun modle SIMULINK


Grce ces callbacks, on peut contrler les paramtres dexcution dun modle
SIMULINK.
De mme que les callbacks associs un modle SIMULINK, ces derniers peuvent tre
raliss par les mmes mthodes : itratives ou par programmation avec la mme
commande set_param.
Dans ce cas, on slectionne le bloc pour lequel on dsire associer les callbacks et on utilise
loption Block Properties du menu Edit.

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

Les fonctions Callbacks

On utilise maintenant la commande set_param pour spcifier le gain K et tracer les


signaux de la structure signaux_ES.
set_param('regul_PI/Gain', 'Gain','0.5')
set_param('Simulink_Callback1','StopFcn', 'Trace_signaux_ES')
fichier Trace_signaux_ES.m
% Trac des signaux ES du modle Regul_PI.mdl
plot(signaux_ES.signals.values)
grid
title('Signaux d''erreur, de commande et de sortie du processus')

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

III. Etude des quelques callbacks


III.1. OpenFcn
On considre le mme modle Simulink_Callback1.mdl quon renomme en
Simulink_Callback2.mdl. On cre un bloc qui remettra les variables pole et
hauteur aux valeurs par dfaut de 0.8 et 5 respectivement, au cas o elles auraient t
modifies.

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'.

Les fonctions Callbacks

509

Aprs avoir double-cliqu sur le bloc, nous avons :


>> who
Your variables are:
hauteur pole
III. 2. CopyFcn DeleteFcn
Ces callbacks excutent les fonctions MATLAB lorsquon fait une copie du bloc ou
lorsquon le supprime.
On lapplique pour le bloc Discrete Transfer Fcn. Lorsquon le copie ou quon le
supprime on excute le script plot_sinc qui affiche la fonction sinus cardinal.
fichier plot_Sinc.m
clc, close all
% Fichier excuter suite un callback CloseFcn
x=-4*pi:pi/100:4*pi;
y=(x==0)+sin(x)./((x==0)+x);
plot(x,y,'LineWidth',2, 'color','k')
title('\bf \itSinus
\itcardinal','FontSize',16,'FontName','Times','Color', 'r')
set(gca,'Xgrid','on','Ygrid','on')
xlabel('\bf Angle \alpha : [-4\pi : 4\pi]','Fontsize',14)
Aprs slection du bloc Discrete Transfer Fcn et la slection du menu Block
Properties, suivi du choix du menu Callbacks, on fait appel au fichier
plot_Sinc.m pour les callbacks CopyFcn et Delete Fcn.

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

III.3. Autres Callbacks


On donne, ci-aprs, quelques autres callbacks avec leur tape dexcution.
Callback
ModelCloseFcn
LoadFcn
. ModelCloseFcn
MoveFcn
NameChangeFcn
StartFcn
PreSaveFcn

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

IV. Fichier startup


Toutes les variables utilises dans une session MATLAB peuvent tre affectes leurs
valeurs dans un script nomm startup.m, ouvert chaque dmarrage de MATLAB.
Si lon reconsidre le mme modle Simulink_Callback1.mdl, on peut affecter les
valeurs 0.8 et 5 respectivement au ple et la hauteur de lchelon de consigne et faire appel
ce modle pour son excution.

511

Les fonctions Callbacks


fichier startup.m
pole = 0.8 ;
hauteur =5 ;
Simulink_Callback1
On peut mme lancer lexcution du modle en ajoutant la commande suivante :
sim('Simulink_Callback1')

Grce aux callbacks programms auparavant, nous obtenons automatiquement le rsultat


de la simulation avec la figure suivante :
Signaux d'entre/sortie

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

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_13, Springer-Verlag Berlin Heidelberg 2010

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.

Ces outils sont reprsents dans le tableau suivant.

516

Chapitre 13

Considrons le cas suivant qui reprsente le fonctionnement des essuie-glaces dun vhicule.

II. Exemples dapplication


II.1. Exemple 1 : systme dessuie-glaces dun vhicule
Dans le graphe suivant, nous allons modliser le fonctionnement des essuie-glaces dun vhicule.
Nous avons 2 tats dnomms : ltat Off (arrt) et ltat ON.
Ltat ON contient lui-mme 2 tats (tats internes ou sous-tats): Slow (tat de fonctionnement lent) et
Fast (tat rapide).
Ltat off ne contient pas dtats internes car il correspond la seule vitesse nulle.
Partant de ltat off on ne peut passer ltat ON que par la position 1 du switch (bouton) correspond la
premire vitesse des essuie-glaces.

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

des entres-sorties SIMULINK.

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.

II.2. Exemple 2 : chronomtre


Lorsque la machine reoit le signal run (tat logique=1), il y a initialisation 0 des variables seconds
et minutes.
La transition qui permet de passer de ltat initial Stopped ltat de comptage (Counter) possde le
label suivant :
[run]/
minutes:=0;
seconds:=0;
Ceci indique que si le signal run est vrai, on ralise cette transition en mettant 0 les variables minutes
et seconds qui seront affiches dans SIMULINK (sorties du bloc Stateflow).
Lorsquon arrive ltat started du dbut de comptage on entre dans ltat interne Counter selon la
condition sur le nombre de secondes et de minutes.
On passe dans ltat Counter lorsque la variable tick est vraie.
Les deux transitions qui partent et arrivent au mme tat Counter ralisent lalgorithme suivant :
Si tick est vrai
Alors Si le nombre de secondes est infrieur 59, on incrmente la variable seconds
Si le nombre de minutes est gal 59, on incrmente la variable minutes.
Fin
Si tick est faux alors on reste dans ltat Started si run a t valid.

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

On choisit de compter jusqu 100.

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

Le signal de sortie lampe attaque un afficheur et une diode lectroluminescente (led).

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

On observe dans SIMULINK le clignotement (rouge/vert) de la lampe de loutil Gauges Blocksets


ou laffichage 0/1 sur le bloc display.
II.5. Horloge
Le modle SIMULINK suivant permet, partir dun nombre de secondes, de donner le nombre dheures,
de minute et de secondes.

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.

III. Objets de Stateflow


Un graphe Stateflow est compos des diffrents objets suivants :
-

tats,
vnements,
transition,
les donnes,
les conditions,
jonction
jonction de lhistorique
etc.

III.1. Les tats


Dans les tats on dcrit les actions raliser dans le cadre du graphe qui dcrit la machine tats finis.
Un tat peut tre actif ou inactif selon des vnements qui peuvent intervenir ou des conditions de
validation des transitions.

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 :

Lampe.On et Lampe Off


Clim.On et Clim.Off

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

On dfinit la variable x dans lespace de travail MATLAB.


>> x=-2*pi:pi/100:2*pi;
Le graphe Stateflow, vu comme un bloc SIMULINK possde une entre de choix des calculs faits sur
cette variable.
Les variables ect, x et y, qui servent pour des calculs intermdiaires sont dfinies comme locales.

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.

Le label dune transition est dans le cas gnral le suivant :


event[condition]{condition_action}/transition_action

Stateflow

531

La transition sera valide lorsque :


- lvnement event a lieu,
et
- la condition est vraie,
On peut spcifier plusieurs vnements avec loprateur | . La condition doit tre mise entre crochets.
Les 2 graphes suivants sont quivalents :
Dans le premier, loccurrence de lvnement event, et si la temprature dpasse le seuil, on applique
la tension de 12V au moteur du ventilateur et quon a dtermin ltat de destination, Etat2, on fait
appel la fonction ma_fonction laquelle on passe les arguments x et y.
Toutes ces commandes sont excutes en sortie de ltat Etat1.

Dans le cas suivant, linstruction de type vnement [condition] [action]/appel_fonction


peut tre sur le label de la transition du passage de ltat Etat1 Etat2.

III.3. Les vnements


Les vnements, objets non graphiques, agissent sur lexcution du graphe Stateflow. Tous les
vnements doivent tre dfinis par le menu Add Event dans Model Explorer.
Loccurrence dun vnement peut servir valider une transition de passage dun tat un autre ou une
action excuter.

532

Chapitre 13

III.4. Les objets Data


Les objets Data (donnes) peuvent tre des variables locales, entres de ou sorties vers SIMULINK, une
constante, etc.

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.

IV. Modlisation de systmes continus dans Stateflow


Les variables continues sont des variables reprsentes par leur taux de variation ou leur drive. Cette
dernire donne est reprsente par une variable locale, de type double.
Pour chaque variable continue quon cre, Stateflow cre implicitement une variable reprsentant sa
drive, avec le nom NomVariable_dot.
Les variables reprsentant les drives napparaissent pas dans lexplorateur.
Aprs un clic droit de la souris, on choisit Properties qui affiche la fentre suivante Dans le menu
Update method, on slectionne Continuous.

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,

avec la constante de temps tau dfinie comme une entre de SIMULINK.

Chapitre 13

534

Dans lexplorateur nous avons les diffrentes variables (Data).

Pour le systme du second ordre, nous programmons le modle dtat suivant :


x'1=-2*z*w0 x1 - w0^2 x2 - w0^2 u
x'2=x1

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

de la palette doutils de Stateflow.

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

Argument du sinus cardinal (rampe de pente /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

VI. Fonctions de test if ... then ... else

if ... else

On se propose de programmer le test if ... else laide de Stateflow.


modle if_else.mdl

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

if ... if ... elseif

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.

VII. Boucle for


VII.1. Valeur dune fonction

On se propose de calculer la variable y qui dpend de n :


cos n
n2
y=
2 1
sin 3n
4 (1 + + 2 ) + 2
n n
n
modle for_loop.mdl
3+

Stateflow

545

On peut vrifier ce rsultat laide du script Matlab :


fichier boucle_for.m
for n=1:200
i(n)=n;
num_y=3+cos(n)/n^2;
den_y=4*(1+2/n+1/n^2)+sin(3*n)/n^2;
y(n)=num_y/den_y;
end
% Trac de lvolution de y en fonction de n
plot(i,y)
grid

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

VII.2. Courbes de Lissajous

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

Nous obtenons la courbe de Lissajous suivante.

547

548

Chapitre 13

VIII. Gnration dun signal PWM


On se propose de gnrer le signal PWM (Pulse Width Modulation) par diverses mthodes de
programmation de Stateflow.

VIII.1. Comparaison dune constante et dun signal triangulaire

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

axis([0 50 -0.2 1.2])


grid
title('Signaux triangulaire et PWM')

La figure suivante montre le cas dun signal PWM de rapport cyclique de 80%.

Signaux triangulaire et PWM

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

VIII.2. Condition else

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

IX. Rgulation PID numrique et analogique


IX.1. Rponse impulsionnelle dun systme discret du 1er ordre

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

Rponse impulsionelle du processus

0.4

0.2

10

15

20

25

30

35

40

Temps discret

Limpulsion est gnre par la diffrence de 2 chelons.


La modlisation du processus est ralise par le graphe Stateflow suivant. Lquation de rcurrence
prcdente du processus est programme dans le graphe Stateflow dans laction de la deuxime transition.
La premire transition ne sert qu affecter des valeurs aux paramtres du modle.

IX.2. Rgulation PID discrte

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

Ce rgulateur correspond la fonction de transfert et lquation de rcurrence suivantes.


u (k ) Kp 1 + T T z 1
=
err (k ) T
1 z 1

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

Consigne, sortie et signal de commande

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

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.
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 la rponse impulsionnelle suivie de la rponse indicielle.


Limpulsion est de hauteur de 2 et de largeur 0.5 (aire unit) comme le montre la figure suivante de
loscilloscope.
Limpulsion est ralise par la diffrence de 2 chelons dcals dune dure de 0.5.

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

La rponse indicielle montre le gain statique unit et sa nature du premier ordre.


Le graphe Stateflow suivant concerne la programmation du rgulateur intgrateur pur analogique.

Chapitre 13

560

Le rgulateur intgral pur a comme expression :


D(p)=Kp/Ti p

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.

X. Fonctions dcrites en langage MATLAB (Embedded fonctions)


Au lieu quelles soient graphiques, les fonctions peuvent tre programmes dans le langage textuel
Matlab. Ces fonctions permettent dajouter des fonctions Matlab aux graphes Stateflow.
Ces fonctions fonctionnent avec un sous-ensemble de fonctions Matlab.
Les fonctions textuelles Matlab sont cres en utilisant licne

de la palette doutils Stateflow.

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

Pour diter le code de la fonction, on double-clique sur le rectangle comportant le symbole eM


(embedded Matlab) et le label de la fonction.
a ouvre alors lditeur dans lequel on trouve le label classique dune fonction Matlab.

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

En dessous de chart, on observe les fonctions eM avec le symbole M.


Pour chaque fonction, aprs un clic dessus, on ouvre leur explorateur dans lequel on dfinit ses
entres/sorties qui sont poly et prim_out pour la fonction prim ainsi que poly et deriv_out
pour la fonction deriv.
Les explorateurs de ces fonctions eM sont les suivants :

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

Nous traons ci-aprs les 3 polynmes, celui de lentre, sa drive et sa primitive.


close all
subplot(131)
plot(poly(:,4),poly(:,1))
grid
gtext('x^2 + 2x+1')
subplot(132)
plot(poly(:,4),poly(:,2))
grid
gtext('x^3/3+x^2+x')
subplot(133)
plot(poly(:,4),poly(:,3))
gtext('2x+2')
grid
x 2 + 2x+1
140

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

XI. Les box


Les box (botes) sont des rectangles qui permettent lorganisation de plusieurs objets graphiques dans le
graphe Stateflow.
Lorsquon veut faire appel une fonction rsidant lintrieur dun box nous devons spcifier le nom du
box.
Un des avantages des box est linstauration de lordre dactivation des tats parallles.
Grce des box lordre dactivation se fait de haut vers le bas et de gauche droite.
On peut crer un box grce loutil

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.

A lextrieur du box, nous avons galement 2 tats parallles Led_Temp et Led_Pressure


indiquant la couleur de la Led (voyant), bleu quand il fait froid ou basse pression et rouge au cas chaud ou
haute pression.

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.

XII. Fonctions temporelles logiques


Les fonctions temporelles logiques excutent un graphe Stateflow en terme de temps. Dans les actions des
tats ou des transitions, on peut utiliser 2 types de temps : celui bas par un vnement ou le temps
absolu. Pour cela, on utilise des fonctions de base appeles fonctions ou oprateurs temporels logiques.
Oprateurs bass sur des vnements :

Stateflow

571

Exemple de ces oprateurs logiques temporels :

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.

XIII. Tables de vrit


Les tables de vrit permettent dimplmenter des dcisions logiques dans un graphe Stateflow.
Pour crer une table de vrit, nous utilisons licne

qui fait apparatre le rectangle :

Chapitre 13

572

A la place du point dinterrogation on crit le label de la table, soit la fonction appeler.

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

On ajoute une ligne de condition avec licne

et une ligne daction avec

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

Signal limit et redress

Temps

Gnration dun signal PWM

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.

Loscilloscope suivant montre le signal PWM de rapport cyclique de 20%.

Stateflow

575

XIV. Jonction de lhistorique


Considrons le graphe suivant o le super tat speed_fan contient 2 tats, vit0 et vit1. Lorsquun
vnement survient, on passe du super tat ltat Arret.
modle vit_fan_stateflow.mdl

Nous avons utilis le bloc repeating sequence pour gnrer une monte puis une descente en
temprature ambiante Tamb.

Chapitre 13

576

La figure suivante montre les signaux :


-

MA (Marche/Arrt),
ltat de la vitesse du ventilateur, vit
la temprature ambiante Tamb.

MA

vit

Tamb

577

Stateflow

A loccurrence de lvnement MA (Marche/Arrt), on passe du super tat speed_fan ltat Arret


qui remet la vitesse zro (vit=0) et le retour se fait dans ltat vit1 (vit=1).

XV. Utilisation des vecteurs et matrices dans Stateflow


Dterminant et inverse dune matrice

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

XVI. Utilisation de fonctions et donnes Matlab, oprateur ml


XVI.1. Utilisation de fonctions Matlab

Grce loprateur ml ou la fonction ml on peut, respectivement, accder aux variables de lespace de


travail Matlab et faire appel des fonctions Matlab.
Supposons lexistence dune variable x dans lespace de travail Matlab.
>> x=5;

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.

Dans lafficheur Display, nous affichons la 1re valeur du tableau x.


Pour vrifier lexistence de la variable x dans lespace de travail Matlab, nous utilisons soit la commande
exist, soit la commande whos.
>> exist('x')
ans =
1

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

On vrifie bien la valeur nulle de la moyenne et lunit de la variance.

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 :

1. Dans les exemples var_esp_travail et array_esp_travail, nous sons avons utilis


successivement ml(randn(1000)) et ml(rand(4,3,2)). Les rsultats sont
envoys vers les variables x et v de lespace de travail Matlab.
2. Dans lexemple suivant, les rsultats de retour de la fonction ml seront envoys vers une
variable locale de Stateflow. On utilisera cette fonction pour gnrer des valeurs alatoires et
calculer leur moyenne et leur variance qui sont des variables locales quon mettra ensuite
dans un tableau pour en faire une variable de sortie vers Simulink.

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

XVIII. Appel de fonctions MATLAB


Considrons la fonction trs simple qui consiste retourner la somme de 2 arguments quon lui passe.
function som = somme_2Nombres(N1,N2)
som=N1+N2 ;

On vrifie quelle fonctionne dans lespace de travail Matlab


>> somme_2Nombres(2,3)
ans =
5

On fait appel maintenant cette fonction sous Stateflow.

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

I. Traitement numrique des signaux dterministes


I.1. Synthse des filtres numriques
Dans cette partie, nous allons tudier une mthode de synthse de filtres numriques passebas, passe haut partir du gabarit d'un filtre passe bande gnrique.

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_14, Springer-Verlag Berlin Heidelberg 2010

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 ) =

h( k ) du filtre. Comme exemple d'application de cette fonction, nous calculons la rponse


impulsionnelle h(k), ( k = 2, 1, 0, 1,2) du filtre passe bas de gabarit suivant :
H()
1

Ce gabarit correspond celui du filtre passe bande pour lequel 1 = 0 et 2 = . Si l'on


2
veut tronquer la rponse impulsionnelle de ce filtre par une fentre rectangulaire de largeur
20, il faut prendre N = 10.
fichier nfrepimp.m
function h = nfrepimp(alpha1,alpha2,N)
% h : rponse impulsionnelle du filtre
% alpha1, alpha2 : pulsations normalises
% N : demi-largeur de la fentre rectangulaire
% [alpha1, alpha2] : frquences normalises dlimitant
% la bande passante du filtre passe bande
k = -N:N;
h = (alpha2*sinc2(k*alpha2)-alpha1*sinc2(k*alpha1)/pi;

Le sinus cardinal est calcul par la fonction sinc2.


fichier sinc2.m
function sc = sinc2(x)
% fonction sinus cardinal
sc = (x == 0)+sin(x)./((x == 0)+x);

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

I.1.2. Rponse en frquences

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);

Exemple 1 : filtre RII moyenneur du premier ordre


1
H1(z) = (1 + z 1 )
2
Si on ne spcifie pas la bande des pulsations, l'intervalle [ , ] est pris par dfaut avec
un pas de / 10. De plus, pour un filtre RIF, on peut ne pas spcifier le dnominateur
(argument den).
>>
>>
>>
>>

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

Exemple 2 : filtre FIR passe bande, d'ordre 4


H2 (z) =

0.2066 z 4 0.4131 z 2 + 0.2066


z 4 + 0.3695 z 2 + 0.1958

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')

I.2. Rponse en frquences d'un filtre numrique


La rponse en frquences d'un filtre numrique peut tre calcule partir de sa rponse
impulsionnelle h( k ) ( k = N ,... 0, ... N ), par la relation :
k=N

H ( j) = h( k ) e
k =N

jk

592

Chapitre 14

Lorsqu'on tronque h( k ) par une fentre rectangulaire, le module du gabarit obtenu,


prsente des oscillations, connues sous le nom du phnomne de Gibbs.
La fonction repfreq propose ci-aprs, calcule la rponse en frquences d'un filtre
numrique partir de sa rponse impulsionnelle h, dans la bande de pulsations
normalises, spcifie par le vecteur omega.
fichier repfreq.m
function H = repfreq(omega,h)
N = (length(h)-1)/2;
k = -N:N;
for i = 1:length(omega)
H(i) = sum(h.*exp(-j*omega(i)*k));
end

On peut amliorer la programmation de la fonction repfreq en supprimant la boucle


for. La fonction repfreq2 prsente cette modification.
fichier repfreq2.m
function H = repfreq2(h,omega)
N = (length(h)-1)/2;
k = -N:N;
% matrice reprsentant exp(-jk*Omega
% exp(-j*k'*omega))
% matrice reprsentant h(k), duplications de h
% h'*ones(1,length(omega)):
% produit lment par lment de deux matrices
% et somme sur chaque colonne
H = sum(h'*ones(1,length(omega)) .* exp(-j*k'*omega));

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)

filtre passe haut ( 1 : pulsation de coupure, 2 = )

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)

Elle permettra de tracer et de retourner le module de la rponse en frquences et la rponse


impulsionnelle aprs troncature par une fentre temporelle de largueur N dont le type est
spcifi par la chane de caractres fen. Pour tronquer la rponse impulsionnelle du filtre
par les fentres de Hamming, Hanning, Blackman, la fentre triangulaire et la fentre
rectangulaire, le paramtre fen prendra respectivement les valeurs 'hamm', 'han',
'blak', 'tril' et 'rect'. La troncature de la rponse impulsionnelle est
ralise par appel de la fonction windows que l'on dfinira par la suite.
fichier filtnum.m
function [h,g] = filtnum(alpha1,alpha2,fen,N);
% synthse de filtre partir de la rponse impulsionnelle
% d'un filtre passe bande gnrique
% alpha1, alpha2 : pulsations de coupure normalises
% fen : type de fentre de troncature

594

Chapitre 14

% N : largeur de la fentre temporelle


% g : mod. du gabarit aprs troncature de la rp. impuls.
% h : rponse impulsionnelle aprs troncature
% sans paramtres, synthse d'un filtre passe bas
% de pulsation de coupure alpha = 0.5*pi/T.
% La rponse impulsionnelle est tronque par la fentre de
% Hamming W(k) = 0.54+0.46*cos(k*pi/N) de largeur N = 20.
%
fen = 'hamm';
%
N = 20;
%
alpha1 = 0; alpha2 = pi/2;
%
[h,g] = filtnum(alpha1,alpha2,fen,N);
if nargin == 0
[h,g] = filtnum(0,pi/2,'hamm',20);
return
end
% Dtermination des caractristiques du filtre
if alpha1 == 0
type = 'passe bas';
end
if alpha2 == pi
type='passe haut';
end
if (alpha1 ~= 0 & alpha2 ~= pi)
type = 'passe bande';
end
if rem(N,2) ~= 0
error('Largeur N de la fentre , pas un nombre pair !!')
end
% Rponse impulsionnelle du filtre passe bande gnrique
k = -N/2:N/2;
h = (alpha2*sinc2(k*alpha2)-alpha1*sinc2(k*alpha1))/pi;
% gnration de la fentre de troncature
W = windows(fen,N);
% troncature de la rponse impulsionnelle
h = h.*W;
% trac de la rponse impulsionnelle
figure(1)
stem(k,h)
grid
title('Rponse impulsionnelle')
xlabel([type ' , ' fen]);
% Rponse en frquences du filtre
omega = -pi:pi/10:pi;
for i = 1:length(omega)
g(i) = abs(sum(h.*exp(-j*omega(i)*k)));
end
% trac de la rponse en frquences
figure(2), plot(omega,g), grid
title('Rponse en frquences')
xlabel([type ' , ' fen]);

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

Exemples de synthses de filtres

filtre passe haut

, , 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

Pour cela, on fait appel la fonction filtnum, propose prcdemment :


[h,g] = filtnum(pi/2,pi,'hamm',20)

La rponse impulsionnelle aprs troncature par la fentre de Hamming et le module de la


rponse en frquences sont reprsenres dans les graphiques suivants :

Traitement du signal

597

Chapitre 14

598

filtre passe bas

On dsire synthtiser un filtre passe bas de bande passante 0 , avec troncature de la


3
rponse impulsionnelle par une fentre triangulaire de largeur N = 32.
[h,g] = filtnum(0,pi/3,'tril',32)

Traitement du signal

599

I.3. Applications
I.3.1. Filtrage de signaux

La fonction filter de syntaxe y = filter(B, A, x), permet d'obtenir la rponse


d'un filtre numrique de fonction de transfert H ( z ) un signal d'entre discret x ( k ) .
x :
vecteur reprsentant le signa filtre,
B, A : numrateur et dnominateur de la fonction de transfert du filtre,
y :
vecteur reprsentant le signal filtr.

Les fichiers de dmonstrations, filtdem, filtdem2 et filtdemo du toolbox


"Signal", permettent de visualiser des exemples de filtrage de signaux.
Considrons un filtre numrique du premier ordre de fonction de transfert : H(z) =
et cherchons la rponse un crneau.
fichier apl_filt.m
% gnration de la squence d'entre
N = 30; t = 1:0.1:N; % temps discret
% squence d'entre
x = [zeros(1,length(t)/3) ones(1,length(t)/3)
zeros(1,length(t)/3)];
% description du filtre
num_H = 0.2; den_H = [1 -0.8];
% filtrage de la squence d'entre
y = filter(num_H,den_H,x);
% trac des squences d'entre et de sortie du filtre
plot(t,x,':'), hold on, plot(t,y)
axis([0 30 -0.2 1.2]), grid,
gtext('entre x'), gtext('sortie y')

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) :

transforme de Fourier du vecteur x,


transforme de Fourier du vecteur x sur N points.

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.

Les frquences f1 et f2 sont des frquences normalises la moiti de la frquence


d'chantillonnage.
D'autres syntaxes de cette mme commande permettent de gnrer des filtres passe bas,
passe haut, etc. La commande help butter donne l'aide ncessaire.
Pour obtenir la rponse en frquences d'un filtre numrique, on utilisera la commande
freqz dont une syntaxe est :
H = freqz(b,a,f)
b, a :
f :

numrateur et dnominateur de la fonction de transfert en z du filtre,


vecteur dsignant la bande de pulsations normalises entre 0 et .

Il est possible d'obtenir la rponse impulsionnelle d'un filtre numrique partir de sa


fonction de transfert en z, grce la commande impz. Cette commande possde beaucoup
de syntaxes dont la suivante :
[h, t] = impz(b, a)
retourne les chantillons de la rponse impulsionnelle dans le vecteur h et les indices
temporels dans le vecteur t.

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

fichier apl_fft.m (suite)


% fft du signal somme
figure(2)
Nx = length(xtot);
tf = fft(xtot,Nx);
w = (0:Nx-1)/Nx*fe;
% trac de la fft du signal somme
stem(w,abs(tf(1:Nx)))

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

plot(t,s_filt), title('signal filtr')


axis([t(1) t(length(t)) -1.5 1.5])
xlabel('frquences normalises'), grid

Les figures suivantes reprsentent le signal sinusodal de 25 Hz d'origine et le signal


sinusodal de frquence 25 Hz obtenu par filtrage du signal somme.

604

fichier apl_fft.m (suite)


% rponse en frquences du filtre
H = freqz(B,A,w,fe);
% trac du module du gabarit en chelles semi-log
figure(5)
% Trac du module de H en chelle logarithmique
semilogx(w,abs(H))
title('module de la rponse en frquences du filtre')
xlabel('frquences en Hz')
grid

fichier apl_fft.m (suite)


[h,t] = impz(B,A); % rponse impulsionnelle du filtre
figure(6)
stem(t,h)
xlabel('n d''chantillon')
grid
title('rponse impulsionnelle du filtre')

Chapitre 14

Traitement du signal

fichier apl_fft.m (suite)


% fft du signal filtr
figure(7), tff = fft(s_filt,Nx); w = (0:Nx-1)/Nx*fe;
stem(w,abs(tff(1:Nx)));
title('module de la fft du signal filtr')
xlabel('frquences en Hz'), grid

605

Chapitre 14

606

II. Signaux stochastiques


II. 1. Caractristiques statistiques du filtrage numrique
II.1.1. Signaux stochastiques monodimensionnels

On considre un filtre numrique du premier ordre de fonction de transfert gnrale :


H ( z) =

B( z 1)
A( z 1)

attaqu par un bruit x(t) gaussien, blanc, centr et de variance 2x .


On se propose d'tudier les caractristiques du bruit en sortie (moyenne, variance,
autocorrlation, intercorrlation avec le bruit en entre, densit spectrale nergtique etc.).
Les signaux discrets x(t) et y(t), de mme longueur, sont respectivement l'entre et la sortie
du filtre numrique. Nous utilisons les notations suivantes :
x, y
Rxy ( k ), Ryx ( k )

: 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)

: chantillon n k des fonctions d'autocorrlation de x et de y,


: Densits spectrales de puissance de x et de y,

Sxy ( w)

: Interspectre de puissance des signaux x et y.

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

La densit spectrale nergtique d'un signal est la transforme de Fourier de sa fonction


d'autocorrlation
Sxy ( w) = F Rxy ( k )

C'est la rponse en frquences du filtre RIF de rponse impulsionnelle Rxy ( k ) dans le


domaine [ , ] de pulsations normalises.

Traitement du signal

607

Le fichier correlxy.m permet de calculer la fonction de corrlation d'un signal x un


signal y. Elle a pour syntaxe :
cxy = correlxy(x,y,k)
x, y :
k :
cxy :

vecteurs lignes de mme dimension reprsentant les signaux,


n de l'chantillon de la fonction de corrlation,
vecteur ligne de mme taille que x et y, reprsentant la fonction de corrlation.

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];

Comme exemple d'utilisation de cette fonction, on se propose de calculer l'aide du fichier


correl.m, les fonctions d'autocorrlation des signaux d'entre et de sortie du filtre
moyenneur :
1
H(z) = (1 + z1 )
2
ainsi que leurs fonctions d'intercorrlation.
fichier correl.m
clc, clear all, close all, hold off
num = 0.5*[1 1];
den = [1 0];
N = 1000;
x = randn(1,N);
y = filter(num,den,x);
k = 3; % nombre d'chantillons de la corrlation
x = x-mean(x);
y = y-mean(y);
% ----------------% Autocorrlation du bruit d'entre
% Autocorrlation du bruit d'entre
correl_xx = conv(x,fliplr(x));
corr_scale = correlxy(x, correl_xx, k);
figure(1)
stem(-k:k,corr_scale)
hold on
plot(-k:k,corr_scale,':')
title('Autocorrlation du bruit blanc d''entre')
grid

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

fichier correl.m (suite)


% Corrlation du bruit de sortie au bruit d'entre
correl_yx = conv(y,fliplr(x));
corr_scale = correlxy(x, correl_yx, k)
figure(4), stem(-k:k,corr_scale), hold on
plot(-k:k,corr_scale,':')
title('Corrlation du bruit de sortie au bruit d''entre')

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

fichier correl.m (suite)


% Autocorrlation du bruit de sortie
correl_yy = conv(y,fliplr(y));
corr_scale = correlxy(x, correl_yy, k)
figure(3)
stem(-k:k,corr_scale)
hold on
plot(-k:k,corr_scale,':')
title('Autocorrlation du bruit de sortie')
grid

Nous obtenons ces rsultats par le calcul dans le domaine temporel.


Ryy ( k ) = E [ y (t ) y (t + k )] =

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

Sa rponse en frquences constitue la DSP du signal de sortie.


>> omega = -pi:pi/10:pi;
>> Rxx = [0.5 0.25];
>> dsp = abs(rpfreqfn(Rxx));
>> plot(omega,dsp)
>> grid
>> title('Densit spectrale de puissance du signal ...
d''entre')
>> xlabel('Pulsations')

La puissance du signal de sortie du filtre moyenneur maximale pour w = 0, dcrot avec la


pulsation pour s'annuler w = .

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 )

S yy ( k ) est la rponse du filtre de fonction de transfert H ( z) H ( z 1) la squence donne


par la DSP du signal d'entre.
Le fichier fonction dspfn permet le calcul de la DSP par cette mthode.
fichier dspfn.m
function dspout = dspfn(Rxx,num,den,omega)
% calcul de la DSP du signal de sortie d'un filtre numrique
if nargin ==1
error('Nombre d''arguments incorrects')
end
if nargin==2
den = [1 zeros(1,length(num)-1)];
omega = -pi:pi/10:pi;
end
if nargin ==3
omega = -pi:pi/10:pi;
end
% fonction de transfert H(z)*H(1/z)*Z(Rxx)=num_G/den_G
num_G = conv(conv(num,fliplr(num)),Rxx);
den_G = conv(den,fliplr(den));
pulse = exp(j*omega);
dspout = polyval(num_G,pulse)./polyval(den_G,pulse);
Exemples d'utilisation de la fonction dspfn

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

Le fichier apl_dsp.m permet le calcul de la densit spectrale nergtique de la sortie de


ce filtre obtenue par l'utilisation de la fonction dspfn et celle donne par le calcul
thorique.
fichier apl_dsp.m
% calcul et trac de la DSP
num = [0 1]; den = [1 -0.2]; Rxx = [1 zeros(1,10)];
omega = -pi:pi/10:pi; dsp = dspfn(Rxx,num,den);
plot(omega,abs(dsp))
a = 0.2; b = 1; % calcul thorique
dsp = b^2./(1+a^2-2*a*cos(omega));
hold on, plot(omega,dsp,'o')
xlabel('pulsations normalises')
title('densit spectrale nergtique de filtre passe bas')

Filtre FIR drivateur


H ( z ) = 1 z 1

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

II.1.2. Systmes et signaux stochastiques multidimensionnels

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

La matrice de variances du vecteur du vecteur d'tat tant :


Px(t ) = A Px(t 1) AT + R
celle du vecteur de sortie est :

Py = C Px C T + R

Exemples de systme d'tat

Considrons un systme discret dcrit par un modle d'tat.


x ( k + 1) = A x ( k ) + B w( k )

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)

Les bruits de mesure v( k ) et de modlisation w( k ) , supposs gaussiens et centrs,


possdent respectivement les variances 0 et 2.
fichier apl_etat.m

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

II.2. Estimation de signaux et de modles de systmes discrets


II.2.1. Algorithme des moindres carrs rcursifs

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

L'objectif est de minimiser un critre quadratique correspondant la somme des carres de


l'cart entre la sortie relle du processus identifier et celle du modle obtenu chaque
instant d'chantillonnage.
Si un processus se comporte comme un systme du premier ordre et prsente un retard pur,
il peut tre modlis par la fonction de transfert suivante :
y(t ) z 1 (b1 + b2 z 1)
=
u(t )
1 a1 z 1

La sortie l'instant courant t est lie aux entres-sorties prcdentes par l'quation de
rcurrence suivante :

y(t ) = a1 y(t 1) + b1 u(t 1) + b2 u(t 2)


que l'on peut exprimer sous forme d'un produit scalaire d'un vecteur paramtres (t ) et du
vecteur des mesures prcdentes (t 1) :
y (t ) = T (t ) (t 1)
avec

T (t ) = [a1 b1 b2 ]
(t 1) = [ y (t 1) u(t 1) u(t 2)]T

Le critre quadratique minimiser a pour expression :

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

La matrice P(t) correspond la matrice de variances de l'erreur d'estimation.


t
P(t ) 1 = ( k 1) ( k 1)T = P(t 1) 1 + (t 1) (t 1)T
k =1
Le lemme d'inversion matricielle :
( A + B C D ) 1 = A 1 A 1 B ( C 1 + D A 1 B ) 1 D A 1
permet d'obtenir la relation rcursive de P(t).
P(t ) = P(t 1)

P(t 1) (t 1) (t 1)T P(t 1)


1 + (t 1)T P(t 1) (t 1)

A partir de l'expression prcdente du vecteur paramtres (t ) , on peut aboutir sa forme


rcursive.
t 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

On obtient l'expression finale de remise jour du vecteur paramtres :

(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

fichier mcr.m (suite)


% initialisation de la matrice de variance
P = 1e8*eye(np);
% initialisation du vecteur paramtres
teta = zeros(np,2);
v = randn(1,N); % gnration du bruit
% gnration du signal de sortie du processus
y = [0 0];
for i = 3:N
phi(:,1) = [y(i-1) u(i-1) u(i-2)]';
y(i) = param*phi(:,1)+v(i);
teta(:,i) = teta(:,i-1)+P*phi*(y(i)-teta(:,i-1)'*phi) /...
(1+phi'*P*phi);
P = P-(P*phi*phi'*P)/(1+phi'*P*phi);
end
disp(['valeurs finales des paramtres : ']);
teta_final=teta(:,i)
% Trac de l'volution des paramtres
figure(2)
for i = 1:np
plot(1:N,teta(i,:)), hold on
end
title('Evolution des paramtres'), grid
teta_final =
0.7632
0.9767
-0.4672

Traitement du signal

fichier mcr.m (suite)


% trac du signal de sortie du processus
figure(3)
plot(1:N,y);
title('Signal de sortie du processus')
grid

fichier mcr.m (suite)


% sortie du modle
ym = [0 0];
% initialisation de la sortie du modle
for i = 3:N
ym(i) = [ym(i-1) u(i-1) u(i-2)]*param' ;
end
% Rsidu de l'identification
err = ym-y; moy = mean(err); % moyenne du rsidu
var = std(err-moy)^2; % variance du rsidu
figure(4), plot(1:N,err)
title('Rsidu de l''identification'), grid

623

624

Chapitre 14

fichier mcr.m (suite)


% calcul de l'autocorrlation du rsidu
err = err-moy; % centrage de l'erreur
% appel de la fonction corrxy.m (dcrite dans ce chapitre)
cor_err = corrxy(err,err);
% trac de la fonction d'autocorrlation
k = -length(err)+1:length(err)-1;
figure(5), plot(k,cor_err)
grid, title('Autocorrlation du rsidu de l''identification')

Traitement du signal

625

fichier mcr.m (suite)


figure(6)
% autocorrlation de randn
t = 0:1000;
x = randn(size(t));
corr_x = corrxy(x,x);
k = -length(x)+1:length(x)-1;
plot(k,corr_x);
grid
title('Autocorrlation du signal gnr par randn')

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

II.2.2. Filtrage de Kalman

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 )] }

Le modle d'tat est dcrit par les 2 quations suivantes :


x(t + 1) = A x(t ) + Bu(t )

y (t ) = C x (t ) + v ( t )

+ w(t )

w(t ) est le bruit d'tat ou de modlisation et v (t ) celui de la mesure. Ils traduisent


respectivement l'incertitude que l'on a sur le modle et le bruit du capteur de mesure.
Ces bruits sont supposs gaussiens, blancs, centrs et dcorrls.
E w(t )T w(t + k ) = Q(t ) ( k )

( k ) : symbole de Kronecker

Q(t ) : matrice de variances du vecteur w(t )


E w(t )T v(t ) = 0 ,

E v(t )T v(t + k ) = R(t ) ( k )

R(t ) : matrice de variances du bruit.


Si les bruits sont stationnaires, leurs matrices de variances, notes Q et R., sont
indpendantes du temps.

Traitement du signal

627

L'estimation rcurrente de l'tat peut se dcomposer en 2 tapes, comme le montre le


dessin suivant.
t-1

x$ t 1/ t 1

TU

Pt 1/ t 1

x$t / t 1

x$t / t

Pt / t 1

Pt / t

MU

Etape TU (Time Update)


Correspond l'volution de l'tat entre 2 priodes d'chantillonnage.
x$t / t 1 = A x$t 1/ t 1 + B u(t )

En l'absence de mesures, l'incertitude augmente, en effet, la matrice P de variance de


l'erreur d'estimation augmente.

] [ x(t ) x$t / t 1] = A Pt 1/t 1 AT + Q

Pt / t 1 = E x(t ) x$t / t 1

Etape MU (Measurement Update)


L'tat est remis jour la suite de la lecture de la sortie du systme.

x$t / t = x$t / t 1 + K (t ) y(t ) C 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

Le gain d'adaptation K(t) est donn par


K (t ) = Pt / t 1 C T R + C Pt / t 1 C T

II.2.2.1. Application 1 : Estimation d'une constante

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

Les bruits v1 et v2 sont considrs blancs, gaussiens, centrs et indpendants.


E [v(k)] = 0
1 0
E v(k) v T (k) = R =

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')

fichier kalman1.m (suite)


correl1 = corrxy(yc(1,:),yc(1,:));
correl2 = corrxy(yc(2,:),yc(2,:));
k = -length(y(1,:))+1:length(y(1,:))-1;
figure(3)
plot(k,correl1);
grid
title('Autocorrlation du signal du capteur 1')

Traitement du signal
figure(4)
plot(k,correl2);
grid
title('Autocorrlation du signal du capteur 2')

fichier kalman1.m (suite)


% matrice de variance du bruit de mesure
Rv = [std(v1)^2 0;0 std(v2)^2];
C = [1 1]'; % matrice d'observation
P(1) = 1; % matrice de variance, initialisation
x(1) = 0; % initialisation de l'tat
for i = 2:length(t)
% tape MU
K = P(i-1)*C'*inv(Rv+C*P(i-1)*C'); % gain d'adaptation
x(i) = x(i-1)+K*(y(:,i)-C*x(i-1));
P(i) = P(i-1)-K*C*P(i-1); end
figure(6), plot(t,x), title('Evolution de l''tat'), grid

629

Chapitre 14

630

On atteint la valeur de la constante au bout de 200 itrations environ.


fichier kalman1.m (suite)
figure(7), plot(t,P)
grid, axis([0 100 0 max(P)])
title('Evolution de la variance de l''erreur d''estimation')

II.2.2.2. Estimation de l'tat d'un processus dynamique

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=

Avec a = 1, et k = 0.32, le modle suivant permet de ressortir la vitesse et la position de


l'arbre moteur.
U(p)

032
.
p +1

&( p)

1
p

( p)

En posant,

x1(t ) = & (t ) : vitesse


x2 (t ) = (t ) : position
on en dduit le modle d'tat analogique :
x& (t ) = x (t )
1
1

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

La fonction c2dt (Conversion of continuous state space models to discrete models) de la


boite outils "Control Toolbox" permet de passer du modle d'tat analogique vers le
modle d'tat discret.
fichier mod_etat.m
% matrices du modle d'tat analogique
A = [-1 0; 1 0];
B = [0.32;0];
C = [0 1];
T = 0.2; % cadence d'chantilolonnage en secondes
% matrices du modle d'tat discret
[A,B,C,D] = c2dt(A,B,C,T,0)

Chapitre 14

632
>> mod_etat
A =
0.8187
0.1813
B =
0.0580
0.0060
C =
0
1
D =
0

0
1.0000

Le processus chantillonn 0.2 s possde le modle d'tat discret suivant :


x (t + 1 )
0.8187
1
=
x (t + 1 )
01813
.
2

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

L'expression de la fonction de transfert discrte dont le numrateur et le dnominateur sont


reprsents par les variables num et den, est donne par la commande printsys de la
boite outils "Control Toolbox".
>> printsys(num,den,'z')
num/den =
0.0059938 z + 0.0056074
-----------------------z^2 - 1.8187 z + 0.81873

La sortie du processus peut tre simule partir de l'quation de rcurrence suivante :


y(t ) = 1819
.
y(t 1) 08187
.
y(t 2) + 0.005994 u(t 1) + 0.005607 u(t 2)

Traitement du signal

633

fichier kalman2.m
%
%
N
n

Estimation de vitesse d'un moteur par un filtre de Kalman


partir de la mesure de la position bruite
= 400; % nombre de priodes d'chantillonnage
= 2;
% ordre du systme

% modle d'tat du systme discret


A = [0.8187 0;0.1813 1];
B = [0.0580;0.0060];
C = [0 1];
v = randn(1,N); % bruit de mesure
Rv = std(v)^2; % variance du bruit de mesure
P = [10 0;0 10];
% Gnration du signal de commande, carr
u_max = 2*ones(1,N/4);
u = [-u_max u_max -u_max u_max];
% initialisation de l'tat et de la sortie
x = zeros(n,3);, y = zeros(1,3);
% algorithme du filtrage de kalman
for i = 3:N
% sortie du processus
y(i)=1.819*y(i-1)-0.8187*y(i-2)+0.00599*u(i-1)+0.0056*...
u(i-2)+v(i);
% tape TU
x(:,i) = A*x(:,i-1)+B*u(i-1);
P = A*P*A';
% tape MU
K = P*C'/(Rv+C*P*C'); % gain d'adaptation
x(:,i) = x(:,i)+K*(y(i)-C*x(:,i));
P = P-K*C*P; % mise jour de la matrice de variances
% volution de la matrice P
P1(:,i) = P(:,1); % 1re colonne de P
P2(:,i) = P(:,2); % 2me colonne de P
end
% trac du signal de commande
figure(1)
plot(1:N,u)
title('Signal de commande');
axis([0 N-1 -max(u_max)-1 max(u_max)+1]);
% trac du signal de sortie
figure(2)
plot(1:N,y)
title('Position bruite de l''arbre moteur'), grid

634

Chapitre 14

fichier kalman2.m (suite)


% trac de la vitesse estime
figure(3), plot(1:N,x(1,:));
title('Vitesse estime par le filtre de kalman'), grid

Traitement du signal

635

fichier kalman2.m (suite)


% volution de la matrice de variance P
figure(4)
plot(1:N,P1(1,:))
hold on
plot(1:N,P1(2,:))
plot(1:N,P2(2,:))
title('Evolution de la matrice de variance P')
mxP = max(max(P1(1,:)),max(max(P1(2,:)),max(P2(1,:))))])
axis([0 20 0 mxP])
grid
hold off

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

fichier kalman2.m (suite)


% Estimation de la vitesse par la drive de la position
deriv_pos(1) = 0;
for i = 2:N
deriv_pos(i) = (y(i)-y(i-1))/0.2;
end
% trac de la drive de la position
figure(5)
plot(1:N,deriv_pos)
grid
title('Vitesse estime par la drive de la position')

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

x2 (t + T) = cos w(t + T) = sin wT cos wt + cos wT sin wt

Chapitre 14

638

Le modle d'tat est alors :

avec
cos wT
A=
sin wT

x (t + 1) = A x(t )

y (t ) = C x (t )

sin wT

coswT

C = (1 0)

Il ny a pas de bruit de modlisation car on cherche un type de signal dtermin dont on


connat parfaitement la valeur de la pulsation.
On considre dans ce cas particulier, un signal sinusodal de pulsation w = 2 / 5 ,
. s.
chantillonn la cadence T =01
fichier kalman3.m
% estimation par filtrage de kalman d'une sinusode
% noye dans du bruit
n = 2;
% ordre du systme
T = 0.1; % priode d'chantillonnage en s
t = 0:T:500; % horizon de l'estimation
% bruit blanc gaussien centr, de variance 1
v = randn(size(t));
w = 2*pi/5;
% pulsation du signal
y = cos(w*t)+v; % sinusode bruite
figure(1), plot(t,y); axis([0 100 -4 5])
title('signal bruit')grid

Traitement du signal

639

fichier kalman3.m (suite)


% matrice d'volution
A = [cos(w*T) -sin(w*T);sin(w*T) cos(w*T)];
% matrices d'tat
% matrice C d'observation
C = [1 0];
% matrice de variance, initialisation
P = [1000 0; 0 0];
% variance du bruit de mesure
Rv = 1;
% initialisation de l'tat
x = zeros(n,1);
% algorithme de Kalman
for i = 2:length(t)
% tape TU
x(:,i) = A*x(:,i-1);
P = A*P*A';
% tape MU
K = P*C'/(Rv+C*P*C'); % gain d'adaptation
x(:,i) = x(:,i)+K*(y(i)-C*x(:,i));
P = P-K*C*P;
% volution de la matrice P
P1(:,i) = P(:,1); % 1re colonne de P
P2(:,i) = P(:,2); % 2me colonne de P
end
% sortie du filtre de Kalman
figure(2)
plot(t,x(1,:))
axis([0 150 -1.5 1.5])
xlabel('150 premirs chantillons')
title('Sortie du filtre de Kalman')
grid

La figure suivante reprsente le signal estim par le filtre de Kalman durant les 150
premires itrations.

640

Chapitre 14

On obtient une bonne estimation de la sinusode au bout d'une cinquantaine d'itrations


environ.
fichier kalman3.m (suite)
% sortie du filtre de Kalman
figure(3)
plot(t,x(1,:))
axis([480 500 -1.5 1.5])
xlabel('20 derniers chantillons')
title('Sortie du filtre de Kalman')
grid
figure(4)
plot(t,y);
title('signal bruit')
xlabel('20 derniers chantillons')
axis([480 500 -1.5 1.5])
grid

Les deux figures ci-dessous, reprsentent respectivement, les 20 derniers chantillons du


signal estim par le filtre de Kalman et les 20 derniers chantillons du signal bruit
d'origine.

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

fichier kalman3.m (suite)


%
%
%
%

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

% trac des lments de la matrice P


figure(5)
plot(t,P1(1,:)),
hold on
plot(t,P1(2,:))
plot(t,P2(1,:))
plot(t,P2(2,:))
title('Evolution des lments de la matrice de variances P')
axis([0 20 -.2 1])
grid
hold off

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.

fichier kalman3.m (suite)


% Variance et moyenne de l'erreur
% on s'intresse aux 300 dernires valeurs de l'erreur
k = 200:500;
err = err(k); var_err = std(err)^2; moy_err = mean(err);
disp(['moyenne et variances de l''erreur'])
disp(['moyenne : ',num2str(moy_err)])
disp(['variance : ',num2str(var_err)])
moyenne et variances de l'erreur
moyenne : -0.001617
variance : 0.001796

La moyenne de l'erreur et sa variance, de l'ordre 10-3, sont trs ngligeables.


III. Signal Processing Toolbox & Signal Processing Blockset

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.

III.1. GUI de la boite outils Signal Processing Toolbox


III.1.1. GUI sptool et FDATool

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 .

La commande filter et loutil danalyse de filtres numriques FVTOOL


La commande filter permet dobtenir le signal de sortie dun filtre pour un signal
dentre donn.
>> b = 1 ; a = [1 0.8]; imp = [1; zeros(49,1)];
>> h = filter(b,a,imp); stem(h)

Limpulsion est dfinie comme une valeur 1 linstant initial et de 0 partout.

648

Chapitre 14

On peut obtenir cette rponse impulsionnelle ou dautres rponses particulires en utilisant


loutil de visualisation des filtres (Filter Visualization Tool).par la commande
fvtool en spcifiant le numrateur b et le dnominateur a.
>> fvtool(b,a)

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

Sa rponse en frquence est :

Analyse dans le domaine des ples et des zros


La commande zplane permet de tracer les ples et les zros dun filtre. Pour dsigner un
filtre passe-bande il faut spcifier des ples complexes conjugus.
Considrons le cas du zro et des ples suivants :
>> zer = -0.8;
>> pol = 0.95*exp(j*2*pi*[-0.4 0.4]');
>> zplane(zer,pol)

Traitement du signal

651

>> [b,a] = zp2tf(zer,pol,1);


>> fvtool(b,a)

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

La rponse en frquences du filtre est la suivante :

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

Filtres IIR (rponse impulsionnelle infinie)

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

On peut crer le filtre de Butterworth en spcifiant dabord les caractristiques


frquentielles (bande passante, la bande coupe, les frquences de coupure et les
attnuations correspondantes).
Supposons un filtre passe-bande de la bande passante allant de 2000 Hz 5000 Hz, une
bande coupe commenant partir de 500 Hz de chaque cot.
Lchantillonnage se fait 10 KHz avec un maximum de 1 dB dondulation dans la bande
passante.
Lattnuation de la bande coupe est de 30 dB.
[n,Wn] = buttord([2000 5000]/10000,[500 7000]/10000,1,30)
[b,a] = butter(n,Wn);
fvtool(b,a)
>> droite(Wn(1),-10,Wn(1),10, Wn(1),Wn(1))
>> droite(Wn(2),-10,Wn(2),10, Wn(2),Wn(2))
>> gtext('w1 = 0.1715')
>> gtext('w2 = 0.5516')
n =
5
Wn =
0.1715

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

III.2. Etude de quelques blocs de la librairie Signal Processing Blockset

La librairie Signal Processing Blockset propose des outils pour le traitement


numrique du signal, la simulation et la gnration de code. Elle contient des blocs de
traitement de signal, dalgbre linaire et de blocs de calcul matriciel.
Des exemples de dmonstration peuvent tre consults en excutant la commande
suivante :
>> demo signal blockset

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

III.2.1. Librairie Estimation

Cette librairie possde 3 bibliothques de blocs : prdiction linaire, estimation du spectre


de puissance et estimation de paramtres.

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

Nous spcifions le dnominateur du filtre AR estim par lalgorithme de Yule Walker


dans le callback InitFcn.
>> title('Sortie du filtre z/(z+0.5) et l''estimateur de Yule Walker')

>> xlabel('Temps discret')

Le filtre obtenu, dordre p a la forme suivante :


H ( z) =

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

III.2.2. Librairie Filtrage


Cette librairie comporte des blocs de mise en uvre de filtres digitaux, des filtres
adaptatifs, etc.

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

Algorithme LMS (least mean squares) des moindres carrs


Dans lexemple suivant nous utilisons lalgorithme LMS pour obtenir les paramtres dun
filtre qui permet dobtenir la sortie dsire.

La figure suivante reprsente la sinusode dorigine et la sortie du filtre LMS.

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')

Lerreur sannule au bout de 25 chantillons environ, temps au bout duquel la sinusode


estime rejoint celle dsire.
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

III.2.3. Librairie Math Functions

Le modle sgn_blockset3.mdl permet la rsolution de lquation A x = B par la

mthode dite des moindres carrs : x = ( AT A) 1 AT B

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.

Dans cet exemple, on obtient directement la solution par le bloc LU Solver de


Matrices and Linear Algebra/Linear System Solvers.
Dans lexemple suivant, nous avons invers la matrice ATA par le bloc General
Inverse (LU) et un bloc de multiplication matricielle, Matrix Multiply 3 entres.
On effectue, dans lexemple suivant, le produit simultan des 3 matrices : (ATA)-1,
et B.

AT

Traitement du signal

665

III.2.4. Librairie Signal Management

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

Lindexation se fait par le retrait dune sous-matrice dans une autre.


Nous choisissons un intervalle dune colonne, la premire ligne et la dernire colonne, soit
llment de la premire ligne et dernire colonne.
Lautre mthode consiste slectionner un lment dans un tableau. Nous choisissons
llment contenu la position dtermine par la taille du vecteur, size, (dernire).
Nous avons aussi ralis un masque pour extraire un lment dun vecteur connaissant la
taille du vecteur et la position de llment extraire.

Le masque Elment n a besoin de la taille du vecteur (5) et la lindice de la


dernire valeur rcuprer donc n 5.

Traitement du signal

667

Utilisation du GUI FDATool - sgn_blockset1.mdl

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.

Nous reprsentons ci-dessous, le bruit contenant la sinusode, la sinusode ajoute et celle


quon extrait par le filtre passe-bande de Butterworth.

668

Chapitre 14

Extraction dune sinusode continue

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'

Filtrage par des scripts MATLAB et trac de la FFT

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

La figure suivante reprsente la sinusode de 10 Hz et celle quon extrait du signal somme.


Nous retrouvons bien lamplitude de 2.
Sinusode de 10 Hz et celle extraite
2
1
0
-1
-2
0

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

La courbe suivante reprsente lerreur de filtrage.

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

Rgulation et contrle de procds

I. Commande linaire quadratique LQI


II. Commande RST
III. Commande asymptotique et commande optimale
dans l'espace d'tat
III.1. Commande asymptotique par placement de ples
III.2. Commande optimale dans l'espace d'tat
IV. La rgulation PID
V. La boite outils "Control System Toolbox"
V.1. Etude dun systme dun moteur avec charge
V.2. Le systme linaire et invariant dans le temps, LTI
V.2.1 Fonction de transfert
V.2.2. Zros-Ples-Gain
V.2.3. Espace dtat
V.2.4. Les objets LTI et leurs proprits
V.2.5. Les systmes LTI dans SIMULINK
V.2.6. LTI viewer
Dans ce chapitre, nous allons tudier de nombreuses mthodes de rgulation et de contrle
de procds.

I. Commande linaire quadratique LQI


La commande LQI telle qu'elle est prsente ci-aprs, est base sur la minimisation d'un
critre quadratique. Elle est prdictive un pas et possde une intgration afin de rejeter
l'erreur en rgime permanent.
Le critre J minimiser permet d'assurer un compromis entre le carr de la variation de la
commande de l'instant d'chantillonnage t et le carr de l'erreur de poursuite de l'instant
future (t+1).
J = e(t + 1) 2 + R u (t ) 2
La minimisation de ce critre consiste calculer la variation de commande optimale qui
satisfait :
J
=0
(u )
La prsence de l'erreur future e(t +1) et de l'incrment de commande u(t ) permet
d'aboutir une commande prdictive un pas d'chantillonnage et d'inclure une
intgration.

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_15, Springer-Verlag Berlin Heidelberg 2010

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

qui relie les entres-sorties du processus par l'quation de rcurrence suivante :


y (t )=a1 y (t 1)+b1 u (t 1) + b2 u (t 2)

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

La commande appliquer rellement au processus, l'instant discret t, se calcule par la


somme de la commande applique l'instant (t-1) et de l'incrment u(t).
u(t ) = u(t 1) + u(t )

A partir du modle du processus et de la loi de commande, on obtient la fonction de


transfert en boucle ferme suivante :
1
y (t )
=
r (t ) 1 z 1 (1+ a ) + z 2 a
1
1
avec =

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

On s'impose une valeur du coefficient damortissement = 2 / 2 , et on dduit celle de la


pulsation normalise 0T par le rapport des 2 relations prcdentes.

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

Le fichier R_w0T.m permet le calcul des paramtres 0T et R si le modle du processus


est du premier ordre de ple 0.8.
z 1
B(z)
=
A(z) 10.8 z 1

fichier R_w0T
% Calcul des paramtres w0T et R de la commande LQI
z = sqrt(2)/2;

% coefficient d'amortissement

% paramtres du modle du processus


a1 = 0.8;
b1 = 1;
x = 0:0.001:1;
y = 2*exp(z*x).*cos(x*sqrt(1-z*z))-(1+a1)/a1;
plot(x,y);
grid
hold on
%trac de l'axe d'ordonne nulle
plot(x,zeros(1,length(x)),'-.')
xlabel('pulsation normalise w0T')
title('recherche de w0T pour dzeta = 0.7071')
% recherche de l'indice des tableaux x et y qui satisfait y=0
% avec la prcision de 0,05%
j = find(abs(y)<0.0005);
% valeur de w0T recherche
w0T = x(j);
% Trac dune droite verticale w0T

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

Pour programmer cette loi de commande, on utilisera les fonctionnalits polynomiales et


matricielles de MATLAB. Les sommes sont programmes sous forme de produits scalaires
et on utilisera le minimum de boucles 'for'.
Le modle du processus est dfini par les 2 polynmes A et B comme suit :

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 ]

T = [ y(t) y(t 1) y(t 2 ) ... y(t n + 1 ) y(t n)] T

Construction du vecteur de mesures :


Le vecteur est construit de la faon suivante :

=[a1 a2 a1 a3 a2 ...an an1 an ] +[100 ...00]


= diff([0 A 0]) + eye(1,n+1)

Construction du vecteur de mesures :


La sortie y (t ) de linstant courant est donne par le modle (1) en fonction des sorties et
des commandes prcdentes.

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'

avec du_t_1, le vecteur contenant les valeurs prcdentes de l'incrment de commande.


Le fichier fonction lqi.m permet la programmation de cette commande.

Chapitre 15

678
[y,u] = lqi(a,b,r,N,R,u_min,u_max)
a, b :
r, N :
R :
u_min, u_max :

polynmes A et B du modle du processus,


signal de consigne et nombre d'chantillons,
coefficient de pondration de l'incrment de commande,
valeurs limites de la commande.

Les paramtres retourns sont la sortie du processus et le signal de commande.


fichier lqi.m
function [y,u] = lqi(a,b,r,N,R,u_min,u_max)
% Commande Linaire Quadratique avec Intgration (LQI)
% Commande prdictive 1 pas
% Minimisation du critre quadratique :
%
J = R du(t)^2 + e(t+1)^2
% sans paramtres, les rsultats correspondent :
%
modle du processus a1 = 0.8; b1 = 1;
%
nombre d'chantillons N = 600
%
coefficient de pondration R = 34.48
%
limitation de commande entre 0 et 10
%
consigne crneau entre 3 et 7
if nargin ~= 7
home
help lqi;
disp('Appuyer sur une touche pour rsultats d''un exemple')
pause
% consigne crneau
N = 600;
r = [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;
% modle du processus
aa =.8 ; bb = 1; R = 34.48;
[y,u] = lqi(aa,bb,r,N,R,u_min,u_max);
% affichage des rsultats
figure(1)
plot(1:N,r,'-.',1:N,y);
xlabel('temps discret')
title('Signaux de sortie et consigne')
figure(2)
stairs(1:N,u);
title('Signal de commande')
xlabel('temps discret')
return
end

Contrle de procds

% ordre du modle du processus


na = length(aa);
nb = length(bb);
% initialisation des variables
% ---------------------------du = zeros(1,N);
y = r;
u = r/(sum(bb)/(1-sum(aa)));
% algorithme de commande
% ---------------------alpha = bb(1,1)/(bb(1,1)^2+R);
% polynme AA
AA = diff([0 aa 0])+eye(1,na+1);
% polynme BB
BB = bb(1,2:nb);
ok = isempty(BB);
if ok, BB = 0; end
for i = max(na,nb)+1:(N-1)
%--------------------- boucle d'chantillonnage
% valeurs prcdentes de la sortie et de la commande
y_t_1 = fliplr(y(i-na:i-1));
u_t_1 = fliplr(u(i-nb:i-1));
% valeurs prcdentes des incrments de la commande
du_t_1 = fliplr(du(i-nb+1:i-1));
if ok, du_t_1 = 0; end
% sortie courante du modle du processus
y(i) = y_t_1*aa'+u_t_1*bb';
% calcul de l'incrment et de la commande appliquer
du(i) = alpha*(r(i+1)-fliplr(y(i-na:i))*AA'-du_t_1*BB');
u(i) = du(i)+u(i-1);
% saturation de la commande
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

L'appel de la fonction lqi sans paramtres, correspond au cas prcdemment tudi.

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

et on visualisera l'effet du coefficient de pondration R sur les performances de la loi de


commande.
fichier cde_lqi.m
% Nombre dchantillons
N = 600;
% signal de consigne
% gnration de l'chelon
r = [3*ones(1,N/3) 7*ones(1,N/3) 3*ones(1,N/3)];
R = 1;
u_min = 0;
u_max = 10;
aa = [0.76 -0.3];
bb = 0.5;
[y,u] = lqi(aa,bb,r,N,R,u_min,u_max);
% Appel de la fonction lqi sans paramtres
lqi
figure(1)
plot(y)
hold on
% trac du signal de consigne
plot(r,'-.')
hold off
title('signaux de sortie et de consigne')
xlabel('instants d''chantillonnage')
axis([0 N 2 8])
% affichage de la commande sous forme bloque
figure(2)
stairs(u)
title('signal de commande')
xlabel('instants d''chantillonnage')

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

II. Commande RST


L'intrt de ce type de commande -contrairement beaucoup d'autres correcteurs
numriques tel le classique PID- est de spcifier la loi de rjection des perturbations
indpendamment de celle de la poursuite du signal de consigne.
Pour cette raison, ce rgulateur est dit "poursuite et rgulation objectifs indpendants".
Le calcul de la loi de commande est bas sur un critre polynomial qui permet de spcifier
la dynamique de rjection de l'erreur entre le signal de rfrence et le signal de sortie
(perturbation).
P( z 1) [r (t + 1) y (t + 1) ] = 0
Cette dynamique s'obtient par le choix du polynme P( z 1) .

Si l'on choisit un polynme de rgulation du premier ordre


P( z 1) = 1 05
. z 1 = 1 p1 z 1

la perturbation sera divise par 2 chaque instant d'chantillonnage.


Comme exemple d'application de cette commande, considrons un modle de processus du
premier ordre avec retard pur :

Contrle de procds

685

H ( z 1) =

1
1
B( z 1) z (b1 + b2 z )
=
1 a1 z 1
A( z 1)

Le modle prdicteur est dans ce cas


y(t + 1) = (1+ a1) y(t ) a1 y(t 1) + b1 u(t ) + b2 u(t 1)
Avec le polynme de rgulation du premier ordre, la commande u(t) appliquer au
processus l'instant d'chantillonnage t est :
u(t ) =

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

Si l'on choisit un filtre du premier ordre de ple 1 , il suffit d'afficher 2 = 0 .


Pour des consignes ne prsentant pas de fronts raides (sinus, etc.), il n'est pas utile de les
filtrer; dans ce cas, il faut afficher 1 = 2 = 0 .
Les coefficients 1 et 2 dterminent la pulsation propre non amortie w0 et le
coefficient d'amortissement par les relations suivantes :

1 = 2 e

0T

2 = e

cos ( 0T 1 2 )

2 0T

T est la priode d'chantillonnage.


fichier Regul_RST.m
N = 300;
% gnration du crneau de consigne
%c = [3*ones(1,N/2) 7*ones(1,N/3) 3*ones(1,N/3)];
c = [3*ones(1,N/3) 7*ones(1,N/3) 3*ones(1,N/3)];
% filtrage par un filtre du 2nd ordre
% pulsation non amortie w0T = 0.2
% coefficient d'amortissement dzeta = 0.7071

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)

La commande s'exprime en fonction des 3 polynmes R, S et T.


u( t ) =

1 1
T ( z ) r (t + 1) R( z 1) y(t )

S ( z 1)

Chapitre 15

688

Dans le cas du processus tudi, nous avons :


R( z 1) = (1 + a1 p1) a1 z 1
S ( z 1) = b1 + (b2 b1) z 1 b2 z 2
T ( z 1) = 1 p1 z 1
Dans le cas gnral d'un processus d'ordre n, ayant m zros et d'un choix de polynme de
rgulation d'ordre l, les polynmes du rgulateur ont pour expressions :
n
l
R( z 1) = 1 + a1 + (ai ai 1) z i an z n pi z 1
i=2
i=2
m
S ( z 1) = b1 + (bi bi 1) z i bm z m
i=2
T ( z 1) = P( z 1)
Programmation du rgulateur
Le modle du processus dcrit par deux polynmes A et B, pour obtenir le polynme R, il
faut ajouter des zros au plus petit des polynmes A et P.
if length(A)<length(P)
A(length(A)+1:length(P)) = zeros(1,length(P)-length(A))
else
P(length(P)+1:length(A)) = zeros(1,length(A)-length(P))
end

Ainsi, le polynme R sous forme plus compacte,


R( z 1) = (1+ a1 p1) +

max(n, l )

i=2

[(ai ai 1) pi ] zi an zn

peut tre dcrit facilement l'aide d'un seul tableau.


R = [1+A(1)-P(1)

diff(A)-P(2:length(P))-A(length(A))]

Les polynmes S et T sont donns par :


S = [B(1)
T = P

diff(B)

-B(length(B)]

La commande, u(t), appliquer au processus, l'instant discret iT, se calcule comme


suit :
% ordres de A et P aprs augmentation du plus petit
q = length(A);
s = length(S);
u(i) = ([1 -P]*fliplr[r(i-q:r(i+1))]'-R*...

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

% ordre du modle du processus et des polynmes Hr et Preg


if length(aa)<length(Preg)
aa(length(aa)+1:length(Preg)) = zeros(1,length(Preg)-...
length(aa));
else
Preg(length(Preg)+1:length(aa)) = zeros(1,length(aa)-...
length(Preg));
end
nb = length(bb);
% ordres de aa et Preg aprs augmentation du + petit
na = length(aa);
% construction des polynmes R, S et T
R
=
[1+aa(1)-Preg(1)
diff(aa)-Preg(2:length(Preg))
aa(length(aa))];
S = [bb(1) diff(bb) -bb(length(bb))];

-...

% initialisation des signaux de commande et de sortie


y = r;
u = r/(sum(bb)/(1-sum(aa)));
for i = max(na,nb)+1:(N-1);
y_t_1 = fliplr(y(i-na:i-1));
u_t_1 = fliplr(u(i-nb:i-1));
y(i) = y_t_1*aa'+u_t_1*bb';
u(i) = ([1 -Preg]*(fliplr(r(i-length(Preg)+1:i+1)))'-...
R*(fliplr(y(i-length(R)+1:i)))'-S(2:length(S))*...
(fliplr(u(i-length(S)+1:i-))')/S(1);
% saturation de la commande
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
Considrons le processus du second ordre suivant :

1
B(z)
=
A(z) 1 0.76 z 1 + 0.3 z 2

Contrle de procds

691

sur lequel on appliquera la commande RST. On spcifie un modle de rfrence du


premier ordre de ple 0.9 ( 1 = 0.9 , 2 = 0 ) et une dynamique de rgulation du premier
ordre de ple 0,5.
Pour appliquer cette commande, on spcifie tous les paramtres ncessaires dans le fichier
script cde_rst.m.
fichier cde_rst
N = 600;
% consigne chelon
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.76 -0.3]; bb = 0.5;
% gnration du signal de rfrence
num_Hr = sum(den_Hr);
r(1) = c(1); 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);
figure(1)
plot(y)
hold on
plot(r,'g-.')
plot(c,':');
title('signaux de rfrence, de consigne et de sortie')
xlabel('instants d''chantillonnage'), grid
figure(2)
plot(u), grid
title('signal de commande')
xlabel('instants d''chantillonnage');

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

III. Commande asymptotique et commande optimale dans


l'espace d'tat
III.1. Commande asymptotique par placement de ples

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 :

det (zI A + BF) = 0


Si l'on dsire un retour l'quilibre suivant une dynamique de second ordre de ples rels
z1 = 0.6 et z2 = 0.8 , les deux coefficients de retour d'tat sont solutions du systme :

. 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

La loi de commande applique un double intgrateur (volant d'inertie) est schmatise


comme suit :
0 +
-

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;

Matrices du modle d'tat du systme discret


>>[A,B,C,D] = c2dt(A,B,C,0.1,0) % chantillonnage 0.1 s
A =
1.0000
0.1000
0
1.0000
B =
0.0050
0.1000
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

Signal de commande par retour d'tat

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

Evolution du vecteur d'tat


2
x1
0
perturbation sur la vitesse
x2

-2

-4

-6

-8

-10

10

20

30

40

50

60

70

80

90

100

Signal de commande par retour d'tat

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

Quelques soient les conditions initiales, en deux priodes d'chantillonnage le systme


revient sa position d'quilibre : c'est la rponse pile pour laquelle les actions sont trs
violentes.
III.2. Commande optimale dans l'espace d'tat
Rgulation autour d'une consigne nulle

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

Application au double intgrateur chantillonn la cadence T = 0.1 s.

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

fichier cde_opt1.m (suite)


figure(3), stairs(1:N-1,u), grid
title('Signal de commande par retour d''tat optimal')
Signal de commande par retour d'tat optimal

-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')

Evolution du vecteur d'tat, retour permanent

0.5

x1

-0.5
x2
-1

-1.5

perturbation sur la vitesse

10

20

30

40

50

60

70

80

90

100

fichier cde_opt1.m (suite)


figure(5)
stairs(1:N-1,u);
grid
title('Signal de commande par retour d''tat permanent')
Les rsultats obtenus par un retour d'tat permanents ne diffrent pas de beaucoup de ceux
de la commande optimale avec un retour d'tat variant dans le temps.

Chapitre 15

702

Signal de commande par retour d'tat permanent

-2

-4

-6

-8
0

10

20

30

40

50

60

70

80

90

100

Rgulation autour d'une consigne constante non nulle

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

La loi de commande est schmatise comme suit :


x _ ref +

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

Le signal de sortie atteint la valeur de la consigne au bout d'une quarantaine de priodes


d'chantillonnage.
fichier cde_opt2.m (suite)
% trac du signal de commande bloqu
figure(2), stairs(1:N-1,u); grid
txt = 'signal de commande par retour d''tat , R = ';
title([txt, num2str(R)])

Contrle de procds

705

Laugmentation de la pondration R, a pour consquence de rallonger le temps de rponse.


Avec R = 1, nous obtenons une poursuite beaucoup plus lente et un signal de commande
beaucoup plus faible cause d'une pondration beaucoup plus forte.
Quelque soit la valeur de ce coefficient de pondration R, nous obtenons toujours une
erreur statique nulle grce la prsence de lintgration mais au bout dun temps de plus
en long.

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'quation d'tat devient :


x(t + 1) = A x(t) + B [q r(t) F x(t)] = (A B F) x(t) + B q r(t)
La sortie en rgime permanent, s'exprime en fonction du signal de consigne par :
y = C ( I A + B F ) 1 B q r

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

matrices du modle d'tat discret du processus


= [1.0000 0.1000;0 1.0000];
= [0.0050;0.1000];
= [1 0];

N = 400; % horizon de commande


% signal de rfrence carr
palier = ones(1,N/4); ref = [-palier palier -palier palier];
% matrices de pondration
H = [1 0;0 0]; Q = H; R = 0.01;
% initialisation de la matrice P

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

La figure suivante reprsente le signal de commande par retour dtat.

IV. La rgulation PID


La rgulation la plus rpandue dans lindustrie est la commande P.I. (Proportionnelle et
Intgrale) o la commande applique au processus est forme de 2 parties :
- une partie proportionnelle lerreur consigne-sortie Kp ,
Kp
- une partie intgrale de cette erreur D( p ) =
Ti p
Lexpression analogique du rgulateur PI est :
D( p) = Kp (1 +

1
)
Ti p

Une faon de discrtiser ce rgulateur serait dutiliser les quivalences analogique et


discrte de la drive.
p 1 z 1
La fonction intgrale est conserve (
discrte du rgulateur est la suivante :

1
1

) par la discrtisation. Lexpression


p 1 z 1

Contrle de procds

709

D( z 1 ) =

Kp 1 + Ti Ti z 1
Ti
1 z 1

On dsire rguler un systme discret de fonction de transfert :


H ( z) =

a = 0,8
b1 z 1
Avec 1
1 a1 z 1
b1 =1

Le schma du systme rgul (boucle ferme) est :

o r, y, et u sont respectivement les signaux de consigne, de sortie, derreur et de


commande issue du rgulateur.
Lquation caractristique (dnominateur) de la fonction de transfert en boucle ferme est :
1 + Ti
) a1 1] z 1 + (a1 K p b1 ) z 2 et le gain statique est gal 1.
A( z 1 ) = 1 + [ K p b1 (
Ti
En notant lquation caractristique sous la forme :
A( z 1 ) = 1 1 z 1 2 z 2
Les paramtres 1 et 2 sont donns en fonction du coefficient damortissement et de
la pulsation propre non amortie normalise = 0T (0< <1) du systme du 2nd ordre de
la boucle ferme par :

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

Le modle pid_1.mdl propose cette rgulation. Les paramtres Kp et Ti sont entrs


dans le Callback InitFcn du modle (voir chapitre Callbacks).

La figure suivante affiche les 3 signaux de consigne, du signal de commande du PID et de


la sortie du processus.

Contrle de procds

711

Rgulateur analogique suivi dun bloqueur dordre 0

Comme le PID est analogique, on le fait suivre par un bloqueur dordre 0.

Les paramtres du rgulateur sont entrs dans la boite de dialogue du masque du PID (voir
chapitres Masques et sous-systmes).

Chapitre 15

712

V. La boite outils "Control System Toolbox"


V.1. Etude dun systme dun moteur avec charge

MATLAB dispose de la boite outils "Control System Toolbox" pour la


modlisation de procds et la mise en oeuvre de rgulateurs.
Afin d'tudier quelques unes des fonctions prvues, nous allons considrer l'asservissement
de la position angulaire d'une charge couple travers un rducteur l'arbre d'un moteur
courant continu.
On utilisera la correction de la vitesse de l'arbre moteur par boucle tachymtrique et par un
rgulateur numrique.

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

Coefficient de force contre-lectromotrice


Coefficient de retour tachymtrique
Coefficient de couple moteur
Rsistance et self d'induit
Rapport de rduction
Moment d'inertie de l'arbre moteur
Moment d'inertie de la charge

Etude du systme moteur sans charge

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

Nous voulons calculer la fonction de transfert de ce systme en l'absence de couple


perturbateur, tracer sa rponse indicielle et sa rponse en frquences (diagrammes de Bode
et de Nyquist).et tudier sa rponse une perturbation indicielle de couple perturbateur.
La boite outils "Control System Toolbox" contient diffrentes fonctions pour le
calcul de la fonction de transfert et du modle d'tat d'un systme boucl.
La fonction series permet de calculer la fonction de transfert ou le modle d'tat de
deux systmes mis en cascade.
Considrons la mise en cascade de 2 systmes de fonctions de transfert respectives H1(p),
H2(p). La fonction de transfert global est donne par :
[numG, denG] =

series(numH1, denH1, numH2, denH2)

Dans le cas de la chane directe du moteur :


U

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

La fonction minreal utilise prcdemment permet de simplifier la fonction de transfert


obtenue par la compensation de ples.
On obtient ainsi une fonction de transfert normalise; le coefficient de plus haut degr du
dnominateur est gal l'unit.
Dans notre cas, il n'y a pas eu de compensation de ples.
La fonction de transfert du systme boucl peut tre obtenue l'aide de la commande
feedback.
Considrons la fonction de transfert H(p) = Y(p)/X(p) du systme suivant :
+

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)

fichier moteur.m (suite)


% fonction de transfert du moteur
[numH1,denH1] = feedback(num_cd,den_cd,Ke,1,-1);
[numH1,denH1] = minreal(numH1,denH1);
disp('Fonction de transfert H1 du moteur :')
printsys(numH1,denH1)
num/den =
5e+005
--------------------s^2 + 1000 s + 3e+004
>> step(numH1,denH1)

La courbe suivante donne la rponse indicielle du moteur.

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)

On peut vrifier facilement que ce rsultat correspond parfaitement la fonction de


transfert obtenue par le calcul.
Hm ( p) =

Km
Ke Km + R Jm p + L Jm p2

fonction de transfert thorique


>>
>>
>>
>>

numTh = Km; denTh = [L*Jm R*Jm Ke*Km];


disp('Fonction de transfert thorique H1 du moteur :')
[numTh,denTh] = minreal(numTh,denTh)
printsys(numTh,denTh)

num/den =
5e+005
--------------------s^2 + 1000 s + 3e+004

La rponse du systme un signal x peut tre obtenue l'aide de la commande lsim.


lsim(numH1,denH1,x)

Dans l'tude de procds, on utilise souvent les rponses l'chelon et l'impulsion.


La boite outils "Control System Toolbox" dispose des fonctions step et
impulse pour obtenir les rponses indicielle et impulsionnelle.
Les paramtres d'appel peuvent tre les polynmes de la fonction de transfert ou les
matrices d'tat du systme.

Chapitre 15

716

fichier moteur.m (suite)


% rponse indicielle, vitesse moteur non charg
figure(1)
step(numH1,denH1)
grid
ylabel('vitesse de l''arbre moteur (rad/s)')
xlabel('temps')
title ('rponse indicielle vitesse, moteur non charge);
k = dcgain(numH1,denH1);
disp('Gain statique en rad/s/V')
disp(num2str(k));

Step Response
18
16

vitesse de l'arbre moteur (rad/s)

14
12
10
8
6
4
2
0

0.05

0.1

0.15

0.2

0.25

temps (sec)

Gain statique : 16.67


Etude du systme moteur avec charge

On s'intresse au systme ayant comme sortie la position angulaire de la charge sur


l'arbre en fonction de la tension d'induit du moteur.
U +
-

1
R+Lp

Km

Ke
Ke

1
Cp
JtJmp

1/N

Contrle de procds

717

fichier moteur.m (suite)


% systme du moteur charg
[num_cd, den_cd] = series(1, [L R], Km, [Jt 0]);
[numH2,denH2] = feedback(num_cd,den_cd,Ke,1,-1);
denH2 = N*denH2;
[numH2,denH2] = minreal(numH2,denH2);
disp('Fonction de transfert, vitesse de la charge')
printsys(numH2,denH2)
0 pole-zeros cancelled
Fonction de transfert de vitesse de la charge
num/den =
5263
------------------s^2 + 1000 s + 6316

Avant de corriger le systme, on a besoin d'tudier ses caractristiques en boucle ouverte,


travers ses rponses indicielle, impulsionnelle, ses rponses en frquences afin de
dterminer les marges de gain et de phase, etc.
De plus, un modle de haut degr peut tre simplifi. On s'intresse dans ce qui suit,
l'tude de la rponse indicielle.
L'allure de cette rponse, donne dans la figure suivante, est trs proche de celle d'un
systme du premier ordre avec une intgration, de la forme :
Gs
p (1+ p)
Gs et sont le gain statique et la constante de temps du systme de premier ordre ayant
comme sortie la vitesse angulaire de la charge.

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

% calcul de la constante de temps


val_stat = rep_ind(length(rep_ind));
trait = 0.63*val_stat*ones(1,length(rep_ind));
plot(trait), grid, hold off

La lecture graphique de la constante de temps peut se faire en invoquant la commande


zoom. Nous pouvons aussi modifier l'axe des temps par la commande axis.
>> zoom on

Contrle de procds

719

Aprs slection la souris, de rectangles qui entourent le point d'intersection de la courbe


avec le trait reprsentant 63% de la valeur maximale, on obtient une constante de temps de
6 secondes environ.
Le modle peut tre considr comme un premier ordre de constante de temps de 6
secondes.
fichier moteur.m (suite)
% modle simplifie
num1 = k/N; den1 = [6 1];
ind1 = step(num1,den1);
t = 0:min(length(rep_ind), length(ind1))-1;
figure(3)
% trac des rponses indicielles des modles rl
% et simplifi
plot(t,ind1(t+1),'o')
hold on
plot(t,rep_ind(t+1))
grid
title('modle rel et modle simplifi')
axis([0 length(t)-1 0 val_stat*1.2])

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

Le mode correspondant au ple p = -993.6438 s'teignant trs rapidement; peut tre


nglig.
La fonction residue permet de dcomposer cette rponse impulsionnelle en ses
diffrents modes.
>> [r,p,k] = residue(numH2,denH2)
r =
-5.3309
5.3309
p =
-993.6438
-6.3562
k =
[]

La rponse impulsionnelle du systme peut tre alors dcompose comme suit :


y (t ) = 5.3309 ( e

6.3562 t

993.6438 t

Les diagrammes de Bode peuvent tre directement tracs en invoquant la commande


bode.
Dans le cas du modle simplifi du premier ordre :
>> bode(0.833,[6 1]);

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)

Nous traons ci-aprs le digramme de Nyquist du modle simplifi du premier ordre.


>>
>>
>>
>>
>>

nyquist(0.833,[6 1])
grid
title('diagramme de Nyquist du modle simplifi')
xlabel('axes rel')
ylabel('axe imaginaire')

Chapitre 15

722

Effet d'une perturbation de couple perturbateur

On se propose d'tudier l'effet d'un chelon de couple perturbateur sur la vitesse de la


charge.
Cp

Km
R+Lp

+
+

1
Jmp
Jt

1/N

Wc

Ke
Ke

On peut obtenir la fonction de transfert Wc/Cp l'aide de la commande feedback.


>> [num,den] = feedback(1,[Jt 0],Ke*Km,[L R],-1);
>> den = den*N ; disp('Fonction de transfert Wc/Cp')
>> printsys(num,den)
Fonction de transfert Wc/Cp
num/den =
0.01 s + 10
---------------------------0.000095 s^2 + 0.095 s + 0.6
>> dcgain(num,den)
ans =
16.6667

Contrle de procds

723

La rponse au couple perturbateur possde la mme dynamique et le mme gain statique


que celle de la vitesse de l'arbre moteur vis--vis de la tension d'induit.
Correction tachymtrique de la vitesse du moteur

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

A partir de la fonction de transfert Wm/U et le retour tachymtrique Kg, on obtient la


fonction de transfert Wc/Wr.
fichier moteur.m (suite)
% retour tachymtrique
% fonction de transfert, vitesse moteur
[numH3, denH3] = feedback(Km,conv([Jt 0],[L R]),Ke,1,-1);
disp('Fonction de transfert Wm/U :')
printsys(numH3,denH3,'p')
[numH4,denH4] = feedback(numH3,denH3,Kg,1,-1);
disp('Fonction de transfert Wm/Wr :')
printsys(numH4,denH4,'p')
% fonction de transfert, vitesse charge
denH5 = denH4*N; numH5 = numH4;
disp('Fonction de transfert Wc/Wr :')
printsys(numH5,denH5,'p')
gain_stat = dcgain(numH5,denH5)
Fonction de transfert Wm/U :
num/den =
0.5
-------------------------------4.75e-006 p^2 + 0.00475 p + 0.03
Fonction de transfert Wm/Wr :
num/den =
0.5
--------------------------------4.75e-006 p^2 + 0.00475 p + 0.055

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

Le calcul thorique de la fonction de transfert Wm/Wr donne :


Wm
Km
=
Wr Km(Ke + Kg) + Jt R p + Jt L p2
>> disp('resultat theorique Wm/Wr')
>> num = Km;
>> den = [Jt*L Jt*R Km*(Kg+Ke)];
>> printsys(num,den);
rsultat thorique Wm/Wr
num/den =
0.5
--------------------------------4.75e-006 s^2 + 0.00475 s + 0.055
Discrtisation du systme analogique

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')

on discrtise le systme analogique prcd du bloqueur d'ordre 0 (zero-order hold).


fichier reg_num.m
% syntse de rgulateur numrique
% modle analogique
na = 0.833; da = [6 1];
% discrtisation du systme
[nd,dd] = c2dm(na,da,2,'zoh');
printsys(nd,dd,'z'), figure(1)
indN = dstep(nd,dd);
stairs(indN), grid, xlabel('temps discret')
ylabel('rponse impulsionnelle')

Contrle de procds

725

title('modle analogique discrtis T = 2s')


Fonction de transfert du modle discret
num/den =
0.23613
----------z - 0.71653

La discrtisation conserve l'ordre et le gain statique du modle analogique.


>> ddcgain(nd,dd)
ans =
0.8330
modle analogique discrtis T = 2s
0.9
0.8

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)

Elle retourne le module et la phase dans les vecteurs Mag et Phase.

Chapitre 15

726

[MAG,PHASE,W] = dbode (A,B,C,D,Ts,...)

On peut utiliser indiffremment la fonction de transfert du systme discret ou son modle


d'tat. En notant H ( z  1 ) et D ( z  1 ) les fonctions de transfert du modle discret et du
rgulateur, le schma de la loi de commande est, en gnral, le suivant :
Wr

+
-

1
DJm
(z 1)

1
H (z1)
Jm

Wc

avec Wr la consigne de vitesse.


Nous dsirons que le systme en boucle ferme se comporte comme un systme du premier
ordre de gain statique unit et de ple = 0.8 , soit une fonction de transfert en boucle
ferme :
F (z 1 ) =

Le modle du processus tant :

(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 )]

Dans le cas des spcifications prcdentes, ce correcteur a pour expression :


D (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 :

numrateur et dnominateur de la chane directe,


-1 pour une contre-raction et +1 pour une raction.

fichier reg_num.m (suite)


% expression du rgulateur
alfa = 0.8; numD = (1-alfa)*dd; denD = conv([1 -1],nd);
disp('Expression du rgulateur :')
printsys(numD,denD,'z')
Expression du rgulateur :
num/den =
0.2 z - 0.14331
------------------0.23613 z - 0.23613

Par l'utilisation de la commande cloop, on peut vrifier que la fonction de transfert en


boucle ferme est identique celle que nous avons spcifie.
>>
>>
>>
>>
>>
>>

[numF, denF] = cloop(conv(numD,nd),conv(denD,dd),-1);


numF = suppz(numF);
denF = suppz(denF);
[numF, denF] = minreal(numF, denF);
disp('Fonction de transfert en boucle ferme :')
printsys(numF,denF,'z')

1 pole-zeros cancelled
Fonction de transfert en boucle ferme :
num/den =

Chapitre 15

728
0.2
------z - 0.8

La fonction suppz permet de supprimer les premiers coefficients nuls de polynmes.

Mise en oeuvre du correcteur

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,

gnre un signal carr de priode 2 pour les lments du vecteur

square(x,rc) :

gnre un signal carr de priode 2 et de rapport cyclique 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

Pour gnrer un chelon, il suffit de spcifier un nombre de priodes gal 1.


En notant (t ) l'erreur entre la consigne et la sortie du processus, l'instant discret t, et
aprs simplification de l'expression du correcteur :
D (z 1 ) =

1 2 z 1
1 z

0.8471 0.6069 z 1
1 z 1

La variation de la commande u(t ) est donne par :


u(t ) = 1 (t ) 2 (t 1
La sortie du processus est donne par l'quation de rcurrence :
y (t ) = a y (t 1) + b u(t 1)
1
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

Les figures suivantes reprsentent les signaux de consigne et de sortie du processus. On


remarque bien que la dynamique de poursuite correspond un premier ordre de ple 0.8.
L'erreur statique est nulle grce la prsence d'une intgration dans la loi de commande.

Contrle de procds

731

V.2. Le systme linaire et invariant dans le temps, LTI

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

On peut crer ue fonction de transfert en spcifiant son numrateur et son dnominateur en


utilisant la fonction tf.
Si lon veut spcifier un systme du 2nd ordre de coefficient damortissement optimal
2
=
et une pulsation propre , soit la fonction de transfert :
0
2
1

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

Une autre faon plus simple dcrire, en spcifiant le paramtre s de Laplace :


>> s=tf('s');
>> sys=1/(10000*s^2+141.4*s+1)
Transfer function:
1
----------------------10000 s^2 + 141.4 s + 1

V.2.2. Zro-Ple-Gain

Pour spcifier la fonction de transfert suivante :

H ( p) =

1
( p + 2) ( p + 3)

par la mthode ZPK, nous notons :


- 2 ples de -2 et -3,
- Pas de zro,
- Un gain de 1
>> sys = zpk([],[-2 -3],[1])
Zero/pole/gain:
1
----------(s+2) (s+3)

La rponse impulsionnelle est obtenue par la commande impulse.


>> impulse(sys)

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

V.2.3. Espace dtat

La commande ss permet de construire le modle dtat en spcifiant les matrices dtat A,


B, C et D.
La commande zp2ss permet de passer de la forme Zros-Ples vers la forme Espace
dEtat. Considrons lexemple prcdent.
>> [A,B,C,D]=zp2ss([],[-2 -3],[1])
A =
-5.0000
-2.4495
2.4495
0
B =
1
0
C =
0
0.4082
D =
0

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.

Nous retrouvons les 2 ples par ses valeurs propres:


>> eig(sys)
ans =
-3
-2

Chapitre 15

734

Lopration de passage du modle dtat la mthode Zros-Ples se fait par ss2zp.


Nous pouvons passer de la fonction de transfert au modle dtat par tf2ss et ss2tf
respectivement.
Pour passer au modle dtat discret, chantillonn la cadence T=0.1s, nous utilisons la
commande c2dt.
>> [Ad,Bd,Cd,Dd] = c2dt(A,B,C,0.1,0)
Ad =
0.5850
-0.1908
0.1908
0.9746
Bd =
0.0779
0.0104
Cd =
0

0.4082

Dd =
0

La commande tf peut aussi dfinir des systmes multivariables. Pour un systme m


sorties et n entres, les polynmes num et den sont des tableaux de cellules de dimensions
m x n o num(i,j) et den(i,j) spcifient la fonction de transfert liant lentre j
la sortie i.
Pour un systme 2 sorties et 1 entre, un tel systme peut tre dfini par sa fonction de
transfert comme suit :
>> sys = tf( {1 ; 1 } , {[20 1] ; [10000 141.4 1]})
Transfer function from input to output...
1
#1: -------20 s + 1
#2:

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)

V.2.4. Les objets LTI et leurs proprits

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 donnes du modle,


la cadence dchantillonnage,
les retards,
les noms des entres et des sorties

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

Retards sur les entres


Groupes des entres
Noms des entres
Notes sur le modle
Retards sur les sorties
Groupes des sorties
Noms des sorties
Cadence dchantillonnage
Donnes additionnelles

Vecteur
Structure
Cellule de chanes
Texte
Vecteur
Structure
Cellule de chanes
Scalaire
Type arbitraire

La priode dchantillonnage Ts maintient la valeur de la priode des systmes discrets.


Par convention, Ts est nulle pour des systmes continus. Ts vaut -1 pour des systmes
dont on ne spcifie pas la priode dchantillonnage.
InputDelay, OutputDelay, permettent de spcifier des retards purs sur les entres ou
les sorties.

Les proprits InputName et OutputName permettent de donner un nom chacune des


entres et sorties. Par dfaut, si on ne spcifie pas de nom, ces proprits sont des cellules
vides.
Considrons lexemple suivant :

>> sys = tf(1,[1 5],'Inputdelay',0.5);


>> set(sys,'inputname','Tension (V)','outputname', ...
'Vitesse (rad/s)','notes','modle d''un moteur CC')

Contrle de procds

737

En invoquant la variable sys, nous retrouvons toutes les proprits de lobjet.


>> sys
Transfer function from input "Tension (V)" to output "Vitesse
(rad/s)":
1
exp(-0.5*s) * ----s + 5

Le type de ces proprits sont rappeles grce la commande set(sys).


>> set(sys)
num: Ny-by-Nu cell array of row vectors (Nu = no. of inputs)
den: Ny-by-Nu cell array of row vectors (Ny = no. of outputs)
ioDelay: Ny-by-Nu array of delays for each I/O pair
Variable: [ 's' | 'p' | 'z' | 'z^-1' | 'q' ]
Ts: Scalar (sample time in seconds)
InputDelay: Nu-by-1 vector
OutputDelay: Ny-by-1 vector
InputName: Nu-by-1 cell array of strings
OutputName: Ny-by-1 cell array of strings
InputGroup: structure with one field per channel group.
OutputGroup: structure with one field per channel group.
Name: String
Notes: Text
UserData: Arbitrary

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'}
[]

Proprits spcifiques pour zpk :

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)

Pour avoir le ple, par exemple, on utilise la mme commande get.


>> get(sys_zpk,'p')
ans =
[-5]

Les diffrentes proprits sont dfinies comme suit :


>> get(sys_zpk)
z:
p:
k:
ioDelay:
DisplayFormat:
Variable:
Ts:

{[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'}
[]

Proprits spcifiques pour ss :


:
a
Matrice dtat A
b
Matrice de commande B
c
Matrice dobservation C
d
Matrice de passage direct
D
e
Descripteur de la moyenne
de ltat.
InternalDelay
Retards internes
StateName
Noms des tats
Scaled
Etat mis lchelle pour
une meilleure prcision ?
On fait de mme que prcdemment en forant la classe ss.
>> sys_ss=ss(sys)
a =
x1
x1 -5
b =
x1

Tension (V)
1

c =
Vitesse (rad

x1
1

d =
Vitesse (rad

Tension (V)
0

Input delays (listed by channel): 0.5


Continuous-time model.
>> get(sys_ss)
a: -5

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.

Proprits spcifiques pour frd

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')

Les 10 premires rponses en frquences sont:


Frequency(Hz)
------------0
1
2
3
4
5
6
7

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

V.2.5. Les systmes LTI dans SIMULINK

Dans la partie SIMULINK de la boite outils Control System Toolbox , nous


pouvons utiliser le bloc LTI System pour dfinir un modle LTI soit sous forme de
fonction de transfert soit sous ses autres formes comme les quations dtat.
Dans le cas suivant, nous le dfinissons sous la forme de fonction de transfert dont nous
spcifions le numrateur et le dnominateur.
Soit le modle suivant du 1er ordre de constante de temps 20 s et de gain statique unit :

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

Nous utilisons la commande ss(A,B,C,D) dans le champ LTI system variable


du bloc, comme on peut le voir en double-cliquant sur ce bloc.

Les matrices A, B, C, D peuvent tre entres directement dans un callback de la fentre du


modle SIMULINK (Voir chapitre Callbacks).
On utilisera le callback InitFcn qui est appel chaque initialisation du modle
SIMULINK, tf_ss.mdl.

Contrle de procds

743

Les fonctions MATLAB, excutes sont celles o lon spcifie ces matrices.

On choisit loption Model Properties du menu File.


La commande excute sera alors le calcul des matrices dtat par zp2ss.

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

Nous obtenons linterface graphique suivant :

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)

Le Viewer Preferences qui permet de spcifier les prfrences daffichage des


courbes, textes, mode daffichage des axes (linaire ou logarithmique), etc. peut tre ouvert
par le menu Edit, en choisissant Viewer Preferences.
On peut spcifier les units de frquence, le style du texte, etc.
Le Viewer Preferences peut tre aussi ouvert par la commande suivante :

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

Contrle par logique floue

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).

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_16, Springer-Verlag Berlin Heidelberg 2010

Chapitre 16

748

Il existe plusieurs types de fonctions dappartenance : triangulaire, gaussienne, etc.


Le domaine dans lequel la logique floue a t le plus applique est la conduite de procds
industriels dont on ne possde pas de modle mathmatique ou trop fortement non linaires.
Considrons le cas du pendule invers, pour lequel on doit maintenir le pendule sa position
verticale en agissant sur la force applique au chariot qui le supporte.

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

II. Etapes de mise en uvre dun contrleur flou


II.1. Etape de fuzzification
Ltape de fuzzification consiste dfinir des ensembles flous pour les variables dentre et
de sortie.
Pour chacune de ces variables, on doit connatre a priori son intervalle de dfinition. Dans la
plupart des cas, le rgulateur flou reoit comme variables dentre, lerreur entre la sortie du
processus et le signal de consigne ainsi que la variation de cette erreur.
La drive de cette erreur suffit pour reprsenter sa variation.
Ainsi la loi de commande peut tre schmatise comme suit :
r(t) -

e(t)

Contrleur flou
1 z

Processus

y(t)

749

Contrle par logique floue


Dans le cas du pendule invers, il sagit davoir = 0 . Lerreur et sa variation sont alors :

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

II.2. Etape dinfrence

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

Contrle par logique floue

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

Lagrgation des rgles 1 et 2 se fait en prenant en chaque point de lensemble de dfinition


de la variable de sortie (univers de discours), le maximum des surfaces obtenues.

Chapitre 16

752
NG

-10

-5

NG

-10

-5

NG

5
Z

PG

10 u
PG

10 u

PG
max

-10

-5

10 u

Si les rgles 1 et 2 sont actives en mme temps, la fonction dappartenance de la variable de


sortie est symbolise par la surface pleine ci-dessus.
Cette mthode est dite infrence max-min . Une autre mthode, dnomme somprod consiste utiliser le produit pour le ET et la demi-somme pour le OU.
II.3. Etape de dfuzzification

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

TOOLBOX dispose de plusieurs types de

centre de gravit de la surface,


bissecteur de la surface,
moyenne des maximas,
plus petit des maximas en valeur absolue,
plus grand des maximas en valeur absolue.

753

Contrle par logique floue

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

III. Linterface graphique de la bote outils Fuzzy Logic TOOLBOX


La commande fuzzy permet douvrir linterface graphique FIS Editor dans laquelle on peut
dfinir compltement le systme flou. Par dfaut, linterface propose une entre et une sortie
avec la mthode de Mamdani. Les oprateurs ET et OU sont raliss respectivement par le
min et le max, limplication se fait par le min, lagrgation des rgles par le max et la
dfuzzification par la mthode du centre de gravit (centroid).

755

Contrle par logique floue

On dcrit ci-aprs les diffrents menus et leurs options.

Menu File

New FIS
Import

:
:

Export

Print
Close

:
:

nouveau systme flou de type Mamdani ou Sugeno,


lecture dun systme flou sauvegard sur disque (fichier
.FIS),
Export du systme flou vers lespace de travail ou un
fichier,
impression,
Fermeture de la fentre.

Menu Edit

Undo
:
Add Variable
:
Remove Selected Variable :
Membership Functions

Rules

annuler la dernire modification,


ajout dune variable dentre ou de sortie,
suppression de la variable dentre ou de sortie
pralablement slectionne,
dition des fonctions dappartenance (ensembles
flous),
dition des rgles floues.

Chapitre 16

756

Menu View

Rules

: permet de passer la fentre Rule Viewer dans laquelle on peut


donner toutes les variables dentre des valeurs quelconques laide
de la souris ou par des valeurs numriques en les entrant dans le
vecteur ligne Input. On observe ainsi la surface floue de
la variable de sortie ainsi que sa valeur numrique aprs

dfuzzification,
Surface

: permet de passer la fentre Surface Viewer dans laquelle est


affiche la surface reprsentant la variable de sortie en fonction des
variables dentre.

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.

Contrle par logique floue

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.

Contrle par logique floue

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

Pour pouvoir utiliser ce rgulateur dans SIMULINK ou dans un fichier M, il faut


imprativement le sauvegarder dans lespace de travail, laide de loption Export To
Workspace du menu File.
Lorsquon aura export le systme flou vers lespace de travail, on peut vrifier lexistence de
ce systme flou et voir ses caractristiques, grce aux commandes whos et linvocation de
son nom aprs le prompt.
>> whos
Name
reg_flou

Size
1x1

Bytes
8096

Class
struct

Attributes

Le systme flou est connu comme une structure.


>> reg_flou
reg_flou =
name:
type:
andMethod:
orMethod:
defuzzMethod:
impMethod:
aggMethod:
input:
output:
rule:

'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

Contrle par logique floue


ans =
1x9 struct array with fields:
antecedent
consequent
weight
connection
antecedent correspond aux entres, consequent aux sorties.
>> a1=reg_flou.rule.antecedent
x =
1
1
>> b1=reg_flou.rule.consequent
b1 =
5

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

On se propose de raliser le mme type de rgulateur flou avec 2 entres : lerreur et sa


variation dont chacune sera dfinie par 3 ensembles flous de formes gaussiennes.
La cration dun systme flou se fait laide de la commande newfis qui accepte jusqu' 7
arguments.
Ses diffrentes syntaxes sont :
sys_flou = newfis('nom_syst');
sys_flou
nom_syst

:
:

matrice caractrisant le systme flou,


nom du systme flou.
sys_flou = newfis(nom_syst, type)

nom_syst
type

:
:

nom du systme flou,


type Mamdani ou Sugeno.

La syntaxe gnrale avec les 7 arguments est :


sys_flou = newfis('nom_syst',type,ET_methode, OU_method,
imp_method, agg_method,deffuz_method);
nom_syst
type
ET_methode
OU_method
imp_method

:
:
:
:
:

nom du systme flou,


type Mamdani ou Sugeno,
mthode utilise pour loprateur ET,
mthode utilise pour loprateur OU,
mthode dimplication (min ou prod),

Chapitre 16

762
agg_method

deffuz_method

mthode dagrgation des rgles (max, OU probabiliste


ou somme),
mthode de dfuzzification.

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

:
:
:
:

nom du systme flou,


variable dentre 'input' ou de sortie 'output',
nom de la variable auquel feront rfrence les rgles floues,
intervalle de valeurs que prend la variable.

sys_fuz = addmf(nom, 'type', num, nom_mf,


type_mf,params)
nom
type
num
nom_mf
type_mf
params

:
:
:
:
:
:

nom de la fonction dappartenance,


variable dentre 'input' ou de sortie 'output',
numro de la variable (la variable n 1 est la 1re cre),
nom de la fonction dappartenance,
type de la fonction dappartenance, exemple gaussmf
paramtres de la fonction dappartenance.

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

Contrle par logique floue


% gaussiennes d'cart-type 5, centres sur -10, 0 et 10
sys_flou = addmf(sys_flou,'input',1,'Negative','gaussmf',...
[5 min(interv_err)]);
sys_flou = addmf(sys_flou,'input',1,'Nulle','gaussmf',...
[5 mean( interv_err)]);
sys_flou = addmf(sys_flou,'input',1,'Positive','gaussmf',...
[5 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 5, centrs sur -10, 0 et 10
sys_flou = addmf(sys_flou,'input',2,'Negative','gaussmf',...
[5 min(interv_derr)]);
sys_flou = addmf(sys_flou,'input',2,'Nulle','gaussmf',...
[5 mean(interv_derr)]);
sys_flou = addmf(sys_flou,'input',2,'Positive','gaussmf',...
[5 max(interv_derr)]);

A ce niveau, on a ralis la fuzzification des 2 entres du rgulateur flou.


Le trac des fonctions dappartenance de la premire valeur dentre du systme sys_flou
se fait par la commande plotmf.
>> figure, plotmf(sys_flou,'input',1)
>> title('ensembles flous de l''erreur'), grid
>> ylabel('degrs d''appartenance')
ensembles flous de l'erreur
Negative

Nulle

degrs d'appartenance

Positive

0.8

0.6

0.4

0.2

0
-10

-8

-6

-4

-2

err

10

Chapitre 16

764

suite du fichier prog_flou.m


% dfinition de la variable de sortie du rgulateur
interv_cde = [-10 10];
sys_flou = addvar(sys_flou,'output','cde',interv_cde);
% dfinition des 5 fonctions d'appartenance triangulaires
base1 = [-15 -10 -5]; % base de la 1re fonction triangulaire
sys_flou = addmf(sys_flou,'output',1,'GN','trimf',base1);
base = base1+5;
sys_flou = addmf(sys_flou,'output',1,'N','trimf',base);
base = base+5;
sys_flou = addmf(sys_flou,'output',1,'Z','trimf',base);
base = base+5;
sys_flou = addmf(sys_flou,'output',1,'P','trimf',base);
base = base+5;
sys_flou = addmf(sys_flou,'output',1,'GP','trimf',base);

On trace les fonctions dappartenance de la variable de sortie.


figure
plotmf(sys_flou,'output',1)
title(ensembles flous de la variable de sortie)
grid
ylabel ('degrs d''appartenance')
ensembles flous de la variable de sortie
GN

degrs d'appartenance

>>
>>
>>
>>
>>

GP

0.8

0.6

0.4

0.2

0
-10

-8

-6

-4

-2

cde

10

765

Contrle par logique floue

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)

suite du fichier prog_flou.m


% dition de la matrice des rgles floues
regles = [1 1 5 1 1
1 2 4 1 1
1 3 3 1 1
2 1 4 1 1
2 2 3 1 1
2 3 2 1 1
3 1 3 1 1
3 2 2 1 1
3 3 1 1 1];
sys_flou = addrule(sys_flou,regles);

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

et d_err est Negative alors cde est GP';


et d_err est Nulle alors cde est P
';
et d_err est Nulle alors cde est Z
';
d_err est Negative alors cde est P
';
d_err est Nulle alors cde est Z
';
d_err est Positive alors cde est N
';
et d_err est Negative alors cde est Z ';
et d_err est Nulle alors cde est N
';
et d_err est Positive alors cde est GN'];

>> sys_flou = parsrule(sys_flou,regles,'verbose','francais');

La commande showrule affiche les rgles de faon normalise.


>> showrule(sys_flou)
>> showrule(sys_flou)
ans =
1. If (err is Negative) and (d_err
2. If (err is Negative) and (d_err
3. If (err is Negative) and (d_err
4. If (err is Nulle) and (d_err is
5. If (err is Nulle) and (d_err is
6. If (err is Nulle) and (d_err is
7. If (err is Positive) and (d_err
8. If (err is Positive) and (d_err
9. If (err is Positive) and (d_err

is Negative) then (cde


is Nulle) then (cde is
is Positive) then (cde
Negative) then (cde is
Nulle) then (cde is Z)
Positive) then (cde is
is Negative) then (cde
is Nulle) then (cde is
is Positive) then (cde

is GP) (1)
P) (1)
is Z) (1)
P) (1)
(1)
N) (1)
is Z) (1)
N) (1)
is GN) (1)

suite du fichier prog_flou.m


% sauvegarde sur disque sous le nom 'regul_flou.fis'
writefis(sys_flou,'regul_flou');
% suppression des variables intermdiaires
clear interv_cde regles base interv_derr base1 interv_err

Le systme est maintenant compltement dfini.


La commande getfis, possdant plusieurs syntaxes, permet davoir des informations sur le
systme : nombre dentres, densembles flous de chacune delles, etc.

nom du systme flou dfini par la matrice sys_flou


>> getfis(sys_flou,'name')
ans =
regul_flou

Contrle par logique floue

caractristiques de la 1re entre


>> getfis(sys_flou,'input',1)
Name =
err
NumMFs =
3
MFLabels =
Negative
Nulle
Positive
Range =
[-10 10]
ans =
Name: 'err'
NumMFs: 3
mf1: 'Negative'
mf2: 'Nulle'
mf3: 'Positive'
range: [-10 10]

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]

caractristiques du systme flou


>> getfis(sys_flou)
Name
= regul_flou
Type
= mamdani
NumInputs = 2
InLabels =
err
d_err
NumOutputs = 1
OutLabels =
cde
NumRules = 9

767

Chapitre 16

768
AndMethod = min
OrMethod = max
ImpMethod = min
AggMethod = max
DefuzzMethod = centroid
ans =
regul_flou

caractristiques du 1er ensemble flou de la 1re entre


>> getfis(sys_flou,'input',1,'mf',1)
Name = Negative
Type = gaussmf
Params = [5 -10]
ans =
Name: 'Negative'
Type: 'gaussmf'
params: [5 -10]

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.

caractristiques de lensemble du systme flou


La commande showfis dcrit compltement le systme flou, pour chacune des entres ou
sorties, elle retourne tous ses paramtres (nom, domaine de variations, nombre et types de
fonctions dappartenance, etc.).
De plus, elle indique la mthode utilise (si elle nest pas spcifie, celle de Mamdani est
prise par dfaut) et affiche la liste des rgles.
>> showfis(sys_flou)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.

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

Contrle par logique floue


17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
51.
52.
53.
54.
55.
56.
57.
58.

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

affichage de la liste des rgles


La commande showrule, sans spcification du type de langage, affiche la liste des rgles
sous forme linguistique, en anglais par dfaut.
>> showrule(sys_flou)
ans =
1.If
2.If
3.If
4.If
5.If
6.If
7.If
8.If
9.If

(err
(err
(err
(err
(err
(err
(err
(err
(err

is
is
is
is
is
is
is
is
is

Negative) and (d_err


Negative) and (d_err
Negative) and (d_err
Nulle) and (d_err is
Nulle) and (d_err is
Nulle) and (d_err is
Positive) and (d_err
Positive) and (d_err
Positive) and (d_err

is Negative) then (cde


is Nulle) then (cde is
is Positive) then (cde
Negative) then (cde is
Nulle) then (cde is Z)
Positive) then (cde is
is Negative) then (cde
is Nulle) then (cde is
is Positive) then (cde

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)

gnration de la surface de la variable de sortie en fonction des entres

GP) (1)
(1)
Z) (1)
GN) (1)
Z) (1)
(1)

771

Contrle par logique floue

La commande surfview(sys_flou) ouvre la fentre Surface Viewer dans laquelle


on a la possibilit de modifier langle de vue laide de la souris en dplaant un point
quelconque de la fentre.
Pour obtenir une meilleure prcision graphique, on peut aussi augmenter le nombre de mailles
pour chacune des 2 entres, en entrant une valeur plus grande pour Xgrids et Ygrids.
La commande gensurf(sys_flou) trace cette surface dans une fentre graphique.

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),

>> title('commande en fonction de l''erreur et de sa variation')

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

Une reprsentation graphique du systme, qui rappelle succinctement les paramtres


essentiels (nombre dentres et de sorties, nombre et types de fonction dappartenance, etc.),
est obtenue par la commande plotfis.
>> plotfis(sys_flou)
>> gtext('reprsentation graphique du systme flou')
reprsentation graphique du systme flou

err (3)

regulflou

(mamdani)

9 rules
cde (5)

derr (3)

System regulflou: 2 inputs, 1 outputs, 9 rules

Contrle par logique floue

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

Pour utiliser ce rgulateur, on excute le programme prog_flou.m.

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

Contrle par logique floue


titre1 = 'rgulation par logique floue - ';
titre2 = 'signaux de consigne et de sortie';
title(strcat(titre1,titre2));
xlabel('temps discret')
figure(2)
% signal de commande appliqu au processus
stairs(u)
xlabel('temps discret'), grid
title('signal de commande appliqu');
figure(3)
% signal de sortie du rgulateur flou
stairs(du);
title('sortie du rgulateur flou')
xlabel('temps discret')
grid
figure(4)
subplot(211)
% signal derreur
plot(err)
axis([0 length(err) -6 6])
title('erreur')
grid
subplot(212)
% variation de lerreur
plot(d_err), axis([0 length(d_err) -6 6])
title('drive de l''erreur'), grid
xlabel('temps discret')
rgulation par logique floue -signaux de consigne et de sortie

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

sortie du rgulateur flou

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

Contrle par logique floue

A partir des courbes de lerreur et de sa variation, on peut facilement vrifier la table


dinfrence (rgles floues).
erreur
5

-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

On peut rendre le systme de commande plus dynamique en rtrcissant le domaine de


valeurs de lerreur et de sa drive lors de ltape de fuzzification.
Les lignes de commandes suivantes du fichier prog_flou2.m permettent la modification
de lintervalle de dfinition de lerreur. Par consquent, on modifie aussi les paramtres
(cart-type et moyenne) des fonctions dappartenance de lerreur.
% dfinition des variables d'entre : l'erreur et sa variation
interv_err = [-1 1];
sys_flou = addvar(sys_flou,'input','err',interv_err);
% dfinition des ensembles flous des entres
% fonctions dappartenance gaussiennes d'cart-type 1, de
% moyennes respectives -1, 0 et 1
sigma = 1;
sys_flou = addmf(sys_flou,'input',1,'Negative','gaussmf',...
[sigma min(interv_err)]);
sys_flou = addmf(sys_flou,'input',1,'Nulle','gaussmf',...
[sigma mean(interv_err)]);
sys_flou = addmf(sys_flou,'input',1,'Positive','gaussmf',...
[sigma max(interv_err)]);

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.

V. Utilisation du rgulateur flou dans SIMULINK

La boite outils Fuzzy Logic Toolbox est un outil additionnel Simulink.

La librairie comporte 3 blocs dont le premier comporte diffrentes formes de fonctions


dappartenance (ensembles flous), les 2 autres tant des rgulateurs.

Contrle par logique floue

779

Le bloc reprsentant un systme flou existe dans la librairie Blocksets &


Toolboxes/SIMULINK Fuzzy.

A partir de linterface graphique, nous avons sauvegard ce systme sous le nom


regul_flou.fis et dans lespace de travail sous forme dune matrice regul_flou.
Pour associer ce bloc au rgulateur flou cr prcdemment, on double-clique sur licne pour
spcifier le nom reg_flou de la matrice prsente dans lespace de travail.

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

On fait de mme pour le signal de sortie du rgulateur et la commande totale applique au


processus. Grce au bloc Switch, le gain multiplicatif de la commande floue vaut 0.2
jusqu' linstant t=300 puis 0.8 jusqu' la fin.

Comme le montre la figure prcdente, en double-cliquant sur le bloc Switch, on spcifie


linstant auquel le signal dentre change de port dentre (du port 1 vers le port 2).
On utilise lditeur de systmes flous en ralisant successivement les 3 actions suivantes :
- excution de la commande fuzzy,
- importation du systme flou partir du fichier reg_flou.fis
- exportant ce mme systme flou vers lespace de travail Matlab.

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

Contrle par logique floue


y = cs(2,:);
r = cs(3,:);

% sortie
% consigne

% affichage des signaux de consigne et de sortie


figure(1)
plot(t,r)
hold on
h = plot(t,y);
set(h,'LineWidth',2);
plot(300*ones(1,25),-1.2:0.1:1.2,'-.')
axis([0 600 -1.5 1.5]), hold off
title('Signaux de consigne et de sortie')
xlabel('temps discret')
text(150,-1.25,'Gain k = 0.2'), text(400,-1.25,'Gain k = 0.8')
% trac du signal de commande
figure(2)
stairs(t,ut)
hold on
% trac de la sortie du rgulateur flou
h = stairs(t,uf);
set(h,'LineWidth',2);
plot(300*ones(1,21),-1:0.1:1,'-.'), hold off
title('Sortie du rgulateur flou et commande applique')
xlabel('temps discret')
text(150,-1.25,'Gain k = 0.2')
text(400,-1.25,'Gain k = 0.8')
Signaux de consigne et de sortie

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

Ce type de commande floue est analogue une commande PI (proportionnelle et intgrale).


Lintgrateur annule lerreur statique et le gain multiplicatif agit sur le temps de rponse.
Sortie du rgulateur flou et commande applique

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

Contrle par logique floue

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).

Nous obtenons ainsi, trs facilement partir du programme reg_flou1.mdl, le


programme de la commande floue, reg_flou2.mdl, sans lajout de lintgration.
On utilise le mme systme flou que prcdemment, reg_flou.fis.

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

Avec k=1, lerreur statique est quasiment nulle.


Sortie du rgulateur flou et commande applique

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

Contrle par logique floue

Si on continue augmenter ce gain, on arrive linstabilit du systme.


Sortie du rgulateur flou et commande applique

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

Avec un gain k=1.8, on observe lapparition de linstabilit.

VI. Mthode de Sugeno


La mthode de Mamdani, datant de 1975, est beaucoup plus rpandue dans la thorie du
contrle de procds. La mthode de Sugeno (1985) en diffre au niveau de la dfinition de
la variable de sortie et, par consquent, des mthodes de dfuzzification.
Rien ne change au niveau de la fuzzification des variables dentre. La variable de sortie
prend, soit une valeur constante (singleton) indpendant des valeurs des entres, soit une
combinaison linaire de celles-ci.
Ce singleton sera, lors de ltape de dffuzification, pondr par les degrs dappartenance
des variables dentre.
La rgle gnrale dune rgle de type Sugeno est, pour un systme 2 entres e1 et e2 :
Si e1 est A ET e2 est B Alors sortie = p*e1+q*e2+r

avec A et B qui sont des fonctions dappartenance, respectivement, de e1 et e2, et p, q, r


des constantes choisies par lutilisateur pour dfinir la combinaison linaire des entres.

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

Rgulateur par Sugeno

0.8

0.6

0.4

0.2

0
-10

-8

-6

-4

-2

err

10

787

Contrle par logique floue


ensembles flous de la variation de l'erreur

Rgulateur par Sugeno

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]

Remarquons que la taille du vecteur Params est gale au nombre dentres + 1.


On peut choisir un singleton constant pour chaque ensemble flou de la sortie qui sera pondr
par le degr dappartenance minimal (dans le cas du ET).

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

Ces rsultats sont schmatiss par les figures suivantes :

789

Contrle par logique floue

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 :

cde = (2)*1+(1)*(-0.5) = 1.5


cde = (1)*1+(1)*(-0.5) = 0.5

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

cas NN : min = 0.4328

0.8411

cas PN : min = 0.5709

0.5709
0.4328

cas PP : min = 0.2107


0.2107

-10

10

err

-1

-0.5

d_err

cas NP : min = 0.2107

Dans chaque cas, la valeur du singleton est pondre par


dappartenance :
cas NN
: cde = 1.5*0.4328 =
cas NP
: cde = 0.5*0.2107 =
cas PN
: cde = 0.5*0.5709 =
cas PP
: cde = 1.5*0.2107 =

le minimum des degrs


0.6492
0.1054
0.2854
0.3160

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 =

1.5* 0.4328 + 0.5* 0.2107 + 0.5* 0.5709 + 1.5* 0.2107


= 0.9515
0.4328 + 0.2107 + 0.5709 + 0.2107

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

Contrle par logique floue


surface engendre par la sortie du rgulateur

20

cde

10
0
-10
-20
1
0.5

10
5

-0.5

derr

-5
-1

-10

err

Dans le fichier cde_sug.m, on utilise le rgulateur pour la poursuite du mme signal de


consigne que prcdemment. A linstant t = 150, on cre une perturbation de valeur 1.
fichier cde_sug.m
% Utilisation du rgulateur flou de Sugeno
% dans une loi de commande
% lecture du rgulateur de Sugeno
reg = readfis('reg_sug');
% 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);
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);
% entre du rgulateur
x = [err(i) d_err(i)];
% sortie du rgulateur
du(i) = evalfis(x,reg);

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

Contrle par logique floue


applied control signal

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

La figure suivante montre les courbes de lerreur et de sa variation.

400

450

Chapitre 16

794

En analysant chaque instant dchantillonnage, la courbe donnant la sortie du rgulateur, on


peut facilement retrouver leffet des rgles floues dfinies.
error

6
4
2
0
-2
-4
-6

50

100

150

200

250

300

350

400

300

350

400

derivative of the error

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

Le fichier prog_flou3.m permet la programmation avec des commandes spcifiques la


bote outils Fuzzy Logic TOOLBOX, du rgulateur flou ralis prcdemment par
linterface graphique.
fichier prog_flou3.m
% cration d'un rgulateur flou de type Sugeno
sys_flou = newfis('reg_sug2','sugeno');
% dfinition des variables d'entre : l'erreur et sa variation
interv_err = [-10 10] ; interv_derr = [-1 1];
sys_flou = addvar(sys_flou,'input','err',interv_err);
% dfinition des ensembles flous des entres
sigma = 8.5;
sys_flou = addmf(sys_flou,'input',1,'Neg','gaussmf',...
[sigma min(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

795

Contrle par logique floue


sys_flou = addvar(sys_flou,'input','d_err',interv_derr);
sigma = 0.85;
sys_flou = addmf(sys_flou,'input',2,'N','gaussmf',...
[sigma min(interv_derr)]);
sys_flou = addmf(sys_flou,'input',2,'P','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 4 ensembles flous de sortie
sys_flou = addmf(sys_flou,'output',1,'NN','linear',[2
sys_flou = addmf(sys_flou,'output',1,'PN','linear',[1
sys_flou = addmf(sys_flou,'output',1,'NP','linear',[1
sys_flou = addmf(sys_flou,'output',1,'PP','linear',[2
regles = ['si
'si
'si
'si

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');

Il y a cration du systme flou sys_flou.fis


>> whos
Name
sys_flou

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

Dans le fichier prog_flou4.m, on cre le rgulateur flou reg_sug3.fis. Les


modifications apportes au fichier prog_flou3.m sont les lignes de code suivantes :
fichier prog_flou4.m (modification du fichier prog_flou3.m)
...

% dfinition des 4 singletons constants de sortie


sys_flou = addmf(sys_flou,'output',1,'GP','constant',10);
sys_flou = addmf(sys_flou,'output',1,'P','constant', 5);
sys_flou = addmf(sys_flou,'output',1,'N','constant',-5);

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')

Les caractristiques du rgulateur (type, caractristiques des variables dentre, de sortie,


mthodes dimplication, de dfuzzification, etc.) peuvent tre affiches sous la forme dun
texte ASCII par la commande edit.
>> edit reg_sug3.fis
[System]
Name ='reg_sug3'
Type = 'sugeno'
NumInputs = 2
NumOutputs = 1
NumRules = 4
AndMethod = 'prod'
OrMethod = 'probor'
ImpMethod = 'min'
AggMethod = 'max'
DefuzzMethod = 'wtaver'
[Input1]
Name = 'err'
Range = [-10 10]
NumMFs = 2
MF1 = 'Neg':'gaussmf',[8.5 -10]
MF2 = 'Pos':'gaussmf',[8.5 10]
[Input2]
Name = 'd_err'
Range = [-1 1]
NumMFs = 2
MF1 = 'Negat':'gaussmf',[0.85 -1]
MF2 = 'Posit':'gaussmf',[0.85 1]
[Output1]
Name = 'cde'
Range = [-10 10]
NumMFs = 4
MF1 = 'GP':'constant',10
MF2 = 'P':'constant',5

797

Contrle par logique floue


MF3 = 'N':'constant',-5
MF4 = 'GN':'constant',-10
[Rules]
1 1, 4 (1)
1 2, 3 (1)
2 1, 2 (1)
2 2, 1 (1)

:
:
:
:

1
1
1
1

Par dfaut, un systme flou de Sugeno ralise le ET par le produit, le OU par le OU


probabiliste, limplication par le min, lagrgation des rgles par le max et la
dfuzzification par la mthode wtaver.
Le OU probabiliste ou somme algbrique est dfini par :
a Ou_prob b = a + b - a b

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

Le gain multiplicatif de la sortie du rgulateur est de 0.2.


A linstant discret t = 150, on remarque la perturbation rejete avec un lger dpassement.

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.

Contrle par logique floue

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

Avec un gain de 0.7, on obtient une bonne poursuite du signal de consigne.

400

801

Contrle par logique floue


fuzzy regulation, target and process output signals

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

Contrle par logique floue


fuzzy regulation : target and process output signals

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

VII. Bloc Fuzzy Logic Controller with Ruleviewer

Avec ce contrleur, nous avons la possibilit dobserver en temps rel, les variations des
variables du systme flou dans la fentre Ruleviewer.

Contrle par logique floue

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.

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0_17, Springer-Verlag Berlin Heidelberg 2010

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

La somme pondre des signaux dentre (stimuli), constituant lactivation du neurone, se


transforme en sortie aprs son passage par une fonction de seuillage ou de transfert.

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.

II. Rseaux de neurones linaires adaptatifs


II.1. Architecture
x1

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

II.2. Loi dapprentissage

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

Daprs lexpression de E k , et avec y k = W x k + b , les drives partielles sont :

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

avec le gain dapprentissage.


De mme, on obtient lexpression de la modification du biais :

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

:
:
:
:
:

erreur en sortie e = t - y, de dimensions (S, 1),


vecteur dentre, de dimensions (R, 1),
gain dapprentissage,
variation des poids, dimensions (S, R),
variations des biais, dimensions (S, 1).

II.3. Quelques domaines dapplication


II.3.1. Identification de processus

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 :

x = [ y (t 1) u(t 1) u(t 2)]T , b = 0

Le fichier adal_ident1.m permet de simuler un modle ARMA et de dterminer les


signaux dentre et de cible pour le neurone.
fichier adal_ident1.m
% identification par solvelin
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 = 100; % nombre de points
for i = 11:N
u(i) = -u(i-7)*u(i-10);
end
y = (dlsim(B,A,u))'
% affichage des signaux d'entres-sorties
plot(u)
hold on
plot(y)
xlabel('chantillons')
title('signaux d''entre et de sortie du systme
identifier')
grid
% signaux retards
y1 = delaysig(y,1)
y1 = y1(2,:);
u1 = delaysig(u,2);
u2 = u1(3,:);
u1 = u1(2,:);

812

Chapitre 17

% suppression des lments nuls des signaux retards


u1 = u1(3:N);
u2 = u2(3:N);
y1 = y1(3:N);
y = y(3:N);
% entres du neurone
x = [u1;u2;y1];
t = y;
% utilisation de la commande solvelin
[w,b] = solvelin(x,t)
input and output signals of the system to be identified

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

disp(['valeurs finales des poids et du biais :']);


W, b
% trac de l'volution des poids
for k = 1:3
x = poids_W(1,k,:);
plot(x(:)), hold on
end
eta = num2str(eta);
title(['volution des poids W et du biais b, \eta=' eta])
xlabel('chantillons')
plot(biais_b(:),':')
W weights and b bias evolution, = 0.1

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

A la fin de lapprentissage, nous obtenons :


final values of weights and bias
W =
0.7973
0.9999
-0.4976
b =
-0.0012
II.3.2. Prdiction de signal

On programme la rgle dapprentissage de la loi de Widrow-Hoff sans avoir recours des


fonctions de la bote outils.

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,

\eta = ' num2str(eta)])

816

Chapitre 17

figure(2)
plot(e)
title(['erreur de prdiction,
hold on
plot(r-r_est)
hold off

\eta = ' num2str(eta)])

% trac de l'volution des poids


figure(3)
for k = 1:R
x = poids_W(1,k,:);
plot(x(:))
hold on
end
hold off
title(['volution des poids W,
xlabel('temps discret')

\eta = ' num2str(eta)])

% trac de l'volution du biais


figure(4)
plot(biais_b(:))
title(['volution du biais, \eta = ' num2str(eta)])
xlabel('temps')

Signaux rel et prdit

= 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

valeurs finales des poids et du biais :


W =
0.8893
-0.3623
-0.7312
-0.2417
b =
-0.0028

0.4507

Evolution des poids W = 0.1

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

II.3.3. Suppression dinterfrence

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

:
:

sortie, erreur, poids et biais finaux,


poids et biais initiaux, matrice dentre, cible et gain
dadaptation des poids et biais.

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

Initialisation alatoire des poids W et du biais b


= length(temps); % nombre d'entres
= R;
signal parasite p
= randn(size(r));

% 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

Nous obtenons le poids et le biais suivants :


w =
-0.5166
b =
-0.1922

Dans le fichier sup_interf2.m, nous utilisons la fonction learnwh de la bote outils


Neural Network TOOLBOX.

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

Initialisation alatoire des poids W et du biais b


= 1;
= S;
signal parasite p
= randn(size(temps));

% 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

III. Rseaux couches caches, rtropropagation de lerreur


III.1. Principe

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 W et w0 reprsentent respectivement la matrice de poids de dimensions (L, I) et vecteur


biais (I, 1) et x le vecteur stimulus (J, 1).
Chaque cellule de la couche cache transforme son entre en rponse travers une fonction
de transfert.
h = f (h _ in) = f (W x + w0)
De mme, chaque cellule de la couche de sortie transforme son entre en sortie par une
fonction de transfert.
La rponse de la couche de sortie est donne par :

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

La fonction de transfert ou dactivation, non linaire et croissante, permet dintroduire un


seuil et une saturation. Dans la technique de rtropropagation, lalgorithme fait intervenir la
drive de cette fonction. Il est alors intressant dutiliser des fonctions dont la drive est
facile calculer. Les fonctions les plus courantes sont les sigmodes unipolaire et bipolaire
transformant respectivement lintervalle ; en [0 ; 1] et [ 1; 1] ainsi que la fonction
tangente hyperbolique.

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

dont la drive est donne par :


f 4' ( x ) = f 1 ( x ) [1 f 1 ( x )]

Si lon veut, de plus, modifier les valeurs extrmes, on dfinit la fonction

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)]

Le fichier fonction sigm_var.m implmente cette fonction sigmodale.


fichier fonction sig_param.m
function [g, gp] = sig_param(x,par)
g = par(1)*logsig(par(3)*x)-par(2);
gp = (par(2)+g).*(par(1)-par(2)-g)*par(3)/par(1);

Le fichier sigm_var.m permet de tracer plusieurs versions de cette sigmode et leurs


drives.
fichier sigm_var.m
% fonction sigmode paramtrable
close all
x = -10:0.1:10;
% a_b_s : vecteur contenant alpha, beta et sigma
abs1 = [4 2 2];
[g1,gp1] = sig_param(x,abs1);
plot(x,g1)
text(-0.9,-1.5,'\leftarrow \alpha=4, \beta = 2, \sigma =
2',...
'HorizontalAlignment','left')
hold on

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

sigmode de pente et de valeurs extrmes variables


- x

g(x) = /(1+e ) -

1.5
1
0.5
0

=3, =1, = 0.5

-0.5
-1
-1.5

= 4, = 2, = 1

=4, = 2, = 2

-2
-2.5
-10

-8

-6

-4

-2

10

10

activation x

drives des sigmoides


g'(x) = [ + g(x)] [- - g(x)]
2

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)

retourne le vecteur des drives, soit o .*(1 o) .

III.3. Algorithme de rtropropagation

On note :
X

xk
T
tk
hk
ok
W

:
:
:
:
:
:

w0
Z

:
:

z0

matrice de stimuli, dimensions (I, N) o N reprsente le nombre de


stimuli prsenter au rseau,
stimulus n k (colonne n k de la matrice X),
matrice de cibles ou rponses thoriques, dimensions (I, N),
cible n k (colonne n k de la matrice T),
sortie de la couche cache, dimensions (L, 1),
rponse du rseau, vecteur colonne J composantes,
matrice de poids des connexions liant la couche dentre la couche
cache, dimensions (L, I),
vecteur de biais des cellules de la couche cache, dimensions (L, 1),
matrice de poids des connexions liant la couche cache la couche de
sortie, dimensions (J, L),
vecteur de biais des cellules de la couche de sortie, dimensions (J, 1).

A chaque prsentation dun stimulus n k, on ralise les 2 tapes successives suivantes :


1. le passage du stimulus de lentre vers la sortie du rseau,
2. la rtropropagation de lerreur dans le rseau pour la mise jour des matrices de
poids et de biais afin de rduire lerreur entre la sortie obtenue et la cible
recherche.
passage du stimulus travers le rseau
Chaque cellule de la couche cache somme toutes ses entres et fait passer le signal obtenu
travers sa fonction de transfert. De mme pour les cellules de la couche de sortie. Sous forme
matricielle, le vecteur de sortie n k a pour expression :
ok = g [Z ( f (W x k + w0)+ z 0]
avec f et g , les fonctions de transfert, qui peuvent tre identiques, respectivement des
couches cache et de sortie.
Le vecteur de sortie est compar celui que lon dsire obtenir, le vecteur t k . On dduit
lerreur
ek = t k o k

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

Le gradient de E k par rapport la matrice Z peut se calculer comme suit :


E k / Z =

Ek Ek
ok
( Z hk + z 0)
=
Z
ok ( Z hk + z0)
Z

Daprs lexpression de E k , la premire drive partielle est :

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

avec le gain dapprentissage.


La mme mthode sera utilise pour la mise jour du vecteur des biais z0. En considrant que
le vecteur dentre passant par les biais est unitaire, on obtient facilement :
z 0( k + 1) = z 0( k ) E k / z 0 = z 0( k ) + (t k o k ) .* o k .* (1 o k ) = z 0( k ) + s

Lerreur en sortie s est rtropropage la sortie de la couche cache travers la transpose


de la matrice Z.
Par analogie lexpression prcdente de remise jour de la matrice Z, avec hk le vecteur de
sortie de la couche cache, on obtient :
W ( k + 1) = W ( k ) E k /W = W ( k ) + Z ( k )T s .* hk .* (1 hk ) x kT = W ( k ) + h x T

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)

retourne le vecteur des drives de lerreur en sortie dune


couche, soit o .* (1 o ) , si o dsigne le vecteur des sorties en
sortie de cette couche,

deltalog(o,e)

retourne la quantit e .* o .* (1 o ) . Dans les calculs prcdents,


cette quantit est note s ,

deltalog(h,ds,Z) :

retourne la quantit Z ( k )T ds .* hk .* (1 hk ) . Dans les calculs


prcdents, cette quantit est note h .

Ces diffrentes syntaxes propres la fonction sigmode unipolaire, sont les mmes pour les
fonctions de transfert deltatan et deltalin.

IV. Commande par modle inverse neuronal


Le modle inverse neuronal dun processus donn est un rseau de neurones qui permet de
calculer lentre (ou le signal de commande) u(t), de linstant discret t = kT, partir des
valeurs antrieures de ses entres-sorties.
Ltape de modlisation ncessite lacquisition dun fichier dentres-sorties du processus.
Pour que les diffrents modes du processus soient excits, on appliquera un signal riche en
frquences : une squence binaire pseudo-alatoire autour du point de fonctionnement dsir.
Si lon ralise N acquisitions, on obtient un fichier sous la forme dune matrice N lignes et 2
colonnes reprsentant respectivement lentre discrte u(t) et la sortie y(t).

Rseaux de neurones

833

On considrera, dans la suite, un modle de transmittance H(z),


H ( z) =

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.

IV.1. Premire architecture

Le rseau de neurones, ci-aprs, a pour but de fournir, chaque instant dchantillonnage, la


variation de commande u(t ) = u(t ) u(t 1) . La variation future de la sortie y (t + 1) ,
permettra, comme on le verra plus loin, de raliser une commande prdictive 1 pas
dchantillonnage.
1

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)

Le fichier modele.m permet lacquisition et laffichage des entres-sorties de ce modle.


fichier modele.m
% fichier de gnration d'E/S d'un modle de processus
clear all; close all
% Gnration d'un signal constant + S.B.P.A.
temps = 200;

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;

Lapprentissage du rseau, par la mthode de rtropropagation de lerreur, est ralis grce au


fichier apprent1.m. Les poids et les biais sont initialiss des valeurs alatoires, de
distribution uniforme entre -0.5 et 0.5. Le gain dadaptation est choisi gal 0.8. Tout le
fichier des entres-sorties est prsent au rseau pendant un nombre ditrations gal 300.
Nous avons choisi dutiliser 7 cellules dans la couche cache.
fichier apprent1.m
% Apprentissage du rseau de sortie = variation de la commande
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,:);
% 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 = 2:length(es_N1)-1
% stimulus n i
x=[dy_N(i+1) dy_N(i) y_N(i) y_N(i-1) u_N(i-1) du_N(i1)]';
% rponses des cellules de la couche cache
h = logsig(W*x+w0);
% rponse des cellules de la couche de sortie
o(i) = logsig(Z*h+z0);

Rseaux de neurones

837

% erreur en sortie du rseau


e(i) = du_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;
biais_w0(:,:,k) = w0;
biais_z0(:,:,k) = z0;
% sauvegarde des poids et biais dans fichier weights1.mat
save weights1 poids_W poids_Z biais_w0 biais_z0
home, clc, disp(['k = ' num2str(k)])
end % boucle while

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

hold off, grid, title('volution des poids W1k')


xlabel('itrations')
% trac de l'volution des biais de la couche cache
figure(2)
for k = 1:Nb_Hu
x = biais_w0(k,1,1:100);
plot(x(:)), hold on
end
hold off, grid
title('volution des biais des cellules de la couche cache')
xlabel('itrations')
% trac de l'volution des poids Z
figure(3)
for k = 1:Nb_Hu
x = poids_Z(1,k,1:100);
plot(x(:)), hold on
end
hold off, grid
title('volution des poids Z')
xlabel('itrations')
% trac de l'volution du biais z0
figure(4)
x = biais_z0(1:100);
plot(x(:)), grid
title('volution du biais de la cellule de sortie')
xlabel('itrations')

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

x=[dy_N(i+1) dy_N(i) y_N(i) y_N(i-1) u_N(i-1) du_N(i1)]';


% rponse des cellules de la couche de sortie
y(i) = logsig(Z*(logsig(W*x+w0))+z0);
end % boucle for
y = y(1:100);
figure(1), plot(y), hold
h = plot(du_N(1:100));
set(h,'LineWidth',1.5)
title(['rponses relle et dsire du rseau aprs ' ...
num2str(N) ' itrations'])
axis([0 100 0 1]), grid, hold off
figure(2), du_N = du_N(1:100);
erreur = y-du_N;
plot(erreur), grid
axis([0 100 -0.2 0.2])
title(['erreur d''apprentissage ' 'aprs ' num2str(N) ...
itrations'])
disp(['erreur maximale : ' num2str(max(erreur))])
disp(['variance de l''erreur : ' num2str(std(erreur)^2)])
disp(['variance de l''erreur : ' num2str(std(erreur)^2)])

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

La courbe suivante reprsente lerreur dapprentissage.


erreur d'apprentissage aprs 300itrations

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

erreur maximale : 0.0020113


variance de l'erreur : 0.0024997

Au bout de 5 itrations (N=5 dans le fichier ver_app1.m) seulement, nous obtenons :


rponses relle et dsire du rseau aprs 5 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

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

erreur maximale : 0.15391


variance de l'erreur : 0.011208

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 )

Le fichier cde_nr1.m ralise la commande schmatise ci-dessus. Le signal issu de la


cellule de sortie du rseau, aprs sa dnormalisation, multipli par un gain k, est ajout la
commande applique au processus linstant dchantillonnage prcdent.
La valeur du gain k influe sur la stabilit du systme boucl.
Lerreur statique est nulle grce la prsence de lintgration. On ralise ainsi une commande
prdictive avec intgration.

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

figure(2), stairs(u), title('signal de commande')


xlabel('temps discret'), axis([0 400 4 6.2]), grid
Consigne et sortie
7

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

IV.2. Deuxime architecture

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)

Les signaux dentre ne contiennent pas de variations et en sortie on cherche obtenir


directement le signal de commande normalis.
On conserve nanmoins le caractre prdictif de la loi de commande, dans laquelle la
consigne future normalise sera applique la premire cellule de la couche dentre.
On excute le fichier modele.m afin de gnrer de nouvelles valeurs de la commande et de
la sortie du modle.
Le fichier es_norm2.m se charge de normaliser les signaux et de les stocker dans le fichier
es_N2.mat.
Les coefficients de normalisation seront sauvegards dans ab_norm2.mat.
fichier es_norm2.m
% Normalisation des diffrents signaux entre 0.1 et 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_N2 = [u_N;y_N];
save signaux es_N2
% coefficients a et b de normalisation des E/S
save ab_norm2 a_u b_u a_y b_y
clear all

Lapprentissage du rseau se fait laide du fichier apprent2.m.

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

biais_w0(:,:,k) = w0; biais_z0(:,:,k) = z0;


% sauvegarde des poids et biais dans fichier weights.mat
save weights2 poids_W poids_Z biais_w0 biais_z0
clc
disp(['k = ' num2str(k)])
end % boucle while

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

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

itrations

60

70

80

852

Chapitre 17

On vrifie, comme pour la premire structure du rseau, les rsultats de lapprentissage.


fichier ver_app2.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,:);
% lecture du fichier des poids et biais
load weights2
N = 100;
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 = 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)]';
% rponse des cellules de la couche de sortie
y(i) = logsig(Z*(logsig(W*x+w0))+z0);
end % boucle for
y = y(1:100);
figure(1)
stairs(y)
hold
h = stairs(u_N(1:100));
set(h,'LineWidth',1.5)
title(['rponses relle et dsire du rseau aprs ' ...
num2str(N) ' itrations'])
axis([0 100 0 1])
grid
hold off
figure(2)
u_N = u_N(1:100);
erreur = y-u_N;
plot(erreur)
grid
axis([0 100 -0.2 0.2])
title(['erreur d''apprentissage ' ' aprs ' num2str(N) ...

Rseaux de neurones

853

'itrations'])
disp(['erreur maximale : ' num2str(max(erreur))])
disp(['variance de l''erreur : ' num2str(std(erreur)^2)])

rponses relle et dsire du rseau aprs 100 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

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 )

Cette loi de commande est implmente dans le fichier cde_nr2.m .


fichier cde_nr2.m
% commande par modle inverse neuronal
clear all, close all, clc
% lecture des poids
load weights2
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_norm2
% 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 = r; % initialisation de la sortie du modle
u = 5*ones(size(r));
y_N = a_y*y+b_y;
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 la consigne future
r_N = a_y*r(i+1)+b_y;

856

Chapitre 17

% 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_out = logsig(h_in);
% activation des cellules de la couche de sortie
o_in = Z*h_out+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
u_N(i) = logsig(o_in);
% dnormalisation de la commande
u(i) = (u_N(i)-b_u)/a_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,'-.')
text(296,5.7,'perturbation en sortie \rightarrow',...
'HorizontalAlignment','right')
title('Consigne et sortie'), xlabel('temps discret')
axis([0 400 4.5 7.2])
figure(2),
stairs(u)
title('signal de commande')
xlabel('temps discret'),
axis([0 400 4 6.2])
grid

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

Labsence dintgration dans la loi de commande, ajoute lerreur statique de modlisation,


entrane un cart en rgime permanent entre la consigne et la sortie du processus. Par contre,
la perturbation est rejete sans dpassement.

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

A chaque priode dchantillonnage, on rtropropage lerreur de poursuite travers le rseau


pour modifier les diffrents poids et biais, afin dannuler lerreur en rgime permanent.
Ceci revient continuer lapprentissage en ligne du rseau afin dliminer lerreur de
poursuite. Comme lerreur est, dans ce cas prcis, statique, ce sont les biais qui subiront les
plus grandes variations.
y N (t )

Modle inverse neuronal

r (t + 1)

u N (t )

z 1

Processus

DN

y (t )

u( t )

Ce type de commande, la fois prdictive et adaptative, est implmente dans le fichier


cde_nr3.m.
fichier cde_nr3.m
% commande par modle inverse neuronal
% avec adaptation des poids pour annuler l'erreur statique
clear all, close all
clc
% lecture des poids
load weights2
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_norm2

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

r; % initialisation de la sortie du modle


5*ones(size(r));
= a_y*y+b_y;
= a_u*u+b_u;

% 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);
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 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);
u_N(i) = o;
% dnormalisation de la commande

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;

% 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
% trac des diffrents signaux
figure(1)
plot(y), hold, plot(r,'-.')
title(['Consigne et sortie, Gain = ' num2str(eta)])'
xlabel('temps discret')
axis([0 400 4.5 7.2]), grid
figure(2)
stairs(u)
title(['signal de commande, Gain = ' num2str(eta)])
xlabel('temps discret')
axis([0 400 4 6.2]), grid
% trac de l'volution des poids W11, W12, W13 et W14
figure(3)
for k = 1:5
x = poids_W(k,1,:);
plot(x(:)), hold on
end
hold off
grid
title('poids W1k')

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

signal de commande, Gain = 0.2


6

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

Pour un signal de consigne carr, on peut imposer la dynamique de poursuite en spcifiant un


modle de rfrence. Si lon veut suivre la consigne suivant une dynamique du 2me ordre de
pulsation propre normalise w0 T et de coefficient damortissement tout en ayant un gain
statique unit, le signal de rfrence r (t ) poursuivre est, en fonction de la consigne c(t ) :
r (t ) =

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

Dans le fichier cde_modref.m, on spcifie un filtre du second ordre de facteur


2
damortissement =
.
2
fichier cde_modref.m
% Commande neuronale adaptative par modle de rfrence
% gnration de la consigne
close all
palier1 = 5*ones(1,100);
palier2 = 6*ones(1,100);
c = [palier1 palier2 palier1 palier2];

866

Chapitre 17

% modle de rfrence du second ordre


dzeta = sqrt(2)/2;
w0T = 0.08*pi;
alfa1 = -2*exp(-dzeta*w0T)*cos(w0T*sqrt(1-dzeta^2));
alfa2 = exp(-2*dzeta*w0T);
r(1:2) = c(1:2);
for i = 3:length(c)
r(i) = (1+alfa1+alfa2)*c(i)-alfa1*r(i-1)-alfa2*r(i-2);
end
% affichage de la consigne
plot(r)
hold on
plot(c,'-.')
% lecture du fichier des poids et biais
load weights2
N = length(poids_W); % nombre ditrations
% rcupration de la dernire page des tableaux
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_norm2
% gain d'adaptation des poids
eta = 0.1;
y =
u =
y_N
u_N

r; % initialisation de la sortie du modle


5*ones(size(r));
= a_y*y+b_y;
= a_u*u+b_u;

% 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);
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);

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

% trac des diffrents signaux


figure(1)
plot(y)
hold on
plot(r,'-.')
title(['Consigne et sortie, Gain = ' num2str(eta)])
xlabel('temps discret'), grid
figure(2), stairs(u)
title(['signal de commande, Gain = ' num2str(eta)])
xlabel('temps discret'), grid
% trac de l'volution des poids W11, W12, W13 et W14
figure(3)
for k = 1:5
x = poids_W(k,1,:);
plot(x(:)), hold on
end
hold off, grid
title(['adaptation des poids W1k, Gain = ' num2str(eta)])
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, Gain = ' num2str(eta)])
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(['adaptation des poids Z, Gain = ' num2str(eta)])
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, Gain = ' num2str(eta)])
xlabel('temps discret')

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

axis([0 length(t) -0.1 0.1]), grid


% trac de l'volution des poids W11, W12, W13 et W14
figure(3)
for k = 1:Nb_Hu
x = poids_W(k,1,:);
plot(x(:)), hold on
end
hold off, grid
title(['volution des poids W1k, Gain = ' num2str(eta)])
xlabel('temps discret')
% trac de l'volution des poids Z
figure(5)
for k = 1:Nb_Hu
x = poids_Z(1,k,:);
plot(x(:))
hold on
end
hold off
grid
title(['volution des poids Z, Gain = ' num2str(eta)])
xlabel('temps discret')

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

variance de lerreur d'estimation :


var_err =
2.2907e-005

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

Les lignes de code de ce fichier caractrisent ce type destimation.


% sortie du rseau : estime de r(t+1)
o = logsig(Z*h+z0);
r_est(i+1) = o;
% erreur d'estimation
e(i) = r(i)-r_est(i);

Un gain dapprentissage de 4, non seulement ne permet pas destimer correctement le signal,


mais fait apparatre un dbut dinstabilit.
signaux, rel et prdit, Gain = 4

1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0

50

100

150

variance de lerreur d'estimation :


var_err =
0.0018

Cette instabilit se voit bien lorsque le gain vaut 5.

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

La figure suivante reprsente lerreur de prdiction.


prediction error

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

M. MOKHTARI, A. MESBAH, Apprendre et Matriser MATLAB ,


Editions Springer-Verlag Berlin Heidelberg New York, USA, 1997
M. MOKHTARI, M. MARIE, Applications de MATLAB 5 et SIMULINK 2. Contrle de
procds, logique floue, Rseaux de neurones, Traitement de signal,
Editions Springer-Verlag Berlin Heidelberg New York, USA, 1998
M. MOKHTARI, MATLAB 5.2 & 5.3 et SIMULINK 2 et 3 pour tudiants et ingnieurs ,
Editions Springer-Verlag Berlin Heidelberg New York, USA, 2000
M. MOKHTARI, M. MARIE, Engineering Applications of MATLAB 5 and SIMULINK
3, Editions Springer-Verlag Berlin Heidelberg New York, USA, 2000
A. TEWARI, MODERN CONTROL DESIGN, with MATLAB and SIMULINK
Editions John & Sons, LTD, 2002
M. ZELAZNI, Systmes asservis : commande et rgulation. Tome 2 : Synthse,
Applications, Instrumentation
G. DREYFUS, Rseaux de neurones, mthodologie et applications, Editions Eyrolles,
2004.
A. BIRAN, MATLAB for Engineers, Editions Addison-Wesley, 1995
S. J. CHAPMAN, MATLAB Programming for Engineers,
Editions Brooks/Cole, 2002.
P. MARCHAND, Graphics and GUIs with MATLAB, Editions Chapm an&Hall/CRC,
2003
C. BURGAT, Automatique, Problmes rsolus dautomatique, Editions Ellipses, 2001.
V. MINZU, Commande automatique des systmes linaires continus, Editions Ellipses,
2001.
P. PROUVOST, Automatique, contrle et rgulation, Editions Dunod, 2004.
M. BROWN, Neurofuzzy Adaptive Modelling and Control, Editions Prentice Hall
International, 1994.
C. S. BURRUS, Computer-Based Exercises for Signal Processing using MATLAB,
Editions Prentice Hall International, 1994.

N. Martaj, M. Mokhtari, MATLAB R2009, SIMULINK et STATEFLOW pour Ingnieurs, Chercheurs


et Etudiants, DOI 10.1007/978-3-642-11764-0, Springer-Verlag Berlin Heidelberg 2010

880

Rfrences bibliographiques

A. Angot, Complments de mathmatiques , Editions de la revue d'optique, 1952


A. V. Oppenheim, Digital signal processing , Prentice Hall International, 1975
A. Biran, M. Breiner, MATLAB for Engineers, Addison-Wesley Publishers Ltd., 1995.
C. Marven & Gillian Ewers, A simple approach to Digital Signal Processing, Texas
Instruments, 1993
C. Johnson, Process control instrumentation technology, Prentice-Hall International,
1988
D. Jaume, Commande des systmes dynamiques par calculateur , Eyrolles, 1991
E. Diday, J. Lemaire, J. Pouget, F. Testu, Elments danalyse des donnes , Dunod,
Paris, 1982.
E. Davalo, Patrick Nam, Des rseaux de neurones , Eyrolles, 1990
F. Gruau, Synthse de rseaux de neurones par codage cellulaire et algorithmes
gntiques , Universit de Lyon 1, 1994.
J. De Lagarde, Initiation lanalyse des donnes , Dunod, Paris, 1983.
J.D. Cowan, Advances in neural information processing system, Ed.Tesauro, Gerald,
Alspector, Joshua. Morgan Kaufmann, 1994.
J.P. Benzcri, et coll.. Pratique de lAnalyse des donnes. Analyse des correspondances,
expos lmentaire, Dunod, Paris, 1980.
J. C. Gille, M. Clique, Systmes linaires, quations d'tat , Eyrolles, 1990
K J. Astrm, B. Wittenmark, Computer-controlled systems, Theory and design,
Prentice-Hall International Editions, 1984
L. Fausett, Fundamentals of neural networks, architectures, algorithms, and
applications
L. B. Jackson, Digital Filters and Signal Processing, Third Edition, 1996
L. Jzquel, Active control in mechanical engineering , Herms, 1995
M. Bellanger, Traitement numrique du signal, Thorie et pratique, Masson, 1996
MathWorks,

MATLAB rfrence guide, the MathWorks Inc.


MATLAB user's guide, the MathWorks Inc.

M. J. Grimble and Michael A. Johnson, Optimal control and stochastic estimation,


Theory and applications , John Wiley & Sons, 1988

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

biais, 807813, 819, 821, 825, 830, 832,


836841, 849, 858864, 870
Blackman, 593, 595
blanc
signal binaire, 432
bruit gaussien, 606
bruit, 608, 612, 621, 625
Blockset, 643, 655
bloqueur, 380, 381, 694, 711, 724
Bode, 713, 720, 721, 725
boite outils
Signal processing, 3, 59, 279, 587, 600,
632, 643646
Fuzzy logic, 58, 752, 754, 778, 789, 794
Control Systems, 113, 631, 670, 673,
712713, 741, 747
Neural Network, 810, 821, 829, 832
box, 567570
C
Callback
InitFcn, 4850, 371, 441, 463, 465,
476477, 488, 491, 502, 504, 657,
659, 710, 742
PostLoadFcn, 372, 502
Dialog Callback, 437
NameChangeFcn, 499, 510
CloseFcn, 499, 501
PreloadFcn, 504
PostSaveFcn, 501
Preload, 501
PreSave, 501
StartFcn, 501, 510
StopFcn, 501, 507
OpenFcn, 507
CopyFcn, 509
capteur, 282, 306, 308, 517, 626630, 632
caractres spciaux, 7, 242
Chebyshev, 264
chemins de recherche, 58, 243, 291
chirp, 257, 417
coefficient
damortissement, 5053, 339, 476, 489,
535, 647, 674675, 685, 709, 731,
865
de pondration, 705
dun polynme, 24, 112, 126, 265, 309,
310, 380, 566, 654
dun filtre, 645, 649, 662

884

de pondration, 675683, 789


de retour dtat, 693, 696
de normalisation, 835, 847
comparaison
de matrices, 145, 147
de vecteurs, 145
une constante, 375
lment par lment, 38
concatnation
de cellules, 313, 316
de vecteurs, 8, 414, 480
de matrices, 1418, 143, 144, 298,
306307, 407
de chanes de caractres, 71, 76
conjugu, 20, 88, 650
constante de temps, 55, 347, 349, 533,
554557, 558, 631, 709, 717719,
741
contrle
axes, 202, 216
instructions, 1, 36, 39
de procds, 111, 673
convergence, 849
corrlation, 606, 607
couche
cache, 808, 824825, 830, 832, 836,
837, 870
dentre, 824, 830, 844, 847, 854, 870
de sortie, 825, 830
courbes paramtriques, 28, 191
covariance, 642
Cramer, 11, 183, 252
cryptage, 79
D
Data curseur, 25, 211
dcryptage, 79
deffuzification, 785
densit spectrale, 422423, 606, 611614
dterminant, 164, 251, 577578
dterministe, 587, 615, 643
DirFeedthrough, 458, 479, 492
Display, 5154, 340, 524, 529, 580
dynamique
processus, 619, 626, 630
de poursuite, 687, 730, 865
du 2nd ordre, 674, 687, 693, 865
du 1er ordre, 686
de rgulation, 691

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

matrice, 344345, 456, 459, 463, 475,


487488, 715, 733, 739, 740741, 743
espace, 357, 380, 477, 673, 693, 697
modle, 344, 368, 387, 390, 456, 459,
465, 467, 472, 474, 476, 487, 615,
631632, 638, 693, 694697, 713,
716, 734
reprsentation, 390
quations, 472, 534, 615, 693, 706, 741
variables, 476, 483, 489, 631
fini, 514, 595
explorateur, 526, 532, 534, 564565, 579,
580, 585
exponentiel
ajustement, 181
modle, 1314, 180182
F
factorisation, 164, 166
FDATool, 644, 645, 667
fichiers
binaires (mat), 31, 52, 376, 377, 388,
540, 559, 744
textes, 45, 280, 471
filtre
AR, 652, 657
Butterworth, 101, 103, 262, 652, 653,
667, 668, 670
coupe bande, 593
de Kalman, 626, 630, 632, 635643
drivateur, 337, 613
elliptique, 644, 652
FIR, 380, 591, 613, 645, 649, 652, 659
LMS, 491, 661, 662
moyenne mobile, 354
moyenneur, 590, 607, 611
passe haut, 587, 588, 593, 596, 600
passe bande, 587, 588, 591, 600, 650,
652, 653, 667
passe bas, 101102, 262, 588, 593, 598,
600, 649, 652, 659, 670
RII, 589, 590, 612
Yule Walker, 657, 658
Flag, 457, 458, 459, 461, 462, 735
flou
contrleur, 748, 756, 762, 804
ensemble, 747, 768, 787
rgulateur, 55, 347348, 368, 372, 381,
420, 493494, 552557, 559562,
684, 688, 693, 708712, 724728,
747, 749, 756764, 773781, 786,
791801

systme, 765768, 779780, 783, 786,


795, 797, 804
fonctions
de transfert, 54, 619
graphiques, 535, 563
temporelles logiques, 570
format, 6, 7, 66, 78, 81, 83, 85, 218, 279,
285, 294, 342, 343, 765
fuzzification, 748749, 752, 762763,
778, 785
G
gabarit, 101, 587588, 592593, 649
gain statique, 46, 5255, 347, 358,
375, 459, 461, 471, 476478,
487, 490, 557, 559, 606, 674,
685, 709, 717, 723, 725, 726,
741, 865
Gauss, 166
gaussienne, 192, 748, 750, 768
Gibbs, 592, 595
gradient, 809, 831
H
Hadamard, 151, 158, 163, 831
Hamming, 593, 595596
handle Graphics, 31, 185, 506, 737
Hanning, 593, 595
Hexadecimal, 6, 67, 69, 78
Hilbert, 164
hybride, 480481, 483484
I
icne, 61, 359, 375, 562
identification, 619, 810
IEEE, 67
indexation, 16, 73, 157, 314
infrence, 748, 752
influx nerveux, 807
Initialization, 369, 434, 436, 439
instabilit, 875, 877
intgration, 380, 387, 497, 673, 717,
727, 730, 777, 844, 861
intercorrlation, 606
interface graphique, 336, 648, 743
interfrence, 436, 818
interpolation, 111, 118, 120, 123,
393398
inversion, 151, 244, 577
itration, 837, 839
itrative, 264265, 505

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

pulsation propre, 50, 51, 52, 339, 476,


489, 494, 647, 685, 709, 731, 865
PWM, 372, 433, 445, 445, 548, 549, 550,
574
Q
QR, 164
R
rampe, 50, 51, 339, 340, 341, 342, 418,
476, 477, 484, 537, 552, 566
rationnel, 6, 7
rcursive, 33, 265, 266, 267268, 620
rcursivit des fonctions, 267
rduction, 429, 717
rgime permanent, 56, 387, 391, 392, 448,
477, 478, 497, 561, 671, 673, 699,
706, 854, 858
rgression, 11, 118, 177, 180, 252
rgulation
asymptotique, 693
intgrale, 357, 380
LQI, 673
optimale, 673, 693, 697, 701
par retour dtat, 702, 706
PI, 422, 493, 495, 506
PID, 55, 420, 421, 497, 551, 554, 557,
708
prdictive, 673, 833, 844, 858
RST, 684, 691
adaptative, 858
rpertoire, 58, 60, 242, 243, 279, 280, 282,
286, 289, 290, 291, 294
retard pur, 380, 619, 684
rtropropagation, 824, 825, 830, 831,
836
RIF, 589, 590, 606, 611
RII, 589, 590, 612
RLC, 97, 100
rotation, 150, 434, 510
routage, 45, 338
RST, 684, 691
rupture de squence, 259
S
saisie
dun tableau, 7
dune matrice, 14, 170, 390
dun polynme, 23
de donnes, 33
set_param, 504, 505, 507
S-fonction, 436, 439, 455495

888

singleton, 303, 785787, 789790, 795,


798
singulire, 152
sinus
amorti, 190, 430, 434
cardinal, 36, 42, 43, 186190, 195, 206,
228, 257, 351353, 372, 434, 509,
536, 588
solveur, 59, 457, 460, 505
somme
de vecteurs, 10, 139
de matrices, 140
lments dun tableau, 18, 23, 141, 162,
414, 485
de complexes, 87, 89, 139
cumule, 139, 174
Sources, 45, 46, 339, 340, 375, 376, 378,
454
sous-fonctions, 269
sous-systme configurable, 453
sous-systmes
activs, 451
triggs, 451
spectre, 110, 602, 656
sphre, 204
splines, 120122
sptool, 644, 646
stabilit, 561, 652, 743, 844
startup, 61, 282, 510
Stateflow
tat, 516519, 522527, 529, 530533,
538, 540, 554, 568, 569
transition, 516522, 525, 530, 531, 534,
536, 538, 540, 543, 544, 549564,
568, 571, 584
vnements, 520, 531, 570, 575
objets Data, 532
table de vrit, 571
stationnaires, 626
structure, 46, 56, 155, 169, 279, 279, 290,
293, 311, 319, 326334, 360361,
457458, 471, 490, 497, 503, 507,
548, 736, 760, 835, 847854
subfunction, 270
Sugeno, 755, 761, 785, 789, 797
surface, 30, 94, 185, 198, 199204, 238,
752756, 770771, 790
Switch, 51, 258, 339, 340, 404, 406, 410, 449,
460, 471, 516, 517, 518, 526, 780
symtrique, 146, 162, 169, 170, 672

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

S-ar putea să vă placă și