Initiation MATLAB 1
1
Introduction
Le logiciel MATLAB, d´evelopp´e par la soci´et´e The MathWorks (http://www.mathworks.com), est devenu un langage de r´ef´erence pour l’analyse et la r´esolution de probl`eme scientifique. Il int`egre `a la fois des solutions de calcul, de visualisation et un environnement de d´eveloppement. Son nom provient de MATrix LABoratory, l’objectif initial ´etait de fournir un acc`es simplifi´e aux biblioth`eques de fonctions des projets LINPACK et EISPACK (d´edi´ees au calcul matriciel et `a l’alg`ebre lin´eaire).
MATLAB a de nombreux avantages par rapport aux langages de programmation traditionnels (tel que le C/C++). Il permet le d´eveloppement int´eractif de part l’utilisation d’un langage interpr´et´e. La structure de donn´ees de base est le tableau ne n´ecessitant pas de dimensionnement. Il fournit de nombreuses fonctions pr´eprogramm´ees regroup´ees en boˆıtes `a outils (toolbox) pour de nombreux domaines (par ex : signal processing, statistics, control theory, optimization, ...).
De plus, MATLAB dispose d’un excellente documentation.
2
D´
emarrer MATLAB
Lorsque vous lancez MATLAB pour la premi`ere fois, l’´ecran ressemble `a celui de la Figure 1. Le ’bureau’ MATLAB est une fenˆetre contenant d’autres sous-fenˆetres. Les principaux outils disponibles depuis ce bureau sont :
— COMMAND WINDOW : invite de commande permettant de taper des instructions, d’appeler des scripts, d’ex´ecuter des fonctions MATLAB.
— COMMAND HISTORY : historique des commandes lanc´ees depuis l’invite de commande.
— WORKSPACE : il liste les variables en m´emoire, il permet ´egalement de parcourir graphiquement le contenu des variables
— CURRENT DIRECTORY : un navigateur de fichier int´egr´e `a MATLAB pour visualiser le r´epertoire de travail courant et y effetuer les op´erations classiques tel que renommer ou supprimer un fichier.
— le HELP BROWSER : un navigateur permettant de parcourir l’aide de MATLAB. L’aide est un outil pr´ecieux pour trouver les fonctions et apprendre leur fonctionnement (notamment le format des donn´ees `
a fournir en entr´ee ainsi que les valeurs renvoy´ees par la fonction).
Par la suite, il est conseill´e de tester toutes les instructions pr´ec´ed´ees de >> dans la command window. Lorsque vous optenez une erreur, essayez d’en comprendre la signification. Avec un peu de pratique, vous verrez que les messages d’erreur sont en g´en´eral explicites.
3
MATLAB comme calculette
Comme tout langage de programmation, MATLAB dispose de fonctions de calculs math´ematiques. Nous en voyons ici quelques exemples d’utilisation.
Entrer les commandes à exécuter
Invite de commandes : Voir ou réexécuter les commandes précédemment utilisées
Voir ou changer le répertoire de travail Gestionnaire de fichier :
liste les fichiers du
répertoire de travail Obtenir de l’aide liste les variables en mémoireWorkspace :
Figure 1 – L’interface graphique de l’environnement MATLAB (version R2010b)
+ (addition) ⇒ >> 3+2 - (soustraction) ⇒ >> 3-2 * (multiplication) ⇒ >> 3*2 / (division) ⇒ >> 3/2 ^ (puissance) ⇒ >> 3^2
Si l’on regarde ce que donne l’exemple d’addition : >> 3+2
ans = 5
On peut remarquer que lorsqu’aucune variable d’affectation n’est sp´ecifi´ee pour stocker le r´esultat de l’op´eration, MATLAB stocke le r´esultat dans une variable appel´ee ans (diminutif pour answer). Cette va-riable sera ´ecras´ee `a chaque nouvelle op´eration. Pour ´eviter cela, on peut sp´ecifier le nom d’une variable pour stocker le r´esultat. On pourra alors r´eutiliser le r´esultat de l’op´eration plus tard. Par ex :
>>x = 3+2
x =
5
x prend alors la valeur 5. Cette variable peut alors ˆetre r´eutilis´ee dans un calcul suivant : >>x/2
ans = 2.5000
3.1 Priorit´e des op´erateurs
1. () 2. ^ 3. * / 4. + -Exemple 1 : >> 3 + 2 * 4 ^ 2
---16 1) Evalutation de 4^2 car ^ `a la priorit´e sur les autres op´erateurs * et +
---32 2) Evalutation de 2*16 car * `a la priorit´e sur +
---ans = 35 3) Pur finir, ´evalutation de 3+32
Exemple 2 :
>> ( ( 3 + 2 ) * 4 ) ^ 2
---5 1) Evalutation de 3+2 car () `a la priorit´e sur *
---20 2) Evalutation de 5*4 car () `a la priorit´e sur ^
---ans = 400 3) Pour finir, ´evalutation de 20^2
A titre d’exercice, ´evaluer les expressions suivantes : 1) 123+456123∗456 , vous devriez obtenir 96.8705
2) 2 1 3+ 1 5+ 1 6 2 3+ 4 5+ 5 6
, vous devriez obtenir 0.6087 3) 12−61 2 +
2
3, vous devriez obtenir 0.625
4) 1+(
2 3)
1 2
12−62 , vous devriez obtenir -0.0757
4
Manipuler des variables
Une variable est un emplacement en m´emoire permettant de stocker provisoirement une donn´ee. On r´ef`ere `a l’emplacement en m´emoire par le nom que l’on donne `a la variable. On pourra utiliser le contenu de la variable (dans un calcul par exemple si la donn´ee stock´ee est une valeur num´erique) ou modifier la donn´ee stock´ee `a l’emplacement m´emoire.
On distingue plusieurs types de variable selon les donn´ees qu’elles servent `a stocker (nombre, caract`ere alpha-num´erique, tableau, matrice, structure). Contrairement `a d’autres langages de programmation, sous MATLAB le type des variable n’a pas besoin d’ˆetre sp´ecifi´e, MATLAB inf`ere le type d’une variable en fonction de la donn´ee que l’on y stocke.
Sous MATALB, les noms de variabledoivent commencer par une lettre, sont sensibles `a la casse (diff´erenciation des caract`eres majuscule/minuscule) et ne peuvent contenir aucun caract`ere sp´ecial except´e le tiret bas ( , underscore). De mˆeme, il faut ´eviter d’utiliser comme nom de variable des noms d´ej`a employ´es comme nom de fonctions (par ex : min, max, exp ...). MATLAB g´en´erera ´egalement une erreur si un des mots-cl´es r´eserv´es
suivant est utilis´e : for, end, if, while, function, return, elseif, case, otherwise, switch, continue, else, try, catch, global, persistent, break. Ces mots-cl´es font partie de la syntaxe du langage MATLAB, nous verrons dans la suite des exemples d’utilisation de certains de ces mots-clefs.
4.1 Utilisation d’une variable
Les variables sont cr´e´ees lors de la premi`ere affectation (op´eration qui permet d’attribuer une valeur `a une variable).
A ← 0 on affecte la valeur 0 `a la variable A, si A n’existait pas auparavant, elle est cr´e´ee. B ← 11 on affecte la valeur 11 `a la variable B
On peut alors utiliser une variable dans un calcul ou pour affecter son contenu `a une autre variable. A ← B on affecte la valeur contenue ds B `a la variable A, A vaut `a pr´esent 11, B reste inchang´ee
A ← A + 1 on affecte la valeur contenue ds A incr´ement´ee de 1 `a la variable A, A vaut `a pr´esent 12 Sous MATLAB, l’affectation se fait `a l’aide de l’op´erateur =
>> A = 0 >> B = 11 >> A = B >> A = A + 1
4.2 Quelques types de variables : nombres, vecteurs (tableau 1D), matrices (tableau 2D)
- nombres : >>a = 0.66 >>deuxiemeNombre = 2/3 >>mon_nom_de_variable = -4 - tableau 1D en ligne : >>rowvect1 = [1,2,3]
On s´epare les ´el´ements du vecteur par une virgule pour obtenir un agencement en ligne >>rowvect2 = [a , mon_nom_de_variable , 12]
Nous avons ici utilis´e le contenu des variables a et mon_nom_de_variable pour affecter les 2 premiers ´el´ements de la matrice rowvect2. Le r´esultat sera rowvect2 = [0.66 , -4 , 12]
- tableau 1D en colonne :
>>colvect = [1;2;3] (on s´epare les ´el´ements par un point virgule pour obtenir un agencement en colonne) - matrice :
>>maPremiereMatrice = [1,2,3;4,5,6;7,8,9] %creation d’une matrice de dimension (3x3)
(les ´elements d’une mˆeme ligne sont s´epar´es par des virgules, les lignes de la matrice sont s´epar´ees par un point virgule)
Le caract`ere % permet desp´ecifier un commentaire dans le code : ce qui suit sur une ligne le caract`ere % ne sera pas interpr´et´e par MATLAB. Les commentaires dans un code source d’un programme informatique sont en g´en´eral destin´es `a un lecteur humain pour aider `a la compr´ehension du programme. Vous n’avez pas besoin de recopier le commentaire dans les exemples sur une ligne de ce tutoriel.
4.3 Acc`es aux ´el´ements des tableaux
Acc`es `a un ´el´ement unique :
Pour acc´eder `a un ´el´ement unique d’une variable de type tableau 1D, on sp´ecifie entre paranth`eses apr`es le nom de la variable l’indice de l’´el´ement (l’indice peut ˆetre donner par le biais d’une variable) :
>>rowvect1(1) %acc`es au 1er ´el´ement de rowvect1 >>colvect(3) %3eme ´el´ement de colvect
>> ind = 2
>>rowvect1(ind) %acc`es au 2eme ´el´ement car ind = 2 ne fonctionne que si la variable utlis´ee contient un entier >>rowvect1(end) %dernier ´el´ement
le mot-cl´e end permet d’acc´eder au dernier ´element
Pour les tableaux `a 2 dimensions, on sp´ecifie entre parenth`eses la position de l’´el´ement dans le tableau en donnant en premier la ligne puis la colonne :
>>maPremiereMatrice(2,3) %´el´ement de la 2eme ligne, 3eme colonne
>>maPremiereMatrice(1,end) %´el´ement de la 1eme ligne, derni`ere colonne Acc`es `a un sous-ensemble :
Si l’on souhaite extraire un sous-ensemble d’un tableau, on sp´ecifie pour chaque dimension un tableau des indices que l’on souhaite conserver. Pour un tableau 2D, on r´ecup`ere alors l’intersection des lignes et colonnes sp´ecifi´ees.
>>rowvect1( [1,3] ) %vecteur compos´e du 1er et 3eme ´el´ement de rowvect1
>>maPremiereMatrice( [1,3] , [1,2] ) %Intersection des lignes 1 et 3 avec les colonnes 1 et 2
>>maPremiereMatrice([1,2],[2,3]) %matrice (2x2) extrait du coin sup´erieur droit de maPremiereMatrice
>>maPremiereMatrice(2,:) %2eme ligne de la matrice maPremiereMatrice >>maPremiereMatrice(:,3) %3eme colonne de la matrice maPremiereMatrice
L’op´erateur : (double point), lorsqu’utilis´e pour acc´eder aux ´el´ements d’un tableau, permet de conserver tous les indices de la dimension.
L’op´erateur : permet ´egalement de cr´eer un tableau 1D en ligne de la mani`ere suivante : <debut>[:<incr´ement>]:<fin>
Ceci va cr´eer un vecteur en ligne de valeurs allant de <debut> jusqu’`a <fin> par pas de <incr´ement>. L’incr´ement est optionnel. Si il n’est pas sp´ecifi´e, il sera par d´efaut pris ´egal `a 1.
Exemple de cr´eation de tableau avec l’op´erateur : >>D = 1:4
>>E = 0:0.1:2.5
Essayer avec 2.45 au lieu de 2.5. La valeur finale n’´etant alors pas un multiple du pas. Le vecteur g´en´er´e n’ira que jusqu’`a la plus proche valeur inf´erieure.
>>F = 10:-1:0 %fonctionne ´egalement avec un pas n´egatif.
Cette op´eration est utile pour : — cr´eer/initialiser des vecteurs
— acc´eder `a des sous-ensembles de vecteurs ou matrices >>E(1:10) %10 premiers ´el´ements de E
>>E(end-9:end) %10 derniers ´el´ements de E — dans les boucles for (`a venir)
Exercice : cr´eer tout d’abord la matrice M, `a partir de la commande suivante >>M = magic(10). Cette commande va cr´eer une matrice de dimension (10x10) ayant des propri´et´es particuli`eres.
— Cr´eer une matrice M1 compos´ee uniquement de la premi`ere colonne de M — Cr´eer une matrice M2 compos´ee uniquement de la deuxi`eme ligne de M — Cr´eer une matrice M3 compos´ee des 3 premi`eres colonnes de M
— Cr´eer une matrice M4 compos´ee des 3 derni`eres lignes de M
— Cr´eer une matrice M5 compos´ee de l’intersection des 1`ere, 5`eme, et 7`eme lignes de M et des 2`eme, 4`eme et 8`eme colonnes de M
Vous devriez obtenir : M5 =
99 8 51
93 2 75
5 89 32
4.4 Plus sur les matrices
4.4.1 Cr´eation de matrices sp´eciales
La matrice est la structure de donn´ees de base de MATLAB. Pour rappel, MATLAB a ´et´e initialement cr´e´e comme solution de calcul matriciel (alg`ebre lin´eaire). De ce fait, MATLAB dispose de fonctions pour cr´eer diff´erents types de matrices utiles.
— La fonction ones : cr´eer une matrice dont tous les ´el´ements sont des 1. >>Mones1 = ones(4) %matrice de taille (4x4)
>>Mones2 = ones(10,2) %matrice de taille (10x2)
— La fonction zeros : cr´eer une matrice dont tous les ´el´ements sont des 0.
— La fonction rand : cr´eer une matrice de nombres al´eatoires uniform´ement distribu´e compris entre 0 et 1. >>Mrand1 = rand(5) %matrice de taille (5x5)
>>Mrand2 = rand(2,7) * 10 + 5 %matrice de taille (2x7) de nombres compris entre 5 et 15 — La fonction randn : cr´eer une matrice de nombres al´eatoires suivant une loi normale centr´ee r´eduite. — La fonction randperm : cr´eer un vecteur ligne (matrice 1xn) contenant une permutation al´eatoire du
nombre entier sp´ecifi´e.
>>randperm(6) pourrait renvoyer le vecteur suivant
[4 1 2 5 3 6 ]
4.4.2 Assemblage de matrices (concat´enation)
La concatenation de matrices permet de rassembler une ou plusieurs matrices pour en cr´eer une nou-velle. Les crochets [] que nous avons vu plus tˆot pour construire des tableaux servent ´egalement `a r´ealiser la concat´enation. Par exemple, l’expression C = [A , B] va concat´ener horizontalement les matrices A et B. Tan-dis que l’expression C = [A ; B] va r´ealiser une concat´enation verticale. L’op´eration de concat´enation ´echoura si les dimensions des matrices `a concat´ener ne sont pas compatibles, i.e. pour r´ealiser une concat´enation hori-zontal les matrices doivent avoir le mˆeme nombre de lignes et pour r´ealiser une concat´enation verticale le mˆeme nombre de colonnes.
This example constructs a new matrix C by concatenating matrices A and B in a vertical direction : >>A = ones(2, 5) * 6; % 2-by-5 matrix of 6’s
>>B = rand(3, 5); % 3-by-5 matrix of random values >>C = [A; B] % Vertically concatenate A and B C = 6.0000 6.0000 6.0000 6.0000 6.0000 6.0000 6.0000 6.0000 6.0000 6.0000 0.9501 0.4860 0.4565 0.4447 0.9218 0.2311 0.8913 0.0185 0.6154 0.7382 0.6068 0.7621 0.8214 0.7919 0.1763
Pas de probl`eme, les 2 matrices on bien le mˆeme nombre de colonnes. Essayer maintenant de faire la concat´enation horizontale, que ce passe-t-il ?
Exercice : - Utiliser les fonctions ones, zeros et rand ainsi que la concat´enation de matrices pour cr´eer une matrice G de taille (3x10) de la forme suivante.
G =
0 0 0 0 0 1 1 1 1 1
1 1 1 1 1 0 0 0 0 0
0.5831 0.4062 0.2354 0.4088 0.9711 0.8083 0.6523 0.2193 0.3891 0.5491
A titre d’exemple d’utilisation de la fonction randperm, nous pourrions `a pr´esent souhaiter randomiser l’ordre des colonnes de la matrice G.
>>G = G(:,randperm(10))
4.4.3 Op´erations sur les matrices
Les op´erations math´ematiques sur les matrices suivent les r`egles de l’alg`ebre lin´eaire. Des contraintes sur la taille et la forme des matrices existent pour permettre de r´ealiser la multiplication (avec l’op´erateur *), la division (avec l’op´erateur / ou \), l’exponentiation (avec l’op´erateur ^) de matrices. Dans nos applications `a nous ce ne sont en g´en´eral pas ces op´erations d’alg`ebre lin´eaire que nous souhaitons r´ealiser sur nos donn´ees.
Les op´erations que nous sommes plus susceptible d’effectuer sur des matrices sont les op´erations qui s’ap-pliquent sur les ´el´ements correspondant de 2 matrices de mˆeme dimension. Pour les vecteurs, matrices et tableaux de dimension sup´erieure, les 2 op´erandes doivent avoir la mˆeme taille. Chaque ´el´ement du premier op´erande est associ´e avec l’´el´ement du deuxi`eme op´erande `a la mˆeme position pour r´ealiser l’op´eration math´ematique. Si les op´erandes sont de tailles diff´erentes cette association d’´el´ements ”un `a un” n’est plus possible.
Voici la liste des op´erateurs ”un `a un”
— 1. + L’addition et la soustraction fonctionne de la mˆeme mani`ere qu’en alg`ebre lin´eaire — 2.
-— 3. .* Pour la multiplication, la division et l’exponentiation, il faut adjoindre un point `a l’op´erateur pour signifier que l’on souhaite effectuer l’op´eration ´el´ement par ´el´ement.
— 4. .^ — 5. ./
4.4.4 Suppression de lignes ou colonnes d’une matrice
Parfois, l’on peut vouloir supprimer certaines lignes ou certaines colonnes d’une matrice. Il y a 2 mani`eres de g´erer ce cas. La premi`ere mani`ere est de r´eaffecter `a la variable contenant la matrice le sous-ensemble que l’on souhaite garder. Par exemple, pour supprimer la 5eme ligne de la matrice H
>> H = magic(10) %cr´eer une matrice (10x10)
>> H = H([1:4,6:end],:) %on reaffecte H en gardant toutes les lignes sauf la 5eme
La deuxi`eme mani`ere consiste `a effecter une matrice vide aux lignes ou aux colonnes que l’on souhaite supprimer. Par exemple,
>> I = rand(13) %cr´eer une matrice (13x13)
>> I([1:3,:) = [] %supprimons les 3 premi`eres lignes
>> I([:,end-4:end) = [] %supprimons les 5 derni`eres colonnes
5
Appeler/utiliser des fonctions de MATLAB
Prototype d’une fonction type :
[out1,out2,...] = function_name(in1,in2,...)
- une fonction peut prendre des arguments d’entr´ee plac´es entre parenth`eses apr`es le nom de la fonction (ce sont les donn´ees `a traiter).
- une fonction peut renvoyer une ou plusieurs valeurs de retour (ce sont le/les r´esultat(s) du traitement effectu´e(s) par la fonction)
Exemple 1 : la fonction max renvoie le maximum du vecteur donn´e en entr´ee, mais elle peut aussi renvoyer la position du maximum dans ce vecteur. Voir l’aide (>>doc max)
>>notes = [12 , 3 , 17 , 15 , 13 ] >>max(notes) %affiche la note maximale
>>noteMax = max(notes) %stocke la note maximale ds la variable noteMax
>>[noteMax , ind] = max(notes) %ici, en plus ind contiendra la position de ’noteMax’ dans ’notes’ Exemple 2 : la fonction size renvoie un vecteur contenant la taille selon chaque dimension de la variable pass´ee en argument (voir l’aide >>doc size)
>>size(ind) %un scalaire est une matrice de dimension (1x1) >>size(rowvect)
>>size(maPremiereMatrice)
>>dim = size(maPremiereMatrice) %sauvegarde du r´esultat ds la variable dim >>[dim1 , dim2] = size(maPremiereMatrice)
Exercice : Cr´eer la matrice F en utilisant la commande suivante : >>F = []; for i=11:10:91; F = [F;i:i+8]; end;
— Quelle est la dimension de la matrice F ? — Quelle est la taille selon chaque dimension ?
— Quelle est le maximum de la deuxi`eme ligne de F ?
Trouver une fonction et de l’aide sur son fonctionnement :
>>lookfor fourier (recherche de fonction par mot-clef, par exemple pour trouver la transform´ee de fourier discr`ete)
>>help fft (obtenir de l’aide sur la fonction fft en ligne de commande)
>>doc fft (ouvre un browser, aide plus d´etaill´ee. Le browser contient un moteur de recherche et des menus permettant de facilement trouver une fonction)
6
Ecrire des scripts M-files
Un fichier de script est un fichier externe contenant une suite d’instruction MATLAB. Les fichiers de script ont une extension de nom de fichier .m. Les M-files peuvent ˆetre des scripts qui ex´ecutent simplement une suite d’instructions ou peuvent ˆetre des fonctions (nous verrons les fonctions plus loin).
Exemple : cr´eer le script ”test script” (soit vous tapez >>edit test_script.m, soit vous faites ’File’->’New’->’Script’ puis ’Save As’ en sp´ecifiant ”test script.m” comme nom) avec la suite d’instructions suivante : clear all %efface toutes les variables du workspace
a = 1 b = 2;
c = 3, d = 4; e = a*b/(c+d), scal = 11;
Sauvegardez puis ex´ecutez le script (menu Debug->Save&Run ou Fleche verte ou F5). Observez la sortie sur la ligne de commande et conclure quant `a l’utilisation des ; et ,
Il est ´egalement possible d’appeler le script depuis la ligne de commande, taper >>test_script
7
Programmer avec MATLAB
7.1 Op´erateurs de comparaisons
Les op´erateurs de comparaison sont : == : ´egal `a (x == y)
> : strictement plus grand que (x > y) < : strictement plus petit que (x < y) >= : plus grand ou ´egal `a (x >= y) <= : plus petit ou ´egal `a (x <= y) ~= : diff´erent de (x ~= y)
Le r´esultat d’une ´evaluation d’un test logique `a l’aide d’op´erateurs de comparaisons peut-ˆetre Vrai ou Faux qui sont respectivement repr´esent´es par les entiers 1 et 0 sous MATLAB ( VRAI <==> 1 , FAUX <==> 0 ).
Exemple :
>>toto = 3 %on affecte `a toto la valeur 3 >>titi = 4 %on affecte `a titi la valeur 4 >>toto == 3 % ´egal `a ?
>>toto == titi
>>toto ~= 3 % diff´erent de ? >>toto ~= titi
>>toto > 3 % plus grand que ? >>toto > titi
>>toto < 3 % plus petit que ? >>toto < titi
>>toto >= 3 % plus grand ou ´egal `a ? >>toto >= titi
>>toto <= 3 % plus petit ou ´egal `a ? >>toto <= titi
7.2 Op´erateurs logiques
Cr´eer 4 variables bool´eennes pour tester les diff´erents op´erateurs >>a = 1; b = 0; c = 1; d = 0;
Puis tester les 3 op´erateurs logiques : - l’op´erateur & (ET logique),
>>a&c >>a&b >>b&d >>b&a
Un ET logique entre 2 propositions renvoie VRAI si et seulement si les deux propositions sont vraies. - l’op´erateur | (OU logique),
>>a|c >>a|b >>b|d >>b|a
Un OU logique entre 2 propositions renvoie FAUX si et seulement si les deux propositions sont fausses. l’op´erateur ~ (NON logique),
>>~a >>~b >>~b|a >>~(b|a)
Exemple concret : on veut savoir si un individu a 25 ans r´evolus et mesure moins 180cm. Si le test (age>25) & (taille<180) retourne 1 les deux conditions sont v´erifi´ees, si il retourne 0 au moins une des deux conditions est fausse.
>> age = 30; taille = 170; (age>25) & (taille<180) >> age = 24; taille = 165; (age>25) & (taille<180) >> age = 35; taille = 185; (age>25) & (taille<180) >> age = 20; taille = 195; (age>25) & (taille<180)
A titre d’exercice, ´ecrire l’´equation logique permettant de savoir si un individu peut avoir acc`es au grand 8 du parc d’attraction. Un individu a acc`es au man`ege dans les cas suivants :
- il a plus d’1m30
- il est majeur ou accompagn´e d’un individu majeur.
Pour cela, cr´eer 3 variables age , taille , accompagne et test´e les diff´erents cas de figure.
Les op´erateurs de comparaison et les op´erateurs logiques sont utilis´es essentiellement dans les instructions de contrˆole if et while.
7.3 Branchement conditionnel (IF ... THEN ... ELSE ...)
On a parfois besoin d’ex´ecuter une s´equence d’instructions seulement dans le cas o`u une condition donn´ee est v´erifi´ee au pr´ealable. Diff´erentes formes d’instruction conditionn´ee existent sous MATLAB.
— Forme 1
if <expression bool´eenne>
<suite d’instructions ex´ecut´ee si l’expression est VRAI> end
— Forme 2
if <expression bool´eenne>
<suite d’instructions 1 ex´ecut´ee si l’expression est VRAI> else
<suite d’instructions 2 ex´ecut´ee si l’expression est FAUSSE> end
L’indentation n’est pas obligatoire, mais elle permet de rendre le programme plus lisible. — Forme 3
if <expression bool´eenne 1>
<suite d’instructions 1 ex´ecut´ee si l’expression 1 est VRAI> elseif <expression bool´eenne 2
<suite d’instructions 2 ex´ecut´ee si l’expression 1 est FAUSSE et que l’expression 2 est VRAI> .
. . else
<suite d’instructions n ex´ecut´ee si aucune des expressions n’est VRAI > end
Exemple : ´ecrire un script pile_face.m pour simuler un tirage `a pile ou face x = rand(); %renvoie un nombre al´eatoire compris
% entre 0 et 1 selon une loi uniforme if x > 0.5
disp(’pile’) else
disp(’face’) end
Exercice : ´ecrire un script solve_eq_2.m r´ealisant la r´esolution d’une ´equation du second ordre ax2 + bx + c = 0.
Connaissant a,b,c (variables qu’on pourra initialiser au d´ebut du script), trouver x dans l’ensemble des nombres r´eels.
Rappel :
- si ∆ = b2− 4ac est sup´erieur `a 0, alors il existe 2 solutions r´eelles, x1 = −b−
√ ∆
2a et x2 =
−b+√∆ 2a
- si ∆ est nul, alors il existe 1 solution unique, x = −b2a
- si ∆ est inf´ereur `a 0, il n’y a pas de solution ds l’ensemble des r´eels. On affichera alors ’pas de solution’. Indication : la racine carr´e s’obtient avec la fonction sqrt ou en ´elevant `a la puissance 12
7.4 Boucle for
La boucle for r´ep´ete une suite d’instruction un nombre pr´ed´etermin´e de fois. Sa structure est la suivante : for var = <list-of-values>
<suite d’instruction> end
La boucle for va executer la <suite d’instruction> pour chaque ´el´ement de la <list-of-values> en affectant l’´el´ement `a la variable var.
Exemple 1 : i = 0;
for k = 0:0.1:1 i = i + 1;
disp([’Iteration ’,num2str(i),’, k vaut ’,num2str(k)]); end
En g´en´eral, la liste de valeurs sert `a indexer un vecteur (ou matrice), on doit alors se limiter `a des valeurs enti`eres.
Exemple 2 : (on rajoute plus 2 `a tout le monde) : note1 = [ 4 , 12 , 7 , 15 , 12 ]
for i = 1:length(note1) %voir l’aide de length note1(i) = note1(i) + 2;
end
Exemple 3 : calcul de moyenne sur un vecteur. Ecrire le script suivant note2 = [ 4 , 18 , 7 , 15 , 12 ]
somme = 0;
for i = 1:length(note2)
%on fait la somme des notes somme = somme + note2(i); end
%on divise la somme des notes par le nombre de notes moyenne = somme / length(note2)
Il existe bien entendu dans MATLAB des fonctions permettant le calcul direct d’une moyenne, ce n’est qu’un exemple. Pour info, >>moyenne2 = mean(note2)
Exercice :
1) ´Ecrire un script qui cherche le maximum d’un vecteur sans utiliser la fonction max. Pour se faire, initialiser une variable maxi avec le premier ´el´ement du vecteur, puis ´ecrire une boucle for qui passera en revue chaque ´el´ement du vecteur et qui testera si celui-ci est sup´erieur `a maxi, si il est sup´erieur, on mettra `a jour maxi avec l’´el´ement courant du vecteur. Ainsi une fois tout le vecteur parcouru, maxi devrait contenir la valeur maximum du vecteur.
2) Modifier le script pour ´egalement sauvegarder la position du maximum dans le vecteur.
7.5 Boucle while
Il arrive que nous souhaitions r´ep´eter une suite d’instructions jusqu’`a qu’une condition soit satisfaite. Si l’on ne connait pas le nombre d’it´erations n´ecessaire `a l’avance, une boucle while est pr´ef´erable par rapport `a une boucle for
while <expression bool´eenne> <suite d’instructions> end
La <suite d’instructions> va ˆetre r´ep´et´ee tant que l’<expression bool´eenne> est vrai, ou dit autrement jusqu’`a ce que l’<expression bool´eenne> soit fausse.
Exemple 1 : on cherche le premier ´el´ement n´egatif d’un vecteur vec = [1,1,1,1,1,1,-1,1,-1]
i = 1;
while vec(i) >= 0 %tant que vec(i) est sup´erieur `a 0
i = i+1; %on incr´emente i pour regarder l’´el´ement suivant de vec end
i %indice du premier ´el´ement n´egatif vec(i) %premier ´el´ement n´egatif
R´eessayer avec vec = [1,1,1,1,1,1,1,1,1], que ce passe-t-il ? Modifions le script pour prendre en compte ce cas limite : vec = [1,1,1,1,1,1,-1,1,-1]
i = 1;
while (i <= length(vec)) && (vec(i) >= 0) i = i+1;
end
if i <= length(vec)
disp( [’i = ’ ,num2str(i)] )
disp( [’vec(i) = ’ ,num2str( vec(i) )] ) else
disp(’Tous les ´el´ements sont positifs’) end
R´eessayer avec vec = [1,1,1,1,1,1,1,1,1]
7.6 Instructions break
L’instruction break : provoque l’arrˆet de la premi`ere boucle for, while englobante. L’instruction for ci-dessous est stopp´ee au premier i tel que t(i) est nul :
t = -2:10; for i = 1:length(t) if t(i) == 0 break; end end
disp( [’i = ’ ,num2str(i)] )
disp( [’t(i) = ’ ,num2str( t(i) )] )
7.7 Instructions continue
L’instruction continue : dans une instruction for, while, l’instruction continue provoque l’arrˆet de l’it´eration courante, et le passage au d´ebut de l’it´eration suivante.
Supposons que l’on parcoure un tableau t pour r´ealiser un certain traitement sur tous les ´el´ements, sauf ceux qui sont n´egatifs :
for i = 1:length(t) if (t(i) < 0 )
continue; % on passe au i suivant dans le for end
... % traitement de l’´el´ement courant end
Num´eros Element du M-file Description
(1) Ligne de d´efinition D´efinie le nom de la fonction ainsi
de fonction que le nombre et l’ordre des arguments d’entr´ee et de sortie (2-5) Texte d’aide Description du programme qui sera
affich´ee lorsqu’on demandera de l’aide sur la fonction (6+) Corps de la fonction Code de la fonction r´ealisant les calculs n´ecessaires.
Table 1 – D´etail des ´el´ements constituant une fonction MATLAB
8
Cr´
eation d’une fonction
Nous avons ´evoqu´e pr´ec´edemment l’utilisation de fonctions MATLAB pr´eprogramm´ees telle la fonction max() et size(). Tout comme pour les scripts, il est possible de cr´eer ses propres fonctions au sein d’un M-file. Contrairement aux scripts, les fonctions peuvent accepter des donn´ees en entr´ee et renvoyer des donn´ees en sortie. Chaque fonction a son propre espace en m´emoire et ne voie pas les donn´ees du workspace. Seules les donn´ees qu’on aura sp´ecifi´e comme arguments d’entr´ee seront utilisables par la fonction.
A titre d’exemple, nous allons cr´eer une fonction de calcul de moyenne. Ds le r´ep´ertoire courant, cr´eer le fichier myMean.m (>>edit myMean.m) contenant le code suivant :
function [mu,minv,maxv] = myMean( tab ) (1)
%MYMEAN(TAB) calcul de moyenne sur un tableau 1D (2)
%Pour un tableau ’tab’ `a 1 dimension [mu,minv,maxv] = myMean( tab ) (3) %retourne la moyenne ’mu’, le minimum ’minv’ le maximum ’maxv’ des (4)
%´el´ements de ’tab’. (5)
mu = 0; (6) for i = 1:length(tab) (7) mu = mu + tab(i); (8) end (9) mu = mu / length(tab); (10) minv = min(tab); (11) maxv = max(tab); (12)
La premi`ere ligne d’une fonction commence avec le mot-cl´e function. Cette ligne donne le nom de la fonction ainsi que la liste des arguments d’entr´ee et de sortie. Dans le cas de cette fonction, elle ne prend qu’un seul argument en entr´ee mais peut renvoyer de 1 `a 3 valeurs. Il est possible mais pas obligatoire de rajouter en commentaires sous la premi`ere ligne de d´efinition de la fonction un descriptif de ce que fait la fonction. Ces lignes en commentaires seront affich´es lorsqu’on demandera de l’aide sur la fonction. Il est important de noter que le nom du fichier .m contenant notre fonction doit ˆetre form´e du nom de la fonction suivi de l’extension .m . Pour notre exemple de calcul de moyenne, le fichier devra obligatoire s’appeler myMean.m.
Le tableau 1 donne un r´ecapitulatif des ´el´ements constituants une fonction MATLAB.
- Cr´eer un vecteur (par ex, >>note = [2,18,5,15] ) et appeler la fonction myMean() des mani`eres suivantes : >>myMean(note)
>>a = myMean(note) >>[a,b] = myMean(note) >>[a,b,c] = myMean(note)
Exercices :
— Ecrivez une fonction de conversion de degr´es Fahrenheit vers des degr´es Celsius. (Rappel : C =
5
9(F − 32))
— Ecrivez une fonction prenant 2 arguments d’entr´ee et 2 arguments de sortie qui permettra de d´eterminer la taille en cm et le poids en kg d’une personne `a partir de sa taille en pouces (1 in = 2.54 cm) et son poids en livres (1 lb = 0.453 kg).
9
Graphique 2D
9.1 Fonction ´el´ementaire
On souhaite afficher la fonction y = sin(3πx) sur 0 < x < 1. Pour cela, on ´evalue un certain nombre de points sur l’intervalle.
>>N = 10; h = 1/N; x=0:h:1 >>y = sin(2*pi*x)
Pour afficher les donn´ees sur un graphique, on utlise la fonction plot(). Elle prend un ou 2 tableaux 1D en entr´ee. Si utilis´ee avec 2 tableaux, ceux-ci doivent ˆetre de mˆeme taille.
>>figure(1), plot(y) >>figure(2), plot(x,y)
Comparez les figures 1 et 2, et conclure quant `a l’utilisation d’1 ou 2 tableaux. La fonction figure permet de cr´eer un nouvelle fenˆetre pouvant contenir des graphes
Il peut ˆetre utile de fermer toutes les fenˆetres de graphique en d´ebut de script. Pour cela, on appelle la fonction close all
Effectuer un nouvel affichage pour N = 100
9.2 Titres, labels et grille
Pour rajouter un titre et des labels d’axes `a notre figures, on utilise >>title(’Graph de y = sin(3 pi x)’)
>>xlabel(’Axe x’) >>ylabel(’Axe y’)
Une grille en pointill´es peut ´egalment ˆetre rajout´ee >>grid on %affichage de la grille
>>grid off %masquage de la grille
9.3 Styles de ligne et couleurs
Par d´efaut, les lignes sont bleues en trait plein. Il est possible de modifier le style et la couleur de la ligne en rajoutant un 3`eme argument `a la fonction plot(). La figure 2 pr´esente les couleurs et styles de ligne disponibles ainsi que les codes associ´es. Par exemple, pour afficher notre courbe avec un point vert par donn´ee, nous utiliserons l’option ’g.’.
Figure 2 – Styles de ligne
9.4 Plusieurs courbes sur le mˆeme graphique
Un nouvel appel de la fonction plot efface le graphique pr´ec´edent. Ce n’est pas souhaitable si l’on souhaite afficher plusieurs courbes sur le mˆeme graphe. Pour emp´echer MATLAB d’effacer le graphe, on utilise hold on >>plot(x,sin(3*pi*x),’r-’), hold on
>>plot(x,cos(3*pi*x),’kx’)
>>title(’Plusieurs courbes’), xlabel(’Axe x’),ylabel(’Axe y’) >>legend(’Sinus’,’Cosinus’)
Une l´egende peut ˆetre affich´ee donnant la liste des styles de lignes suivie de la description sp´ecifi´ee par l’utilisateur
9.5 Affichage de plusieurs graphes cˆote `a cˆote (subplot)
Une fenˆetre d’un graphique peut ˆetre divis´ee en sous-fenˆetres suivant un tableau de dimension (mxn). On peut alors afficher dans chaque sous-fenˆetre une ou plusieurs courbes. Les fenˆetres sont index´ees de 1 `a m · n en ligne en partant du coin sup´erieur gauche. (subplot(2,2,k), pour la k i`eme fenˆetre d’un tableau (2x2)). Les instructions hold et grid fonctionnent sur le subplot courant
Exemple : >>subplot(2,2,1), plot(x,sin(3*pi*x)) >> ylabel(’sin 3 pi x’) >>subplot(2,2,2), plot(x,cos(3*pi*x)) >> ylabel(’cos 3 pi x’) >>subplot(2,2,3), plot(x,sin(6*pi*x)) >> ylabel(’sin 6 pi x’)
>>subplot(2,2,4), plot(x,cos(6*pi*x)), hold on, plot(x(1:10:end),cos(6*pi*x(1:10:end)),’r.’) >> ylabel(’sin 6 pi x’)