Académique Documents
Professionnel Documents
Culture Documents
3e année
Année Universitaire 2015-2016
1 Introduction à Matlab
1.1 Généralités
Matlab est un logiciel de calcul numérique développé par MathWorks 1 , utilisé dans de nombreux domaines
d’application aussi bien dans le domaine de l’éducation que dans le monde de la recherche et du développement
(notamment en ingénierie et en mathématiques appliqués). Matlab est un langage de programmation de
haut niveau doublé d’un environnement de calcul matriciel. Matlab est d’ailleurs l’abréviation de « Matrix
Laboratory », car toutes les variables dans Matlab sont considérées comme des matrices (un scalaire est par
exemple une matrice 1◊1). Matlab est un language de programmation interprété contenant de nombreuses
bibliothèques pré-programmées et une interface permettant la visualisation graphique des résultats. Matlab
propose donc des facilités de programmation et de visualisation, ainsi qu’un grand nombre de fonctions
réalisant diverses méthodes numériques. Cette première séance de TP est destinée à vous familiariser avec
l’usage de Matlab, en introduisant les commandes les plus courantes, et à faire vos premiers pas dans le
domaine du calcul numérique.
Question 1. Exécuter l’introduction de Matlab, charger quelques démonstrations. Bref, faites un petit tour
du propriétaire !
1. http://www.mathworks.com/
1
1.1.2 Environnements
Par défaut lorsque matlab est lancé, on se trouve dans la fenêtre de commandes (Command Window)
dans laquelle il est possible de taper directement des instructions. L’invitation à taper des commandes est
symbolisée par des chevrons >> (prompt).
En tapant edit dans la fenêtre de commandes, on peut ouvrir un éditeur de texte (Editor) dans lequel
on peut créer ou éditer des scripts (ou fichiers d’instructions) contenant une succession d’instructions (lignes
de code) avec la coloration syntaxique de Matlab. Les scripts doivent être enregistrés avec l’extension .m. Un
script peut être lancé simplement en tapant son nom sans l’extension dans la fenêtre de commandes dès lors
qu’il se trouve dans le répertoire courant.
En tapant workspace dans la fenêtre de commandes, on peut ouvrir l’espace de travail (Workspace) dans
lequel sont stockées toutes les variables définies ainsi que leurs valeurs.
En tapant commandhistory dans la fenêtre de commandes, on peut ouvrir l’historique des commandes
(Command History) dans lequel on trouve toutes les commandes précédemment tapées dans la fenêtre de
commandes.
On peut également faire apparaître une des fenêtres Command Window, Command History, Current
Directory, Workspace ou Editor en cliquant sur Window dans la barre de navigation puis en sélectionnant la
fenêtre souhaitée.
Remarque : Dans les dernières versions de Matlab, la fenêtre Current Directory est appelée Current Folder,
et on peut faire apparaître ou disparaître une des fenêtres en cliquant sur Home dans la barre de navigation
puis en sélectionnant Layout.
Question 2. Charger l’aide en ligne de Matlab. Trouver la fonction qui donne les valeurs propres d’une
matrice. Taper help de cette fonction dans la fenêtre de commandes.
Solution
2
[V,D] = eig(A) produces a diagonal matrix D of eigenvalues and
a full matrix V whose columns are the corresponding eigenvectors
so that A*V = V*D.
[V,D,W] = eig(A) also produces a full matrix W whose columns are the
corresponding left eigenvectors so that W'*A = D*W'.
[V,D,W] = eig(A,B) also produces a full matrix W whose columns are the
corresponding left eigenvectors so that W'*A = D*W'*B.
Overloaded methods:
codistributed/eig
gpuArray/eig
sym/eig
3
1.1.4 Gestion des fichiers et commandes système
Pour gérer les différents fichiers d’un programme, on peut utiliser la fenêtre Current Directory ou à défaut
une des commandes suivantes.
Question 3. Créer un nouveau répertoire de travail TP_intro dans le répertoire Documents et ajouter le au
chemin d’accès (path) (sélectionner le menu File puis Set Path). Fermer la session et rouvrir une nouvelle
session Matlab. Vérifier que le répertoire TP_intro se trouve dans le chemin d’accès (path). Si non, créer un
fichier pathdef.m (sélectionner le menu File puis Set Path) dans votre répertoire de démarrage. A chaque
démarrage de Matlab, il vous suffira de lancer la commande pathdef pour inclure TP_intro au chemin
d’accès (path). Cela permet de classer correctement ses documents dans une arborescence claire.
Solution
>> cd Documents
>> mkdir TP_intro
>> cd TP_intro
Pour ne pas faire afficher le résultat, il faut mettre un point-virgule ; à la fin de la commande :
>> a=5+8;
Les instructions placées derrière le caractère % ne sont ni interprétées, ni exécutée par Matlab. Cela permet
notamment d’insérer des lignes de commentaires (apparaissant en vert dans l’éditeur et dans la fenêtre de
commandes) dans ses scripts et fonctions :
>> a = 3;
>> b = 4;
>> c = sqrt(a^2+b^2) % calcul d'une hypoténuse
c =
5
4
Et il faut commenter ses scripts, fonctions, . . . surtout ceux de l’examen !
% met en commentaire
; supprime l’affichage d’une commande
format style définit le format d’affichage dans la fenêtre de commandes
avec le style spécifié : short (défaut), long, shorte, longe, . . .
1.1.7 Historique
Matlab conserve l’historique des commandes qui est visible dans la fenêtre d’historique des commandes
(Command History). Il est donc possible de récupérer des instructions déjà saisies (et ensuite de les modifier
dans le but de les réutiliser).
Question 4.
1. Taper les commandes clear et a=1:7;. Taper les commandes a, who et whos.
2. Utiliser ø pour modifier la variable a : a=1:2;.
3. Taper la commande b=a+2;. Réexécuter les commandes who et whos en utilisant ø. Taper clear et b.
Solution
5
1. >> clear
>> a=1:7;
>> a
a =
1 2 3 4 5 6 7
>> who
Your variables are:
a
>> whos
Name Size Bytes Class Attributes
a 1x7 56 double
2. >> a=1:2;
3. >> b=a+2;
>> who
Your variables are:
a b
>> whos
Name Size Bytes Class Attributes
a 1x2 16 double
b 1x2 16 double
>> clear
>> b
? ? ? Undefined function or variable ’b’.
A niveau de priorité égal, les opérations sont effectuées de la gauche vers la droite. Les parenthèses permettent
alors d’organiser les priorités dans les calculs. Leur utilisation est recommandée pour éviter les ambiguïtés et
risques d’erreurs.
6
1.3.1 Affectation
On peut créer des vecteurs et des matrices en entrant leurs coefficients, ou en utilisant des commandes
spécifiques.
• scalaire :
>> a=10
a =
10
• vecteur ligne de taille 1◊3 (les espaces ou les virgules , séparent les éléments d’un vecteur ligne) :
>> x=[1 2 3] % ou x=[1,2,3]
x =
1 2 3
• vecteur colonne de taille 3◊1 (les points-virgules ; séparent les éléments d’un vecteur colonne) :
>> y=[1;2;3]
y =
1
2
3
• matrice de taille 2◊3 (les points-virgules ; séparent les lignes d’une matrice) :
>> M=[1 2 3; 4 5 6] % ou M=[1,2,3; 4,5,6]
M =
1 2 3
4 5 6
• chaîne de caractères sous forme d’un vecteur ligne (les guillements '' servent à délimiter la chaîne de
caractères) :
>> ch='matlab'
ch =
matlab
z =
2.0000 + 1.0000i
• polynôme P représenté sous forme d’un vecteur ligne contenant les coefficients classés dans l’ordre
des puissances décroissantes. Par exemple, représentation du polynôme P d’expression P(x)=x2 ≠6x+9 :
>> P=[1 ≠6 9]
7
P =
1 ≠6 9
• structure : variable à plusieurs champs de nature différente (l’accès aux différents champs se fait par la
commande point .) :
>> maillage.label='aile';
>> maillage.nbnodes=800;
>> maillage
maillage =
label: 'aile'
nbnodes: 800
1.3.2 Manipulation
Un coefficient quelconque d’un vecteur ligne (ou colonne) est référencé par son indice. Un coefficient
quelconque d’une matrice est référencé par ses indices de ligne et de colonne, dans cet ordre. Les indices d’un
vecteur ou d’une matrice commencent toujours à 1 (l’indice 0 n’existe pas).
• Accès au ie élément d’un vecteur par son indice i :
>> x(3) % renvoie la valeur de la 3≠ieme composante de x
ans =
5
• Stockage des matrices dans Matlab sous forme d’un seul vecteur colonne :
>> C=[1 5 3; 2 4 6; 3 6 9]
C =
1 5 3
2 4 6
3 6 9
>> C(4)
ans =
5
8
>> a=zeros(1,5);
>> a(1:3)=[1 3 4]
a =
1 3 4 0 0
>> b=[2,5];
>> a(b)=[≠2 3] % modification des composantes 2 et 5 de a
a =
1 ≠2 4 0 3
>> A=[2,3,4; 3,≠2,6]
A =
2 3 4
3 ≠2 6
>> L=[A,A] % ou L=[A A] concaténation horizontale
L =
2 3 4 2 3 4
3 ≠2 6 3 ≠2 6
>> C=[A;A] % concaténation verticale
C =
2 3 4
3 ≠2 6
2 3 4
3 ≠2 6
>> D=[A;[1,1,1]] % ajout d'une ligne de 1
D =
2 3 4
3 ≠2 6
1 1 1
• Recherche des éléments d’une matrice vérifiant une condition particulière à l’aide de la commande
find :
9
Question 5.
1. Construire une suite croissante de nombres allant de ≠8 à ≠5 par pas de 0.25.
2. Construire une suite décroissante d’entiers allant de 15 à 3.
3. Construire une suite de 100 nombres allant de ≠fi à fi.
Solution
1. >> x=≠8:0.25:≠5;
2. >> x=15:≠1:3;
3. >> x=linspace(≠pi,pi,100); % ou x=≠pi:2*pi/99:pi;
10
n:m vecteur ligne constitué des nombres de n à m par pas de 1
n:p:m vecteur ligne constitué des nombres de n à m par pas de p
linspace(n,m,p) vecteur ligne constitué de p nombres uniformément répartis
logspace(n,m,p) vecteur ligne constitué de p nombres répartis logarithmiquement
(ou équidistants) entre n et m
length(x) longueur de x
x(i) ie coordonnée de x
x(i1:i2) coordonnées i1 à i2 de x
[x,y] concaténation des vecteurs x et y
x' transposée de x
x*y' produit scalaire des vecteurs lignes x et y
x'*y produit scalaire des vecteurs colonnes x et y
dot(x,y) produit scalaire des vecteurs (lignes ou colonnes) x et y
reshape(x,m,n) crée une matrice de taille m ◊ n à partir de x
• Matrices
size(A) taille/dimension de A (nombre de lignes et de colonnes de A)
A(i,j) coefficient d’ordre i,j de A
A(i1:i2,:) lignes i1 à i2 de A
A(i1:i2,:)=[] suppression des lignes i1 à i2 de A
A(:,j1:j2) colonnes j1 à j2 de A
A(:,j1:j2)=[] suppression des colonnes j1 à j2 de A
A(:) concaténation des vecteurs colonnes de A (conversion matrice en vecteur)
A(i) coefficient d’ordre i dans l’indexation linéaire de A
diag(A) coefficients diagonaux de A
• Matrices particulières
11
A' transposée de A
inv(A) inverse de A
logm(A) logarithme matriciel de A
expm(A) exponentielle matricielle de A
sqrtm(A) racine carrée matricielle de A
det(A) déterminant de A
trace(A) trace de A
rank(A) rang de A
poly(A) polynôme caractéristique de A
eig(A) valeurs propres de A
[V,D]=eig(A) matrice diagonale D dont la diagonale principale contient les valeurs propres de A
et matrice V dont les colonnes sont les vecteurs propres associés tels que AV = DV
diag(A) extrait la diagonale de A
tril(A) extrait la partie triangulaire inférieure de A
triu(A) extrait la partie triangulaire supérieure de A
spy(A) représentation graphique des éléments non nuls de A
reshape(A,m,n) redimensionne A en une matrice de taille m ◊ n (avec les mêmes éléments)
repmat(A,m,n) créé une grande matrice par blocs contenant m ◊ n copies de A
(dans le cas de matrices de grande taille)
+ ≠ addition, soustraction
* ^ multiplication, puissance (matricielles)
.* .^ multiplication, puissance terme à terme
\ / division à gauche, division à droite (matricielles)
.\ ./ division à gauche, division à droite terme à terme
x=A\b solution du système linéaire A*x=b
x=b/A solution du système linéaire x*A=b
norm(A) ou norm(A,2) norme 2 de A
q
norm(A,1) norme 1 de A : ÎAÎ1 = maxj=1...n ni=1 |Ai,j |
qn
norm(A,inf) norme infini de A : ÎAÎŒ = maxi=1...n |A |
Òqj=1 qi,j
norm(A,'fro') norme de Frobenius de A : ÎAÎfro = n
i=1
n
j=1 |Ai,j |
2
Taper help matfun pour avoir la liste complète des fonctions matricielles proposées par Matlab.
Question 6.
1. Construire la matrice A définie par Q R
1 2 3
c d
A = a4 5 6b
7 8 9
en tapant
>> A = [1 2 3; 4 5 6; 7 8 9]
2. Quels sont les résultats des commandes suivantes ?
>> A([2 3],[1 3])
>> A([2 3],1:2)
>> A([2 3],:)
>> A([2 3],end)
>> A(:)
>> A(5)
>> reshape(A(:),size(A))
12
Solution
1. >> A = [1 2 3; 4 5 6; 7 8 9]
A =
1 2 3
4 5 6
7 8 9
Question 7.
1. Calculer les valeurs propres et vecteurs propres de A.
2. Construire une matrice C de même taille que A. Essayer A+C, A*C et A.*C.
3. Définir la matrice B comme étant la matrice A à laquelle on a ajouté le vecteur colonne [1; 2; 3].
13
Solution
D =
16.1168 0 0
0 ≠1.1168 0
0 0 ≠0.0000
Question 8.
1. Créer des matrices particulières. Exemple de création d’une matrice par blocs :
>> C=[A, zeros(3,2); zeros(2,3), eye(2)]
2. Répliquer le vecteur colonne [1; 3; 6] pour en faire une matrice de taille 3◊19, de deux manières :
en utilisant la commande ones et en effectuant une multiplication matricielle, puis en trouvant la
commande de réplication.
Solution
14
1. >> C=[A, zeros(3,2); zeros(2,3), eye(2)]
C =
1 2 3 0 0
4 5 6 0 0
7 8 9 0 0
0 0 0 1 0
0 0 0 0 1
2. >> v=[1; 3; 6]
v =
1
3
6
>> M=v*ones(1,19)
M =
Columns 1 through 13
1 1 1 1 1 1 1 1 1 1 1 1 1
3 3 3 3 3 3 3 3 3 3 3 3 3
6 6 6 6 6 6 6 6 6 6 6 6 6
Columns 14 through 19
1 1 1 1 1 1
3 3 3 3 3 3
6 6 6 6 6 6
>> M=repmat(v,1,19)
M =
Columns 1 through 13
1 1 1 1 1 1 1 1 1 1 1 1 1
3 3 3 3 3 3 3 3 3 3 3 3 3
6 6 6 6 6 6 6 6 6 6 6 6 6
Columns 14 through 19
1 1 1 1 1 1
3 3 3 3 3 3
6 6 6 6 6 6
Question 9. Ecrire la matrice carrée M de taille 12◊12 contenant les entiers de 1 à 144 rangés par ligne.
Extraire de cette matrice les sous-matrices suivantes :
1. la sous-matrice formée par les coefficients mi,j pour i = 1, . . . , 6 et j = 7, . . . , 12 ;
2. celle des coefficients mi,j pour (i, j) œ {1, 2, 5, 6, 9, 10}2 .
Solution
Construction de la matrice M avec initialisation et indexation linéaire :
>> M=zeros(12); % ou M=zeros(12,12);
>> M(:)=1:144
M =
1 13 25 37 49 61 73 85 97 109 121 133
2 14 26 38 50 62 74 86 98 110 122 134
3 15 27 39 51 63 75 87 99 111 123 135
15
4 16 28 40 52 64 76 88 100 112 124 136
5 17 29 41 53 65 77 89 101 113 125 137
6 18 30 42 54 66 78 90 102 114 126 138
7 19 31 43 55 67 79 91 103 115 127 139
8 20 32 44 56 68 80 92 104 116 128 140
9 21 33 45 57 69 81 93 105 117 129 141
10 22 34 46 58 70 82 94 106 118 130 142
11 23 35 47 59 71 83 95 107 119 131 143
12 24 36 48 60 72 84 96 108 120 132 144
>> M=M'
M =
1 2 3 4 5 6 7 8 9 10 11 12
13 14 15 16 17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70 71 72
73 74 75 76 77 78 79 80 81 82 83 84
85 86 87 88 89 90 91 92 93 94 95 96
97 98 99 100 101 102 103 104 105 106 107 108
109 110 111 112 113 114 115 116 117 118 119 120
121 122 123 124 125 126 127 128 129 130 131 132
133 134 135 136 137 138 139 140 141 142 143 144
Extraction de sous-matrices :
1. >> M(1:6,7:12)
ans =
7 8 9 10 11 12
19 20 21 22 23 24
31 32 33 34 35 36
43 44 45 46 47 48
55 56 57 58 59 60
67 68 69 70 71 72
2. >> v=[1,2,5,6,9,10];
>> M(v,v)
16
ans =
1 2 5 6 9 10
13 14 17 18 21 22
49 50 53 54 57 58
61 62 65 66 69 70
97 98 101 102 105 106
109 110 113 114 117 118
Solution
17
3. >> x=A\b
x =
0
≠1.4000
≠0.8000
4. >> x=inv(A)*b
? ? ? Error using ==> inv
Matrix must be square.
La matrice A n’est pas carrée, elle ne risque pas d’être inversible ! La solution x obtenue en faisant
x=A\b est une solution particulière parmi l’ensemble des solutions du système sous-dimensionné.
1.4 Fonctions
Certaines fonctions de Matlab s’appliquent à l’ensemble d’un vecteur. Lorsqu’on les applique à des
matrices, elles opèrent colonne par colonne.
• Fonctions élémentaires
Taper help elfun pour avoir la liste complète des fonctions élémentaires proposées par Matlab. Taper
help specfun pour avoir la liste complète des fonctions spéciales.
• Fonctions vectorielles
18
max(x) maximum de x (plus grand élément de x)
[y,I]=max(x) retourne en plus les indices I du maximum de x
min(x) minimum de x (plus petit élément de x)
[y,I]=min(x) retourne en plus les indices I du minimum de x
sort(x) trie/ordonne les éléments de x par ordre croissant
[y,I]=sort(x) retourne en plus les indices I des éléments de x
I=find(x) retourne les indices I des éléments non nuls de x
[I,J]=find(x) retourne les indices des lignes (dans le vecteur I)
et des colonnes (dans le vecteur J) des éléments non nuls de x
sum(x) somme des éléments de x
cumsum(x) vecteur contenant la somme cumulée des éléments de x
prod(x) produit des éléments de x
cumprod(x) vecteur contenant le produit cumulé des éléments de x
diff(x) vecteur des différences entre deux éléments consécutifs de x
factorial(x) vecteur contenant le factoriel des éléments de x
mean(x) moyenne des éléments de x
median(x) médiane des éléments de x
var(x) variance des éléments de x
std(x) écart-type des éléments de x
>> A=rand(3)
>> sort(A)
>> [B,I]=sort(A)
>> sort(A')
>> max(A)
>> max(A')
>> max(max(A))
>> sum(A)
>> cumsum(A)
>> prod(A)
>> diff(A)
>> D=A([1,2],1:3)
>> sum(D,1)
>> sum(D,2)
Solution
>> x=rand(1,5)
x =
0.2785 0.5469 0.9575 0.9649 0.1576
>> mean(x)
ans =
0.5811
19
>> std(x)
ans =
0.3745
>> median(x)
ans =
0.5469
>> sort(x)
ans =
0.1576 0.2785 0.5469 0.9575 0.9649
>> A=rand(3)
A =
0.9706 0.8003 0.9157
0.9572 0.1419 0.7922
0.4854 0.4218 0.9595
>> sort(A)
ans =
0.4854 0.1419 0.7922
0.9572 0.4218 0.9157
0.9706 0.8003 0.9595
>> [B,I]=sort(A)
B =
0.4854 0.1419 0.7922
0.9572 0.4218 0.9157
0.9706 0.8003 0.9595
I =
3 2 2
2 3 1
1 1 3
>> sort(A')
ans =
0.8003 0.1419 0.4218
0.9157 0.7922 0.4854
0.9706 0.9572 0.9595
>> max(A)
ans =
0.9706 0.8003 0.9595
>> max(A')
ans =
0.9706 0.9572 0.9595
>> max(max(A))
ans =
0.9706
>> sum(A)
ans =
2.4131 1.3639 2.6674
>> cumsum(A)
ans =
0.9706 0.8003 0.9157
1.9278 0.9422 1.7079
20
2.4131 1.3639 2.6674
>> prod(A)
ans =
0.4509 0.0479 0.6961
>> diff(A)
ans =
≠0.0134 ≠0.6584 ≠0.1235
≠0.4718 0.2799 0.1673
>> D=A([1,2],1:3)
D =
0.9706 0.8003 0.9157
0.9572 0.1419 0.7922
>> sum(D,1)
ans =
1.9278 0.9422 1.7079
>> sum(D,2)
ans =
2.6866
1.8913
Question 12. Calculer 10! en utilisant la fonction prod puis la fonction factorial.
Solution
>> prod(1:10)
ans =
3628800
>> factorial(10)
ans =
3628800
Question 13.
1. Construire le vecteur y de taille 8 défini par
1ÿ n
ȳn = yi
n i=1
Extraire ȳ8 . Donner une fonction qui calcule directement ȳ8 à partir de y.
Solution
21
1. >> y=[3.2 4.8 3.3 3.2 3.1 4.2 3.2 3.3]
y =
3.2000 4.8000 3.3000 3.2000 3.1000 4.2000 3.2000 3.3000
2. >> vmoy=cumsum(y)./(1:length(y))
vmoy =
3.2000 4.0000 3.7667 3.6250 3.5200 3.6333 3.5714 3.5375
>> moy=vmoy(end)
moy =
3.5375
>> moy=mean(y) % ou moy=sum(y)/length(y)
moy =
3.5375
Question 14. Tirer 20 nombres aléatoirement (et uniformément) dans l’intervalle [0 , 1]. Quelle est la valeur
minimale du vecteur et la position du coefficient qui la réalise ? Vérifier.
Solution
>> x=rand(1,20)
x =
Columns 1 through 10
0.2548 0.2240 0.6678 0.8444 0.3445 0.7805 0.6753 0.0067 0.6022
0.3868
Columns 11 through 20
0.9160 0.0012 0.4624 0.4243 0.4609 0.7702 0.3225 0.7847 0.4714
0.0358
>> [xmin,I]=min(x)
xmin =
0.0012
I =
12
Question 15. Soit X une matrice 2◊n contenant les coordonnées de n points du plan. Comment faire pour
obtenir une matrice où les points sont ordonnés par ordre croissant des abscisses ?
Solution
>> n=10;
>> X=rand(2,n);
X =
0.6557 0.8491 0.6787 0.7431 0.6555 0.7060 0.2769 0.0971 0.6948
0.9502
0.0357 0.9340 0.7577 0.3922 0.1712 0.0318 0.0462 0.8235 0.3171
0.0344
>> [Y,I]=sort(X(1,:))
22
Y =
0.0971 0.2769 0.6555 0.6557 0.6787 0.6948 0.7060 0.7431 0.8491
0.9502
I =
8 7 5 1 3 9 6 4 2 10
>> Z=X(:,I)
Z =
0.0971 0.2769 0.6555 0.6557 0.6787 0.6948 0.7060 0.7431 0.8491
0.9502
0.8235 0.0462 0.1712 0.0357 0.7577 0.3171 0.0318 0.3922 0.9340
0.0344
Solution
1. >> y
y =
3.2000 4.8000 3.3000 3.2000 3.1000 4.2000 3.2000 3.3000
>> I=find(y<3.3)
I =
1 4 5 7
Question 17.
1. Tirer 100 nombres aléatoirement (et uniformément) dans l’intervalle [0 , 1] et grouper les dans un
vecteur x = (xi )16i6100 .
2. Construire le vecteur y = (yi )16i6100 tel que yi = 2xi .
3. Construire le vecteur z = (zi )16i6100 tel que zi = Âyi Ê, correspondant à la partie entière de yi , à l’aide
de la fonction floor.
4. Donner la fréquence de 1 sur l’échantillon z. Pouvait-on s’attendre à ce résultat ?
23
Solution
1. >> x=rand(1,100);
2. >> y=2*x;
3. >> z=floor(y);
4. >> freq=mean(z)
freq =
0.5100
Environ la moitié (51%) des composantes du vecteur z valent 1, et l’autre moitié 0. D’après la loi des
grands nombres, plus le nombre n d’éléments (tirés aléatoirement) du vecteur x est élevé (ici n = 100),
plus la fréquence de 1 sur l’échantillon z est proche de 50%.
Remarque : Attention à ne pas confondre = qui sert à affecter une valeur à une variable et == qui sert à
tester l’égalité.
24
if conditions si les conditions sont vérifiées,
instructions alors les instructions sont exécutées.
end
if conditions si les conditions sont vérifiées,
instructions1 alors les instructions1 sont exécutées,
else sinon,
instructions2 alors les instructions2 sont exécutées.
end
if conditions1 si les conditions1 sont vérifiées,
instructions1 alors les instructions1 sont exécutées,
elseif conditions2 si les conditions1 ne sont pas vérifiées mais les conditions2 le sont,
instructions2 alors les instructions2 sont exécutées.
else sinon (si ni les conditions1 ni les conditions2 ne sont vérifiées),
instructions3 alors les instructions3 sont exécutées.
end
Question 18.
1. Créer le script test_si.m suivant :
if a>0
b=0
else
b=1
end
Question 19.
1. Créer le script pile_ou_face.m qui simule le lancer d’une pièce de monnaie :
u=rand;
if u<p
disp('pile')
else
disp('face')
end
Remarque : Une proposition logique (par exemple (x>0 & x<10) a pour valeur 1 si elle est vraie et 0 sinon.
Dans les calculs, on peut donc éviter d’utiliser l’instruction if en introduisant des indicatrices d’ensembles.
25
for variable = vecteur les colonnes du vecteur sont affectées l’une après l’autre à la variable , et
instructions pour chaque valeur prise par la variable , les instructions sont exécutées.
end
while conditions tant que les conditions sont vérifiées,
instructions les instructions sont exécutées.
end
Une boucle for s’arrête à un rang fixé, tandis qu’une boucle while s’arrête conditionnellement. On donne les
instructions de rupture de séquence dans le tableau suivant. Il vaut mieux cependant mieux programmer
suffisamment proprement pour s’en dispenser !
1.5.5 Choix
Syntaxe de la commande switch permettant d’effectuer un choix selon la valeur d’une expression :
switch expression
case cas1 dans le cas où l’ expression est égale au cas1 ,
instructions1 les instructions1 sont exécutées,
case cas2 dans le cas où l’ expression est égale au cas2 ,
instructions2 les instructions2 sont exécutées,
case cas3 dans le cas où l’ expression est égale au cas3 ,
instructions3 les instructions3 sont exécutées,
otherwise autrement,
instructions4 les instructions4 sont exécutées,
end
Question 21.
1. Créer le script choix.m suivant :
26
switch message
case 'Erreur'
sprintf('Attention erreur')
case 'Avertissement'
sprintf('Attention script incomplet')
otherwise
sprintf('Tout est OK')
end
1.5.6 Fonctions
Comme pour les fichiers d’instructions, les fichiers de fonctions sont des fichiers texte avec une extension
.m. Leur syntaxe est particulière : ils nécessitent des arguments en entrée et renvoient des variables en sortie.
Ils contiennent la définition d’une fonction et portent le nom de cette fonction (avec l’extension .m). Si un
fichier de fonctions ma_fonction.m est placé dans un répertoire accessible, la fonction ma_fonction devient
une fonction Matlab comme toutes les autres. Le texte placé en commentaire sous la définition de la fonction
est le contenu de l’aide pour celle-ci.
function définit une fonction (dans un fichier portant le même nom que la fonction avec l’extension .m)
nargin nombre d’arguments en entrée d’une fonction
nargout nombre d’arguments en sortie d’une fonction
varargin liste d’arguments variable en entrée d’une fonction
varargout liste d’arguments variable en sortie d’une fonction
Question 22.
1. Créer le fichier val_abs.m contenant la fonction val_abs :
function [b,pos]=val_abs(a)
% Renvoie la valeur absolue (b) et un booléen traduisant la positivité de a (pos)
if a>0
b=a;
pos=true;
else
b=≠a;
pos=false;
end
27
>> a=≠5;
>> [b,pos]=val_abs(a)
b =
5
pos =
0
Pour afficher du texte ou le contenu d’une variable à l’écran, on peut utiliser la commande disp, fprintf
ou sprintf. Pour afficher une chaîne de caractères et récupérer une valeur saisie au clavier par l’utilisateur,
on peut utiliser la fonction input.
Types de formats :
28
Question 23.
>> disp('Coucou')
Coucou
>> n=input('Entrez une valeur :\n')
Entrez une valeur :
4
n =
4
>> disp(['Vous avez tapé : ' num2str(n)])
Vous avez tapé : 4
Question 24.
>> sprintf('%s', 'il fera beau a Brest')
ans =
il fera beau a Brest
>> temps = 'il fera beau a Brest'; sprintf('%s',temps)
ans =
il fera beau a Brest
>> sprintf('meteo : %s', temps)
ans =
meteo : il fera beau a Brest
Question 25.
>> x = pi/3; y = sin(x);
>> sprintf('sin(%8.6f) = %4.2f', x,y) % x et y : nombres à virgule fixe
ans =
sin(1.047198) = 0.87
>> sprintf('sin(%8.6f) = %4.2e', x,y) % y : nombre à virgule flottante
ans =
sin(1.047198) = 8.66e≠01
Question 26. Réinitialiser l’espace de travail en tapant clear (effacement des variables d’environnement)
puis effacer la fenêtre de commandes en tapant clc.
29
plot(y,'s') tracé d’une courbe ou d’un nuage de points (i,y(i))
plot(x,y,'s') tracé d’une courbe ou d’un nuage de points (x(i),y(i))
loglog(x,y,'s') tracé en échelle logarithmique (suir l’axe des abscisses
et des ordonnées)
semilogx(x,y,'s') tracé en échelle semi-logarithmique (sur l’axe des abscisses)
semilogy(x,y,'s') tracé en échelle semi-logarithmique (sur l’axe des ordonnées)
fill(x,y,c) créé un polygone 2D rempli à partir des valeurs de x et y
avec la couleur spécifiée par c
polar(t,r,'s') tracé en coordonnées polaires (r,t)
bar(x,y,'s') tracé sous forme d’un histogramme
stairs(x,y,'s') tracé sous forme d’une fonction en marches d’escalier
stem(x,y,'s') tracé sous forme d’un diagramme en bâtons
fplot(fun,limits) tracé d’une fonction fun entre les bornes limits,
limits est un vecteur correspondant au support [xmin xmax] de x
ou au support [xmin xmax ymin ymax] de x et y
hist(y,nbins) tracé d’un histogramme des valeurs de y réparties en nbins classes
si nbins est un scalaire, ou sur les classes centrées sur les valeurs de c
si nbins est un vecteur
[n,c]=hist(y,nbins) ne dessine pas d’histogramme mais retourne les vecteurs n et c,
où c est le vecteur des milieux des classes et n le nombre de valeurs de y
appartenant à chaque classe ; l’histogramme s’obtient par bar(c,n)
's' est un paramètre optionnel constitué d’une chaîne de caractères qui spécifie le type de tracé (style de
lignes, symbole des marqueurs, couleur). Taper help plot pour avoir la liste des valeurs possibles pour 's'.
Taper help graph2d pour avoir la liste des fonctions ou variables de contrôle d’un graphique 2D.
30
Symbole Couleur
'y' jaune
'm' magenta
'c' cyan
'r' rouge
'g' vert
'b' bleu
'w' blanc
'k' noir (défaut)
31
figure(2)
fplot('[x*sin(x),2*x*sin(x)]',[≠pi,3*pi])
fplot(@(x) x.*sin(x),[≠pi,3*pi])
fplot('x*sin(x)',[≠pi,3*pi],'b≠')
hold on
fplot('2*x*sin(x)',[≠pi,3*pi],'yo')
hold off
figure(3)
t=0:0.1:2*pi;
plot(sin(t),sin(2*t))
plot(sin(t),sin(2*t),'c≠')
Question 28. Soient f et g les fonctions définies sur l’intervalle [0 , 10] par
3 4 3 4
x x
f (x) = exp ≠ et g(x) = cos
25 10
Tracer ces deux fonctions à l’aide de la fonction fplot dans une même fenêtre graphique mais sur des graphes
différents, puis sur le même graphe.
Solution
32
1.6.4 Sauvegarde d’une figure
Une figure peut être sauvegardée sous plusieurs formats :
• sous un format propre à Matlab avec l’extension .fig. Pour cela, cliquer sur la commande Save as du
menu File de la fenêtre graphique et entrer un nom de fichier avec l’extension .fig dans l’encadré qui
apparaît. Un tel fichier (avec l’extension .fig) peut être visualisé en utilisant la commande Open du
menu File.
• sous un format PostScript avec l’extension .pdf, .eps, .epsc, .eps2, .epsc2, .ps, . . . en utilisant soit
la commande Save as, soit la commande Export Setup du menu File d’une fenêtre graphique.
On peut également utiliser une des commandes saveas ou print :
>> saveas(gcf,'nom_fichier','format')
>> print(gcf,'≠dformat','nom_fichier') % ou print ≠dformat 'nom_fichier'
format est une chaîne de caractères désignant le format de sauvegarde (extension) : pdf, eps, eps2, epsc,
epsc2, ps, . . .
Question 29.
1. Tirer 100 couples de points (x, y) aléatoirement (et uniformément) dans le carré [0 , 1]◊[0 , 1].
2. Représenter le nuage de points obtenus dans une fenêtre graphique.
3. Calculer le centre de gravité G du nuage de points.
4. Ajouter le centre de gravité en rouge au nuage de points.
5. Sauvegarder la figure sous le nom nuage.fig. Fermer la fenêtre graphique. Ouvrir une nouvelle fenêtre
graphique et faire apparaître le fichier nuage.fig.
6. Faire afficher dans une même fenêtre graphique deux histogrammes, un pour les abscisses et un pour
les ordonnées des points tirés.
7. Sauvegarder les variables x, y et le centre de gravité G dans un fichier binaire sauvegarde.mat. Effacer
les variables x, y et G avec la commande clear. Puis, charger le fichier sauvegarde.mat afin de les
récupérer. Vérifier la récupération avec la commande who.
Solution
3. >> G=[mean(x);mean(y)]
4. >> hold on
>> plot(G(1),G(2),'+r')
>> hold off
>> l=legend('$(x,y)$','$(G_x,G_y)$');
>> set(l,'Interpreter','latex')
>> saveas(gcf,'nuage','fig')
>> close
>> open nuage.fig
33
5. Sur deux graphes différents :
>> figure
>> subplot(1,2,1)
>> hist(x,20) % ou [nx,cx]=hist(x,20); bar(cx,nx,'b')
>> ylabel('$x$','Interpreter','latex')
>> l=legend('$x$');
>> set(l,'Interpreter','latex')
>> subplot(1,2,2)
>> hist(y,20) % ou [ny,cy]=hist(y,20); bar(cy,ny,'r')
>> ylabel('$y$','Interpreter','latex')
>> l=legend('$y$');
>> set(l,'Interpreter','latex')
1.6.5 Exemple
On considère deux vecteurs ligne de taille 1 ◊ n notés x et y.
• La fonction figure permet de créer une fenêtre graphique.
• plot(y) trace une fonction passant par les n points du vecteur y avec en abscisse l’indice de y leur
correspondant.
plot(x,y) trace les valeurs de y avec en abscisse les valeurs de x du même indice.
• Des caractéristiques de style et de couleur peuvent être données au tracé en remplaçant le mot-clé
'LineSpec' par l’une de ses valeurs dans la commande plot(x,y,'LineSpec').
On pourra aussi regarder les options liées aux axes.
Exemples : axis tight permet d’ajuster les axes à l’amplitude des variables,
axis equal impose la même unité sur les deux axes, . . .
• La commande hold on permet de tracer plusieurs courbes sur un même graphe. La commande hold off
met fin à cette option.
• Les légendes sur les axes des abscisses et des ordonnées s’ajoutent à l’aide des commandes xlabel('
légende x') et ylabel('légende y'). Un titre peut être ajouté grâce à la commande title('titre'),
et une légende générale avec la commande legend('courbe1','courbe2').
Exemple :
x=linspace(0,2*pi,20);
y1=sin(x);
y2=sin(x+pi/2);
plot(x,y1,'≠xr');
hold on
plot(x,y2,':db');
xlabel('$x$ (en rad)','Interpreter','latex')
34
ylabel('$\sin(x)$','Interpreter','latex')
title('Fonction sinus avec et sans d\''ephasage de $\displaystyle\frac{\pi}{2}$','
Interpreter','latex')
l=legend('$\sin(x)$','$\sin\left(x+\displaystyle\frac{\pi}{2}\right)$');
set(l,'Interpreter','latex')
• Pour créer une animation sur des courbes 2D, on peut utiliser la commande plot encapsulée dans
une boucle en prenant soin de demander une pause d’une seconde entre chaque tracé pour rendre
l’animation visible. Par exemple, on souhaite tracer N courbes de M points stockés sur les lignes d’une
matrice A.
>> figure;
>> for j=1:N
plot(A(j,:))
pause(1)
end
• Pour représenter des graphes en 3D, on a le choix entre des isovaleurs associées à une échelle de couleurs
(commande imagesc), et une représentation en perspective qui nécessite une réorganisation des données
d’entrée grâce à la commande mesh.
1.7 Entrées/Sorties
• Lecture d’un fichier
Utile pour récupérer des données dans un fichier texte (fichier input avec l’extension .msh). On
considère le fichier wing.msh contenant les informations suivantes :
Nodes
4
1000
2 48 44 0
3 15.99999999994878 14.66666666661972 0
4 14.39999999998723 32.39999999998363 0
Lecture du nombre de noeuds (9) et stockage dans la sous-structure nnod de la structure analysis :
chaine=fgets(fid); % lecture de la ligne suivante
analysis.nnod=sscanf(chaine,'%d'); % stockage de la donnée chaine (entier indiqué par
le type de format '%d') dans la sous≠structure nnod de la structure analysis
Lecture de toutes les coordonnées stockées sur les lignes suivantes de wing.msh et stockage dans la
matrice coor préalablement initialisée avec des zéros :
>> coor=zeros(analysis.nnod,2);
>> for i=1:analysis.nnod
chaine=fgets(fid);
h=sscanf(chaine,'%d %f %f %f')';
coor(i,:)=h(2:3); % transposition pour stocker en ligne (stockage en colonne par
defaut)
end
disp(coor); % affichage de la matrice coor
35
Fermeture du fichier :
fclose(fid);
Question 30. Vous ferez un script pour rassembler les instructions précédentes
36