Polycioie Intro Matlab
Polycioie Intro Matlab
Polycioie Intro Matlab
Prrequis:
Savoir naviguer sur Internet, dans les dossiers grs par le systme d'exploitation Windows. Les tudiants
devront se munir d'une disquette personnelle.
Objectifs:
- acqurir un certain "vocabulaire"
- acqurir une certaine "grammaire"
- acqurir une "mthodologie" dans la conception des programmes
2
21. Reshape et find.................................................................................................................. 25
5.2.3. Instructions conditionnelles if................................................................................................... 25
22. Fonction avec if et is*....................................................................................................... 25
5.2.4. Boucles for................................................................................................................................ 26
23. Boucle conditionnelle, break ............................................................................................ 26
24. Tic et toc ........................................................................................................................... 26
5.2.5. Boucles while............................................................................................................................ 26
25. Boucle tant que ................................................................................................................. 26
5.2.6. return......................................................................................................................................... 26
5.2.7. Switch, case, otherwise............................................................................................................. 26
26. Switch................................................................................................................................ 26
27. Boucles implicites ............................................................................................................. 27
5.3. TYPES DE DONNEES (DATA TYPES)..................................................................................................... 27
5.3.1. Types numriques......................................................................................................................... 27
5.3.2. Type logique ............................................................................................................................. 27
5.3.3. Caractres et chanes................................................................................................................. 28
5.3.4. Structures .................................................................................................................................. 28
5.3.5. Cellules ..................................................................................................................................... 28
28. Fonctions signenombre et signematrice ........................................................................... 29
29. Ecrire une fonction dont l'en-tte est : ............................................................................. 29
30. Fonction estentier ............................................................................................................. 29
31. Types numriques ............................................................................................................. 29
32. Type logique...................................................................................................................... 29
33. Type caractres et chanes de caractres......................................................................... 29
34. Types structures et cellules............................................................................................... 30
6. CONSEILS DANS LA PROGRAMMATION..................................................................................... 30
6.1. CONVENTIONS D'ECRITURE ................................................................................................................ 30
6.2. FICHIERS, ORGANISATION, AMELIORATION DES PERFORMANCES ....................................................... 31
7. GRAPHIQUES 3D.................................................................................................................................. 32
7.1. COURBES EN 3D ................................................................................................................................ 32
7.2. SURFACES .......................................................................................................................................... 32
7.2.1. Gnration des points (meshgrid) ............................................................................................. 32
7.2.2. Trac de la surface .................................................................................................................... 34
7.2.3. Courbes de contour ................................................................................................................... 34
7.2.4. Contrle de l'angle de vue......................................................................................................... 34
35. Trac d'une surface en 3D ................................................................................................ 34
8. ECHANGES ENTRE MATLAB ET L'EXTERIEUR........................................................................ 35
8.1. SAUVEGARDE DE DONNEES ................................................................................................................ 35
8.2. IMPORTER DES TABLEAUX ................................................................................................................. 35
8.3. INCLURE DES COURBES MATLAB DANS UN DOCUMENT ................................................................... 35
9. CALCUL NUMERIQUE AVEC MATLAB ........................................................................................ 35
9.1. RECHERCHE DES ZEROS D'UNE FONCTION .......................................................................................... 36
9.2. INTERPOLATION ................................................................................................................................. 37
9.3. APPROXIMATION (ESTIMATION DE PARAMETRES OU "FITTING" OU "AJUSTEMENT") .......................... 37
9.3.1. Linaire ..................................................................................................................................... 38
36. Simulation d'une exponentielle dcroissante bruite ....................................................... 39
3
MATLAB (MATrix LABoratory) comprend de nombreuses fonctions graphiques, un systme puissant
d'oprateurs s'appliquant des matrices, des algorithmes numriques, ainsi qu'un langage de programmation
extrmement simple utiliser. L'aspect modulaire est l'un des plus grands atouts de MATLAB : l'utilisateur
peut lui-mme dfinir ses propres fonctions, en regroupant des instructions MATLAB dans un fichier portant
le suffixe ".m". La syntaxe est bien plus abordable que dans les langages classiques et devrait liminer les
rticences habituelles des programmeurs dbutants pour crire des fonctions. En termes de vitesse
d'excution, les performances sont infrieures celles obtenues avec un langage de programmation classique.
L'emploi de MATLAB devrait donc tre restreinte des problmes peu gourmands en temps calcul, mais
dans la plupart des cas, il prsente une solution lgante et rapide mettre en oeuvre.
4
1.5. Fichiers de commandes (scripts)
1.5.1. Principe gnral
Le principe est simple : regrouper dans un fichier une srie de commandes MATLAB et les excuter en bloc.
Tout se passera comme si vous les tapiez au fur et mesure dans une session MATLAB. Il est fortement
conseill de procder comme ceci. Cela permet notamment de rcuprer facilement votre travail de la veille.
Les fichiers de commandes peuvent porter un nom quelconque, mais doivent finir par l'extension ".m".
Pour crer un fichier de commandes, taper des commandes MATLAB l'intrieur de l'diteur intgr, sauver
par exemple sous le nom "toto.m", puis sous MATLAB, tapez :
>> toto
Toutes les commandes du fichier seront excutes en bloc.
5
2. Input et format
Ecrire un script qui invite l'utilisateur entrer un nombre, l'affiche en format court simple puis court avec
puissance de 10. Indices : input, format. La prcision dans un calcul avec chacun de ces nombres est-elle
affecte?
3. Addpath (ajoute un chemin)
Ecrire un programme simple et le sauver dans un rpertoire qui ne soit pas le rpertoire courant. Tenter de
l'excuter en l'appelant de la fentre de commandes. Utiliser la commande addpath pour rendre l'appel
effectif.
3. Matrices et tableaux
En dpit du titre de cette section, MATLAB ne fait pas de diffrence entre les deux. Le concept de tableau est
important car il est la base du graphique : typiquement pour une courbe de n points, on dfinira un tableau
de n abscisses et un tableau de n ordonnes. Mais on peut aussi dfinir des tableaux rectangulaires deux
indices pour dfinir des matrices au sens mathmatique du terme, puis effectuer des oprations sur ces
matrices.
8
3.3. Extraction de sous-tableaux
Il est souvent utile d'extraire des blocs d'un tableau existant. Pour cela on utilise le caractre ":". Il faut
spcifier pour chaque indice la valeur de dbut et la valeur de fin. La syntaxe gnrale est donc la suivante
(pour un tableau deux indices) :
tableau(dbut : fin, dbut : fin)
2 3
Ainsi pour extraire le bloc 12 13
on tapera :
>> M(1:2,2:3)
ans =
2 3
12 13
On utilise le caractre ":" seul pour prendre tous les indices possibles. Exemple :
>> M(1:2,:)
ans =
1 2 3
11 12 13
C'est bien pratique pour extraire des lignes ou des colonnes d'une matrice. Par exemple pour obtenir la
deuxime ligne de M :
>> M(2,:)
ans =
11 12 13
Cette syntaxe est trs utilise pour allonger des vecteurs ou des matrices, par exemple si je veux ajouter une
colonne M, constitue par V :
>> M=[M V]
M=
1 2 3 11
1 12 13 12
21 32 23 13
9
Si je veux lui ajouter une ligne, constitue par U :
>> M = [M;U]
M=
1 2 3
11 12 13
21 32 23
1 2 3
6. Matrice et extraction
Ecrire un script qui dfinisse la matrice M suivante et affiche la dernire ligne:
1 2 3 4 5
9 10 11 12 13
-1 -2 -3 -4 -5
10
et maintenant la multiplication terme terme :
>> [1 0; 0 1] .* [1 2; 3 4]
ans =
10
04
3.5.4. Transposition
L'oprateur transposition est le caractre ' (prime) et est souvent utilis pour transformer des vecteurs lignes
en vecteurs colonnes et inversement.
12
9. Rsolution d'un systme d'quations
Soit le systme de 5 quations 5 inconnues :
1=x+2y+3z+4u+5v
2=x+2y+3z+4u+v
3=x+2y+3z+u+v
4=-x-2y+3z+4u+v
5=x+y+z+u+v
Ecrire le script rsolvant ce systme
10. Gnration rapide de matrices
Soit a=ones(2,3). Est-il possible de calculer a-1, a+a, 2*a, a*a, a.*a ? Analyser les rsultats.
11. Gnration rapide de vecteurs
En une ligne de commande, crer le vecteur colonne ayant comme valeurs (sans les crire explicitement) :
[10-60;10-59; ...; 1059; 1060]
indice : logspace
12. Manipulation de matrices
Crer la matrice suivante en utilisant la commande reshape :
1 11 21 31 41 51 61 71 81 91
2 12 22 32 42 52 62 72 82 92
3 13 23 33 43 53 63 73 83 93
4 14 24 34 44 54 64 74 84 94
5 15 25 35 45 55 65 75 85 95
6 16 26 36 46 56 66 76 86 96
7 17 27 37 47 57 67 77 87 97
8 18 28 38 48 58 68 78 88 98
9 19 29 39 49 59 69 79 89 99
10 20 30 40 50 60 70 80 90 100
13
4. Graphique 2D
Une courbe 2D est reprsent par une srie d'abscisses et une srie d'ordonnes. Le logiciel trace
gnralement des droites entre ces points. La fonction de MATLAB s'appelle plot.
14
4.1.2. Superposer plusieurs courbes
Il suffit de spcifier autant de couples (abscisses, ordonnes) qu'il y a de courbes tracer. Par exemple pour
superposer sin et cos :
>> plot(x, cos(x),x, sin(x))
Les deux courbes tant en ralit dans des couleurs diffrentes. Cette mthode fonctionne mme si les
abscisses des deux courbes ne sont pas les mmes.
15
Specifier Marker Type
+ plus sign
o circle
* asterisk
. point
x cross
s square
d diamond
^ upward pointing triangle
v downward pointing triangle
> right pointing triangle
< left pointing triangle
p five-pointed star (pentagram)
h six-pointed star (hexagram)
Lorsque l'on utilise seulement un style de points, MATLAB ne trace plus de droites entre les points
successifs, mais seulement les points eux-mme. Ceci peut tre pratique par exemple pour prsenter des
rsultats exprimentaux.
Les codes peuvent tre combins entre eux. Par exemple :
>> plot(x,sin(x),':',x,cos(x),'r-.')
4.2.2. Labels
Il s'agit d'afficher quelque chose sous les abscisses et cot de l'axe des ordonnes :
>> plot(x,cos(x))
>> xlabel('Abscisse')
>> ylabel('Ordonne')
4.2.3. Lgendes
Utilisation de l'instruction legend. Il faut lui communiquer autant de chanes de caractres que de courbes
traces l'cran. Un cadre est alors trac sur le graphique, qui affiche en face du style de chaque courbe, le
texte correspondant. Par exemple :
>> plot(x,cos(x),':',x,sin(x),'-.',x,sqrt(x),'--')
>> legend('cosinus','sinus','racine')
16
4.2.4. Tracer un quadrillage
C'est l'instruction grid, qui utilis aprs une instruction plot affiche un quadrillage sur la courbe. Si on tape
nouveau grid, le quadrillage disparat.
17
4.5. Instructions graphiques diverses
4.5.1. Maintien du graphique
Par dfaut une instruction plot efface systmatiquement le graphique prcdent. Il est parfois utile de le
conserver et de venir le surcharger avec une nouvelle courbe. Pour cela on utilise la commande hold. Pour
dmarrer le mode surcharge, taper hold on, pour revenir en mode normal, hold off.
Il est conseill de ne pas abuser de cette commande.
la fonction cosinus
1
0.5
cos(5t)
-0.5
-1
0 1 2 3 4 5 6 7 8 9 10
t (s)
la fonction tangente
2
1
tan(2.5t)
-1
-2
0 1 2 3 4 5 6 7 8 9 10
t (s)
18
5. Programmation MATLAB
5.1. Fonctions
Nous avons vu un certain nombre de fonctions prdfinies. Il est possible de dfinir ses propres fonctions. La
premire mthode permet de dfinir des fonctions simples sur une ligne de commande. La seconde, beaucoup
plus gnrale permet de dfinir des fonctions trs volues en la dfinissant dans un fichier.
>> sincos(0:pi/3:pi)
ans =
0 0.3424 1.9132 3.1416
On peut donc noncer la rgle suivante :
Lorsque l'on dfinit une fonction, il est prfrable d'utiliser systmatiquement les oprateurs terme terme .*,
./ et .^ au lieu de * / et ^ si l'on veut que cette fonction puisse s'appliquer des tableaux.
On peut de mme dfinir des fonctions de plusieurs variables :
>> sincos = inline('sin(x)-y.*cos(x)', 'x', 'y')
sincos =
Inline function:
sincos(x,y) = sin(x)-y.*cos(x)
L'ordre des variables (affich l'cran) est celui dans lequel elles apparaissent dans la dfinition de la
fonction. Essayer :
>> sincos(1,2)
19
5.1.2. Fonctions dfinies dans un fichier
Dans les mathmatiques on crit souvent les fonctions sous la forme :
y = f(x) ou z = g(x, y) ou ....
Nous verrons que c'est la mme chose sous MATLAB. Les noms de fonctions doivent tre plus explicites
que f ou g. Par exemple une fonction renvoyant le carr d'un argument x pourra tre nomme carre (on vite
les accents):
y = carre(x)
Dans le fichier dfinissant la fonction, cette syntaxe est aussi prcde du mot cl function :
Forme gnrale d'une fonction dans un fichier nomfonction.m :
Commenons par reprendre l'exemple prcdent (sincos). L'ordre des oprations est le suivant :
1. Editer un nouveau fichier appel sincos.m
2. Taper les lignes suivantes :
function s = sincos(x)
% sincos calcule sin(x)-x.*cos(x)
s = sin(x)-x.*cos(x);
3. Sauvegarder
Le rsultat est le mme que prcdemment :
>> sincos(pi/12)
ans =
0.0059
On remarquera plusieurs choses :
- l'utilisation de .* pour que la fonction soit applicable des tableaux.
- la variable s n'est l que pour spcifier la sortie de la fonction.
- l'emploi de ; la fin de la ligne de calcul, sans quoi MATLAB afficherait deux fois le rsultat de la
fonction.
Donc encore une rgle :
Lorsque l'on dfinit une fonction dans un fichier, il est prfrable de mettre un ; la fin de chaque commande
constituant la fonction. Attention cependant ne pas en mettre sur la premire ligne.
Un autre point important : le nom du fichier doit porter l'extension .m et le nom du fichier sans suffixe doit
tre exactement le nom de la fonction (apparaissant aprs le mot-cl function)
En ce qui concerne l'endroit de l'arborescence o le fichier doit tre plac, la rgle est la mme que pour les
scripts.
Voyons maintenant comment dfinir une fonction comportant plusieurs sorties. On veut raliser une fonction
appele cart2pol qui convertit des coordonnes cartsiennes (x; y) (entres de la fonction) en coordonnes
polaires (r; fi) (sorties de la fonction). Voil le contenu du fichier cart2pol.m :
On remarque que les deux variables de sortie sont mises entre crochets, et spares par une virgule.
Pour utiliser cette fonction, on crira par exemple :
>> [module,phase] = cart2pol(1,1)
module =
1.4142
phase =
0.7854
On affecte donc simultanment deux variables module et phase avec les deux sorties de la fonction, en
mettant ces deux variables dans des crochets, et spars par une virgule.
Il est possible de ne rcuprer que la premire sortie de la fonction. MATLAB utilise souvent ce principe
pour dfinir des fonctions ayant une sortie principale et des sorties optionnelles.
Ainsi, pour notre fonction, si une seule variable de sortie est spcifie, seule la valeur du rayon polaire est
renvoye. Si la fonction est appele sans variable de sortie, c'est ans qui prend la valeur du rayon polaire :
>> cart2pol(1,1)
ans =
1.4142
14. Crer une fonction: vec2col
Ecrire la fonction vec2col.m qui transforme tout vecteur (ligne ou colonne) pass en argument en vecteur
colonne. Un traitement d'erreur (fonction error) testera que la variable passe la fonction est bien un
vecteur et non une matrice (utiliser size et l'instruction conditionnelle if dcrite plus bas).
15. Equations du 1ier et du second degr
Complter les 2 fonctions dont les 2 premires lignes sont respectivement :
function x=equ1(a,b)
% resout a*x+b=0
et
function x=equ2(a,b,c)
% resout a*x^2+b*x+c=0
qui rsolvent les quations du premier et du second degr. Utiliser la fonction nargin pour que l'appel
equ2(a,b, c) soit valide. Vrifier que les solutions sont correctes.
16. Nargin, nargout
Chercher avec l'aide la syntaxe et l'utilisation de ces commandes. Les appliquer equa1 et equa2.
Imaginons maintenant que vous criviez un fichier de commande, et une fonction (dans deux fichiers
diffrents bien sr), le fichier de commande se servant de la fonction. Si vous voulez passer une valeur A du
21
fichier de commandes la fonction, vous devez normalement passer par une entre de la fonction.
Cependant, on aimerait bien parfois que la variable A du fichier de commandes soit utilisable directement par
la fonction.
Pour cela on utilise la directive global. Prenons un exemple : vous disposez d'une relation donnant le Cp d'un
gaz en fonction de la temprature T :
Cp(T) = AT3 + BT2 + CT + D
et vous voulez en faire une fonction. On pourrait faire une fonction 5 entres, pour T, A, B, C, D, mais il est
plus naturel que cette fonction ait seulement T comme entre.
Comment passer A,B,C,D qui sont des constantes ? Rponse : on dclare ces variables en global tant dans le
fichier de commandes que dans la fonction, et on les affecte dans le fichier de commandes.
Fichier de commandes :
global A B C D
A = 9.9400e-8;
B = -4.02e-4;
C = 0.616;
D = -28.3;
T = 300:100:1000; % Temprature en Kelvins
plot(T, cp(T)) % On trace le CP en fonction de T
La fonction :
function y = cp(T)
global A B C D
y = A*T.^3 + B*T.^2 +C*T + D;
Operator Description
Operator Description
< Less than
& AND
<= Less than or equal to
> Greater than | OR
== Equal to
~= Not equal to
On peut se demander ce qui se passe quand on applique un oprateur de comparaison entre deux tableaux, ou
entre un tableau et un scalaire. L'oprateur est appliqu terme terme. Ainsi :
>> A=[1 4 ; 3 2]
A=
14
32
>> A> 2
ans =
01
10
Les termes de A suprieur 2 donnent 1 (vrai), les autres 0 (faux).
23
Une application importante des oprateurs logiques concerne le traitement automatique des grandes matrices.
Crons une matrice (2X5, petite pour l'exemple):
>> A=[10, 12, 8, 11, 9; 10, 10, 128, 11, 9];
A=
10 12 8 11 9
10 10 128 11 9
L'lment 128 s'carte fortement de toutes les autres. Il peut s'agir par exemple d'un point aberrant apparu
lors d'une mesure exprimentale et on dsire remplacer les valeurs suprieure 20 par la valeur 10. Pour une
petite matrice telle que A, cela est facilement ralisable, il suffit de taper: A(2, 3)=10; Mais cette mthode est
irraliste si on a faire avec une matrice 1000X1000 ! Utilisons plutt:
>> A(A>20)=10;
Et le tour est jou:
A=
10 12 8 11 9
10 10 10 11 9
On peut aussi construire des fonctions par morceaux. Imaginons que l'on veuille dfinir la fonction suivante :
f(x) = sin(x) si x > 0 sinon f(x) = sin(2x)
Voil comment crire la fonction:
>> f = inline('sin(x).*(x>0) + sin(2*x).*(~(x>0))', 'x')
f=
Inline function:
f(x) = sin(x).*(x>0) + sin(2*x).*(~(x>0))
On ajoute les deux expressions sin x et sin 2x en les pondrant par la condition logique dfinissant leurs
domaines de validit. Simple mais efficace ! Reprsentons la fonction ainsi dfinie :
>> x=-2*pi:2*pi/100:2*pi;
>> plot(x,f(x))
donne la courbe suivante gauche:
1
0.8
0.6
0.4
0.2
-0.2
-0.4
Fonction carre
gnre partir d'un sinus et
-0.6 d'un
oprateur logique
-0.8
-1
0 2 4 6 8 10 12 14 16
24
Sachant que "FAUX" et 0 sont identiques dans MATLAB, cela permet de trouver tous les indices d'un
tableau respectant un critre logique donn :
>> x = [ -1.2, 0, 3.1, 6.2, -3.3, -2.1]
x=
-1.2000 0 3.1000 6.2000 -3.3000 -2.1000
>> inds = find (x < 0)
inds =
1 5 6
On peut ensuite facilement extraire le sous-tableau ne contenant que les lments ngatifs de x en crivant
simplement :
>> y = x(inds)
y=
-1.2000 -3.3000 -2.1000
Retenez bien cet exemple. Ce type de squence s'avre trs utile dans la pratique car ici encore, il conomise
un test (if). Notons enfin que la commande find s'applique aussi aux tableaux 2D.
21. Reshape et find
Expliquer prcisment ce que fait la commande suivante :
>>a=reshape(fix((rand(1,400)-0.5)*100),20,20);
Trouver tous les lments de valeur gale 7.
Transformer la matrice a en un vecteur colonne b, trier b par ordre croissant. Combien d'lments ont pour
valeur 7?
Indices : find, sort.
ATTENTION : moins d'ajouter un commentaire explicite, ce genre d'expression est proscrire car il rend
la comprhension du code difficile.
25
5.2.4. Boucles for
for variable = valeur dbut: pas: valeur fin
instructions
end
Exemple:
for i = 1:m
for j = 1:n
H(i,j) = 1/(i+j);
end
end
23. Boucle conditionnelle, break
Combien de fois cette boucle est-elle value ? Quelles sont les valeurs de i affiches l'cran ?
for i=12:-2:1;
disp(i)
if i==8
break
end
end
5.2.6. return
Un retour la fonction appelante ou la fentre de commande, est provoqu lorsque MATLAB rencontre la
commande return.
switch couleur
26
case 'rouge'
chaine='La couleur choisie est : rouge';
case 'vert'
chaine='La couleur choisie est : vert';
case 'bleu'
chaine='La couleur choisie est : bleu';
otherwise
chaine='Couleur inconnue';
end
disp(chaine)
27. Boucles implicites
Ecrire explicitement le vecteur u dfini par des boucles implicites :
u(1:2:10)= (1:2:10).^2;
u(2:2:10)= (2:2:10).^3;
Expliquer les rsultats.
Les nombres virgules flottantes double-prcision (cods sur 64 bits) sont les nombres utiliss par
dfaut par MATLAB. En simple-prcision, ils sont cods sur 32 bits.
inf = infini et NaN = Not a Number sont 2 valeurs spciales utiles, reprsentant par exemple 1/0 et
0/0 (ou encore inf/inf) respectivement.
5.3.4. Structures
Les structures (bases de donnes) sont des tableaux avec des "conteneurs de donnes" appels "champs". Les
champs peuvent tre de n'importe quel type. Par exemple, un champ peut contenir une chane de caractre
reprsentant un nom, un autre contenir un nombre reprsentant l'ge, un troisime une matrice de notes, ...
Exemple :
etudiant.nom = 'Jean Durand';
etudiant.age = 21;
etudiant.notes = [12; 13; 10; 14; 14];
etudiant est une structure 3 champs ne comportant pour l'instant qu'un seul lment. Ajoutons en un second:
Les structures sont particulirement utiles pour passer en une seule variable un grand nombre de paramtres.
5.3.5. Cellules
Un tableau de cellules permet de stocker des donnes de type diffrents. La figure ci-dessous montre un
tableau A (2 X 3) de cellules contenant: un tableau d'entiers non signs (cell 1,1), un tableau de caractres
(cell 1,2), un tableau de nombres complexes (cell 1,3), un tableau de nombres virgules flottantes (cell 2,1),
un tableau d'entiers signs (cell 2,2), et un autre tableau de cellules (cell 2,3).
28
Pour accder aux donnes d'un tableau de cellules, utiliser la mme mthode d'indexation que pour les autres
matrices MATLAB avec des accolades { } la place des parenthses ( ). Par exemple A{1, 3} donne le
contenu de la cellule place sur la premire ligne, la troisime colonne, ici le tableau de nombre complexes.
Pour crer la cellule (1, 3), on peut crire:
A(1, 3)={0.25+3i, 8-16i; 34+5i, 7+0.92i}; ou
A{1, 3}=[0.25+3i, 8-16i; 34+5i, 7+0.92i];
29
Transformer chligne en entiers correspondant aux codes ASCII de ses caractres : asc=uint8(chligne).
1/ Ecrire une fonction enAlea=abaleatoire(a, b) qui renvoie un entier alatoire compris entre a et b.
Cette fonction servira dterminer de faon alatoire
- la longueur de chanes de caractres reprsentant les noms et les prnoms d'une liste de personnes fictives,
cette longueur devra tre comprise entre 5 et 12
- l'ge qui devra tre compris entre 16 et 21
2/ Ecrire une fonction chAlea=chainealeatoire(n) qui renvoie une chane de caractres alatoires de
longueur n. Les codes ASCII des lettres a, b, c, ...,z s'tendent de 97 122. Les noms et prnoms des
tudiants seront gnrs par cette fonction.
3/ Ecrire une fonction noAlea=notesaleatoires qui renvoie une matrice alatoire (5X1) de nombre compris
entre 0 et 20 et dfinis une dcimale prs.
4/ Ecrire la fonction principale (principale dans le sens o elle utilise les fonctions prcdentes)
etStruct=generationetudiant(n) qui gnre la structure etudiant comportant n lments (donc n tudiants).
* La longueur d'un nom est li la porte de la variable. Des variables entires comme i, j, k, n, ... ou relles
comme x, y, u, ... ont une porte de quelques lignes de code.
* Les noms de fonctions devraient tre intgralement en minuscules avec ventuellement des "underscores":
calcule_moyenne(.)
triangule(.)
extraitcolonne(.)
* Une fonction interagit avec les programmes partir de ses entres, de ses sorties et des variables globales. Les
structures permettent d'viter de longues listes de variables d'entre/sortie.
* Vectoriser les boucles, c'est dire les convertir en oprations sur des vecteurs ou des matrices. L'exemple suivant
calcule le sinus de 1001 valeurs comprises entre 0 et 10:
i = 0;
for t = 0:.01:10
i = i + 1;
y(i) = sin(t);
end
La version vectorise du mme programme est:
t = 0:0.01:10;
y = sin(t);
Comparer le temps d'excution avec tic et toc.
* Pr-allouer de l'espace mmoire pour les matrices. Dans les boucles for ou while qui augmente la taille
d'une structure chaque boucle, MATLAB perd du temps chaque fois rechercher des blocs contigus de
mmoire de plus en plus grands. La rapidit du programme sera amlior si la matrice est initialise ds le
dbut sa taille maximale. Voici une version dispendieuse en temps d'excution:
x = 0;
for k = 2:1000
x(k) = x(k-1) + 5;
end
Changer la premire ligne en allouant un bloc de mmoire de 1 X 1000 pour x initialis zro produit un
srieux gain de temps machine:
x = zeros(1, 1000);
for k = 2:1000
x(k) = x(k-1) + 5;
end
31
7. Graphiques 3D
7.1. Courbes en 3D
Une courbe en 2D est dfinie par une liste de doublets (x; y) et une courbe en 3D par une liste de triplets (x;
y; z). Puisque l'instruction plot attendait deux arguments, un pour les x, un pour les y, l'instruction plot3 en
attend trois : les x, les y et les z.
Voici un exemple de courbe paramtre :
>> t=-10:0.1:10;
>> plot3(exp(-t/10).*sin(t), exp(-t/10).*cos(t), exp(-t))
>> grid
7.2. Surfaces
7.2.1. Gnration des points (meshgrid)
Pour dfinir une surface, il faut un ensemble de triplets (x; y; z). En gnral les points (x; y) tracent dans le
plan un maillage rgulier mais ce n'est pas une obligation. La seule contrainte est que le nombre de points
soit le produit de deux entiers mn (on comprendra pourquoi trs bientt).
Si on a en tout mn points, cela signifie que l'on a mn valeurs de x, mn valeurs de y et mn valeurs de z. Il
apparat donc que abscisses, ordonnes et cotes des points de la surface peuvent tre stockes dans des
tableaux de taille mn.
Toutes les instructions de trac du surface, par exemple surf auront donc la syntaxe suivante:
surf ( tableau d'abscisses, tableau d'ordonnes, tableau de cotes)
x L x 1n y L y1n z L z1n
11 11 11
x 21 M x 2n y 21 M y 2n z 21 M z 2n
M M M M M M M M M
x m1 L x mn y m1 L y mn z m1 L z mn
Il reste maintenant construire ces tableaux. Prenons l'exemple de la surface dfinie par z = x2 + y2 dont on
veut tracer la surface reprsentative sur [-1; 1] [-2; 2].
Pour dfinir un quadrillage de ce rectangle, il faut d'abord dfinir une suite de valeurs x1; ... ; xm pour x et une
suite de valeurs y1; ... ; yn pour y, par exemple :
>> x = -1:0.2:1
32
x=
Columns 1 through 7
-1.0000 -0.8000 -0.6000 -0.4000 -0.2000 0 0.2000
Columns 8 through 11
0.4000 0.6000 0.8000 1.0000
>> y = -2:0.2:2
y=
Columns 1 through 7
-2.0000 -1.8000 -1.6000 -1.4000 -1.2000 -1.0000 -0.8000
Columns 8 through 14
-0.6000 -0.4000 -0.2000 0.2000 0.4000 0.6000
Columns 15 through 21
0.8000 1.0000 1.2000 1.4000 1.6000 1.8000 2.0000
En combinant toutes ces valeurs de x et y, on obtient mn points dans le plan (x; y). Il faut maintenant
construire deux tableaux, l'un contenant les 1121 abscisses de ces points l'autre les 1121 ordonnes, soit:
1 0.8 L 1 2 2 L 2
1 0.8 L 1 1.8 1.8 L 1.8
X = Y =
M M M M M M M M
1 0.8 L 1 2 2 L 2
Ainsi, si on considre par exemple la premire colonne de ces matrices, on obtient tous les couples (x, y)
pour x=-1: (-1, -2), (-1, -1.8), (-1, -1.6), (-1, -1.4), ..., (-1, 1.8) et (-1, 2). Les autres colonnes couvrent le reste
de la portion du plan xy. Ci-dessous, le maillage correspondant:
2
1.8
1.6
1.4
1.2
1
0.8
0.6
0.4
0.2
Y 0
-0.2
-0.4
-0.6
-0.8
-1
-1.2
-1.4
-1.6
-1.8
-2
-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1
33
Rassurez-vous pas besoin de boucles, la fonction meshgrid se charge de gnrer ces 2 matrices:
>> [X,Y] = meshgrid(x, y);
Il reste maintenant calculer les z = f(x, y) correspondants. C'est l que les calculs terme terme sur les
matrices montrent encore leur efficacit : on applique directement la formule aux tableaux X et Y, sans
oublier de mettre un point devant les oprateurs *, / et ^
>> Z = X .^2 + Y.^2;
Notons enfin qu'il existe des fonctions de conversion entre les coordonnes cartsiennes, cylindriques et
sphriques, permettant de tracer facilement des courbes dfinies dans l'un de ces systmes de coordonnes.
On regardera par exemple la documentation de cart2pol.
34
8. Echanges entre MATLAB et l'extrieur
8.1. Sauvegarde de donnes
Commandes save et load. La premire permet d'crire toute ou une partie des variables dans un fichier
binaire dont l'extension est ".mat". La seconde permet de recharger les variables contenues dans le fichier.
Syntaxe :
save nom fichier var1 var2 var3
Les variables sont simplement spares par des blancs. Si aucune variable n'est spcifie, toutes les variables
sont sauvegardes dans nom_fichier.mat. La syntaxe de load est identique. Les donnes sont dans un format
binaire.
Noter que des options de ces commandes permettent de sauver et de charger des fichiers de donnes dans le
format ASCII (format texte ==> voir l'aide).
35
9.1. Recherche des zros d'une fonction
Problme : On cherche x0 tel que f(x0) = 0.
La fonction fzero permet de rsoudre ce problme. Il faut fournir d'une part la fonction f elle-mme, et
d'autre part une estimation (valeur initiale) de x0. L'efficacit de l'algorithme est comme toujours dpendante
de la valeur initiale choisie. La fonction f peut-tre dfinie par une directive inline ou bien crite dans une
fichier.
Par exemple on cherche le zro de :
f(x) = cos(x) - x
Une approche graphique permet souvent de trouver une estimation de x0. La figure suivante montre ainsi que
les fonctions x x et x cos(x) se coupent en un point sur [-; ]. Une valeur raisonnable pour l'estimation
de x0 est par exemple 0.
36
La bonne solution est d'utiliser la directive global vue pcdemment. La fonction f s'crira donc :
function y = f(x)
global m
y = x-cos(m*x);
et on cherchera son zro en crivant :
>> global m
>> m = 1;
>> fzero(f,0)
Notons enfin que l'on aura tout intrt mettre les trois lignes ci-dessus dans un fichier de commandes, et
lancer ce fichier de commandes en bloc.
9.2. Interpolation
Le problme : connaissant des points tabuls (xi; yi), construire une fonction polynomiale passant par ces
points. En termes plus simples, c'est ce que fait la fonction plot quand elle "relie" les points que vous lui
donnez : elle fait passer un polynme de degr 1 entre deux points conscutifs.
La fonction interp1 rsout le problme. Il suffit de lui donner les valeurs tabules ainsi qu'une srie
d'abscisses o l'on souhaite connatre les ordonnes interpoles. Sur chaque intervalle on peut interpoler par
un polynme de degr 0 (option 'nearest'), de degr 1, qui est le comportement par dfaut (option 'linear') ou
de degr 3 (option 'cubic').
Les lignes suivantes fournissent un exemple gnrique: partir de 8 points (xi, yi), on cherche une
interpolation f(x) entre ces 8 points.
clear; close all;
xi = [-1 -1/2 0 1/2 1 2 3 4];
yi = [1.5 1 10 1 1/2 10 -10 0];
x = -2:0.1:5;
ycubic = interp1 (xi, yi, x, 'cubic');
plot(xi,yi,'ok', x,ycubic,'-k')
La figure suivante illustre l'interpolation (en traits pleins) cubiques
obtenues par interp1 sur ces 8 points (illustrs par des cercles).
37
9.3.1. Linaire
Illustrons la mthode par un exemple: on cherche ajuster des points exprimentaux (xi; yi) par une fonction
de la forme :
a2 a
y = f (x) = a 1 + + 32
x x
Ou encore de faon plus gnrale, la forme suivante : y = a1 f1(x) + a2 f2(x) + ... +am fm(x).
Les 5 points exprimentaux sont donns par : xi = [0.25 1/2 1 2 3] et yi = [18 7 4 2 1.1].
On a donc un systme de 5 quations 3 inconnues (le systme est dit "surcontraint", c'est dire qu'il y a
plus d'quations que d'inconnues) :
1 1 1
x x2
y 1 1
1 1
x x2
y a
2 1 1 1
y =
1
x x2 a2
3
y4 1 1 a3
1
x
x2
y5
1 1 1
x x2
de la forme Y = F A. On trouve la matrice des paramtres par inversion : F-1 Y = A qui s'crit sous
MATLAB par F \ Y = A.
La squence d'instructions est la suivante :
>> xi = [1/4 1/2 1 2 3]; xi = xi'; % on dfinit les abscisses et ordonnes
>> yi = [18 7 4 2 1.1]; yi = yi'; % en colonnes
>> F = [ones(size(xi)) 1./xi 1./(xi.^2)];
>> A = F \ yi
>> x = 1/4:1/16:3; % On trace la courbe obtenue
>> plot(xi,yi,'o', x, A(1) + A(2)./x + A(3)./(x.^2))
Ce programme trace la courbe ajuste ainsi que les points exprimentaux :
38
Cette mthode marche ds que la fonction cherche dpend linairement des coefficients inconnus (le cas
oppos dpasse le cadre d'une simple introduction). Cela fonctionne en particulier pour faire de
l'approximation polynomiale, mais dans ce cas on peut utiliser directement la fonction polyfit, qui en plus
des coefficients du polynme renvoie des informations sur la qualit de l'approximation ralise. La fonction
polyfit attend en entre simplement les xi, les yi et l'ordre du polynme recherch. La fonction polyval peut -
tre utilise pour recalculer le polynme d'approximation en tout point.
L'exemple suivant calcule deux polynmes d'approximation, un d'ordre 3, l'autre d'ordre 4 et trace le rsultat.
>> xi = [-2 -1.5 -1 0 1 1.5 2];
>> yi = [3.5 2 1.5 0 1.3 2.5 3.9];
>> A4 = polyfit (xi, yi, 4)
>> A3 = polyfit (xi, yi, 3)
>> x = -2:0.1:2;
>> plot(xi, yi, 'o', x, polyval(A4,x), x, polyval(A3,x), '--' )
A4 =
-0.0652 0.0313 1.1411 -0.0022 0.1473
A3 =
0.0313 0.8570 -0.0022 0.3247
39
c/ Appliquer la fonction bruit s (Une valeur sig = 0.1*max(s) parat raisonnable et signifie qu'on commet
une erreur accidentelle de 10% du calibre (=max(s)) sur les mesures), comparer dans le mme graphe les 2
courbes s et bruit(s, 0.1*max(s)). Ci-dessous une partie de la figure qu'on peut obtenir.
40