Académique Documents
Professionnel Documents
Culture Documents
Septembre 2022
2
Table des matières
3 Scripts et Fonctions 39
3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2 M-files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2.1 Fichiers Script . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.2.2 Fichiers de type Fonction . . . . . . . . . . . . . . . . . . . . . 42
3.3 Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.3.1 Principes de base d’une fonction . . . . . . . . . . . . . . . . . 44
3.3.2 Espace de travail des fonctions . . . . . . . . . . . . . . . . . . 49
3.3.3 Chemin de Matlab . . . . . . . . . . . . . . . . . . . . . . . 52
3.3.4 Sous-fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.3.5 Fonctions de manipulation . . . . . . . . . . . . . . . . . . . . 55
3.4 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
i
ii TABLE DES MATIÈRES
5 Visualisation et traçage 79
5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.2 Graphique 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.3 Graphique 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.3.1 Courbes paramétriques . . . . . . . . . . . . . . . . . . . . . . 85
5.3.2 Surfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.4 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Chapitre 1
1.1 Introduction
Ce chapitre vous permet de démarrer avec le logiciel Matlab, en l’utilisant
comme calculatrice. Comme vous le verrez, Matlab possède une grande biblio-
thèque de fonctions mathématiques intégrées que vous pouvez utiliser pour effectuer
toute opération disponible sur une calculatrice scientifique ou graphique. À la fin de
ce chapitre, vous devez être familiarisés avec l’environnement Matlab, la manière
d’exécuter des commandes dans Matlab et les fonctionnalités mathématiques de
base de Matlab.
1
2 CHAPITRE 1. Premiers pas avec l’environnement Matlab
lab qui liste toutes les variables actuellement utilisées dans l’espace de travail. Les
détails de l’espace de travail seront également expliqués à la section 4 sur les fonc-
tions. Dans les versions antécédentes, une fenêtre appelée fenêtre d’historique des
commandes (command history window) était comme un répertoire de toutes
les commandes précédentes exécutées à l’invite de commandes, ce qui est utile pour
rappeler le travail effectué lors d’une session précédente. Dans les nouvelles versions,
il suffit de cliquer sur la flèche HAUT du clavier afin d’afficher cette fenêtre cachée.
Vous pouvez réorganiser la taille et la forme de chaque fenêtre en cliquant et en
maintenant le curseur de la souris sur les bordures des fenêtres, puis en les faisant
glisser vers un emplacement qui vous convient le mieux. Vous pouvez également mo-
difier l’emplacement des fenêtres en cliquant et en maintenant le curseur de la souris
sur la barre de titre de la fenêtre et en le faisant glisser vers un autre emplacement. Si
vous souhaitez supprimer une fenêtre, cliquez sur le symbole de triangle dans le coin
supérieur droit de la fenêtre et choisir fermer. Pour le remettre, cliquez sur l’icône
Layout sur la bande d’outils puis cochez la fenêtre souhaitée. Vous pouvez changer
la couleur d’arrière-plan ainsi que la couleur et le style de police en fonction de vos
préférences personnelles. Les options peuvent être modifiées dans l’icône Préférences
sur la bande d’outils.
Les opérations ont un ordre de priorité standard que différentes opérations ont
les unes par rapport aux autres. Matlab utilise le même ordre d’opérations que vous
avez appris à l’école primaire. Les puissances sont exécutées avant la multiplication
et la division, qui sont exécutées avant l’addition et la soustraction. Les parenthèses,
(), peuvent également être utilisées dans Matlab pour imposer un ordre autre que
l’ordre standard des opérations. Dans le cas de deux opérations ayant le même ordre
de priorité, Matlab commence de gauche à droite.
5
>> sin(pi/2)
ans =
1
Essayer ! :
>> format long
>> pi
ans =
3.141592653589793
La fonction help est une commande très intéressante qui peut être utilisée pour
afficher la description de n’importe quelle fonction dans Matlab. Vous pouvez ap-
peler la fonction d’aide en tapant >> help à l’invite de commande suivie du nom
de la fonction. Si vous voyez une fonction avec laquelle vous n’êtes pas familier, il est
recommandé d’utiliser la fonction d’aide avant de demander à quoi sert une fonction
spécifique.
1.3. LA CALCULATRICE MATLAB 5
Matlab peut gérer l’expression 1/0, qui est l’infini : Inf ou −1/0 = −∞ −Inf.
Notez que Matlab renverra 0/0 comme n'est pas un nombre ou NaN. Vous pouvez
taper Inf à l’invite de commande pour désigner l’infini ou NaN pour désigner quelque
chose qui n’est pas un nombre et que vous souhaitez la traiter comme un nombre.
Enfin, Matlab
√ peut également gérer les nombres imaginaires, en utilisant la variable
i, qui est −1. √
Attention, la valeur −1 est stockée dans les variables i et j, mais si vous réutilisez
ces variables pour stocker une autre valeur vous allez écrasez leur valeur initiale.
>> 3 + Inf
ans =
Inf
>> 2 / Inf
ans =
0
>> Inf/Inf
ans =
NaN
Opérateur Signification
> Supérieur
>= Supérieur ou égal
< inférieur
<= inférieur ou égal
== Égal
∼= Différent de
Attention ! :
L’opérateur ′ =′ avec un seul symbol est un opérateur d’affectation.
Les opérateurs logiques (Logical operators) sont des opérations entre deux
expressions logiques que, pour des raisons de discussion, nous appelons P et Q.
Les opérateurs logiques fondamentaux que nous utiliserons ici sont AND, OR et
NOT, qui sont notés dans Matlab par &&, ||, et ∼ , respectivement. Il existe
d’autres opérateurs logiques, mais ils sont équivalents à des combinaisons de ces
trois opérateurs. P AND Q n’est vraie que si P et Q sont toutes les deux vraies. P
OR Q est vraie si une des deux expressions P ou Q est vraie ou si P et Q sont vraies
toutes les deux. Il est important de noter que OR dans Matlab est une inclusif
OR, ce qui signifie qu’il est vrai si P et Q sont tous deux vrais aussi. En revanche,
exclusif OR ou XOR est vraie si P ou Q est vraie, mais fausse si P et Q sont
toutes les deux vraies. Si P est vraie, alors NOT P est fausse, et si P est fausse,
alors NOT P est vraie.
Tout comme les opérateurs arithmétiques, les opérateurs logiques ont un ordre
d’opérations les uns par rapport aux autres et par rapport aux opérateurs arith-
métiques. Toutes les opérations arithmétiques seront exécutées avant les opérations
de comparaison, qui seront exécutées avant les opérations logiques. Les parenthèses
peuvent être utilisées pour modifier l’ordre des opérations.
Même lorsque l’ordre des opérations est connu, il est généralement utile pour vous
et ceux qui lisent votre code d’utiliser des parenthèses pour rendre vos intentions
plus claires.
8 CHAPITRE 1. Premiers pas avec l’environnement Matlab
Attention ! : Bien qu’en logique formelle, 1 soit utilisé pour indiquer vrai et
0 pour indiquer faux, Matlab abuse légèrement de la notation et prendra tout
nombre différent de 0 comme vrai logique lorsqu’il est utilisé dans une opération
logique. Par exemple, 3 && 1 sera calculé vrai. N’utilisez pas cette fonctionnalité
de Matlab. Utilisez toujours 1 pour désigner une déclaration vraie.
1.5 Exercices
L’environnement Matlab
1. Depuis l’historique des commandes, exécuter respectivement les trois dernière
récentes commandes.
2. Redimensionner l’invite de commande d’une manière qui vous convient.
3. Dans l’anglet ’préférence’ choisir la taille de police que vous souhaitez ainsi
que la couleur de fond (Noir) et la couleur de police (Blanc).
4. Taper sur l’invite de commande >> travel et tester le programme Traveling
Salesman.
5. Taper sur l’invite de commande >> pdetool et tester l’outil de résolution des
équations aux dérivées partielles.
La Calculatrice Matlab
6. Calculez la surface d’un trapèze de base inférieure B = 6, base supérieure b = 4
et de hauteur h = 2. Rappelons que la surface d’un trapèze vaut : S = B+b 2
×h
7. Calculez la surface complète ainsi que le volume d’un cylindre de rayon r = 3
et hauteur h = 6.
8. Calculez la distance entre les points de coordonnées (2, 3), (1, 4).
9. Calculez la pente entre les deux dits points.
10. Calculez la valeur de 5! en utilisant la commande factorial.
1.5. EXERCICES 9
11
12 CHAPITRE 2. Variables et structures de données
égal est affectée à la variable à gauche du signe égal. Par conséquent, >> 1 = x
générera une erreur dans Matlab. L’opérateur d’affectation est toujours le dernier
dans l’ordre des opérations relatives aux opérateurs mathématiques, logiques et de
comparaison.
Il existe certaines restrictions sur les noms que les variables peuvent prendre. Les
variables ne peuvent contenir que des caractères alphanumériques (lettres et chiffres)
ainsi que des traits de soulignement. Cependant, le premier caractère d’un nom de
variable doit être une lettre. La longueur maximale d’un nom de variable est de 255
caractères, ce qui est rarement un problème. Les espaces dans un nom de variable
ne sont pas autorisés et les noms de variable sont sensibles à la casse (par exemple,
x et X seront considérés comme des variables différentes).
Notez que lorsqu’une variable est affectée, elle n’a aucune mémoire de la façon
dont elle a été affectée. C’est-à-dire que si la valeur d’une variable, a, est construite
à partir d’autres variables, comme x, la réaffectation de la valeur de x ne changera
pas la valeur de a.
Attention ! : Vous pouvez écraser des variables ou des fonctions intégrées qui
ont été stockées dans Matlab. Par exemple, la commande >> pi = 2 stockera
la valeur 2 dans la variable nommée >> pi. Après cette affectation, >> pi se
comportera comme la valeur 2 au lieu de la valeur π. Par conséquent, vous devez
toujours faire attention à ne pas donner à vos variables le même nom que les
fonctions ou valeurs intégrées. Un moyen simple de vérifier si un nom est déjà
utilisé est d’utiliser la fonction d’aide : help.
Astuce ! : Certaines des structures de données que vous créerez et avec les-
quelles vous travaillerez seront très volumineuses, comportant des milliers ou des
millions d’entrées. Puisqu’il n’est pas utile pour un humain de visualiser phy-
siquement le contenu de ces structures de données, un point-virgule peut être
utilisé après la création d’une variable pour supprimer l’affichage. Par exemple,
>> x = 2; n’affichera pas l’affectation résultante à l’écran, mais l’affectation à
x sera toujours exécutée. Vous pouvez le vérifier en regardant dans la fenêtre de
l’espace de travail.
>> x = 2;
>> x
x =
14 CHAPITRE 2. Variables et structures de données
Vous pouvez créer des tableaux de doubles dans Matlab en utilisant des cro-
chets [ ]. Le terme technique pour la fonction fournie par des crochets est appelé
concaténation (nom) ou concaténer (verbe). Il est courant de séparer les colonnes par
des virgules ou espace et les lignes par des point-virgules dans une concaténation.
Vous pouvez créer un tableau vide en plaçant des crochets autour de rien.
>> x = [1 5 9]
x =
1 5 9
>> y = [1 5 9 ; 2 4 8]
y =
1 5 9
2 4 8
Ou :
>> y = [x; 2 4 8]
y =
1 5 9
2 4 8
2.2. TABLEAUX DE DOUBLES 15
Ou :
>> y = [[1; 2] [5; 4] [9; 8]]
y =
1 5 9
2 4 8
Notez, encore une fois, que Matlab résout toujours les crochets les plus internes
en premier. La ligne de commande >> y = [[1; 9], [4; 2], [3; 7]] concaté-
nera [1;9] avant les crochets externes.
3
>> size(x)
ans =
1 3
>> size(y)
ans =
2 3
>> length(y)
ans =
3
>> rows = size(y, 1)
rows =
2
>> cols = size(y, 2)
cols =
3
Parfois, nous voulons garantir un point de début et de fin pour un tableau, tout
en ayant des éléments régulièrement espacés. Par exemple, nous pouvons vouloir un
tableau qui commence à 1, se termine à 8 et a exactement 10 éléments. Pour cela,
vous pouvez utiliser la fonction linspace. Contrairement aux fonctions avec les-
quelles vous avez travaillé auparavant qui ne prennent qu’une seule entrée, linspace
prend trois valeurs d’entrée séparées par des virgules. Donc A = linspace(a,b,n)
génère un tableau de n éléments équidistants partant de a et se terminant en b.
Un autre type de tableau très structuré est une matrice dans laquelle chaque
élément porte le même nombre. A cet effet, les fonctions zeros et ones sont utiles.
Ces fonctions prennent en arguments le nombre de lignes et ce de colonnes et ren-
voient une matrice de la dimension d’entrée rempli des zéros ou des uns. De même,
la fonction eye permet d’avoir une matrice identité selon une démarche identique. Si
le nombre de colonnes n’est pas spécifié, alors Matlab va considéré que la matrice
est carrée.
Essayer ! : Générez une matrice 3 × 2 remplie des uns, une matrice 2 remplie
des zéros et une matrice identité de dimension 3 × 3 :
>> M = ones(3, 2)
M =
1 1
1 1
1 1
>> N = zeros(2, 4)
N =
0 0 0 0
0 0 0 0
0 0 0 0
>> I = eye(3)
I =
1 0 0
0 1 0
0 0 1
0 0 0 1 1 1
0 0 0 1 1 1
Essayer ! : Créez la matrice suivante : M =
1 0 0 1 2 3
0 1 0 4 5 6
0 0 1 9 8 7
>> M = [zeros(2,3) ones(2,3); eye(3) [1:3; 4:6; 9:-1:7]]
M =
0 0 0 1 1 1
0 0 0 1 1 1
1 0 0 1 2 3
0 1 0 4 5 6
0 0 1 9 8 7
2.4 Indexation
Dans Matlab, les indices d’un tableau sont indiqués par des parenthèses atta-
chées au nom de la variable. Si A est un tableau dans l’espace de travail courant,
nous pouvons obtenir l’élément de la ligne row et de la colonne col en utilisant la
notation A(row, col). C’est ce qu’on appelle l’indexation de tableau : array in-
dexing. Vous pouvez spécifier un tableau d’indices pour obtenir plusieurs éléments
d’un tableau. En d’autres termes, r et c peuvent être des tableaux et vous pouvez
utiliser des opérations de création de tableau dans l’indexation. Si vous voulez une
ligne ou une colonne entière, vous pouvez raccourcir cette opération avec la com-
mande deux-points (:). Si vous voulez aller à la fin d’un tableau lors de l’indexation,
vous pouvez utiliser le mot end.
3 7 −2 1
Essayer ! : Soit le tableau A = :
−3 4 5 0
Retrouver l’élément de la deuxième ligne et de la troisième colonne (i.e. 5).
>> A(2,3)
ans =
5
Vous pouvez réaffecter une valeur d’un tableau à l’aide de l’indexation de ta-
bleau et de l’opérateur d’affectation. Vous pouvez réaffecter plusieurs éléments à un
seul numéro en utilisant l’indexation de tableau sur le côté gauche. Vous pouvez
également réaffecter plusieurs éléments d’un tableau tant que le nombre d’éléments
à affecter et le nombre d’éléments affectés sont identiques. Vous pouvez aussi créer
un tableau en utilisant l’indexation de tableau.
20 CHAPITRE 2. Variables et structures de données
1 2
Essayer ! : Créez une matrice A = à l’aide de l’indexation.
3 4
>> A(1,1) = 1;
>> A(1,2) = 2;
>> A(2,1) = 3;
>> A(2,2) = 4
A =
1 2
3 4
2.5 Arithmétique
Dans la section 1.3, on a déjà parlé de l’arithmétique de base dans Matlab.
Dans la présente section, on parlera de l’arithmétique matricielle. En effet, Matlab
fait la différence entre les opérations arithmétique entre tableaux (par case) et les
opérations entre matrices comme le produit matriciel par exemple.
2.5. ARITHMÉTIQUE 21
Commençant par le cas le plus simple, où l’opération est entre scalaire et tableau.
Soit T un tableau et a un scalaire. T + a rajoute la valeur a à chaque élément de T ,
T − a soustrait la valeur a de chaque élément de T , T *a multiplie chaque élément
de T fois la valeur de a et T /a divise chaque élément de T par la valeur de a.
1 2
Essayer : Soit le tableau T = . Additionnez et soustrayez la valeur
3 4
2 de T . Multipliez et divisez T par 2. Vérifiez par vous-même la commutativité
de l’addition et de la multiplication scalaires :
T + a = a + T et aT = T a.
>> T + 2
ans =
3 4
5 6
>> T * 2
ans =
2 4
6 8
>> T − 2
ans =
−1 0
1 2
>> T / 2
ans =
0.5000 1.0000
1.5000 2.0000
Décrire les opérations entre deux matrices est plus compliqué. Prenons d’abord
les opérations d’addition et de soustraction + et −, car elle ne présente aucun pro-
blème. Soit deux tableaux T1 et T2 de même taille. T1 + T2 fait l’addition de chaque
élément de T1 à son correspondant dans T2 . De même T1 − T2 soustrait chaque
élément de T2 de son correspondant dans T1 .
22 CHAPITRE 2. Variables et structures de données
1 3 0 1
Essayer : Soit deux tableaux T1 = , T2 = . Additionnez et
5 7 2 3
soustrayez les valeurs de T2 de celles de T1 :
>> T1 + T2
ans =
1 4
7 10
>> T1 − T2
ans =
1 2
3 4
ans =
0 3
10 21
>> T1 ./ T2
ans =
Inf 3.0000
2.5000 2.3333
>> T1 .^ T2
ans =
2.5. ARITHMÉTIQUE 23
1 3
25 343
ans =
6 10
14 26
>> T1 ^ 2
ans =
16 24
40 64
ans =
1 5
3 7
Les détails des opérations matricielles vont être discutés dans ce qui suit.
Toutes les fonctions arithmétiques intégrées de Matlab, telles que sin, peuvent
accepter des tableaux comme arguments d’entrée. La sortie est la fonction évaluée
pour chaque élément du tableau d’entrée. Une fonction qui prend un tableau en
entrée et exécute la fonction dessus est dite vectorisée.
ans =
1 2 3 4
>> x > 3
ans =
0 0 0 1 1 1
>> x > y
ans =
1 1 0 0 1 1
Matlab peut indexer les éléments d’un tableau qui satisfont une expression
logique.
Essayer ! : Soit x le même tableau que dans l’exemple précédent. Créez une
variable y contenant tous les éléments de x strictement supérieurs à 3. Attribuez
à toutes les valeurs de x supérieures à 3 la valeur 0.
>> y = x(x>3)
y =
4 5 6
>> x(x>3) = 0
2.6. CHAÎNES DE CARACTÈRES 25
x =
1 2 3 0 0 0
S =
's'
w =
'Hello World'
w =
'HelloWorld'
>> class(S)
ans =
'char'
>> class(w)
26 CHAPITRE 2. Variables et structures de données
ans =
'char'
Vous pouvez vous retrouver dans une situation où vous aimeriez utiliser une
apostrophe comme caractère. Ceci est problématique car une apostrophe est utilisée
pour désigner des chaînes. Heureusement, une apostrophe peut être créée en utilisant
deux apostrophes.
ans =
Aujourd'hui
>> s1 = 'Hello';
>> s2 = 'World';
>> s3 = [s1, ' ', s2]
s3 =
'Hello World'
Les tableaux de caractères sont indexés de la même manière que les tableaux de
doubles, y compris l’indexation des tableaux. Une chaîne vide peut être créée avec
deux apostrophes, ''.
ans =
'c'
>> s(11:end)
ans =
'methods'
Essayer ! : Créez une chaîne vide. Vérifiez que la chaîne vide est un caractère
de type Char.
>> s = '';
>> class(s)
ans =
'char'
Une fonction très utile dans Matlab est sprintf. La fonction sprintf écrit de
nouvelles données dans une chaîne préformatée.
28 CHAPITRE 2. Variables et structures de données
Essayer ! : Utilisez la fonction sprintf pour créer les chaînes s1 = 'Je m'
'appel Mohammed' et s2 = 'Je m''appel Khadija'.
>> n1 = 'Mohammed';
>> n2 = 'Khadija';
>> s1 = sprintf('Je m''appel %s', n1)
s1 =
Je m'appel Mohammed
s1 =
Je m'appel Khadija
s =
Person =
name: 'Mohammed'
ID: 25468
nationality: 'Morrocan'
Essayer ! : Soit maintenant une liste d’étudiants, chaque étudiant est défini
par un nom (char), un numéro d’identification personnel : ID (double) et un
tableau de notes (double). Remplissez un tableau de structures struct avec les
champs de noms, d’ID et des notes. Vérifiez que le tableau a un type struct à
l’aide de la fonction de class.
>> students(1).name = 'Mohammed';
>> students(1).ID = 25468;
>> students(1).grades = [14 16 15];
>> students(2).name = 'Khadija';
>> students(2).ID = 25327;
>> students(2).grades = [15 13 17];
>> students
30 CHAPITRE 2. Variables et structures de données
students =
name
ID
grades
>> class(students)
ans =
'struct'
Les tableaux de structures peuvent avoir deux dimensions ou plus, mais pour
les besoins de ce cours, les struct seront toujours unidimensionnelles. Puisque les
struct sont des tableaux, ils peuvent être concaténés, mais seulement si les deux
tableaux de struct ont les mêmes champs (et sont de taille compatible). De plus, les
additions et autres opérations arithmétiques ne sont pas autorisées entre les tableaux
de structures ou entre des struct et des nombres.
students =
name
ID
grades
ans =
name: 'Khadija'
ID: 25327
grades: [15 13 17]
ans =
name
ID
grades
Les informations contenues dans le champ d’un élément d’un tableau struct
peuvent être récupérées en indexant l’élément souhaité, puis en plaçant un point,
puis en tapant le nom du champ. Par exemple, students(2).grades renverra les
informations contenues dans le champ des notes du deuxième élément d’étudiant.
Les valeurs contenues dans les champs des tableaux de struct conservent leur type
de données d’origine ; par conséquent, ils se comportent exactement comme ce type
de données. Par exemple, students(2).grades est un tableau double [89 99 75
100 95]. Ainsi, nous pouvons utiliser l’indexation de tableaux pour obtenir des
éléments spécifiques des notes du deuxième étudiant.
grades =
15 13 17
32 CHAPITRE 2. Variables et structures de données
>> class(grades)
ans =
'double'
last =
17
students =
name
ID
grades
activities
club =
ans =
'Mohammed'
ans =
'Khadija'
ans =
'Omar'
Évitez de le faire lors du codage car vous pouvez obtenir des résultats inat-
tendus.
C =
34 CHAPITRE 2. Variables et structures de données
>> class(C)
ans =
'cell'
>> C = cell(1,3);
>> C{1} = 'Numerical methods';
>> C{2} = 2022;
>> C{3} = students;
>> class(C{1})
ans =
'char'
>> class(C{2})
ans =
'double'
>> class(C{3})
ans =
'struct'
ans =
cell
'Numerical methods'
>> C(2)
ans =
cell
[2022]
2.9 Exercices
1. Attribuez la valeur 2 à la variable x et la valeur 3 à la variable y. Effacez juste
la variable x. Ensuite, effacez toutes les variables à l’aide de clear. Effacer
l’écran en utilisant la commande clc.
2. Écrivez une ligne de code qui génère l’erreur suivante :
Undefined function or variable ’x’
3. Écrivez une ligne de code qui génère l’erreur suivante :
The expression to the left of the equals sign is not a valid target
for an assignment.
4. Soit x = 10 et y = 3 définis dans l’espace de travail. Écrivez une ligne de code
qui fera chacune des affectations suivantes :
36 CHAPITRE 2. Variables et structures de données
u = x+y
v = xy
w = x/y
z = sin(x)
r = cos(xy)
s = xy
5. Soit x = 1 4 3 2 9 4 et y = 2 −1 0 3 5 −3 . Calculez les af-
15. Écrivez des lignes de code qui génèrent chacune les erreurs suivantes liées aux
tableaux de structures :
??? Error using ==> horzcat CAT arguments are not consistent in structure
field names.
??? Undefined function or method ’plus’ for input arguments of type
’struct’.
16. Créez un tableau struct appelé Class avec les champs suivants : title (chaîne),
semestre (chaîne) et inscription (double). Remplissez la structure Class avec
les informations de trois de vos cours préférés.
Exemple du premier élément :
>> Class(1).title = 'CMI';
>> Class(1).semestre = 'S3 2022';
>> Class(1).inscription = 27;
Pour l’exemple du premier élément donné, utilisez la concaténation des valeurs
des champs de la variable Class pour générer la chaîne 'CMI: S3 2022'.
17. Créez un tableau de cellules appelé ’Cars’ où chaque ligne contient des données
sur une voiture. Le premier élément de la ligne doit être le nom de la voiture
(chaîne), le deuxième élément doit être la vitesse maximale (double) et le troi-
sième élément de la ligne doit être le nombre de cheveaux (double). Remplissez
la cellule Cars avec des informations à partir de trois éléments d’information
de vos voitures préférées.
Exemple de la première ligne :
>> Cars{1,1} = 'Jaguar F TYPE';
>> Cars{1,2} = 285;
>> Cars{1,3} = 444;
18.
38 CHAPITRE 2. Variables et structures de données
Chapitre 3
Scripts et Fonctions
3.1 Introduction
Dans les deux premiers chapitres, nous avons limité l’utilisation de Matlab dans
des commandes exécutées directement sur la fenêtre de commandes. Dans l’utilisa-
tion courante de Matlab, il sera ennuyeux de rédiger tout un programme en le
retapant à chaque fois sur la fenêtre de commandes. C’est pour cela, nous allons
organiser nos programmes dans des fichiers appelés ’m-files’. Ces fichiers, qui sont
exécutables sur Matlab, permettent de bien structurer nos programmes. Il y a deux
types de fichier Matlab, les Scripts et les fonctions.
La programmation nécessite souvent de répéter un ensemble de tâches encore et
encore. Par exemple, la fonction sin dans Matlab est un ensemble de tâches (c’est-
à-dire des opérations mathématiques) qui calcule une approximation de la valeur
sin(x).
Plutôt que d’avoir à retaper ou à copier ces instructions chaque fois que vous
voulez utiliser la fonction sin, il est utile de stocker cette séquence d’instructions
sous la forme d’une fonction que vous pouvez appeler encore et encore. L’écriture de
vos propres fonctions est l’objet de ce chapitre, et c’est l’utilisation la plus puissante
de la programmation informatique. À la fin de ce chapitre, vous devriez être capable
de déclarer, d’écrire, de stocker et d’appeler vos propres fonctions.
3.2 M-files
Pour écrire plusieurs instructions à la fois et les exécuter ligne par ligne, il est utile
d’utiliser des fichiers ; scripts ou fonctions appelés M-files. Les fichiers de ce type ont
une extension ’.m’ et doit contenir des instructions Matlab ou des commentaires.
Pour écrire vos propres programmes, vous devrez utiliser une nouvelle partie
de l’environnement Matlab appelée l’éditeur. L’éditeur vous permet de créer, de
modifier et d’enregistrer vos fichiers. Vous pouvez ouvrir l’éditeur en cliquant sur le
bouton ’New script’ ou ’New’ , dans le coin supérieur gauche de l’environnement
Matlab. La figure 3.1 montre l’éditeur Matlab.
Pour enregistrer votre programme, cliquez sur le bouton d’enregistrement, dans le
coin supérieur gauche de l’éditeur. Vous pouvez également enregistrer votre fonction
39
40 CHAPITRE 3. Scripts et Fonctions
en appuyant sur ctrl + s. Le type de fichier doit être .m, un fichier .m M-file, qui
est le type de fichier standard pour les script et fonctions Matlab. Les fichier .m
doivent se conformer à un schéma de nomenclature similaire aux variables. Ils ne
peuvent contenir que des caractères alphanumériques et des traits de soulignement,
et le premier caractère doit être une lettre. Le nom d’un fichier doit comporter moins
de 255 caractères.
Essayer ! : Écrire un fichier script qui calcule l’aire et le périmètre d’un cercle
pour un rayon donné.
clc
clear
close all
% Declarer le rayon
r = 1.5;
% Le perimetre
p = 2 * pi * r;
% L'air
a = pi * r^2;
Il est naturel de se demander quand un fichier script est plus approprié qu’une
fonction ou vice versa. Les fonctions sont plus utiles lorsqu’une tâche doit être ef-
fectuée plusieurs fois. Les fichiers script sont utiles lorsque vous devez exécuter une
séquence d’instructions seulement quelques fois dans une situation très spécifique
au contexte. Certains exemples peuvent produire un tracé compliqué ou d’essayer
quelque chose de nouveau pour voir s’il vaut la peine d’écrire une fonction pour cela.
Vous pouvez organiser le code des fichiers script dans des cellules (à ne pas
confondre avec les tableaux de cellules), qui peuvent être exécutées sans exécuter
le reste du script. Cela ne doit pas être confondu avec les tableaux de cellules. Une
cellule est un morceau de code d’un script qui peut être exécuté individuellement.
Les cellules de code peuvent être créées en double commentant ou en utilisant deux
%%. Vous pouvez exécuter une cellule en cliquant sur le bouton évaluer la cellule ou
sur le bouton évaluer la cellule et avancer ou simplement en tappant à la fois sur
’Ctrl’ + ’Enter’ lorsque le curseur est placé dans une cellule.
%% Declarer le rayon
r = 1.5;
%% Le perimetre
p = 2 * pi * r;
%% L'air
a = pi * r^2;
p =
12.5664
Une fois votre fonction enregistrée dans le répertoire de travail actuel, elle se
comporte exactement comme l’une des fonctions intégrées de Matlab et peut être
appelée à partir de l’invite de commande ou par d’autres fonctions.
Remarquez que cette fonction va permettre par la suite de calculer les caracté-
ristiques d’un disque quelconque, simplement par un appel à la fonction [a,p] =
APDisque(r) en changeant chaque fois la valeur du rayon r.
Notez aussi l’utilisation d’un point-virgule à la fin des deux lignes d’affectation
dans le code a = pi.*r^2; et p = 2.*pi.*r;. C’est une habitude très importante
dans la programmation des fonctions dans Matlab, car les résultats des instructions
d’affectation sans point-virgule s’affichent à l’écran. Comme cela sera démontré plus
tard, cela peut rendre les choses très compliquées, vous devez donc prendre soin de
supprimer toutes les instructions ’d’affectation’ dans une fonction. Utilisez la fonc-
tion d’affichage display ou des fonctions similaires lorsque vous souhaitez qu’une
fonction affiche quelque chose à l’écran.
Deuxièmement, notez que le mot end est placé à la fin de la fonction. Le mot
end devient bleu tout comme le mot-clé function. C’est parce que end est aussi
un mot-clé. Dans ce cas, il indique la fin d’une fonction. Plus tard, vous verrez que
cela met également déclare la fin à bien d’autres choses. Cette fonction fonctionnera
toujours si la fin n’y est pas placée, mais cela causera des problèmes plus tard. Par
conséquent, pour notre propos, terminez toujours une fonction avec le mot-clé end.
44 CHAPITRE 3. Scripts et Fonctions
3.3 Fonctions
3.3.1 Principes de base d’une fonction
En programmation, une fonction (function) est une séquence d’instructions qui
exécute une tâche spécifique. Une fonction peut avoir des arguments d’entrée (input
arguments), qui sont mis à sa disposition par l’utilisateur et présentent l’entité
appelant la fonction. Les fonctions ont également des arguments de sortie (output
arguments), qui sont les résultats de la fonction que l’utilisateur s’attend à recevoir
une fois que la fonction a terminé sa tâche. Par exemple, la fonction Matlab sin a un
argument d’entrée, un angle en radians et un argument de sortie, une approximation
de la fonction sin calculée à l’angle d’entrée (arrondi à 16 chiffres). La séquence
d’instructions pour calculer cette approximation constitue le corps de la fonction
(body of the function), qui jusqu’à présent n’a pas été représenté.
Dans ce cours, nous définirons les fonctions par leurs en-tête (function header).
Un en-tête de fonction est la façon dont la définition d’une fonction est donnée à
Matlab. L’en-tête de la fonction est une liste d’arguments de sortie de la fonction,
entourés de crochets, suivis d’un signe égal, du nom de la fonction, puis des argu-
ments d’entrée de la fonction, entourés de parenthèses. Par exemple, l’en-tête de la
fonction sin ressemble à ceci : [y] = sin(x). L’en-tête de la fonction a un rôle très
important, car il sert, dans le même temps, de déclarer la fonction et de l’appelée.
Pour des fonctions plus compliquées, l’en-tête de la fonction sera généralement
suivis d’une brève description de ce que la fonction doit faire (c’est-à-dire la relation
entre les arguments d’entrée et de sortie).
La première ligne d’une nouvelle fonction doit toujours être le mot function,
suivi de son en-tête.
out = a + b + c;
end
Vous remarquerez, peut-être, que le mot function devient bleu. Ce mot devient
bleu parce que function est un mot-clé. Les mots-clés sont des mots que Matlab
a réservés pour avoir une signification spécifique. Dans ce cas, le mot function est
réservé pour désigner le début d’une fonction. D’autres mots clés seront définis dans
les chapitres suivants. Les mots-clés ne peuvent pas être attribués en tant que noms
de variables ou de fonctions. Par exemple, >> function = 2 produirait une erreur.
Afin d’exécuter la fonction, l’utilisateur doit faire appel à la fonction soit direc-
tement sur la ligne de commande soit dans un fichier script.
>> e = myAdder(2,4,6)
e =
12
Matlab offre à l’utilisateur une liberté considérable pour affecter des variables
à différents types de données. Par exemple, il est possible de donner à la variable
x une valeur struct ou une valeur double. Dans d’autres langages de programma-
tion, ce n’est pas toujours le cas, vous devez déclarer au début d’une session si x
sera une structure ou un double, puis vous êtes peut être bloqué. Cela peut être
à la fois un avantage et un inconvénient. Par exemple, myAdder a été construit en
supposant que les arguments d’entrée étaient des doubles. Cependant, l’utilisateur
peut accidentellement saisir une structure ou une cellule dans myAdder, ce qui n’est
pas correct. Si vous essayez d’entrer un argument d’entrée non double dans myAdder,
Matlab continuera à exécuter la fonction jusqu’à ce que quelque chose se passe mal
ou jusqu’à ce que la fonction se termine.
Essayez ! : Utilisez des valeurs non doubles dans les arguments de la fonction
myAdder.
>> myAdder(1,'3',10)
ans =
62
Astuce ! : N’oubliez pas de lire les erreurs que Matlab vous donne. Ils
vous disent généralement exactement où était le problème. Dans ce cas, l’erreur
indique Error in myAdder (line 5), ce qui signifie qu’il y a eu une erreur dans
la fonction myAdder sur la cinquième ligne. La raison pour laquelle il y a eu une
erreur est que la variable b a été affectée à une structure puis ajoutée à un double,
qui n’est pas défini.
À ce stade, vous n’avez aucun contrôle sur ce que l’utilisateur attribue à votre
fonction en tant qu’arguments d’entrée et s’ils correspondent à ce que vous vouliez
que ces arguments d’entrée soient. Donc, pour le moment, écrivez vos fonctions
en supposant qu’elles seront utilisées correctement. Vous pouvez aider les autres
utilisateurs à utiliser correctement votre fonction en commentant bien votre code.
Vous pouvez composer des fonctions en attribuant des appels de fonction comme
entrée à d’autres fonctions. Dans l’ordre des opérations, Matlab exécutera d’abord
l’appel de fonction le plus interne. Vous pouvez également affecter des expres-
sions mathématiques comme entrée aux fonctions. Dans ce cas, Matlab exécutera
d’abord les expressions mathématiques.
>> d = myAdder(1*4,2+3,5−8)
d =
6
c = sin(a) + cos(b);
d = sin(b) + cos(a);
end
B =
1.4496
A =
0.4253
, cosd etc. où, simplement, convertir tout angle en degré et éviter toute sources
d’erreur possible.
Lors de l’écriture de fonctions, vous pouvez oublier d’affecter l’une des sorties si
votre fonction est compliquée. Si tel est le cas, Matlab s’arrêtera et vous obtiendrez
une erreur. Considérez le code erroné suivant où la variable de sortie d n’est pas
affectée.
Essayez ! : Exécutez le code erroné précédent pour les mêmes entrées que
dans l’exemple précédent. Prenez note de l’erreur signalée.
>> [A,B] = myTrigSum(1,2)
Output argument d (and maybe others) not assigned during call to
myTrigSum.
Un autre mot-clé utile est return. Lorsque Matlab voit une instruction de
return, il termine immédiatement la fonction comme s’il avait exécuté l’instruction
de fin de la fonction end. Si l’un des arguments de sortie n’a pas été affecté lorsqu’une
instruction de retour est effectuée, vous obtiendrez une erreur.
>> d = myAdder(1,3,10);
>> out
out =
1
50 CHAPITRE 3. Scripts et Fonctions
Dans myAdder, la variable out est une variable locale. C’est-à-dire qu’elle n’est
définie que dans l’espace de travail de la fonction myAdder. Par conséquent, il ne
peut pas affecter les variables dans les espaces de travail en dehors de la fonction, et
les actions effectuées dans les espaces de travail en dehors de la fonction ne peuvent
pas l’affecter, même s’ils portent le même nom. Ainsi, dans l’exemple précédent, il
existe une variable, out, définie dans l’espace de travail de la fenêtre de commande.
Lorsque myAdder est appelé sur la ligne suivante, Matlab ouvre un nouvel espace
de travail pour les variables de cette fonction. L’une des variables créées dans cet
espace de travail est une autre variable, out. Cependant, comme ils ont des espaces
de travail différents, l’affectation à out dans myAdder ne modifie pas la valeur affectée
à out dans l’espace de travail de la fenêtre de commande.
C’est l’une des raisons pour lesquelles il est dangereux de garder des lignes de
code non supprimées dans vos fonctions. Nous modifions la fonction myAdder afin
qu’elle n’ait pas de point-virgule après la ligne out = a + b + c, et ait la commande
additionnelle attribuant la valeur 2 à la variable y (également non supprimée).
d = a + b + c
y = 2
end
Dans l’exemple précédent, la valeur de out était affichée lorsque la ligne out =
a + b + c était exécutée dans myAdder. Cela signifie que la variable out affichée
est la sortie de l’espace de travail de myAdder, et non de l’espace de travail de la
3.3. FONCTIONS 51
x = a + b;
y = x * a;
z = y * b;
end
b =
3
>> z
Undefined function or variable 'z'.
S’il y a deux fonctions avec le même nom dans le chemin de Matlab, Matlab
exécutera la fonction en premier dans le chemin Matlab. Écrire une fonction avec le
même nom qu’une autre fonction et la placer plus haut dans le chemin Matlab s’ap-
pelle surcharger une fonction (Overloading). La surcharge fait également référence
au fait de donner aux variables le même nom que les fonctions que vous avez écrites.
La surcharge est utile lorsque vous souhaitez effectuer une tâche différemment de
la normale au cours d’un projet particulier. Par exemple, vous pouvez surcharger
la fonction sin avec votre propre fonction qui calcule sin avec une précision de
100 chiffres. Cependant, il est facile de surcharger des fonctions que vous n’avez pas
l’intention de faire, comme nommer une fonction ou un gradient de variable, qui est
en fait une fonction Matlab. Par conséquent, il est important de donner à votre
fonction un nom qui sera très probablement unique. Dans ce cours, nous ajoutons le
mot my au début de chaque nom de fonction pour éviter de surcharger les fonctions
Matlab.
Vous pouvez afficher l’éditeur des chemins Matlab en cliquant sur : Home -
> Environement -> Set path. Le chemin est illustré à la figure 3.2. Vous pouvez
3.3. FONCTIONS 53
modifier le chemin sous :set Matlab path. Cependant, pour notre objectif, nous ne
le ferons jamais.
3.3.4 Sous-fonctions
Une fois que vous avez créé et enregistré une nouvelle fonction, elle se comporte
comme n’importe quelle autre fonction intégrée de Matlab. Vous pouvez appeler
la fonction à partir de l’invite de commande, et toute autre fonction peut également
appeler la fonction. Une sous-fonction (subfunction) est une fonction définie dans
le même fichier m que sa fonction parent. Seule la fonction mère est capable d’appeler
la sous-fonction. Cependant, la sous-fonction conserve un espace de travail distinct
de sa fonction parent. Une sous-fonction est déclarée après l’instruction end de sa
fonction parent, et elle doit avoir une instruction end à la fin de sa propre définition.
function D = myDist(x,y)
% D = myDist(x,y) subfunction for myDist3D
% x,y are 2D coordinates contained in 1x2 arrays
% D is the distance between x and y
D = sqrt((x(1)−y(1))^2+(x(2)−y(2))^2);
end
Notez que Matlab parcourra la liste des sous-fonctions avant d’accéder au che-
min Matlab. Par conséquent, si une sous-fonction surcharge une autre fonction
dans le chemin Matlab, la sous-fonction aura priorité sur cette fonction lorsqu’elle
sera appelée par sa fonction parent.
>> class(f)
ans =
'function_handle'
>> sin(pi/4)
56 CHAPITRE 3. Scripts et Fonctions
ans =
0.707106781186547
y = F(x) + 1;
end
>> y = plusOne(@sqrt, 4)
y =
3
>> F(1,0)
ans =
2
3.4 Exercices
1. Rappelons que le sinus hyperbolique, noté sinh, est exp(x)−exp(−x)
2
. Écrire une
fonction avec l’en-tête y = mySinh(x), où y est le sinus hyperbolique évalué
en x. Supposons que x est un double. Testez votre fonction :
>> sinh(0)
ans =
0
>> sinh(1)
ans =
1.1752
>> sinh(2)
ans =
3.6269
>> A = myTriangle(1,1)
A =
0.5000
>> A = myTriangle(2,1)
A =
1
>> A = myTriangle(3,2)
A =
3
Notez que l’élément supérieur gauche doit toujours être 1. Supposons que n
est un entier strictement positif. Testez votre fonction :
>> M = myCheckerBoard(1)
M =
1
>> M = myCheckerBoard(2)
M =
1 0
0 1
>> M = myCheckerBoard(3)
M =
1 0 1
0 1 0
1 0 1
>> M = myCheckerBoard(4)
M =
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1
62.8319
V =
37.6991
>> M = myFlippedDiag(4,9)
M =
0 9 9 9
9 0 9 9
9 9 0 9
9 9 9 0
4.1 Introduction
Lors de l’écriture de scripts ou fonctions, il est très courant de vouloir que cer-
taines parties du corps du code ne soient exécutées que sous certaines conditions,
en outre, des parties doivent être exécutées plusieurs fois en séries. Par exemple, si
l’argument d’entrée est impair, vous souhaiterez peut-être que la fonction effectue
une opération dessus, et une autre si l’argument d’entrée est pair. Cet effet peut
être obtenu dans Matlab à l’aide d’instructions de branchement (c’est-à-dire l’exé-
cution des branches de la fonction sous certaines conditions), qui font l’objet de ce
chapitre.
Par ailleurs, étant donné que les tâches répétitives apparaissent si fréquemment,
il est naturel que les langages de programmation comme Matlab disposent de
méthodes directes pour effectuer des itérations.
Ce chapitre vous apprend à programmer des tâches itératives. Avec le branche-
ment et l’itération, il est possible de programmer à peu près n’importe quelle tâche
imaginable.
61
62 CHAPITRE 4. Boucles et contrôle de flux
Le mot if est un mot-clé. Une instruction if se termine par le mot clé end.
Lorsque Matlab voit une instruction if, il détermine si l’expression logique associée
est vraie. Si c’est vrai, alors le code dans le bloc de code sera exécuté par Matlab.
S’il est faux, le code de l’instruction if ne sera pas exécuté. La façon de lire ceci est
’Si l’expression logique est vraie, alors faire le bloc de code’.
Lorsqu’il y a plusieurs conditions à prendre en compte, vous pouvez inclure des
instructions elseif ; si vous voulez une condition qui couvre tout autre cas, vous
pouvez utiliser une instruction else.
Dans le code précédent, Matlab vérifiera d’abord si P est vraie. Si c’est le cas,
alors le bloc de code 1 sera exécuté, puis l’instruction if se terminera. En d’autres
termes, Matlab ne vérifiera pas le reste des déclarations une fois qu’il aura atteint
une déclaration vraie. Cependant, si P est fausse, Matlab vérifiera si Q est vraie. Si
Q est vraie, alors le bloc de code 2 sera exécuté et l’instruction if se terminera. S’il est
fausse, alors R sera vérifiée, et ainsi de suite. Si P, Q et R sont toutes fausses, alors le
bloc de code 4 sera exécuté. Vous pouvez avoir n’importe quel nombre d’instructions
elseif (ou aucune) tant qu’il y a au moins une instruction if (la première instruc-
tion). Vous n’avez pas besoin d’une instruction else, mais vous pouvez avoir au plus
une instruction else. Les expressions logiques après if et elseif (c’est-à-dire telles
que P, Q et R) seront appelées des instructions conditionnelles.
if note >= 16
mention = 'Excellent';
4.2. CONDITIONS : INSTRUCTIONS DE BRANCHEMENT 63
Attention, si une condition est vérifiée, le code ne lira pas les conditions qui se
situent après. Alors, l’ordre de chaque condition doit être bien choisi.
Remarquez que la deuxième condition ne peut être jamais atteinte. Nous pou-
vons également insérer des instructions conditionnelles plus compliquées à l’aide
d’opérateurs logiques.
Il existe de nombreuses fonctions logiques conçues pour vous aider à créer des
instructions de branchement. Par exemple, vous pouvez demander si une variable
a un certain type de données ou une certaine valeur avec des fonctions telles que
isreal, isnan, isinf et isa. Il existe également des fonctions qui peuvent vous
donner des informations sur les tableaux de logiques comme any, qui retourne vrai si
un élément d’un tableau est vrai, et faux sinon, et all, qui retourne vrai uniquement
si tous les éléments d’un tableau sont vrais.
Parfois, vous voudrez peut-être concevoir votre fonction pour vérifier les entrées
d’une fonction afin de vous assurer que votre fonction sera utilisée correctement. Par
exemple, la fonction myAdder du chapitre précédent attend des doubles en entrée. Si
l’utilisateur saisit une structure ou un caractère comme l’une des variables d’entrée,
la fonction générera une erreur ou aura des résultats inattendus. Pour éviter cela,
vous pouvez mettre une coche pour indiquer à l’utilisateur que la fonction n’a pas été
utilisée correctement. Cette technique et d’autres techniques de contrôle des erreurs
ne font pas l’objet de ce cours. Pour le moment, vous devez seulement savoir que la
fonction error arrête l’exécution d’une fonction et génère une erreur avec le texte
dans la chaîne d’entrée. La fonction d’erreur prend des entrées de type sprintf.
4.2. CONDITIONS : INSTRUCTIONS DE BRANCHEMENT 65
end
Essayé ! : Écrivez une fonction appelée isOdd qui renvoie ’impaire’ si l’entrée
est impaire et ’paire’ si elle est paire. Vous pouvez supposer que l’entré sera un
entier positif :
function out = isOdd(in)
% out = isOdd(in)
% returne 'impaire' si in est impaire
% et 'paire' si in est paire
else
out = 'impaire';
end
end
>> isOdd(17)
ans =
'impaire'
>> isOdd(32)
ans =
'paire'
La fonction reste, mod(a,b), renvoie le reste d’un nombre a divisé par b. L’énoncé
logique if mod(a, 2)== 0 demande ’est-ce que le reste de in divisé par 2 est
égal à 0 ?’ Si le résultat est vrai alors a est paire, sinon, alors a est impaire.
% Calcul
if strcmp(calc, 'area')
out = pi*r.^2;
elseif strcmp(calc, 'circumference')
out = 2*pi*r;
4.2. CONDITIONS : INSTRUCTIONS DE BRANCHEMENT 67
else
error('calc doit prendre les valeurs: area ou circumference')
end
end
switch floor(note/2)
case 9, mention = 'Excellent';
case 8, mention = 'Tres bien';
case 7, mention = 'bien';
case 6, mention = 'assez bien';
case 5, mention = 'Passable';
otherwise, mention = 'Ajourne';
end
>> mymention(19)
ans =
'Excellent'
>> mymention(14.5)
ans =
'bien'
>> mymention(8.75)
ans =
'Ajourne'
Remarquez que l’instruction switch n’utilise pas les relations logiques, mais,
bascule sur de différentes valeurs d’une variable donnée. Dans l’exemple précédent,
la variable choisie est floor(note/2) ce qui a permis de régénérer tous notes ’déci-
males’ entre 10 et 19.99 aux entiers : {5, 6, 7, 8, 9}, cela a facilité la décision de quelle
mention q’on aura. Notez aussi que la fonction Matlab floor retourne la partie
entière d’un double vers moins l’infini.
% Calcul
switch calc
4.3. BOUCLES : ITÉRATIONS 69
Notez que l’instruction switch permet de bien gérer les chaînes de caractères
mieux que l’instruction if où on doit utiliser la fonction strcmp pour comparer
deux string.
Il continue ce processus jusqu’à ce qu’il n’y ait plus d’éléments à affecter dans le
tableau en boucle.
Nous présentons plusieurs autres exemples pour vous donner une idée du fonc-
tionnement des boucles for, même si certains de ces exemples pourraient être exécutés
de manière plus concise avec des opérations de tableaux.
tableau. Qu’ajouteriez-vous au bloc de boucle for précédent pour gérer cette restric-
tion ?
nous aurions tout aussi bien pu commencer en supposant qu’il y avait un E dans
S (c’est-à-dire que la sortie est vraie). La raison pour laquelle il est plus facile de
commencer en supposant qu’il n’y a pas de E dans S est que si jamais nous en
trouvons un, alors nous savons que notre hypothèse de départ était fausse et que
la sortie devrait être vraie et nous pouvons arrêter de chercher. Cependant, si nous
commençons par supposer qu’il y a un E dans S, alors si nous trouvons un caractère
qui n’est pas un E, cela ne dit rien quant à savoir si notre hypothèse de départ
était vraie ou non, et nous devons continuer à chercher. Comme exercice, essayez de
réécrire anyEs en partant de l’hypothèse qu’il y a un E dans S (out = 1). Était-ce
plus facile ou plus difficile ? L’expérience en programmation vous aidera à déterminer
quelles hypothèses faciliteront votre tâche de programmation. Le programme utilise
également la fonction strcmp, qui donne 1 si les deux chaînes d’entrée sont identiques
et 0 sinon.
Remarquez le nouveau mot-clé break. S’il est exécuté, le mot-clé break arrête
immédiatement la boucle for la plus immédiate qui le contient ; c’est-à-dire que s’il est
contenu dans une boucle for imbriquée, il n’arrêtera que la boucle for la plus interne.
Dans ce cas particulier, la commande break est exécutée si jamais nous trouvons un
E. Le code fonctionnera toujours correctement sans cette instruction, mais puisque
la tâche est de savoir s’il y a des E dans S, nous n’avons pas à continuer à chercher si
nous en trouvons un. De même, si un humain se voyait confier la même tâche pour
une longue chaîne de caractères, cette personne ne continuerait pas à chercher des
E si elle en avait déjà trouvé un. Les instructions break sont utilisées lorsqu’il se
passe quelque chose dans une boucle for qui vous inciterait à vouloir qu’elle s’arrête
plus tôt. Une commande moins intrusive est le mot-clé continue, qui ignore le code
restant dans l’itération actuelle de la boucle for et continue jusqu’à l’élément suivant
du tableau en boucle.
2 3 1
Exemple ! : Soit A une matrice bidimentionnelle, A = , défini
1 3 5
dans l’espace de travail courant. Utilisez une boucle for imbriquée pour calculer
la somme de tous les éléments de A. Comment adapteriez-vous ce code pour gérer
A de taille arbitraire ? :
S = 0;
for i = 1:2
for j = 1:3
S = S + A(i,j);
end
end % Fin de la boucle
4.3. BOUCLES : ITÉRATIONS 73
end
Attention ! : Bien que cela soit possible, n’essayez pas de modifier la variable
en boucle looping variable à l’intérieur de la boucle for. Cela rendra votre code
très compliqué et entraînera probablement des erreurs.
Implémentation propre :
S = 0;
for i = 1:10
S = S + i^2;
end % Fin de la boucle
end
n =
4
Ce qui ce passe ! :
1. Tout d’abord, la variable n (compte courant des divisions de N par 2) est
définie sur 0
2. N est défini sur 8 et représente la valeur actuelle que nous divisons par 2
3. La boucle while commence
4. Matlab calcule N >= 1 ou 8 >= 1, ce qui est vrai pour que le bloc de
code soit exécuté
5. N est attribué N = 8/2 = 4
6. n est incrémenté à 1
7. Matlab calcule N >= 1 ou 4 >= 1, ce qui est vrai pour que le bloc de
code soit exécuté
8. N est attribué N = 4/2 = 2
9. n est incrémenté à 2
10. Matlab calcule N >= 1 ou 2 >= 1, ce qui est vrai pour que le bloc de
code soit exécuté
11. N est attribué N = 2/2 = 1
12. n est incrémenté à 3
13. Matlab calcule N >= 1 ou 1 >= 1, ce qui est vrai pour que le bloc de
code soit exécuté
14. N est attribué N = 1/2 = 0,5
15. n est incrémenté à 4
16. Matlab calcule N >= 1 ou 0,5 >= 1, ce qui est faux donc la boucle while
se termine par n = 4
4.3. BOUCLES : ITÉRATIONS 75
N =
6674322
Vous vous êtes peut-être demandé : ’Et si l’expression logique est vraie et ne
change jamais ?’ et c’est effectivement une très bonne question. Si l’expression logique
est vraie et que rien dans le code de la boucle while ne modifie l’expression, le résultat
est appelé boucle infinie. Les boucles infinies s’exécutent indéfiniment, ou jusqu’à
ce que votre ordinateur tombe en panne ou manque de mémoire.
Exemple ! : Écrire une boucle while qui provoque une boucle infinie :
N = 1;
while N >= 0
N = N + 1;
end
Étant donné que N sera toujours supérieur à 0, quel que soit le nombre d’exé-
cutions de la boucle, ce code ne se terminera jamais. Pouvez-vous changer un seul
caractère pour que la boucle while s’exécute au moins une fois mais ne boucle pas à
l’infini ?
Les boucles infinies ne sont pas toujours faciles à repérer. Considérez les deux
exemples suivants : une boucle infinie et l’autre non. Pouvez-vous déterminer cha-
qu’une ? Au fur et à mesure que votre code devient plus compliqué, il deviendra plus
difficile à détecter.
Exemple ! : Quelle boucle while provoque une boucle infinie ? Rappelons que
la fonction modulo mod(a,b) renvoie le reste de la division a/b :
% 1ere boucle
N = 1;
while N > 0
76 CHAPITRE 4. Boucles et contrôle de flux
N = N +/ 2;
end
% 2eme boucle
N = 2;
while N > 0
if mod(N,2) == 0
N = N + 1;
else
N = N − 1;
end
end
Le premier exemple ne fera pas de boucle infinie car finalement N sera si petit
que Matlab ne pourra pas faire la différence entre N et 0.
Que se passe-t-il dans le cas d’une boucle infinie ? Devez-vous forcer Matlab à
s’éteindre, à redémarrer votre ordinateur ou à en acheter un nouveau ? Heureuse-
ment, Matlab vous permet d’arrêter n’importe quel code en appuyant sur ctrl +
c. Si vous pensez que votre code est coincé dans une boucle infinie, ou si vous en avez
juste assez d’attendre qu’il fasse son travail, vous pouvez utiliser cette commande
pour forcer votre code à s’arrêter. Une erreur sera renvoyée à la ligne qui était en
cours d’exécution lorsque ctrl + c a été exécuté.
4.4 Exercices
1. Écrivez une fonction avec l’entête tip = myTipCalc(bill, party), où bill
est le coût total d’un repas et party est le nombre de personnes dans le groupe.
Le pourboire tip doit être calculé comme suit : 15 % pour un groupe stricte-
ment inférieure à six personnes, 18 % pour un groupe strictement inférieure à
huit personnes, 20 % pour un groupe de moins de 11 personnes et 25 % pour
un groupe de 11 personnes ou plus. Testez votre fonction sur des exemples de
même prix et de nombre de personne différent.
2. Écrivez une fonction avec l’entête f = myMultOperation(a,b,operation).
L’argument d’entrée, operation, est une chaîne qui est soit 'plus', 'moins
', 'mult', 'div' ou 'pow', et f doit être calculé comme a+b, a-b, a*b, a/
b, et a^b pour les valeurs respectives des opérations. Assurez-vous de rendre
votre fonction vectorisée. Conseil : si vous utiliser la condition if n’oubliez pas
d’utiliser la fonction strcmp. Testez votre fonction pour toutes les opérations
possibles avec les données suivantes : a = [3 2 1 5], b = [2 4 3 1].
3. Considérez un cercle de rayon r et de centre C(x0 , y0 ) et un point M (x, y),
où C et M sont des vecteurs en 2D contenant les coordonnées dans le plan.
Écrivez une fonction avec l’entête s = myInsideCircle(M,r,C) où s est la
chaîne ’outside’ si le point M est à l’extérieur du cercle, ’border’ si le point M
4.4. EXERCICES 77
Visualisation et traçage
5.1 Introduction
La visualisation des données est généralement le meilleur moyen de transmettre
des idées et des informations techniques importantes, en particulier si les informa-
tions sont composées de très nombreux chiffres. La possibilité de visualiser et de
tracer des données rapidement et de différentes manières est l’une des fonctionnali-
tés les plus puissantes de Matlab.
Matlab dispose de nombreux générateurs graphiques qui vous permettent d’af-
ficher efficacement des tracés, des surfaces, des volumes, des champs vectoriels, des
histogrammes, des animations et de nombreux autres tracés de données. À la fin
de ce chapitre, vous devriez être familiarisés avec les techniques de traçage les plus
courants et disposer de suffisamment d’informations pour explorer le reste.
Il convient de noter que l’interface graphique de Matlab utilise un style de
programmation appelé programmation orientée objet (OOP), qui est une école de
pensée différente du type de programmation présenté dans ce cours. Ainsi nous avons
essayé de vous montrer tout ce qu’il faut savoir pour utiliser ces fonctionnalités sans
entrer dans le détail de leur fonctionnement.
5.2 Graphique 2D
La fonction de traçage de base dans Matlab est plot (x,y). La fonction plot
prend deux tableaux comme arguments d’entrée x et y, et produit un affichage visuel
des points (xi , yi ) respectifs reliés par une ligne solide.
79
80 CHAPITRE 5. Visualisation et traçage
1
0 0.5 1 1.5 2 2.5 3
Vous remarquerez sur la Figure 5.1 que par défaut, la fonction plot relie chaque
point par une ligne bleue. Pour rendre la fonction lisse, vous devez utiliser une
discrétisation des points plus fine.
1 1
0.8 0.8
0.6 0.6
0.4 0.4
0.2 0.2
0 0
-0.2 -0.2
-0.4 -0.4
-0.6 -0.6
-0.8 -0.8
-1 -1
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
(a) Tracé de la fonction f (x) = sin(x) (b) Tracé de la fonction f (x) = sin(x) avec un
style modifié
et le style de ligne à utiliser dans le tracé. Par exemple, plot (x,y,'ro') tracera
les éléments de x contre les éléments de y en utilisant la couleur rouge ’red’ : r, par
des petits cercles : o. Les couleurs et tailles de marqueurs possibles sont indiquées
dans le tableau 5.1.
Color Ligne Marker
b blue - solid o circle
g green . point x x-mark
r red -. dashdot + plus
c cyan : dotted * star
m magenta – dashed s square
y yellow none no line d diamond
k black v triangle
w white ^ triangle
< triangle
> triangle
p pentagram
h hexagram
Table 5.1 – Symboles de couleur et de style de trait.
La courbe est alors tracée avec une ligne ’tiret pointillé’ -., une couleur rouge :
r en plus d’un marqueur carré : s.
Vous pouvez tracer plusieurs ensembles de données dans un seul graphique à
l’aide de la commande hold on. Taper hold on placera tous les tracés suivants sur
le même graphique jusqu’à ce que hold off soit tapé.
Essayer ! : Retraçons les courbes des deux fonctions sin, cos dans un seul
graphe avec des styles différents : Voir figure 5.2(a)
>> hold on
>> plot(x, sin(x), 'bo')
>> plot(x, cos(x), '−g*')
>> hold off
0.6 0.6
0.4 0.4
0.2 0.2
f(x)
0 0
-0.2 -0.2
-0.4 -0.4
-0.6 -0.6
-0.8 -0.8
-1 -1
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
x
Figure 5.2 – Tracés des fonctions sin, cos dans un seul graphe.
titre à votre tracé à l’aide de la fonction title, qui prend en entrée une chaîne et
place cette chaîne comme titre du tracé. Les fonctions xlabel et ylabel fonctionnent
de la même manière pour nommer vos étiquettes d’axe.
Vous pouvez ajouter également une légende à votre tracé en utilisant la fonction
legend. La fonction legend prend le même nombre de chaînes en entrée que le
nombre d’ensembles de données en cours de tracé. C’est à vous de mettre le nombre
approprié. Si, trop peu, laissera certains de vos ensembles de données sans étiquette,
et s’il est trop nombreux, ignorera les extras et vous donnera un avertissement (figure
5.2(b)).
également utiliser des options avec la commande axis, telles que axis equal, axis
square, axis tight et plusieurs autres. La description de ces options se trouve
dans la fonction d’aide de la fonction axis
sin
2 cos
1.5
Traces des courbes sin et cos dans l intervalle [0 6.28]
1 1 sin
cos
0.5 0.5
f(x)
f(x)
0 0
-0.5 -0.5
-1 -1
0 1 2 3 4 5 6
-1.5
x
-2
0 1 2 3 4 5 6
x
Figure 5.3 – Tracés des fonctions sin, cos dans un seul graphe.
Pour ouvrir une nouvelle figure sans écraser la figure actuelle, tapez >> figure.
Pour fermer toutes les figures actuelles, tapez >> close all. Pour effacer le contenu
d’une figure sans fermer la figure, tapez >> clf.
Vous pouvez créer une table de tracés sur une seule figure à l’aide de la fonction
subplot. La fonction subplot prend trois entrées : le nombre de lignes de tracés, le
nombre de colonnes de tracés et sur quel tracé l’appel à la fonction de traçage doit
tracer.
Il existe plusieurs autres fonctions de traçage qui tracent les données x par rap-
port à y. Certains d’entre eux sont scatter, bar, loglog, semilogx et semilogy.
scatter fonctionnent exactement de la même manière que plot sauf qu’il utilise par
défaut des cercles bleus (c’est-à-dire que plot(x,y,'bo') est équivalent à scatter
(x,y)). La fonction bar trace des barres centrées en x avec une hauteur y. Les
fonctions loglog, semilogx et semilogy tracent les données en x et y avec une
échelle logarithmique, l’axe x sur une échelle logarithmique et l’axe y sur une échelle
linéaire, et l’axe y sur une échelle logarithmique et l’axe des x sur une échelle linéaire,
respectivement.
84 CHAPITRE 5. Visualisation et traçage
%% Clean start
clear
clc
close all
%% Define data
x = 0:4;
y = exp(x);
%% Create subplots
subplot(2,3,1)
plot(x,y)
title(plot)
grid on
subplot(2,3,2)
scatter(x,y)
title(scatter)
grid on
subplot(2,3,3)
bar(x,y)
title(bar)
grid on
subplot(2,3,4)
semilogx(x,y)
title(semilogx)
grid on
5.3. GRAPHIQUE 3D 85
40 40 40
20 20 20
0 0 0
0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
40
101
20 101
0 100
1 2 3 4 0 1 2 3 4 1 2 3 4
subplot(2,3,5)
semilogy(x,y)
title(semilogy)
grid on
subplot(2,3,6)
loglog(x,y)
title(loglog)
grid on
5.3 Graphique 3D
5.3.1 Courbes paramétriques
La fonction de traçage 3D de base est plot3, qui a l’en-tête : H = plot3(x,y,z)
où x, y et z sont des vecteurs. La fonction plot3 tracera toutes les coordonnées (x,
y, z) et l’appel par défaut à plot3 relie les points suivants par une ligne bleue. Les
commandes telles que grid, hold, axis, title, xlabel, ylabel, legend et subplot
fonctionnent de la même manière que lors du traçage en deux dimensions.
86 CHAPITRE 5. Visualisation et traçage
Essayer !: Traçons l’hélice à pas constant dont l’équation paramétrique est
x = cos(t)
la suivante : y = sin(t)
z = 2t
Créez un tracé tridimensionnel de l’ensemble de données (x, y, t) à l’aide de la
fonction plot3. Activez la grille, rendez les axes égaux et mettez des étiquettes
d’axe et un titre. Voir figure 5.5
% Script for generating helix 3D plot
% Data
t = 0:pi/50:10*pi;
x = cos(t);
y = sin(t);
z = 2 * t;
% 3D plot
plot3(x,y,z)
xlabel('x')
ylabel('y')
zlabel('z')
title('Helice a pas constant')
axis square
grid on
5.3. GRAPHIQUE 3D 87
5.3.2 Surfaces
Souvent, nous aimerions un tracé de surface plutôt qu’une courbe lors du tra-
çage en trois dimensions. Dans le tracé de surface tridimensionnel, nous souhaitons
créer un graphique d’une fonction f (x, y). Dans le tracé de surface, toutes les paires
(x, y) doivent être données. Ce n’est pas simple à faire en utilisant des vecteurs. Par
conséquent, dans le traçage de surface, la première structure de données que vous
devez créer s’appelle un maillage. Étant donné les vecteurs de valeurs x et y, un
maillage est une liste de toutes les combinaisons possibles de x et y. Dans Mat-
lab, le maillage est donné sous la forme de deux matrices X et Y où X(i, j) et
Y (i, j) définissent des paires (x, y) possibles. Une troisième matrice, Z, peut alors
être créée telle que Z(i, j) = f (X(i, j), Y (i, j)). Un maillage peut être créé à l’aide
de la fonction meshgrid dans Matlab. La fonction meshgrid a l’en-tête [X,Y]
= meshgrid(x,y), où x et y sont des vecteurs contenant l’ensemble de données
indépendantes. Les variables de sortie X et Y sont telles que décrites précédemment.
X =
1 2 3 4
1 2 3 4
1 2 3 4
Y =
3 3 3 3
4 4 4 4
5 5 5 5
Il existe plusieurs fonctions dans Matlab pour tracer des surfaces. Chaque fonc-
tion a un aspect différent, mais elles ont le même en-tête de fonction de base comme
H = surf (X,Y,Z), où X, Y et Z sont les tableaux discutés ci-dessus. Les fonctions
de traçage de surface les plus courantes sont surf et mesh. Il y a aussi des fonc-
tions pour tracer une fonction z = f (x, y) en tant que contours comme : contour et
contourf. Toutes les commandes telles que hold, axis, grid et autres, fonctionnent
également avec ces tracés.
subplot(2,2,2)
mesh(X,Y,Z)
title('surf')
subplot(2,2,3)
contour(X,Y,Z)
title('surf')
subplot(2,2,4)
contourf(X,Y,Z)
title('surf')
Vous remarquerez que les tracés de surface affiche différentes couleurs pour diffé-
rentes élévations, rouge pour supérieur et bleu pour inférieur. La palette de couleurs
d’un tracé de surface peut être modifiée à l’aide de fonctions telles que caxis et
colormap. Ceux-ci sont laissés en exercices.
Il existe de nombreuses autres fonctions liées au traçage dans Matlab et il ne
s’agit en aucun cas d’une liste exhaustive. Cependant, cela devrait être suffisant pour
vous aider à démarrer afin que vous puissiez trouver les fonctions de traçage dans
Matlab qui vous conviennent le mieux et vous fournir suffisamment de connais-
sances pour apprendre à les utiliser lorsque vous les rencontrez. Par exemple, bar3
et isosurface sont des fonctions de traçage 3D plus avancées qui sont données
comme des problèmes. De plus, la boîte à outils de visualisation de Matlab est très
avancée et expliquer toutes les méthodes de personnalisation des tracés dépasse le
cadre de ce cours. Cependant, il suffit de lire l’aide de Matlab pour diverses fonc-
tions de traçage pour savoir comment faire bon nombre de choses que vous devrez
faire dans votre carrière d’ingénieur.
5.4 Exercices
1. Tracez les courbes des fonctions sin(x), cos(x) et sin(x)cos(x) dans une même
figure. Donnez un titre à votre graphe, des étiquettes pour les axes et une
5.4. EXERCICES 89
0.8
0.6
0.4
0.2
0
y
-0.2
-0.4
-0.6
-0.8
-1
-1 -0.5 0 0.5 1
x
93
94 TABLE DES FIGURES
Liste des tableaux
95