Académique Documents
Professionnel Documents
Culture Documents
Matlab PDF
Matlab PDF
Stphane Balac
Centre de Mathmatiques
INSA de Lyon
(c) Copyright 2001 Stphane Balac - INSA de Lyon
(Centre de Mathematiques, F-69621 Villeurbanne Cedex)
Ce document peut tre reproduit et distribu des fins non-commerciales dans son intgra-
lit ou partiellement. La mention du copyright ainsi que lidentit de lauteur doivent tre
conserves et la prsente notice prserve dans son intgralit sur toute copie intgrale ou
partielle. Si vous distribuez ce travail en partie, vous devez mentionner comment obtenir
une version intgrale du document.
4 Les entres-sorties 36
4.1 Les formats daffichage des rels . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2 Affichage simple, la commande disp . . . . . . . . . . . . . . . . . . . . . . 36
4.3 Lecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.4 Impressions diriges par format . . . . . . . . . . . . . . . . . . . . . . . . . 37
3
6 Graphisme 56
6.1 Gestion des fentres graphiques . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.2 Graphisme 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.2.1 Tracer le graphe dune fonction ; la commande fplot . . . . . . . . . 57
6.2.2 La commande plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.2.3 La commande loglog . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.3 Amliorer la lisibilit dune figure . . . . . . . . . . . . . . . . . . . . . . . . 61
6.3.1 Lgender une figure . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.3.2 Afficher plusieurs courbes dans une mme fentre . . . . . . . . . . . 62
6.3.3 Sauvegarder une figure . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.4 Graphisme 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.4.1 Tracer les lignes de niveau dune fonction de 2 variables . . . . . . . 65
6.4.2 Reprsenter une surface dquation z = g(x, y) . . . . . . . . . . . . 69
6.4.3 Reprsenter une surface paramtre . . . . . . . . . . . . . . . . . . . 73
4
Introduction
matlab est abrviation de MATrix LABoratory. matlab est avant tout un programme
de calcul matriciel. Lexemple suivant est rvelateur ce sujet : si A et B sont deux variables
dfinies comme tant des matrices, linstruction A*B calcule le produit matriciel des ma-
trices A et B. Dautre part avec matlab, un scalaire est considr comme une matrice un
lment et un vecteur est considr comme une matrice une ligne (ou une colonne). Bien
quun peu droutant au dpart, cette approche savre en pratique dune grande efficacit.
Nous supposons que le lecteur est famili des notions dalgbre linaire lmentaire,
notamment matriciel. Un exemple de matrice que nous utiliserons frquemment dans ce
document correspond au carr magique. Lexpression carr magique dsigne tout tableau
carr dont les cases renferment des nombres entiers disposs de telle sorte que les sommes
des nombres inscrits sur chaque ligne, sur chaque colonne et chaque diagonale soient toutes
gales. On pourra consulter au sujet des carrs magiques le chapitre 2 de louvrage Histoire
dalgorithmes [1] : plus souvent utiliss comme talismans que comme objet de recherche
mathmatique, les carrs magiques taient troitement lis la vie quotidienne. Ainsi, il
tait fait appel eux pour faciliter les accouchements, soigner les morsures danimaux
vnneux ou encore gurir de maladie. Il est donc naturel quils ne se rencontrent pas que
dans les livres mais aussi sur des tableaux, sous forme de gravure sur des monuments, des
mdailles . . .. Comme exemple bien connu, on peut citer le carr magique dordre 4 qui
apparat sur une gravure sur bois de la Renaissance dAlbrecht Drer (Mlancolie, 1415).
5
Fig. 1 Mlancolie par Albrecht Drer (1415). Un carr magique dordre 4 apparat au
dessous de la cloche.
Par convention, les commandes matlab apparaissent dans le texte dans une fonte
true-type . Les exemples sont eux aussi prsents dans une fonte true-type . Dans
un souci de gain de place certains exemples sont prsents sur deux colonnes.
Ce document est disponible aux formats pdf et postscript auprs de lauteur. Une version
hypertexte (HTLM) de ce document est galement disponible.
Ce document est destin voluer, aussi toute erreur ou ambigit releve, toute remarque
ou avis peut tre communiqu ladresse suivante : Stephane.Balac@voila.fr.
Cette version du document a bnfici de corrections suggres par Olivier Mazet du Centre
de Mathmatiques de lINSA de Lyon.
Stphane Balac
Centre de Mathmatiques
INSA de Lyon
F-69621 Villeurbanne Cedex
6
1 Prsentation et gnralits
1.1 Une session matlab
Pour lancer matlab1 , commencez par ouvrir une fentre de commande (commandtool)
puis dplacez-vous dans votre rpertoire (directory) de travail. Tapez la commande matlab.
Voici ce que vous devez voir apparatre :
>>
Notez le prompt matlab () qui indique que matlab attend des instructions. Voici
un exemple de session matlab :
A B t x y z
>> whos
Name Size Bytes Class
>> clear x y t
>> whos
Name Size Bytes Class
>> clear
>> who
>>
6 flops.
[unix prompt] ls
toto.mat
[unix prompt] more y.mat
MATLAB 5.0 MAT-file, Platform: SOL2, Created on: Mon Jul 5 20:42:21 1999
MI 8 e e d z
y z
>> y
y =
0.8660
>> z
z =
>>
>> z=cos(x)
z =
-0.5000
>> diary off
et rien de plus . . .
>>
Attention, les commandes matlab doivent tre tapes en minuscules pour tre recon-
nues, mme si elles figurent en majuscules dans laide en ligne.
Plusieurs instructions matlab peuvent figurer sur une mme ligne. Il faut alors les
sparer par une virgule ou par un point virgule. Dautre part, si une commande est trop
longue pour tenir sur une ligne, il est possible de poursuivre sur la ligne suivante en
terminant la ligne par 3 points (...).
>> B = [ 1 3; 4 2 ]; B*B
ans =
>> A + B
??? Error using ==> +
Matrix dimensions must agree.
>> C = [ 1 2 3; 4 5]
??? Number of elements in each row must be the same.
>> whose
??? Undefined function or variable whose.
>>
>> dir
. .. toto toto.mat
>> edit toto
>> delete toto
>> !ls
toto.mat
>>
>> clear
>> x = 2; z = 2+i; rep = oui;
>> whos
Name Size Bytes Class
Comme on ne dfinit pas de manire explicite le type dune variable, il est parfois utile
de pouvoir le dterminer. Cela est possible grce aux commandes ischar, islogical et
isreal. ischar(x) retourne 1 si x est de type chane de caractres et 0 sinon. islogical(x)
retourne 1 si x est de type logique et 0 sinon. La commande isreal(x) est utiliser avec
discernement : elle retourne 1 si x est rel ou de type chane de caractres et 0 sinon (x
>> ischar(rep) 0
ans = >> isreal(x)
1 ans =
>> ischar(x) 1
ans = >> isreal(rep)
0 ans =
>> isreal(z) 1
ans = >>
>> ch = [ch1,ch2]
ans =
bonjour
>> ch(1), ch(7), ch(1:3)
ans =
b
ans =
r
ans =
bon
>> ch3 = soi;
>> ch = [ch(1:3), ch3, ch(7)]
ans =
bonsoir
>>
Si une chane de caractres doit contenir le caractre apostrophe () celui-ci doit tre
doubl dans la chane (ainsi pour affecter le caractre apostrophe () une variable on
devra crire , soit 4 apostrophes).
>>
>> x3
ans =
8 9 10
>> X = [x1 x2 x3]
X =
1 2 3 4 5 6 7 8 9 10
>>
Les lments dun vecteur peuvent tre manipuls grce leur indice dans le tableau.
Le ke lment du vecteur x est dsigne par x(k). Le premier lment dun vecteur a
obligatoirement pour indice 1. En pratique ceci impose de faire des translations dindices
si par exemple on souhaite dfinir une suite xn , n = 0, , N . Le terme x0 de la suite
correspondra llment x(1) du vecteur et le terme xN llment x(N+1). Il est possible
de manipuler plusieurs lments dun vecteur simultanment. Ainsi les lments k l du
vecteur x sont dsigns par x(k :l). On peut galement manipuler facilement les lments
dun vecteur dont les indices sont en progression arithmtique. Ainsi si lon souhaite extraire
les lments k, k + p, k + 2p, , k + N p = l on crira x(k :p :l). Plus gnralement, si K
est un vecteur de valeurs entires, X(K) retourne les lments du vecteur X dont les indices
sont les lments du vecteur K.
Reprenons lexemple prcdent.
Il est trs facile de dfinir un vecteur dont les composantes forment une suite arith-
mtique. Pour dfinir un vecteur x dont les composantes forment une suite arithmtique
de raison h, de premier terme a et de dernier terme b, on crira x = a :h :b. Si a b
nest pas un multiple de h, le dernier lment du vecteur x sera a + Ent((a b)/h) h o
Ent est la fonction partie entire. La commande linspace permet de dfinir un vecteur x
de longueur N dont les composantes forment une suite arithmtique de premier terme a
et de dernier terme b (donc de raison (a b)/(N 1)). Les composantes du vecteur sont
donc linairement espacs. La syntaxe est x = linspace(a,b,N).
>> x = 1.1:0.1:1.9
x =
Columns 1 through 7
1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000
Columns 8 through 9
1.8000 1.9000
>> x = 1.1:0.2:2
x =
1.1000 1.3000 1.5000 1.7000 1.9000
>> x = linspace(1.1,1.9,9)
ans =
Columns 1 through 7
1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000
Columns 8 through 9
1.8000 1.9000
>>
en tapant A = [ 1 3 ; 4 2 ].
Dune faon gnrale, on dfinit une matrice en donnant la liste de ses lments entre
crochets. Signalons que matlab admet dautres faons dcrire les matrices. Les lments
dune ligne de la matrice peuvent tre spars au choix par un blanc ou bien par une virgule
(,). Les lignes quant elles peuvent tre spares au choix par le point-virgule ( ;) ou par
un retour chariot. Par exemple, on peut aussi crire la matrice A de la manire suivante,
Un lment dune matrice est rfrenc par ses numros de ligne et de colonne. A(i,j)
dsigne le ie lment de la j e ligne ligne de la matrice A. Ainsi A(2,1) dsigne le premier
lment de la deuxime ligne de A,
>> A(2,1)
ans =
4
>>
La commande size permet dobtenir les dimensions dune matrice A donne. On peut
soit obtenir de manire spare le nombre de lignes et de colonnes par les instructions
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
B= 8 28 33
17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
Signalons que si les entiers m et n sont gaux on peut se contenter de ne spcifier quune
seule valeur de dimension : ones(n) est la matrice carre de dimension n dont tous les
lments valent 1. Mentionnons enfin la commande magic(n) qui permet dobtenir une
matrice magique de dimension n.
>> A = magic(5) 17 24 1 8 15
A = >> A(:,2)
17 24 1 8 15 ans =
23 5 7 14 16 24
4 6 13 20 22 5
10 12 19 21 3 6
11 18 25 2 9 12
>> A(1,:) 18
ans = >>
>> A = magic(5)
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> L = [1 3 5]; C = [3 4];
>> A(L,C)
ans =
1 8
13 20
25 2
>> A(1:2:5,3:4)
ans =
1 8
13 20
25 2
>>
On nest pas oblig de se limiter la diagonale principale . . .La commande diag admet
un second paramtre k pour dsigner la ke sur-diagonale (si k > 0) ou la ke sous-diagonale
(si k < 0).
>> A = [4 5 6 7 ; 3 4 5 6 5
2 3 4 5; 1 2 3 4] 5
A = 5
4 5 6 7 >> diag(A,-2)
3 4 5 6 ans =
2 3 4 5 2
1 2 3 4 2
>> diag(A,1) >>
ans =
>> N=5;
>> A=diag(2*ones(N,1)) - diag(ones(N-1,1),1) - diag(ones(N-1,1),-1)
A =
2 -1 0 0 0
-1 2 -1 0 0
0 -1 2 -1 0
0 0 -1 2 -1
0 0 0 -1 2
>>
Comme pour la commande diag, les commandes triu et tril admettent un second
paramtre k. On peut ainsi obtenir la partie triangulaire suprieure (ou infrieure) partir
de la ke diagonale. Ainsi,
>> A = [0 1 2; -1 0 1; -2 -1 0] >> A
A = ans =
0 1 2 0 -1 -2
-1 0 1 1 0 -1
-2 -1 0 2 1 0
>> N=5;
>> A=diag(2*ones(N,1)) - diag(ones(N-1,1),1) - diag(ones(N-1,1),-1)
A =
2 -1 0 0 0
-1 2 -1 0 0
0 -1 2 -1 0
0 0 -1 2 -1
0 0 0 -1 2
>> nnz(A)
ans =
13
>> B = sparse(A)
B =
(1,1) 2
(2,1) -1
(1,2) -1
(2,2) 2
(3,2) -1
(2,3) -1
(3,3) 2
(4,3) -1
(3,4) -1
(4,4) 2
(5,4) -1
(4,5) -1
(5,5) 2
>> whos
Name Size Bytes Class
Pour les trs grosses matrices creuses, il nest bien entendu pas souhaitable dutiliser
une structure pleine (full) pour dfinir la matrice avant de passer en stockage sparse.
La commande sparse permet de dfinir une matrice creuse directement sous la forme
sparse. On lutilise de la faon suivante : A = sparse(is,js,s,n,m) pour dfinir une
matrice A Rn,m dont les coefficients sont nuls (et donc non mmoriss) sauf les lments
ais(l),js(l) qui valent s(l) pour l variant de 1 L longueur du tableau s (L = length(s)).
>> N=5;
Les commandes spdiags, speye et sprand permettent de construire des matrices dia-
gonales, identits et des matrices dont les lments sont des nombres alatoires avec un
stockage sparse . Elles sutilisent de la mme manire que leur quivalent diag, eye et
rand pour les matrices pleines.
pi : 3.1415926535897
i : 1
j : 1
eps : prcision numrique relative
realmin : plus petit nombre virgule flottante manipulable
realmax : plus grand nombre virgule flottante manipulable
inf : infini. Est obtenu quand on essaie dvaluer une expression dont le r-
sultat excde realmax
NaN : not-a-number. Est obtenu quand on essaie deffectuer une opration non-
dfinie comme 0/0
Les valeurs des constantes eps, realmin et realmax dpendent de la machine sur laquelle
matlab est install. Par exemple sur une station SUN Ultra 1 on a eps= 2.2204e 16,
realmin= 2.2251e 308 et realmax= 1.7977e + 308.
Les noms des constantes nest pas rserv, cest--dire quil est possible de dfinir des
variables de mme nom. Dans ce cas, lidentificateur fera rfrence la variable dfinie
par lutilisateur et non plus la constante matlab. On fera attention par exemple, si lon
utilise le type complex, ne pas crire de boucles ayant i ou j comme indices. Pour que
lidentificateur fasse nouveau rfrence la constante matlab, il suffit de supprimer la
variable de mme nom de la mmoire par la commande clear.
>> pi = 0; cos(pi)
ans =
1
>> clear pi
>> cos(pi)
ans =
-1
>>
La commande rem donne le reste (remainder) de la division entire de deux entiers (la
syntaxe est rem(m,n)). Les commandes lcm(m,n) et gcd(m,n) retournent respectivement
Lorsque la fonction est dfinie sur C, largument peut tre de type complexe. On dispose
galement de fonctions spcifiques aux complexes :
conj(z) : le conjugu de z,
abs(z) : le module de z,
angle(z) : argument de z,
real(z) : partie relle de z,
imag(z) : partie imaginaire de z.
Les fonctions mathmatiques incorpores dcrites au paragraphe 3.2 peuvent tre utili-
ses avec un argument qui est un vecteur. La fonction est alors applique tous les lments
du vecteur en mme temps.
Citons enfin quelques fonctions logiques. Les commandes all2 et any2 servent tester
si les lments dun vecteur sont nuls ou non. Si v est un vecteur de valeurs numriques,
all(v) retourne vrai (1) si tous les lments du vecteur sont diffrents de 0 et faux (0) si
au moins un lment vaut 0. any(v) retourne vrai (1) si au moins un lment du vecteur
est diffrent de 0 et faux (0) si le vecteur est compos exclusivement de 0.
>> A+B
En plus des oprations matricielles usuelles, il est possible deffectuer des oprations
entre matrices lment par lment. Pour cela, il faut faire prcder loprateur dun
point (.). Ainsi si A et B sont 2 matrices de mme dimension, on obtient la matrice dont le
terme dindices (i, j) est le produit des deux termes dindices (i, j) des matrices A et B par
la commande A.*B. De mme la commande A.2 fournit la matrice dont les termes sont
les carrs des termes de la matrice A. Bien entendu les commandes A.+B et A+B donnent le
mme rsultat.
On peut obtenir les diffrentes normes dune matrice A grce la commande norm.
Ces fonctions matricielles incorpore de matlab peuvent tre utilises avec un argu-
ment qui est une matrice sparse . Les exceptions sont les fonctions rank, expm et norm qui
ncessitent de passer en stockage full (on excutera donc rank(full(B)) par exemple).
>> p = [ 1, 0, -1];
>> polyval(p,0)
ans =
-1
>> polyval(p,[-2,-1,0,1,2])
ans =
3 0 -1 0 3
>> fplot(polyval([ 1, 0, -1] , x) , [-3,3]), grid
>>
1
3 2 1 0 1 2 3
>> r = roots(p)
r =
-1.0000
1.0000
>> poly(r)
ans =
1.0000 0.0000 -1.0000
>>
matlab dispose galement des formats format short g et format long g qui utilise la
meilleure des deux critures virgule fixe ou virgule flottante. On obtiendra tous les
formats daffichage possibles en tapant help format.
On impose un format daffichage en tapant linstruction de format correspondante dans
la fentre de contrle, par exemple format long. Pour revenir au format par dfaut on
utilise la commande format ou format short.
>> pi ans =
ans = 3.1006e+01
3.1416
>> format short g
>> format long >> pi^3
>> pi ans =
ans = 31.006
3.14159265358979
>> format short
>> format short e >>
>> pi^3
>> A = magic(4);
>> disp(A)
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> A
A =
16 2 3 13
5 11 10 8
9 7 6 12
On utilise frquemment la commande disp avec un tableau qui est une chane de
caractres pour afficher un message. Par exemple disp(Calcul du dterminant de la
matrice A). On utilise galement la commande disp pour afficher un rsultat. Par
exemple disp([Le dterminant de la matrice A vaut , num2str(det(A))]). On re-
marque que lusage de la commande disp est alors un peu particulier. En effet un tableau
doit tre dun type donn, les lments dun mme tableau ne peuvent donc tre des chanes
de caractres et des valeurs numriques. On a donc recours la commande num2str (
number to string ) pour convertir une valeur numrique en une chane de caractres. Par
dfaut la commande num2str affiche 4 dcimales mais il est possible de lui spcifier le
nombre de dcimales souhait en second paramtre. De mme il est possible de lui spcifier
un format daffichage particulier de la valeur numrique ; on consultera la documentation
matlab pour plus de dtails. Attention, si la chane de caractres contient une apostrophe
il est impratif de doubler lapostrophe.
4.3 Lecture
La commande input permet de demander lutilisateur dun programme de fournir
des donnes. La syntaxe est var = input( une phrase ). La phrase une phrase est
affiche et matlab attend que lutilisateur saisisse une donne au clavier. Cette donne
peut tre une valeur numrique ou une instruction matlab. Un retour chariot provoque
la fin de la saisie. Une valeur numrique est directement affecte la variable var tandis
quune instruction matlab est value et le rsultat est affect la variable var. Il est
possible de provoquer des sauts de ligne pour arer le prsentation en utilisant le symbole
\n de la manire suivante : var = input( \n une phrase : \n ). Pensez mettre un
point virgule ( ;) la fin de linstruction si vous ne souhaitez pas voir safficher var = .
Sous cette forme il est impossible davoir une donne de type chane de caractres dans
la mesure o matlab essaie dinterprter cette chane de caractres comme une instruction.
Si lon souhaite saisir une rponse de type chane de caractres on utilise la syntaxe var =
input( une phrase ,s). Signalons quun retour chariot (sans autre chose) initialise
la variable var au tableau vide []. Voici un exemple dutilisation de la commande input
(on suppose que la variable res contient une valeur numrique).
o
variables est le nom des variables imprimer suivant le modle ddition spcifi
dans format ;
format est le format ddition. Il sagit dune chane de caractres contenant les
modles dditions des variables imprimer.
Utilisations particulires
>> x = [1:10];
>> sprintf( %d ,,x)
ans =
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ,
>>
Il est possible dutiliser les symboles suivant dans les chanes de caractres
\n : provoque le passage une nouvelle ligne
\t : insre une tabulation horizontale
\b : dcale limpression du champ suivant dun caractre vers la gauche
\r : saut horizontal
Les fichiers de fonctions ont deux rles. Ils permettent lutilisateur de dfinir des
fonctions qui ne figurent pas parmi les fonctions matlab incorpores ( built-in functions
) et de les utiliser de la mme manire que ces dernires (ces fonctions sont nommes
fonctions utilisateur ). Ils sont galement un lment important dans la programmation
dapplications o les fonctions jouent le rle des fonctions et procdures des langages de
programmation usuels.
Dans lexemple qui suit, on dfinit une fonction modulo qui calcule la valeur de a modulo
n en prenant pour systme de rsidus 1, , n au lieu de 0, , n 1 (systme de rsidus
considr par la fonction incorpore mod). Les lignes qui suivent doivent tre enregistres
dans un fichier de nom modulo.m.
Les lignes prcdes du symbole % sont des lignes de commentaire. Les lignes de com-
mentaire situes entre la ligne function ... et la 1re ligne dinstructions sont affiches si
lon demande de laide sur la fonction modulo.
Arguments de sortie :
r : le residu
q : le quotient
>>
Lappel dune fonction utilisateur seffectue de la mme faon que lappel de nimporte
quelle fonction matlab :
>> b = 10 ; m = 4;
>> [r,q] = modulo(b,m)
r =
2
q =
2
>> modulo(10,5)
ans =
5
>>
Remarques :
Il ny a pas de mot-cl (par exemple end) pour indiquer la fin de la fonction. La
fonction est suppose se terminer la fin du fichier. Il est toutefois possible de
provoquer un retour au programme appelant dans le corps de la fonction grce la
commande return.
On ne peut crire quune seule fonction par fichier (qui doit porter le nom de cette
fonction). Toutefois dans la version 5 de matlab existe la notion de sous-fonction .
Une sous-fonction est une fonction crite dans le mme fichier quune autre fonction
La gestion des variables dentre et de sortie est trs souple sous matlab. Si lon
nest intress que par le rsidu et pas par le quotient, on peut se contenter de ne mettre
quune seule variable de sortie, v = modulo(10,4). Dans cet appel la variable v contiendra
le rsidu (la premire variable de sortie). Par contre, mme si lon ne souhaite recueillir
que le quotient, on est oblig deffectuer un appel de la forme [r,q] = modulo(10,4) et
donc de dfinir une variable inutile. Aussi, dune manire gnrale, il est bon de ranger
les variables de sortie par ordre dimportance . Il est galement possible dappeler une
fonction donne avec moins de variables dentre que le nombre indiqu pour la dfinition
de la fonction (il faut bien entendu que le corps de la fonction soit programm de sorte de
prvoir cette ventualit). Il existe deux fonctions matlab utiles pour grer cette situation :
nargin qui retourne le nombre de variables dentre utiliss lors de lappel et nargout qui
retourne le nombre de variables de sortie prvues lors de lappel. Voici un petit exemple
venant illustrer ces possibilits.
if nargin == 2
A = fix(T*rand(m));
else
A = fix(T*rand(m,n));
end
if nargout == 2
rang = rank(A);
end
Dans cet exemple, on gre les variables dentre de la fonction de sorte de ne pas avoir
besoin de donner lors de lappel le nombre de lignes et de colonnes si la matrice est carre.
On gre aussi les variables de sortie afin de ne pas calculer le rang de la matrice si aucune
variable de sortie pour le rsultat nest prvue lors de lappel.
Un point important concerne la gestion des variables entre le programme principal (ou
le workspace) et les fonctions de lutilisateur. Toutes les variables dfinies lintrieur dune
fonction sont des variables locales cette fonction. La communication avec des variables
du programme principal (ou du workspace ) ou avec des variables dautres fonctions se
fait uniquement par les variables dentre et sortie de la fonction. Une alternative existe
toutefois : il est possible de dclarer certaines variables comme des variables globales. Une
variable globale peut tre partage entre un programme principal et plusieurs fonctions sans
quil soit besoin de la spcifier parmi les variables dentre-sortie des diffrentes fonctions.
On dclare une variable globale grce au mot cl global. Par exemple pour dclarer la
variable numex globale on crit global numex. Attention, la dclaration global numex
doit tre reprise dans chaque fonction utilisant numex comme variable.
== : gal (x == y)
> : strictement plus grand que (x >y)
< : strictement plus petit que (x <y)
> = : plus grand ou gal (x y)
< = : plus petit ou gal (x y)
= : diffrent de (x = y)
& : et (x & y)
| : ou (x | y)
: non ( x)
Les oprateurs de comparaison et les oprateurs logiques sont utiliss essentiellement dans
les instructions de contrle, voir le paragraphe 5.3.
Syntaxe :
for indice = borne_inf : borne_sup
squence dinstructions
end
o
indice est une variable appele lindice de la boucle ;
borne_inf et borne_sup sont deux constantes relles (appeles paramtres de la
boucle) ;
squence dinstructions est le traitement effectuer pour les valeurs dindices variant
entre borne_inf et borne_sup avec un incrment de 1. On parle du corps de la
boucle.
Interprtation :
Si borne_inf est plus petit ou gal borne_sup, le traitement squence dinstructions
est excut (borne_sup borne_inf + 1) fois, pour les valeurs de la variable indice gales
borne_inf, borne_inf + 1, , borne_sup 1, borne_sup. Si borne_inf est strictement
plus grand que borne_sup, on passe linstruction qui suit immdiatement linstruction
de fin de boucle (end).
Remarque :
Lindice de boucle ne prend pas ncessairement des valeurs entires. Dautre part il nest
pas ncessaire que lindice de la boucle apparaisse dans le corps de la boucle ; par contre il
est interdit de modifier sa valeur sil apparat. Il est possible dimbriquer des boucles mais
elles ne doivent pas se recouvrir. On peut utiliser un incrment (pas) autre que 1 (valeur
par dfaut). La syntaxe est alors borne_inf : pas : borne_sup. Le pas peut tre ngatif.
Attention a bien grer la borne suprieure ! Voici un exemple (idiot) venant illustrer les
possibilits de variations de lindice de la boucle
>> n = 4;
>> nfac = 1;
>> for k = 1:n
nfac = nfac*k;
end
>> nfac
nfac =
24
>>
Syntaxe :
while expression logique
squence dinstructions
end
o
expression logique est une expression dont le rsultat peut tre vrai ou faux ;
squence dinstructions est le traitement effectuer tant que expression logique est
vraie.
Interprtation :
Tant que expression logique est vraie le traitement squence dinstructions est excut sous
forme dune boucle. Lorsque expression logique devient faux, on passe linstruction qui
suit immdiatement linstruction de fin de boucle (end).
Remarque :
expression logique est en gnral le rsultat dun test (par exemple i < Imax) ou le r-
sultat dune fonction logique (par exemple all(x)). Il est impratif que le traitement de
la squence dinstructions agisse sur le rsultat de expression logique sans quoi on boucle
indfiniment (-:.
>> n = 4;
>> k = 1; nfac = 1;
squence dinstructions
end
o
expression logique est une expression dont le rsultat peut tre vrai ou faux ;
squence dinstructions est le traitement effectuer si expression logique est vraie.
Interprtation :
la squence dinstructions nest excute que si le rsultat de lvaluation de lexpression
logique est vraie (cest--dire vaut 1). Dans le cas contraire on excute linstruction qui
suit le mot cl end. Dans le cas o lexpression logique est vraie, aprs excution de la
squence dinstructions on reprend le programme linstruction qui suit le mot cl end.
Remarque :
Contrairement certains langages de programmation, il ny a pas de mot cl then dans
cette instruction conditionne. Notez galement que la marque de fin de bloc conditionn
est le mot cl end et non pas endif .
squence dinstructions 1
else
squence dinstructions 2
3
Le lecteur attentif sait calculer n! plus simplement . . .Comme par exemple en excutant prod([1 :n])
Interprtation :
Si expression logique est vraie la squence dinstructions 1 est excute, sinon cest la
squence dinstructions 2 qui est excute. Le droulement du programme reprend ensuite
la premire instruction suivant le mot cl end.
Il est bien entendu possible dimbriquer des squences dinstructions conditionnes (au
sens o la squence dinstruction conditionne contient des squences dinstructions condi-
tionne). Pour une meilleure lisibilit, il est recommand dutiliser des indentations afin de
mettre en vidence limbrication des squences dinstructions conditionnes.
squence dinstructions 1
squence dinstructions 2
..
.
squence dinstructions N
else
end
Interprtation :
Si expression logique 1 est vraie la squence dinstructions 1 est excute et le programme
reprend ensuite la premire instruction suivant le mot cl end, sinon si expression logique
2 est vraie la squence dinstructions 2 est excute et le programme reprend ensuite la
premire instruction suivant le mot cl end, etc. Si aucune des expressions logiques 1 N
nest vraie alors squence dinstructions par dfaut est excute.
Remarque :
Attention ne pas laisser despace entre else et if ; le mot cl est elseif.
if numex == 1
A = ones(n);
elseif numex == 2
A = magic(n);
elseif numex == 3 | numex == 4
A = rand(n);
else
error(numero dexemple non prevu ...);
end
Syntaxe :
switch var
case cst_1 ,
squence dinstructions 1
case cst_2 ,
squence dinstructions 2
..
.
case cst_N ,
squence dinstructions N
otherwise
end
o
var est une variable numrique ou une variable chane de caractres ;
cst_1, . . ., cst_N, sont des constantes numrique ou des constantes chane de carac-
tres ;
squence dinstructions i est la squence dinstructions excuter si var==cst_i.
Interprtation :
Si la variable var est gale lune des constantes cst_1, . . ., cst_N, (par exemple cst_i)
alors la squence dinstructions correspondante (ici squence dinstructions i) est excute.
Le programme reprend ensuite la premire instruction suivant le mot-cl end. Si la
Remarque :
La variable var doit bien entendu tre du mme type que les constantes cst_1, . . ., cst_N.
Il nest pas ncessaire de prvoir un cas par dfaut (bien que cela soit prfrable). Sil ny
a pas de cas par dfaut et si la variable var nest gale aucune des constantes cst_1, . . .,
cst_N, alors le programme continue la premire instruction suivant le mot-cl end.
Si la squence dinstructions excuter est la mme pour diffrents cas il est possible de
les regrouper. La syntaxe est alors,
case { cst_k , cst_l , ...}
switch numex
case 1,
A = ones(n)
case 2,
A = magic(n);
case {3,4},
A = rand(n);
otherwise
error(numero dexemple non prevu ...);
end
Voici un exemple de choix ventil portant sur une variable de type chane de caractres.
switch rep
case {oui,o},
disp(bravo ...);
case {non,n}
disp(perdu ...);
case chepas
disp(cest pourtant facile ...);
end
if nargin == 2
A = fix(T*rand(m));
else
A = fix(T*rand(m,n));
end
if nargout == 2
rang = rank(A);
if nargin == 2,
rangx = m;
else
>> A = matale(3);
??? Error using ==> matale
La fonction matale doit avoir 2 ou 3 arguments dentree
>> A = matale(20,3)
A =
8 18 8
12 14 18
15 3 18
>> [A,r] = matale(20,3)
Notons l(x) le numro de la ligne et c(x) le numro de la colonne du carr sur lequel se
trouve lentier x. Partant dun carr dordre impair n = 2k + 1, la technique de Moscho-
poulos peut se formuler comme suit :
l(1) = k + 2;
c(1) = k + 1.
- Connaissant la position (l(x), c(x)) de lentier x, on place lentier x + 1 suivant les rgles
suivantes :
Dans ces rgles pour la prise du modulo, le systme de rsidus que lon considre est
1, 2, . . . , n et non pas 0, 1, . . . , n 1.
function M = magik(n)
%
% Calcule le carre magique dordre n selon la methode
% de Moschopoulous.
%
% Entree:
% n : ordre du carre (entier impair)
% Sortie:
% M : le carre magique
%
if rem(n,2) == 0,
msg = [la methode de Moschopoulous ne construit que des carres ...
, dordre impair];
error(msg)
end
k = (n-1)/2;
l(1) = k+2;
c(1) = k+1;
M(l(1),c(1)) = 1;
for x = 2:n.^2
[l(x),c(x)] = pos(x-1,l(x-1),c(x-1),n);
M(l(x),c(x)) = x;
% ou plus simplement M(pos(x,l(x-1),c(x-1))) = x;
end
if rem(x,n) == 0
ly = modulo(2+lx,n);
cy = modulo(cx,n);
else
ly = modulo(1+lx,n);
cy = modulo(1+cx,n);
end
>> magik(4)
??? Error using ==> magik
la methode de Moschopoulous ne construit que des carres dordre impair
>> magik(5)
ans =
11 24 7 20 3
4 12 25 8 16
17 5 13 21 9
10 18 1 14 22
23 6 19 2 15
>> sum(magik(5),1)
ans =
65 65 65 65 65
>> sum(magik(5),2)
ans =
65
65
65
65
65
>> magic(5)
Illustrons par des exemples les trois faons dutiliser la commande fplot. On obtient
le graphe de la fonction incorpore sinus entre 2 et 2 par linstruction :
fplot(sin,[-2*pi 2*pi]).
Pour tracer le graphe de la fonction h(x) = x sin(x) entre 2 et 2, on peut dfinir la
fonction utilisateur h dans le fichier h.m de la manire suivante4 :
function y=h(x)
y=x.*sin(x);
Il est possible de tracer plusieurs fonctions sur la mme figure. Il faut pour cela utiliser
la commande fplot de la manire suivante :
fplot([nom_f1 , nom_f2 , nom_f3], [x_min , x_max]) o nomf_f1, nom_f2,
nom_f3 est soit le nom dune fonction matlab incorpore, soit une expression dfinissant
une fonction de la variable x, soit le nom dune fonction utilisateur.
Il est galement possible de grer les bornes des valeurs en ordonnes. Pour limiter le
graphe aux ordonnes comprises entre les valeurs y_min et y_max on passera comme second
argument de la commande fplot le tableau [x_min , x_max , y_min , y_max ].
5
6 4 2 0 2 4 6
On comprend trs vite lintrt de grer les bornes des valeurs en ordonnes si lon
excute la commande fplot(cos(x)/x, [-5, 5]) pour tracer le graphe de la fonction
cos(x)/x entre 5 et 5. La figure, qui nest pas vraiment esthtique, nest pas reproduite
ici (-:.
Voici par exemple une autre faon de tracer le graphe de la fonction h(x) = x sin(x)
entre 2 et 2,
Essayez aussi
0.8
0.6
sin(x)/x
0.4
0.2
0
cos(x)/x
0.2
0.4
0.6
0.8
1
5 4 3 2 1 0 1 2 3 4 5
On peut spcifier matlab quelle doit tre la couleur dune courbe, quel doit tre le
style de trait et/ou quel doit tre le symbole chaque point (xi , yi ). Pour cela on donne
un troisime paramtre dentre la commande plot qui est une chane de 3 caractres de
la forme cst avec c dsignant la couleur du trait, s le symbole du point et t le style de
trait. Les possibilits sont les suivantes :
y jaune . point - trait plein
m magenta o cercle pointill court
:
c cyan x marque x pointill long
r rouge + plus -. pointill mixte
g vert * toile
b bleu s carr
w blanc d losange
k noir v triangle (bas)
triangle (haut)
< triangle (gauche)
> triangle (droit)
p pentagone
h hexagone
Il est possible de tracer plusieurs courbes sur la mme figure en spcifiant plusieurs
tableaux x1, y1, x2, y2, , comme paramtres de la commande plot. Si lon souhaite
que les courbes aient une apparence diffrente, on utilisera des options de couleurs et/ou
de styles de traits distincts aprs chaque couple de vecteurs x, y.
Voici un exemple dont le rsultat est affich la figure 7. On trace sur lintervalle [5, 5]
la fonction x2 cos x en trait plein bleu et la fonction x cos x en trait pointill rouge.
>> x = [-5:0.01:5];
>> y = x.^2.*cos(x); z = x.*cos(x);
>> plot(x,y,b-,x,z,r:);
>>
10
12
5 4 3 2 1 0 1 2 3 4 5
>> N=200;
>> x = rand(1,N); y = rand(1,N);
>> plot(x,y,bd), whitebg
>>
6
La commande whitebg permet de passer la fentre graphique en inverse vido
9
10
8
10
7
10
6
10
5
10
4
10
3
10
2
10
1
10
0
10
0 1 2 3
10 10 10 10
Il est possible avec ces commandes dafficher une valeur contenue dans une variable
au milieu de texte. Pour cela on construit un tableau de type chane de caractres en
convertissant la valeur contenue dans la variable en une chane de caractres grce la
commande num2str. Par exemple, supposons que la variable numex contienne le numro
de lexemple trait, disons 5. On obtiendra pour titre de la figure Exemple numero 5 par
linstruction : title([Exemple numero , num2str(numex)]).
Lexemple suivant dont le rsultat est affich la figure 9 illustre lutilisation des
diffrentes commandes permettant de lgender une figure.
>> P = 5;
>> t = [0:.01:2];
>> c = 12*exp(-2*t) - 8*exp(-6*t);
>> plot(t,c); grid
>> xlabel(temps en minutes)
>> ylabel(concentation en gramme par litre)
>> title([evolution de la concentration du produit , num2str(P), ...
au cours du temps ])
>> gtext(concentration maximale)
>>
>> e = exp(1);
>> figure
>> hold on
>> fplot(exp,[-1 1])
>> fplot(log,[1/e e])
>> plot([-1:0.01:e],[-1:0.01:e])
>> grid
>> hold off
>>
5
concentation en gramme par litre
0
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
temps en minutes
On dispose donc de deux faons de superposer plusieurs courbes sur une mme figure.
On peut soit donner plusieurs couples de vecteurs abscisses/ordonnes comme argument
de la commande plot, soit avoir recours la commande hold on. Suivant le contexte on
privilgiera lune de ces solutions plutt que lautre.
Il est possible de dcomposer une fentre en sous-fentres et dafficher une figure diff-
rente sur chacune de ces sous-fentres grce la commande subplot. La syntaxe est
subplot(m,n,i)
o
m est le nombre de sous-fentres verticalement ;
n est le nombre de sous-fentres horizontalement ;
i sert spcifier dans quelle sous-fentre doit seffectuer laffichage. Les fentres sont
numrotes de gauche droite et de haut en bas.
Lexemple suivant dont le rsultat apparat la figure 11 illustre lutilisation de la
commande subplot.
>> figure
>> subplot(2,3,1), fplot(cos,[0 4*pi]), title(cosinus), grid
>> subplot(2,3,2), fplot(sin,[0 4*pi]), title(sinus), grid
>> subplot(2,3,3), fplot(tan,[-pi/3 pi/3]), title(tangente), grid
>> subplot(2,3,4), fplot(acos,[-1 1]), title(arc-cosinus), grid
>> subplot(2,3,5), fplot(asin,[-1 1]), title(arc-sinus), grid
2.5
y = exp(x)
1.5
y=x
0.5
0.5 y = log(x)
1
0.5 1 1.5 2 2.5
0.5 0.5 1
0 0 0
0.5 0.5 1
1 1 2
0 5 10 0 5 10 1 0 1
3 1
1
2.5
0.5
2
0 0
1.5
0.5
1
1
0.5 1
0 2 1.5
1 0 1 1 0 1 1 0 1
6.4 Graphisme 3D
6.4.1 Tracer les lignes de niveau dune fonction de 2 variables
La commande contour permet de tracer les lignes de niveau dune fonction de 2 va-
riables relles. Cette fonction peut tre dfinie par une expression matlab (par exemple
x.*exp(-x.2-y.2)), ou tre dfinie comme une fonction utilisateur. Pour tracer les lignes
de niveau de la fonction g(x, y) pour x [xmin , xmax ] et y [ymin , ymax ] on procde de la
manire suivante :
cration dun maillage, de maille de longueur h, du domaine [xmin , xmax ][ymin , ymax ]
grce la commande meshgrid,
[X,Y] = meshgrid(x_min :h :x_max, y_min :h :y_max).
valuation de la fonction aux nuds de ce maillage, soit par appel la fonction
utilisateur dfinissant la fonction,
Z = g(X,Y)
soit directement en dfinissant la fonction par une expression matlab.
Affichage des lignes de niveau grce la commande contour,
contour(X,Y,Z).
2 2
Ainsi pour tracer les lignes de niveau de la fonction (x, y) 7 xe(x +y ) sur le domaine
[2, 2] [2, 2] en prenant un maillage de maille de longueur h = 0.2, on excute :
function x3 = g(x1,x2)
x3 = x1.*exp(-x1.^2-x2.^2);
et excuter
1.5
0.5
0.5
1.5
2
2 1.5 1 0.5 0 0.5 1 1.5 2
Il existe deux manires dafficher les valeurs des lignes de niveau sur la figure. Si lon
souhaite afficher les valeurs pour toutes les lignes de niveau, on utilise la commande clabel
de la manire suivante :
Si lon souhaite afficher uniquement les valeurs de quelques lignes de niveau, on utilise la
commande clabel de la manire suivante :
>> [C,h] = contour(X,Y,Z,n)
>> clabel(C,h,manual)
On peut alors grce la souris slectionner les lignes de niveau pour lesquelles on
souhaite afficher la valeur.
Ainsi pour tracer 30 lignes de niveau de la fonction (x, y) 7 (x 1)2 + 10 (x2 y)2
sur le domaine [1, 1] [1, 1] et pour choisir laide de la souris les lignes de niveau pour
lesquelles lisovaleur doit tre affiche, on excute :
8.5161
0.8 7.0968
4.25 581
81 4.2
0.6
0.4
2.8
0.2
38
7
1.419
0
4
0.2
4.2
0.4 58
1
0.6
21
9
12
.29
.6
15
03
0.8
35
7
67
.48
.9
26
39
1
1 0.8 0.6 0.4 0.2 0 0.2 0.4 0.6 0.8 1
0.8
0.6
0.4
0.2
0.2
0.4
0.6
0.8
1
1 0.8 0.6 0.4 0.2 0 0.2 0.4 0.6 0.8 1
Si la fonction est dfinie comme une fonction utilisateur dans le fichier g.m,
function x3 = g(x1,x2)
x3 = x1.*exp(-x1.^2-x2.^2);
on excute :
Par dfaut les valeurs extrmes en z sont dtermines automatiquement partir des
extremums de la fonction sur le domaine spcifi. Il est possible de modifier ces valeurs (et
galement les valeurs extrmes en abscisses et ordonnes) par la commande axis dont la
syntaxe est axis(x_min x_max y_min y_max z_min z_max). Si vous ntes pas satisfait
du rsultat, linstruction axis auto restaure la figure originale. La figure 16 montre par
exemple le rsultat de linstruction axis([ -2 2 -2 2 -2 2]).
0.5
2
1 2
1
0
0
1
1
2 2
Les commandes meshc et meshz sutilisent de la mme manire que la commande mesh.
La commande meshc permet dafficher des lignes de niveau sous la surface dans le plan
z = zmin . La commande meshz permet de tracer une boite sous la surface. Un exemple
dutilisation de ces commandes est prsent la figure 18.
1.5
0.5
0.5
1.5
2
2
0 2
1.5
1
0.5
1 0
0.5
1
2 1.5
2
0.5
2
0.5
2 1
1
0
0
1
1
2 2
0.5
2
1 2
1
0
0
1
1
2 2
0.5
0.5
2
1 2
1
0
0
1
1
2 2
La fonction G = (g1 , g2 , g3 ) peut tre dfinie directement par une expression matlab ou
tre dfinie comme une fonction utilisateur. Pour tracer la surface paramtre dquation
(E) pour u [umin , umax ] et v [vmin , vmax ] on procde de la manire suivante :
cration dun maillage de maille de longueur h du domaine de paramtrisation
[umin , umax ] [vmin , vmax ] grce la commande meshgrid,
[U,V] = meshgrid(u_min :h :u_max, v_min :h :v_max).
valuation de la fonction aux nuds de ce maillage, soit par appel la fonction
utilisateur dfinissant la fonction
[X,Y,Z] = G(U,V)
soit directement en dfinissant la fonction par dune expression matlab.
Affichage de la surface grce la commande surf,
surf(X,Y,Z).
Ainsi pour tracer la surface paramtre dquations
x = v cos u,
y = v sin u,
z = 2u.
sur le domaine [0, 2] [0, 2] avec un maillage de maillage de longueur h = 0.2, on excute :
Si la fonction est dfinie comme une fonction utilisateur dans le fichier G.m,
x1 = v.*cos(u);
x2 = v.*sin(u);
x3 = 2*u;
on excute :
12
10
0
2
1 2
1
0
0
1
1
2 2
76
ischar, 13 partie imaginaire, 29
isempty, 15 partie relle, 29
islogical, 13 pause, 52
isreal, 13 pi, 28
plot, 58
j, 14, 28 plus grand commun diviseur, 29
plus petit multiple commun, 29
lcm, 28
poly, 33, 35
length, 16
polynme, 34
lignes de niveau, 65
polynme caractristique, 33
linspace, 18
polyval, 34
load, 9
print, 64
log, 29
prod, 31
log10, 29
produit scalaire, 30
logarithme, 29
produit vectoriel, 30
loglog, 61
lookfor, 11 qr, 34
lu, 34 quit, 7
M-file, 41 racine carre, 29
mthode de Choleski, 33 racines dun polynme, 34
mthode de gradient conjugu, 34 rand, 18, 21
mthode QR, 34 rang, 33
magic, 21 rank, 33
matrice creuse, 24 real, 14, 29
matrice par blocs, 20 realmax, 28
matrice tridiagonale, 23 realmin, 28
max, 31 rem, 28
mean, 31 return, 51
mesh, 69 roots, 34
meshc, 70 round, 29
meshgrid, 65, 69, 73
meshz, 70 sauvegarder une session, 9
message derreur, 12, 51 save, 9
message de mise en garde, 51 script, 41
min, 31 sign, 29
mod, 41 sin, 30
modle ddition, 37 sinh, 30
module, 29 size, 19
sort, 31
NaN, 28 sous-fonction, 42
nargin, 43 sparse, 25
nargout, 43 spdiags, 27
nnz, 24 speye, 27
norm, 33 sprand, 27
norme, 33 sprintf, 37, 39
num2str, 37, 62 spy, 24
sqrt, 29
ones, 18, 21
strcmp, 16
palette des couleurs, 67 subplot, 63
tan, 30
tanh, 30
text, 62
title, 61
trace, 33
trace, 33
transpose, 24
tril, 23
triu, 23
type, 12
valeur absolue, 29
valeurs propres, 33
variables globales, 44
variables locales, 44
vecteur, 16
vecteurs propres, 33
view, 69
warning, 51
while, 46
whitebg, 60
who, 8
whos, 8
workspace, 8
xlabel, 61
ylabel, 61
zeros, 18, 21