Cours de Matlab

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 29

A.

TIMESLI MATLAB

Initiation MatLab

1
A.TIMESLI MATLAB

1. Gnralits
MAT (matrix) LAB (laboratory) est un logiciel puissant dot la fois d'un langage de
programmation haut niveau et d'outils ddis au calcul numrique et la visualisation numrique.
Dvelopp en C par la socit Mathworks, Matlab tait initialement destin faire simplement du
calcul matriciel.
Matlab est un outil puissant qui permet la rsolution de nombreux problmes en beaucoup moins
de temps qu'il n'en faudrait pour les formuler en C ou en Pascal. Il est aussi un outil de rfrence pour
la simulation numrique, notamment en ce qui concerne lAutomatique, Mcanique, Electronique
etc .
Il offre des possibilits avances que ce soit en matire didentification ou de commande.
Il permet, de manire plus gnrale, de rsoudre une grande diversit de problmes de simulation,
dans des domaines aussi varis que le traitement du signal, les statistiques ou la vision, pour ne citer
que quelques exemples.
Avec MatLab les calculs sont numriques (une variable doit avoir une valeur) et bass sur la
manipulation de scalaires, de vecteurs et de matrices.
Le logiciel MatLab est en mme temps un langage de programmation et un environnement
permettant d'utiliser ce langage.
Ce langage fut dvelopp dans les annes 70 pour des applications impliquant des matrices,
l'algbre linaire et l'analyse numrique. Le mot "MatLab" est en fait la forme courte de "Matrix
Laboratory".
Comme ce langage existe et est utilis depuis longtemps, de nombreuses bibliothques d'outils et
de fonctions en rapport avec des applications bien spcifiques ont t dveloppes et testes. Ainsi,
Simulink est la bote d'outil pour le traitement du signal.
Matlab se divise en deux parties :
le noyau Matlab, qui comprend :
l'environnement de travail offrant plusieurs facilits pour la manipulation des donnes. Son
interprteur permet de tester rapidement ses propres programmes Matlab.
le systme graphique Matlab (interfaces homme-machine, graphiques, images, animations).
le langage de programmation Matlab.
une librairie de fonctions mathmatiques Matlab.
un systme d'interfaage facilitant l'excution de programmes C ou Fortran sous Matlab.
une collection de toolboxes (botes outils) regroupant un ensemble de fonctions spcifiques un
thme.
C'est un langage interprt, c'est--dire que les instructions sont excutes immdiatement aprs avoir
t introduites. Il n'est pas ncessaire de compiler un programme avant de l'excuter et toute
commande introduite dans la fentre de commande est immdiatement excute. C'est dans cette
fentre que l'on peut crire les instructions Matlab ( la suite des chevrons >>).
La rponse est affiche et stocke dans la variable ans (answer en anglais est la rponse).
La plupart des fonctions mathmatiques usuelles sont dfinies dans Matlab, et ceci sous une forme
naturelle (sin, cos, exp, ...). de mme que certaines constantes (pi ...).
>> 2*sin(pi/4) ans = 1.4142

1.1. Comment lancer MatLab?


MATLAB est beaucoup plus qu'un langage de programmation. Il s'agit d'une console d'excution
(shell ) au mme titre que les consoles DOS ou UNIX.
Comme toutes les consoles, MATLAB permet d'excuter des fonctions, d'attribuer des valeurs des
variables, etc. Plus spcifiquement, la console MATLAB permet d'effectuer des oprations
mathmatiques, de manipuler des matrices, de tracer facilement des graphiques.
Interface graphique du MatLab

2
A.TIMESLI MATLAB

1.2. Oprations directement faites sur linvite MatLab


Lutilisateur peut affecter des valeurs des variables et effectuer des oprations sur ces variables. Par
exemple :
>> x = 2
x= 2
>> y = 3
y= 3
>> x + y
ans = 5
>> x * y
ans = 6
Ici, il faut noter que lorsque l'utilisateur ne fixe pas de variable de sortie, MATLAB place le rsultat
d'une opration dans ans. Il est toujours possible de connatre les variables utilises et leur type
l'aide de la fonction whos. Par exemple, pour les manipulations prcdentes :
>> whos
Name Size Bytes Class
ans 1x1 8 double array
x 1x1 8 double array
y 1x1 8 double array

1.3. Variables
On peut indiquer le nom de la variable dans laquelle le rsultat doit tre stock (commence par
une lettre, moins de 19 caractres).
>> x = pi/4 x = 0.7854
Le nom de cette variable ainsi que le rsultat sont affichs. Un point virgule la fin de la ligne permet
de ne pas afficher ce rsultat. On peut taper plusieurs commandes par ligne, spares par un point
virgule.
>> x = pi/2; y = sin(x);
Il existe un certain nombre de variables prdfinies : pi inf i realmin realmax eps ans
>> eps ans = 2.2204e-16
>> realmax ans = 1.7977e+308
>> realmin ans = 2.2251e-308

1.4. Variables complexes


Matlab travaille indiffremment avec des nombres rels et complexes. Par dfaut les variables i et
j sont initialises la valeur complexe.

3
A.TIMESLI MATLAB

Naturellement si vous redfinissez la variable i ou j avec une autre valeur elle n'aura plus la mme
signification.
>> z = 3 + 2*i z = 3.0000 + 2.0000i
Les fonctions usuelles de manipulation des nombres complexes sont prdfinies dans Matlab : real,
imag, abs, angle (en radian), conj.
>> r = abs(z);
>> theta = angle(z);
>> y = r*exp(i*theta);

1.5. Scalaires, Vecteurs, matrices et leur manipulation


Llment de base de MATLAB est la matrice. C'est--dire qu'un scalaire est une matrice de
dimension 1x1, un vecteur colonne de dimension n est une matrice nx1, un vecteur ligne de dimension
n, une matrice 1xn. Contrairement aux langages de programmation usuels (i.e. C++), il n'est pas
obligatoire de dclarer les variables avant de les utiliser et, de ce fait, il faut prendre toutes les
prcautions dans la manipulation de ces objets.
Les scalaires se dclarent directement, par exemple :
>> x = 0;
>> a = x;
Les vectrices lignes se dclarent de la manire suivante :
>> V_ligne = [0 1 2]
V_ligne = 0 1 2

Pour les vecteurs colonne, on spare les lments par des points-virgules :
>> V_colonne = [0;1;2]
V_colonne = 0
1
2
Il est possible de transposer un vecteur l'aide de la fonction transpose ou avec l'apostrophe ('). Ainsi,
>> V_colonne = transpose(V_ligne)
V_colonne = 0
1
2
>> V_colonne = V_ligne'
V_colonne = 0
1
2
On peut spcifier directement une matrice sous la forme d'un tableau, l'espace ou la virgule spare
deux lments d'une mme ligne, les points virgules sparent les lments de lignes distinctes.
123
>> A = [1, 2, 3 ; 4, 5, 6 ; 7, 8, 9] A = 4 5 6
789
Les lments d'une matrice peuvent tre n'importe quelle expression de Matlab :
>> x = [ -1.3, sqrt(3), (1+2+3)*4/5 ] x = -1.3000 1.7321 4.8000
Les lments d'une matrice peuvent tre rfrencs par leurs indices :
>>x(2) ans = 1.7321
>>x(5) = abs(x(1)) x = -1.3000 1.7321 4.8000 0.0000 1.3000
On peut remarquer que la taille du vecteur x a t ajuste en remplissant les lments non prciss par
0.
On peut aussi crer des matrices avec les fonctions zeros, ones et eye, ces fonctions crent des
matrices de la taille prcise, respectivement remplies de zros , de un, et de un sur la diagonale et des
zros ailleurs (eye = prononciation anglaise de I comme identit).
>> eye(2,3) ans = 1 0 0
4
A.TIMESLI MATLAB

010
>> ones(1,5) ans = 1 1 1 1 1
On peut avoir des informations sur la taille d'une matrice :
>> size(x) ans = 1 5 Il sagit dune matrice 1x5 (1 ligne et 5 colonnes)
>> length(x) ans = 5 Cest en faite sup(nb de lignes,nb de colonnes)
Concatnation
On peut ajouter des lignes et des colonnes des matrices dj existantes.
>> r1 = [10, 11, 12];
1 2 3
>> A = [A ; r1] A = 4 5 6
7 8 9
10 11 12
>> r2 = zeros(4,1);
1 2 3 0
>> A = [A, r2] A = 4 5 6 0
7 8 9 0
10 11 12 0
Transformations de Matrice
On peut avoir le transpos ou le transpos conjugu d'une matrice :
>> A' % Transpose conjugue de A
>> A.' % Transpose de A
mais aussi des retournements horizontaux (flipud : Up/Down), verticaux (fliplr : Left/Right), ou des
rotations de matrices :
7 8 9
>> A = [1, 2, 3 ; 4, 5, 6 ; 7, 8, 9] ; flipud(A) % Retournement vertical de A 4 5 6
1 2 3
3 2 1
>> fliplr(A) % Retournement horizontal de A 6 5 4
9 8 7
3 6 9
>> rot90(A) % Rotation de A de 90 degrs 2 5 8
1 4 7
On peut galement remettre en forme des matrices et vecteurs sur un nombre de lignes et de colonnes
donns ( condition que le nombre total d'lments corresponde) :
>> B = [ 1 2 3 4 5 6 ];
>> B = reshape(B,2,3) % Remise en forme avec 2 lignes et 3 colonnes B = 1 3 5
2 4 6
L'oprateur " : "
L'oprateur " : ", sous Matlab, peut tre considr comme l'oprateur d'incrmentation. Sa syntaxe
usuelle est : deb:pas:fin. Il construit un vecteur dont le premier lment est deb puis deb+pas,
deb+2*pas... jusqu' deb+n*pas tel que deb+n*pas < fin < deb+(n+1)*pas.
>> x = 0.5:0.1:0.85 x = 0.5000 0.6000 0.7000 0.8000
Le pas d'incrmentation peut tre omis, 1 est alors pris par dfaut :
>> x =1:5 x = 1 2 3 4 5
On peut aussi utiliser le " : " pour slectionner des lments d'une matrice :
>> A(1,3) % Troisime lment de la premire ligne de A
>> A(1,1:3) % Premier, deuxime et troisime lments de % la premire ligne de A
>> A(:,3) % Tous les lments de la troisime colonne
>> A(:) % Vecteur colonne contenant tous les lments lus colonne par colonne.
>> A = [ 1, 2, 3 ; 4, 5, 6 ; 7, 8, 9 ];
>> A( [3, 2, 1],[1, 3]) ans = 7 9
4 6
5
A.TIMESLI MATLAB

1 3
nous donnera les premiers et troisimes lments des lignes 3, 2 et 1 de A.
Mais il faut cependant remarquer que:
>> A([ 1, 0, 3 ],:) ans = 1 2 3
789
nous donne les lignes de A dont lindice est non nul (c'est--dire ici la 1re et la 3ime ligne).

1.6. Chanes de caractres


Comme on l'a vu prcdemment, toute variable de Matlab est une matrice. Cependant, il peut tre
utile de conserver des chanes de caractres dans des variables, et cela se fait de faon tout fait
naturelle. On peut alors raliser des manipulations de mme type que pour les vecteurs
Affectation
>> ch = bonjour monsieur ;
>> size(ch) ans = 1 16
Cancatenation
>> ch1 = Flane ;
>> ch2 = [ch ch1] ch2 = bonjour monsieur flane
>> n=size(ch,2)-size(ch1,2);
>> ch3 = [ch1 blanks(n)];
>> ch4 = [ch ; ch3] ou ch4 = strvcat(ch,ch1) bonjour monsieur
flane
>> size(ch4) ans =2 17
Conversions
On peut convertir des nombres en chane de caractres l'aide des fonctions
num2str : nombre chane
str2num : chane nombre
double ou abs : chane codes ascii
char ou setstr : codes ascii chane
Ecriture de chanes formates
syntaxe : text=sprintf( chaine1 format1 chaine2 format2... , data1, data2 ...)
exemple :
>> pi2 = pi^2 pi2 =9.8696
>> text = sprintf( le carr de pi vaut %3.2f , pi2) text = le carr de pi vaut 9.87
On peut mme crire des caractres spciaux comme retour la ligne : \n et tabulation : \t
Comparaison de chanes
Strcmp(s1,s2) : comparaison des chanes s1 et s2
>> s1=Bonjour Monsieur
>>s2=lower(s1);
>>strcmp(s1,s2) ans = 0
Strcmpi(s1,s2) : comparaison sans tenir compte des majuscule
>>strcmpi(s1,s2) ans = 1
Strncmp(s1,s2,n) : comparaison des n premiers caractres
>> s1(1)=b s1=bonjour Monsieur
>>strncmp(s1,s2,8) ans = 1
Strmatch(str,T) : renvoie les numros de lignes qui commence par str
>>i=strmatch(min,strvcat(min, max, minim)) i= 1
3
findstr(s1,s2) : renvoie les indices de dbut de la chane la plus courte dans lautre
>> findstr (s1,on) ans 2 10
Strrep(s1,s2,s3) : remplace les occurrences de s2 dans s1 par s3
>> s=Strrep(s1,on,ON) s = bONjour MONsieur

6
A.TIMESLI MATLAB

Deux fonctions peuvent tre trs utiles lors de manipulations de chanes de caractres : eval et
feval. Si l'on possde une instruction Matlab dans une chane de caractres, la commande eval
valuera cette chane de caractres comme si elle avait t introduite la ligne de commande de
Matlab :
>> eval([ nom-var, '1 = sqrt(-1)']) x1 = 0.0000 + 1.0000i

1.7. Affichage alphanumrique


On peut afficher des chanes de caractres dans la fentre de commande :
>> message=['pi vaut ' num2str(pi)] ;disp(message) pi vaut 3.142
Les fonctions fprintf existe galement et a la mme syntaxe qu'en C.
>> fprintf('pi vaut %f\n',pi) pi vaut 3.141593
On peut aussi demander des valeurs l'utilisateur :
>>rep = input('Nombre d''itration de l''algorithme : ');
Matlab affichera la chane de caractre entre en paramtre et attendra une rponse de l'utilisateur.

2. Oprations matricielles
Les oprations usuelles sont dfinies de faon naturelle pour les matrices :
>> 2*A % Produit par un scalaire
>> A*B % Produit de deux matrices (de dimensions % cohrentes)
>> A^p % Elve la matrice carre A la puissance p
>> inv(A) % Inversion d'une matrice carre inversible (message % d'alerte ventuel)
>> A.*B % Produit lment par lment de deux matrices
Attention : A*A est diffrent de A.*A.
>> X = A\B % Donne la solution de A*X = B
>> X = B/A % Donne la solution de X*A = B
>> X = A./B % Division lments par lments
La plupart des fonctions mathmatiques n'ayant pas de signification particulire pour des matrices les
considrent comme un simple tableau de valeur, par exemple :
>> exp(A) renverra une matrice dans laquelle tous les lments seront l'exponentielle des lments
de A, de mme pour log, sqrt, round, rem (correspond au modulo), sign. Pour calculer l'exponentielle
matricielle, le logarithme matriciel ou la racine carre d'une matrice on utilisera respectivement expm,
logm et sqrtm.
Certaines fonctions de Matlab agissent indpendamment sur chaque colonnes de la matrice. C'est le
cas de la fonction max (et min) :
>> max(A) renverra un vecteur ligne dont chaque lment sera le maximum (minimum) de la
colonne correspondante. C'est aussi le cas des fonctions sum, prod et median qui donnent
respectivement les sommes, produit, et la valeur mdiane des colonnes de la matrice. Les fonctions
cumsum, cumprod et sort renvoient une matrice dont chaque colonne contient les sommes et produits
cumuls et un tri des colonnes de la matrice initiale.
D'autres fonctions sont trs utiles sur les matrices :
>> det(A) % Dterminant de A
>> trace(A) % Trace de A
>> [V, D] = eig(A) % Renvoie les vecteurs propres et les valeurs propres de A
Remarques sur les matrices creuses : Un grand nombre de fonctions Matlab s'appliquent
directement des matrices creuses (c'est--dire dont la majeure partie des lments sont nuls). On
peut crer des matrices creuses grce la fonction sparse. On ne conservera ainsi en mmoire que les
lments non nuls de la matrice, d'o le gain de place mmoire. De mme lorsqu'on utilisera ces
matrices lors de calculs, Matlab tiendra compte du fait qu'elles soient creuses pour rduire le cot de
calcul. Par exemple :
>> A = eye(2);
>> B = sparse(A) B = (1,1) 1
(2,2) 1
7
A.TIMESLI MATLAB

On voit bien ici que Matlab ne conserve dans la matrice B que les lments non nuls (ici les lments
diagonaux) de la matrice A. Ainsi, les deux instructions suivantes donneront le mme rsultat mais la
premire calculera quatre multiplications alors que la deuxime n'en calculera que deux car la matrice
B est creuse.
>> A*[ 1; 1];
>>C= B*[ 1; 1];
C est une matrice sparse, pour avoir la matrice entire on utilise la fonction full
>> D=full(C) ;
Le tableau suivant rsume les diffrents oprateurs applicables aux matrices.
Syntaxe MATLAB Ecriture mathmatique Terme gnral
A A Aij
B B Bij
A+B A+B Aij + Bij
A-B A-B Aij - Bij
A.*B Aij Bij
A./B Aij / Bij
A.^B AijBij
A.^s Aijs
A*B AB kAikBkj
-1
A/B AB
A\B A-1B
A^n An
A AT Aji

3. Affichages graphiques

3.1. Courbes deux dimensions


Pour tout logiciel de trace de courbes, une courbe 2D est reprsent par une srie d'abscisses et une
srie d'ordonnes. Ensuite, le logiciel trace gnralement des segments entre ces points. MATLAB
n'chappe pas la rgle. La fonction s'appelle plot. L'utilisation la plus simple de l'instruction plot est
la suivante :
plot ( vecteur d'abscisses, vecteur d'ordonnes )
[ x1 x2 xn ] [ y1 y2 yn ]
Les vecteurs peuvent tre ligne ou colonne, pourvu qu'ils soient tous deux de mme type.
Par exemple, si on veut tracer sin(x) sur l'intervalle [0; 2], on commence par dfinir une srie
(raisonnable, disons 100) de valeurs quidistantes sur cet intervalle :
>> x = 0: 2*pi/100 : 2*pi;
puis, comme la fonction sin peut s'appliquer
terme terme un tableau :
>> plot(x, sin(x))
qui fournit le graphe suivant dans la fentre
graphique

On voit que les axes s'adaptent automatiquement aux valeurs extrmales des abscisses et ordonnes.
On remarquera que tout ce que demande plot,
c'est un vecteur d'abscisses et un vecteur
d'ordonnes. Les abscisses peuvent donc tre une
fonction de x plutt que x lui mme. En d'autres
termes, il est donc possible de tracer des courbes
paramtres :>> plot(cos(x), sin(x))

8
A.TIMESLI MATLAB

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. Dans le cas plus frquent o les abscisses
sont les mmes, il existe un autre moyen de superposer les courbes. On a toujours le vecteur des
abscisses, commun aux deux courbes, et on a autant de vecteurs d'ordonnes qu'il y a de courbes.
Tous ces vecteurs d'ordonnes sont regroups
dans un mme tableau, chaque ligne du tableau
reprsentant un vecteur d'ordonnes :
plot ( vecteur d'abscisses, tableau d'ordonnes )
Par exemple, pour superposer sin et cos, on devra fournir plot les arguments suivants :

Le deuxime tableau se construit trs facilement avec le point-virgule


>> plot(x, [cos(x);sin(x)])
Lorsque l'on crit une expression arithmtique dans les arguments de plot, il faut utiliser
systmatiquement les oprateurs terme terme .* ./ et .^ au lieu de * / et ^
Attributs de courbes
Vous aurez remarqu que MATLAB attribue des couleurs par dfaut aux courbes. Il est possible de
modifier la couleur, le style du trait et celui des points, en spcifiant aprs chaque couple (abscisse,
ordonne) une chane de caractres pouvant contenir les codes suivants (obtenus par help plot) :
Couleurs Styles de point Style de lignes
b blue g green . point o circle - solid
r red c cyan x x-mark + plus : dotted
m magenta y yellow s square * star -. dashdot
k black d diamond p pentagram -- dashed
h hexagram <,>,v triangle (none) no line
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-.')
Dcoration des graphiques
Titre : C'est l'instruction title laquelle il faut
fournir une chane de caractres2. Le titre
apparat en haut de la fentre graphique :
>> plot(x,cos(x),x,sin(x)),
>>title('Fonctions sin et cos')

Labels : Il s'agit d'afficher le nom des axes des


abscisses et des ordonnes :
>> plot(x,cos(x)),
>>xlabel('Abscisse'), ylabel('Ordonne')

Lgendes :
C'est l'instruction legend. Il faut lui communiquer
autant de chanes de caractres que de courbes

9
A.TIMESLI MATLAB

traces l'cran. Un cadre est alors trac au


milieu du 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)

Tracer un quadrillage : C'est l'instruction grid, qui utilis aprs une instruction plot affiche un
quadrillage sur la courbe.
Afficher plusieurs graphiques (subplot)
Il sagit de dcouper la fentre graphique en
pavs de mme taille, et d'afficher un graphe
dans chaque pav. On utilise l'instruction
subplot en lui spcifiant le nombre de pavs
sur la hauteur, le nombre de pavs sur la
largeur, et le numro du pav dans lequel on
va tracer :
subplot (Nbre pavs sur hauteur, Nbre pavs
sur largeur, Numro pav)
Les pavs sont numrots dans le sens de la
lecture d'un texte de gauche droite et de haut
en bas. Une fois que l'on a tap une commande
subplot,
toutes les commandes graphiques suivantes
seront excutes dans le pav spcifi.
Exemple :
>> subplot(2,2,1), plot(x,sin(x))
>> subplot(2,2,2),plot(x,cos(x),x,sin(x),'-.')
>> subplot(2,2,3),plot(cos(x),sin(x))
>> subplot(2,2,4),plot(sin(2*x),sin(3*x))
Axes et zoom
Il y a deux manires de modifier les valeurs extrmes sur les axes, autrement dit de faire du
zooming sur les courbes. La plus simple est de la fentre graphique. Vous pouvez alors :
encadrer une zone zoomer avec le bouton de gauche de la souris
cliquer sur un point avec le bouton de gauche. Le point cliqu sera le centre du zoom, ce dernier
tant effectu avec un facteur arbitraire
cliquer sur un point avec le bouton de droite pour dzoomer
Pour faire des zooms plus prcis, utiliser la commande axis.
Instructions graphiques diverses
Par dfaut une instruction plot efface systmatiquement le graphique prcdent. Il est parfois utile
de le conserver et de venir le surcharger avec la nouvelle courbe. Pour cela on utilise la commande
hold. Pour dmarrer le mode surcharge, taper hold on, pour revenir en mode normal, hold off.
Pour effacer la fentre graphique, tapez simplement clf. Cette commande annule galement toutes
les commandes subplot et hold passes.
Saisie d'un point la souris : la commande ginput(N) permet de cliquer N points dans la fentre
graphique, et la commande renvoie deux vecteurs, l'un contenant les abscisses, l'autre les ordonnes.
Utilise sans le paramtre N, la commande tourne en boucle jusqu ce que la touche <Entre> soit
tape.

3.1. Graphique trois dimensions

10
A.TIMESLI MATLAB

3.1.1. Courbes trois dimensions


Une courbe en 3D est dfinie par une liste de
triplets (x; y; z). L'instruction correspondant plot3
attend donc trois arguments. Voici un exemple de
courbe 3d : >> plot3(exp(-t/10).*sin(t), exp(-
t/10).*cos(t), exp(-t)), grid
3.1.2. Surfaces
Gnration des points (meshgrid)
Pour dfinir une surface, il faut un ensemble de triplets (x; y; z). Le nombre de points ncessaires
pour tracer la surface est le produit de deux entiers m x n. Cela signifie que l'on a m x n valeurs de
x, m x n valeurs de y et m x n valeurs de z. Il apparat donc quabscisses, ordonnes et cotes des
points de la surface peuvent tre stocks dans des tableaux de taille m x n.
Toutes les instructions du trac de la surface, par exemple surf auront donc la syntaxe suivante :
>>surf(tableau dabscisses, tableau dordonnes, tableau de cotes)
Il reste maintenant construire ces tableaux. Prenons tout d'abord le cas de la surface dfinie par z =
x2 + y2 dont on veut tracer la surface reprsentative sur [-1,1] x [-2,2]. Pour dfinir un quadrillage
de ce rectangle, il faut dfinir une suite de valeurs x1,,xm pour x et une suite de valeurs y1,,yn
pour y. En combinant toutes ces valeurs de x et y, on obtient m x n points dans le plan (x; y). Il faut
maintenant construire deux tableaux, l'un contenant les n x m abscisses de ces points l'autre les n x
m ordonnes, soit :
x1 x2 . . . xm y1 y1 . . . y1
x y . . . y 2
1 x2 . . . x m 2 y2
. . . . . . . . . . . .
X Y
. . . . . . . . . . . .
. . . . . . . . . . . .

x 1 x2 . . . x m y n yn . . . y n

La cration de ces matrices est assure par la fonction meshgrid :


>> [X,Y] = meshgrid(x,y);
Il reste maintenant calculer les z
correspondants. 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;
Ensuite on peut utiliser toutes les fonctions de
trac de surface, par exemple mesh :
>> mesh(X,Y,Z)
Les instructions les plus courantes sont :
mesh qui trace une srie de lignes entre les points de
la surface en mode <lignes caches>
meshc qui est comme mesh mais ajoute les
courbes de niveau dans le plan (x; y)
surf qui <peint> la surface avec une couleur
fonction de la cote
surfl qui <peint> la surface comme si elle tait
claire.
surfc qui est comme mesh mais ajoute les
courbes de niveau dans le plan (x; y)
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.
Contrle de l'angle de vue

11
A.TIMESLI MATLAB

Il existe la commande view, mais le plus simple


est de fentre graphique. Cliquez avec le bouton
gauche de la souris pour faire tourner la figure.
ATTENTION : tout clic de la souris provoque un
raffichage, et si votre surface contient beaucoup
de points, elle met beaucoup de temps se
rafficher.

3.1.2. Courbes de contour


C'est la fonction contour. Elle s'utilise comme les instructions prcdentes, mais fournit un graphe
2D dans le plan (x; y).
Plusieurs paramtres optionnels peuvent tre
spcifis, notamment le nombre de courbes de
contours afficher :
>> contour(X,Y,Z, 10)

>> [c,h] = contour(peaks,-4:2:4);


clabel(c,h),

4. Environnement de travail, scripts et fonctions

4.1. Rpertoire de travail


Il est indispensable de travailler dans votre propre rpertoire et non dans le rpertoire de Matlab.
Ainsi dans votre rpertoire, vous pouvez organiser vos fichiers dans des sous rpertoires.
Pour que vos fonctions et scripts soient accessibles partir de la ligne de commande Matlab il
faut sassurer que vos rpertoires de travail soient dclars. Ceci se fait l'aide de la commande
editpath qui permet de rajouter aux chemins dj existants le chemin des rpertoires contenant vos
programmes. Sinon, il faut aussi se placer dans votre rpertoire de travail.
En fait lorsqu'on travaille souvent sous matlab avec des fichiers de fonctions et des scripts organiss
dans une arborescence sur le disque de travail, il est possible et prfrable de raliser un fichier
startup.m qui sera excut immdiatement en lanant Matlab. Dans ce fichier on peut dfinir le path
(addpath), charger d'ventuelles variables, se placer dans le rpertoire dsir

4.2. Sauvegarde et chargement de variables


Il peut tre utile, lors d'une session de travail, de sauvegarder des variables dans des fichiers du
rpertoire de travail. Cela peut tre ralis l'aide de la fonction save dont la syntaxe est :
save nom_fichier nom_variables
exemple :
>> save test.mat A, x, y
Si le nom des variables est omis, tous l'espace de travail est sauv; si l'extension du fichier est omise
elle sera automatiquement .mat, si de plus, le nom du fichier est omis, la sauvegarde se fera dans le
fichier matlab.mat.
Pour recharger des variables sauves dans un fichier, il suffit de taper :
>> load nom-fichier

12
A.TIMESLI MATLAB

Il est parfois utile de sauvegarder les commandes tapes et les rsultats obtenus lors dune sance de
travail dans un fichier. Pour cela on utilise la commande diary :
>> diary nomfichier
Pour dsactiver, taper diary off.
Importer des tableaux
MATLAB est souvent utilis comme logiciel d'exploitation de rsultats. Exemple classique : on
a un programme FORTRAN qui calcule des sries de valeurs, et on souhaite tracer une srie en
fonction de l'autre.
Le moyen le plus simple est que votre programme crive un fichier texte organis sous forme de
m colonnes, spares par des blancs, contenant chacune n lignes :
x1 y1 z1 ...
x2 y2 z2 ...
...
xn yn zn ...
Cette structure est obligatoire pour que la mthode simple expose ici fonctionne correctement. Ce
fichier doit porter une extension, qui peut tre quelconque, mais diffrente de .m ou .mat.
Admettons qu'il s'appelle toto.txt, tapez dans MATLAB :
>> load data.txt
Ce faisant, vous crez un nouveau tableau MATLAB, qui porte le nom du fichier sans extension,
soit data. Vous pouvez maintenant extraire les colonnes de ce tableau, et les mettre dans des
vecteurs, par exemple :
>> x = data(:,1); y = data(:,2); z = data(:,3)
et vous n'avez plus qu' tracer l'un de ces vecteurs en fonction d'un autre.

4.3. Fichiers SCRIPT et FUNCTION


Jusqu prsent, l'utilisation que nous avons faite de MATLAB s'apparente beaucoup celle d'une
calculatrice.
Pour des tches rptitives, il s'avre beaucoup plus pratique et judicieux dcrire de courts
programmes pour effectuer les calculs dsirs.
Il existe deux types de fichiers qui peuvent tre programms avec MATLAB : les fichiers SCRIPT
et FUNCTION.
Dans les deux cas, il faut lancer lditeur de fichier et sauvegarder le fichier avec l'extension .m.

4.3.1. Scripts
Il est parfois (souvent) souhaitable, pour ne pas avoir taper plusieurs fois une mme squence
d'instructions, de la stocker dans un fichier. Ainsi on pourra rutiliser cette squence dans une autre
session de travail. Un tel fichier est dnomm script.
Il suffit d'ouvrir un fichier avec le menu file, new, de taper la squence de commande et de
sauver le fichier avec une extension " .m " (nom-fich.m). En tapant le nom du fichier sous Matlab, la
suite d'instructions s'excute.
Les variables dfinies dans l'espace de travail sont accessibles pour le script. De mme les
variables dfinies (ou modifies) dans le script sont accessibles dans l'espace de travail.
On peut (doit) mettre des commentaires l'aide du caractre pour-cent " % ". Toute commande
situe aprs " % " n'est pas prise en compte par Matlab, jusqu' la ligne suivante. De plus Matlab ne
voit pas les espaces blancs (lorsqu'il n'y a pas d'ambigut), ce qui permet de bien indenter ses
fichiers.
Par exemple, le fichier test.m qui reprend l'exemple prcdent de la section 1.2.:
clear all
x = 2;
y = 3;
a=x+y
b=x*y
whos
A.TIMESLI MATLAB

produit la sortie suivante lorsque qu'appelle :


>> test
a=5
b=6
Name Size Bytes Class
a 1x1 8 double array
b 1x1 8 double array
x 1x1 8 double array
y 1x1 8 double array
Habituellement, on utilise les fichiers SCRIPT afin de :
{ Initialiser le systme (fonction clear)
{ Dclarer les variables
{ Effectuer les oprations algbriques
{ Appeler les fonctions
{ Tracer les figures
Il est utile ici de noter que le langage MATLAB n'est pas un langage compil (contrairement au
langage C++, par exemple). A chaque appel d'un SCRIPT (ou d'une FUNCTION), le logiciel lit et
excute les programmes ligne par ligne.
Lorsque MATLAB dtecte une erreur, le logiciel arrte et un message d'erreur ainsi que la ligne o
l'erreur est dtecte s'affichent lcran. Apprendre lire les messages d'erreur est donc important
pour "dboguer" vos programmes rapidement et efficacement.

4.3.2 Fonctions
L'ide de base d'une fonction est d'effectuer des oprations sur une ou plusieurs entres ou
arguments pour obtenir un rsultat qui sera appel sortie.

4.3.2.1 Fonctions dfinies dans un fichier


On a parfois besoin de fonctions qui ne sont pas fournies par Matlab. On peut alors crer de
telles fonctions dans un fichier spar et les appeler de la mme faon que les fonctions
prexistantes.
La premire ligne (hormis les lignes de commentaires) d'une fonction doit imprativement avoir
la syntaxe suivante :
function [ var de sorties, ...] = nom_fonction( var d'entre, ...)
Exemple de fonction :
function y = sinuscardinal(x)
z = sin(x); % Variable de stockage
y = z./x; % Rsultat de la fonction % Il faudra se mfier de la division pour x=0
Cette fonction pourra tre appele par :
>> sincpi = sinuscardinal(pi);
Exemple de fonction plusieurs variables de sortie :
function [mini, maxi] = minetmax(x)
mini = min(x); % Premire variable de sortie
maxi = max(x); % Deuxime variable de sortie
Cette fonction pourra tre appele par :
>> [miny, maxy] = minetmax(y);
Il est important de noter que les variables internes ne sont pas disponibles l'invite MATLAB.
Par exemple, la fonction suivante (avec une seule sortie, le rsultat de l'addition) :
function a = ma_fonction(x,y)
a = x + y;
b = x * y;
produit la sortie suivante :
>> a = ma_fonction(2,3)
a=
A.TIMESLI MATLAB

5
>> whos
Name Size Bytes Class
a 1x1 8 double array
Le rsultat de la multiplication n'est plus disponible. On peut cependant modifier les sorties de
la manire suivante :
function [a,b] = ma_fonction(x,y)
a = x + y;
b = x * y;
pour obtenir :
>> [a,b] = ma_fonction(4,2)
a=5
b=6
>> whos
Name Size Bytes Class
a 1x1 8 double array
b 1x1 8 double array
Habituellement, on utilise les fichiers FUNCTION afin de :
{ Programmer des oprations rptitives
{ Limiter le nombre de variables dans l'invite MATLAB
{ Diviser le programme (problme) de manire claire
Le nom de la fonction doit imprativement tre le mme que le nom du fichier dans lequel elle
est stocke (sinon Matlab ne prendra pas en compte ce nom mais uniquement celui du fichier).
Les nombres d'arguments en entre et en sortie ne sont pas fixes et peuvent tre rcuprs par
nargin et nargout. Cela nous permet donc de faire des fonctions Matlab pouvant dpendre d'un
nombre variable de paramtres.
Les variables de l'espace de travail ne sont pas accessibles la fonction sauf si elles sont entres
comme variable d'entre. De mme les variables dfinies dans une fonction ne sont pas accessibles
dans l'espace de travail.

4.3.2.2 Fonctions inline


On peut aussi dfinir une fonction dans la fentre de commande, cette fonction est dite inline,
exemple :
>> sincos = inline('sin(x)-x*cos(x)') Inline function: sincos(x) = sin(x)-x*cos(x)
On peut maintenant utiliser cette nouvelle fonction :
>> sincos(pi/12) ans =0.0059
On aura remarqu que la commande inline reconnat automatiquement que la variable est x. On peut
de mme dfinir des fonctions de plusieurs variables :
>> prodscal=inline(sqrt((a(1))^2+(a(2))^2+(a(3))^2),a)

4.4. Help / Aide en ligne


Matlab est pourvu d'une fonction d'aide trs utile : help. Ainsi si vous tapez help suivi du nom
d'un rpertoire, Matlab affiche une explication brve sur toutes les fonctions et scripts de ce
rpertoire. Enfin si vous tapez help suivi du nom d'un fichier (script ou fonction), apparat une
explication dtaille sur l'utilisation de la fonction ou du script.
De plus vous pouvez crer une aide sur les fonctions et scripts que vous crez et sur vos
rpertoires. Pour une fonction et un script, Matlab prendra comme help toutes les lignes de
commentaires placs en dbut de fichier. Pour un rpertoire, il faut crer un fichier Contents.m dans
lequel on place (en commentaires) en premire ligne l'aide gnral sur le rpertoire, ensuite les
aides sur les diffrentes fonctions et scripts contenus dans le rpertoire. Ces aides que vous crez
pour vos fonctions et scripts, peuvent videment tre intressantes pour un utilisateur ventuel, mais
peuvent aussi vous tre utiles, pour vous rappeler le but de telle fonction ou pour vous souvenir de
sa syntaxe. Exemple simple :
A.TIMESLI MATLAB

function [mini, maxi] = minetmax(x)


% [mini, maxi] = minetmax(x)
% Cette fonction renvoie les lments minimum et maximum d'un % vecteur
% Ralise le 21 octobre 2006 : M. Afifi

5. Structures de contrle
On va parler ici de tests et de boucles. Commenons par les oprateurs de comparaison et les
oprateurs logiques

5.1. Oprateurs de comparaison et logiques


Notons tout d'abord le point important suivant MATLAB reprsente la constante logique FAUX par
0 et la constante VRAI par 1. Ceci est particulirement utile par exemple pour dfinir des fonctions
par morceaux.
Le tableau suivant comporte l'essentiel de ce qu'il faut savoir sur les oprateurs logiques:
Oprateur Syntaxe Oprateur Syntaxe
gal == infrieur ou gal <=
diffrent de ~= Ngation ~
suprieur > Ou |
suprieur ou gal >= Et &
infrieur <
Il existe dautres oprateurs logiques tels que : exist, isnan, isreal, ischar , islogical
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 =1 4
32
>> A> 2 ans = 0 1
10
Les termes de A suprieur 2 donnent 1 (vrai), les autres 0 (faux). Cest trs utile pour construire
des fonctions par morceaux. Imaginons que l'on veuille dfinir la fonction suivante :
f(x) = sin x si x > 0
sin 2x sinon
>> f = inline('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.

5.2. La commande find


La commande find est utile pour extraire simplement des lments d'un tableau selon un critre
logique donn.
k = find (tableau logique) renvoie dans la variable k la liste des indices du tableau dont les lments
sont non nuls. Cela permet de trouver tous les indices d'un tableau respectant un critre logique
donn exemple:
>> 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.

5.3. Instructions conditionnelles if


La syntaxe est la suivante :
if condition logique
instructions
elseif condition logique
A.TIMESLI MATLAB

instructions
...
else
instructions
end
Notons qu'il est souvent possible d'viter les blocs de ce type en exploitant directement les
oprateurs de comparaison sur les tableaux ainsi que find.
Il existe aussi une structure des conditions multiples : switchcase dont la syntaxe est :
switch variable
case expression1
instructions 1
case expression2
instructions 2
..........
Otherwise
instructions (erreur)
end

5.4. Boucles for et while


Boucles for
for variable = valeur dbut: pas: valeur fin
instructions
end
L'originalit, par rapport dautres langages, rside dans le fait que la variable de boucle peut tre
relle. Exemple : crer le vecteur [1 2 22 24 .... 210]
>> x=[ ]; for n=0:10 x =[x, 2^n] ; end
ou directement
>> for n=0:10; x(n +1) =2^n; end
On peut viter la boucle en utilisant la notion de vecteur
>> n = 0:10;x=2.^n
Cette mthode est dite vectorisation du problme.
Boucles while
while condition logique
instructions
end
Le fonctionnement est classique.
Exemple: calculer le plus petit entier n tel que 2n soit suprieur un rel a donn.
>> max =1998; n=1;
>> while (2^n <max);n=n+1;end; n n = 11
Par vecorisation :
>>n=1:20; max(find(2.^n)<1998) +1

6. Les polynmes
Matlab est un outil trs puissant galement pour faire des oprations sur des fonctions
polynomiales. Par dfaut, Matlab utilise un vecteur pour reprsenter un polynme. Ainsi le vecteur
suivant
>> p = [2 4 8];%reprsente le polynme suivant: p = 2x2 + 4x + 8
Comment diffrencier alors un vecteur normal d'un polynme ? En fait c'est simplement par le
genre d'oprations qu'on effectuer sur la variable p. Ainsi si on fait l'opration suivante:
4 8 16
>> p'*p ans = 8 16 32
16 32 64
A.TIMESLI MATLAB

Matlab interprte p, comme un vecteur et effectue le produit de la transpose de p fois le vecteur p.


Si par contre on utilise la fonction suivante:
>> y =polyint(p) y = 0.6667 2.0000 8.0000 0
on effectue l'intgrale du polynme p, car la fonction polyfun interprte p comme un polynme. La
fonction roots est trs utilie galement pour trouver les racines d'un polynme :
>> roots(p) ans = -1.0000 + 1.7321i
-1.0000 - 1.7321i
Pour plus de dtails sur les fonctions appliques aux polynmes tapez :
>> help polyfun
roots - Find polynomial roots. polyfit - Fit polynomial to data.
poly - Convert roots to polynomial. polyder - Differentiate polynomial.
polyval - Evaluate polynomial. polyint - Integrate polynomial analytically.
polyvalm - Evaluate polynomial with matrix argument. conv - Multiply polynomials.
residue - Partial-fraction expansion (residues). deconv - Divide polynomials.

7. Calcul numrique avec MATLAB


L'objectif de ce chapitre est de prsenter brivement des routines de calcul numrique fournies dans
la version de base de MATLAB.

7.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 de x0. L'efficacit de l'algorithme est comme toujours dpendante de
la valeur estime choisie. La fonction f peut tre dfinie par une directive inline ou bien crite dans
un fichier.
Par exemple on cherche le zero 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.
On peut donc crire, en utilisant inline :
>> f = inline('x-cos(x)')
>> fzero(f,0) % Zero found in the interval: [-0.9051, 0.9051]. ans = 0.7391
On remarquera que la variable f envoye la fonction fzero est elle mme une fonction. On peut
galement crire la fonction dans un fichier f.m :
function y = f(x)
y = x-cos(x);
et ensuite on crira :
>> fzero('f',0)
Un dernier point important : comment faire lorsque la dfinition de la fonction dpend en plus d'un
paramtre ? Par exemple, on veut chercher le zro de la fonction f(x) = cos(mx) x o m est un
paramtre susceptible de varier entre deux excutions. On ne peut pas rajouter un argument la
dfinition de notre fonction f car fzero impose que f ne dpende que d'une variable. Une solution
serait d'affecter m dans le corps de la fonction mais elle est mauvaise car :
lorsque l'on veut changer la valeur de m il faut modifier la fonction,
cette fonction sera peut tre appele des dizaines voire des centaines de fois par fzero, et on
rptera chaque fois la mme instruction d'affectation de m.
La bonne solution est d'utiliser la directive globale. La fonction f s'crira donc :
function y = f(x)
global m
y = x-cos(m*x);
et on cherchera son zro en crivant :
A.TIMESLI MATLAB

>> global m
>> m = 1;
>> fzero(f,0)
Notons 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.
Si on a la toolbox optimisation, on peut dterminer plusieurs racines laide de fsolve au voisinage
des lments dun vecteur que lon donne en argument dentre. La syntaxe est : fsolve( fonc_nl ,
[x1 x2 xn]). Exemple :
>> fun = inline('sin(3*x)');
>> x = fsolve(fun,[1 4 9]) x = 1.0472 4.1888 10.4720

7.2. Recherche de minima


Fonctions une variable :
La valeur qui minimise localement une fonction dans lintervalle [xd, xf] sobtient par :
fminbnd( fonc , xd, xf). Exemple :
>> f = inline('x.^3-2*x-5');
>> xmin = fminbnd(f, 0, 2) xmin = 0.8175
Fonctions plusieurs variables :
Cest fminsearch qui permet de dterminer le vecteur minimisant localement une fonction autour
dun vecteur [x0 y0]. Exemple :
>> fs= inline('(a(1)-1)^2+(a(2)-1)^2','a')
>> a=fminsearch(fs,[0 0]) a = 1.00002111816406 1.00003894042969

7.3. Interpolation
Le problme : connaissant des points tabuls (xi; yi), construire une fonction polynomiale par
morceaux 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 1qui est le comportement par dfaut (option 'linear') ou
de degr 3 (option 'cubic').
Les lignes suivantes fournissent un exemple gnrique : partir de cinq points (xi; yi) et on cherche
une interpolation f(x) entre ces cinq points.
>> xi = [1 1/2 0 1/2 1];
>> yi = [1.5 1 0 1 1/2];
>> x = 1:0.1:1;
>> ylinear = interp1 (xi, yi, x);
>> ycubic = interp1 (xi, yi, x, 'cubic');
>> plot(xi,yi,'*', x,ylinear,'-', x,ycubic,'--')
La figure suivante illustre les interpolations linaires (en traits pleins) et cubiques (en traits
pointills) obtenues par interp1 sur ces 5 points (illustrs par des cercles).
A.TIMESLI MATLAB

7.4. Approximation (estimation de paramtres ou <fitting>)


Problme : faire passer une courbe d'quation connue au milieu d'un nuage de points de telle
sorte que la courbe soit la plus proche possible de l'ensemble des points. Comme on cherche
minimiser une distance entre deux fonctions, on parle en gnral d'approximation aux moindres
carrs ou encore de rgression.

7.4.1 Linaire
Supposons que l'on dispose de n donnes exprimentales (xi; yi) et que l'on cherche dduire
une loi y = f(x) dpendant linairement de m coefficients :

Idalement, les (xi; yi) vrifieraient cette relation, auquel cas on aurait le systme de n quations
linaires m inconnues (a1; ... am) :

soit sous forme matricielle Y = F A auquel cas on trouverait simplement les coefficients ai par
inversion :
A = F-1 Y
En MATLAB, ce genre d'instruction peut se programmer simplement l'aide de l'oprateur \ , et on
crirait alors A = F \Y;
Cela dit le nombre d'quations n'est pas gal au nombre d'inconnues dans le systme linaire ci-
dessus, il est (normalement) suprieur, et le systme est surcontraint. a ne fait rien, l'oprateur \ le
rsout alors au mieux c'est--dire qu'il trouve les ai qui minimise la somme des carrs des rsidus :

Voici un exemple : on cherche fitter des points exprimentaux (xi; yi) par une fonction de la
forme :

La squence d'instructions est la suivante :


>> xi = [1/4 1/2 1 2 3]; xi = xi';
>> 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; >> plot(xi,yi,'o', x, A(1) +
A(2)./x + A(3)./(x.^2))
Ce programme trace la courbe fitte ainsi que les
points exprimentaux :
Cette mthode marche ds que la fonction cherche dpend linairement des coefficients inconnus.
a marche en particulier pour faire de l'approximation polynomiale (les fj sont des monmes xj),
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. 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];
A.TIMESLI MATLAB

>> 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), '--' )

7.4.2. Non linaire


On cherche maintenant fitter des points exprimentaux (xi; yi) par une fonction y = f(x) dpendant
non linairement de m coefficients : y = f(a1; a2; ... am; x). Il s'agit ensuite de minimiser la distance
entre cette fonction et les points exprimentaux,

avec

La fonction F dpend non linairement des paramtres a1; a2; ... am et un algorithme
d'optimisation doit tre utilis. MATLAB possde des routines d'optimisation utiles pour ce genre
de problme notamment si on dispose de la toolbox Optimisation .
Si on na pas cette toolbox, il faut utiliser la routine de minimisation fournie dans la version
MATLAB de base qui s'appelle fminsearch. Pour cela il faut simplement programmer la fonction F
minimiser et d'crire la fonction de fitting f dans une sous fonction spare. Voici comment
procder dans l'exemple suivant : des analyses spectromtriques fournissent des pics que l'on
cherche fitter (par exemple) par des gaussiennes. Par exemple dans le cas de deux pics :

Il y a 6 paramtres B1, B2, x1, x2, 1 et 2 que nous regroupons dans un tableau a avec a(1) = B1,
a(2) = B2, a(3) = 1, a(4) = 2, a(5) = x1, a(6) = x2.
Ecrivons tout d'abord la fonction de fitting :
Function y = f (a, x)
y = a(1)*exp(- ( (x-a(5))/a(3) ).^2) + a(2)*exp(- ( (x-a(6))/a(4) ).^2)
Il est important que cette fonction puisse accepter un tableau en entre, d'o l'usage des points
devant les oprateurs puissance. Ensuite on crit la fonction F reprsentant le rsidu optimiser :
function out = F (a)
global xi yi
out = sum ( (yi - f(a,xi)).^2 );
L'usage de global pour passer les points exprimentaux xi yi est ncessaire car l'entte de la
fonction F optimiser est impose par fminsearch. Il reste appeler l'optimiseur dans un
programme principal :
% Pour passer les points exprimentaux F
global xi yi
% Dfinition des points exprimentaux (en gnral chargs depuis un fichier)
xi=[20 40 60 80 100 120 140 145 155 156 176 196 216 236 256 276 296 ...
316 336 346 356 360 380 400 420 440]
yi=[0.0025 0.0162 0.0846 0.3073 0.7528 1.4288 1.9315 1.9962 2.1083 2.0104 ...
1.6617 0.8970 0.4343 0.3466 0.5393 1.0182 1.7069 2.4561 2.9957 3.1671 3.0137 ...
2.9506 2.6111 1.9578 1.2067 0.5896]
% Estimation de la solution. Le succs de l'opration dpend de cette
A.TIMESLI MATLAB

a0=[2,3,50,70,150,350]; % correspond B1, B2 ,sigma1, sigma2, x1, x2


% Appel de l'optimiseur.
asol = fminsearch ( 'F', a0);
% Superposition points exprimentaux et fitts.
plot (xi, yi, '*', xi, f(asol, xi))

L'algorithme utilis par fminsearch est parfois insuffisant. La toolbox optimisation fourni un grand
nombre de routines d'optimisation. Pour le problme d'estimation de paramtres propos ci-dessus,
la routine ddie est lsqcurvefit (least squares curve fit>). Elle permet de ne programmer que la
fonction f et forme elle-mme la somme des carrs. Voici ce qu'il faut crire pour rsoudre le
problme prcdent :
function y = f (a, x)
y = a(1)*exp(- ( (x-a(5))/a(3) ).^2) + a(2)*exp(- ( (x-a(6))/a(4) ).^2)
C'est en fait la mme que prcdemment. Maintenant on peut appeler directement lsqcurvefit :
% Definition des points exprimentaux
xi = ...
yi = ...
% Estimation de la solution.
a0=[2,3,50,70,150,350]; % correspond B1, B2 ,sigma1, sigma2, x1, x2
% Appel de l'optimiseur. On remarque que la fonction passer est maintenant f et % plus F et
qu'on passe les points exprimentaux directement au solveur.
asol = lsqcurvefit ( 'f', a0, xi, yi);
% Superposition points exprimentaux et fitts.
plot (xi, yi, '*', xi, f(asol, xi))

7.5 Equations diffrentielles


Problme : on cherche rsoudre un systme d'quations diffrentielles ordinaires (EDO, en anglais
ODE) du premier ordre :

avec les conditions initiales y1(0) = y10 yn(0) = yn0


Rappelons au lecteur non averti que tout systme ou quation diffrentielle d'ordre suprieur peut se
ramener simplement cette forme canonique, utilise dans tous les solveurs d'EDO. On voit donc
que la dfinition d'un tel systme repose sur la dfinition de n fonctions de n+1 variables. Ces
fonctions devront tre programmes dans une fonction MATLAB sous la forme canonique suivante :
function ypoint = f (y, t)
ypoint(1) = une expression de y(1), y(2) ... y(n) et t
...
ypoint(n) = une expression de y(1), y(2) ... y(n) et t
ypoint = ypoint';
On remarquera que les yi et les y i sont regroups dans des vecteurs, ce qui fait que la forme de
cette fonction est exploitable quel que soit le nombre d'quations du systme diffrentiel. La
dernire ligne est ncessaire car la fonction doit ressortir un vecteur colonne et non un vecteur ligne.
Ensuite, pour rsoudre cette quation diffrentielle, il faut appeler un solveur et lui transmettre
au minimum :
le nom de la fonction.
les bornes d'intgration (tmin et tmax).
A.TIMESLI MATLAB

les conditions initiales.


Le solveur fournit en sortie un vecteur colonne reprsentant les instants d'intgration t, et une
matrice dont la premire colonne reprsente les y1 calculs ces instants, la deuxime les y2, et la
nime les yn.
L'appel du solveur prend donc en gnral la forme suivante :
[t, y] = ode45 ('f', [tmin tmax], [y10 y20 ... yn0] );
y1 = y(:,1);
y2 = y(:,2);
...
yn = y(:,n);
plot(t, y1, t, y2) % par exemple on trace y1(t) et y2(t)
plot(y1,y2) % ou bien y2(y1) (plan de phase pour les oscillateurs)
Les lignes y1 = ... servent extraire les diffrentes fonctions yi dans des colonnes simples. Nous
avons utilis ici ode45 qui est un Runge-Kutta-Merson imbriqu d'ordre 4 et 5. C'est le plus courant
et celui par lequel il faut commencer, mais il en existe d'autres.
Exemple : On considre l'quation de Matthieu amortie :

o a, b et sont des paramtres. On prend comme conditions initiales y(0) = 10-3 et y (0) = 0. En
posant y1 = y et y2 = y on se ramne la forme canonique :
y 1 = y2
y 2 = -by2 - a(1 + cos t)y1
Ecrivons la fonction matthieu dfinissant cette quation dans un fichier matthieu.m. Comme pour le
problme de recherche de zro, on passera gnralement les paramtres de l'quation dans une
directive global :
function ypoint = matthieu (y, t)
global a b epsilon
ypoint(1) = y(2);
ypoint(2) = -b*y(1) -a*(1+epsilon*cos(t))*y(2);
ypoint = ypoint';
La squence d'instructions ( mettre dans un autre fichier .m) qui appelle le solveur sera par
exemple :
global a b epsilon
% Parametres
a = 1;
b = 0.1;
epsilon = 1;
tfinal = 10*pi; % Temps final
y01 = 1e-3; % Conditions initiales
y02 = 0;
[t,y] = ode45('matthieu', [0 tfinal], [y01 y02]);
y1 = y(:,1); % Extraction de y1 et y2
y2 = y(:,2);
subplot(221)
plot(t,y1) % y1 fonction du temps %
subplot(222),plot(t,y2) (reprsente dy(t)/dt))
subplot(212)
plot(y1,y2) % Plan de phase
A.TIMESLI MATLAB

(t) de l'quation
Ce programme trace la figure suivante qui reprsente les grandeurs y(t) et y
originale en fonction du temps, plus le plan de phase.

8. Reprsentation symbolique
Il est possible de travailler avec une reprsentation symbolique des polynmes ainsi que d'autres
sortes de fonctions si on possde le toolbox symbolique. Voici une brve introduction des
possibilits de manipulation symbolique de matlab

8.1 Cration dun objet symbolique


La commande sym nous permet de crer des variables et des expressions symboliques. Par exemple
>> x=sym(x)
cre la variable symbolique x qui reprsente x. La commande f = sym('a*x+b') affecte lexpression
symbolique ax+b la variable f. Mais pour effectuer des oprations mathmatiques sur f, on a
besoin de crer explicitement les trois variables :
>> a=sym(a)
>> b=sym(b)
>> x=sym(x)
ou simplement :
>> syms a b x
La commande sym permet de spcifier les proprits mathmatiques des variables symboliques en
utilisant une option comme 'real' :
>> x = sym('x','real'); y = sym('y','real');
ou simplement
>> syms x y real
x et y sont ainsi variables symboliques relles et donc f = x^2 + y^2 est positive ou nulle et
z=x+i*y est forcement une variable complexe ou abs(z) donne x^2+y^2 et conj(z) est x-i*y.
Pour enlever la proprit real, on crit la commande suivante :
>> x = sym('x','unreal')
ou >> syms x unreal
La commande clear x ne rend pas la variable irrelle si on la cre nouveau. Nous pouvons aussi
avoir comme option positive qui permet dobtenir des variables symboliques relles positives.
On peut convertir une variable symbolique en chane de caractres laide de la fonction char.
Cest en faite lopration inverse de sym qui convertit une chane en variable symbolique
Exemple: Cration dune Matrice Symbolique
Pour crer une matrice Symbolique, il faut crer les variables symboliques contenues dans ses
lments. Ainsi si nous voulons crer une matrice 3x3 dont lignes sobtiennent par permutation
circulaire, nous procdonts comme suit :
>> syms a b c
>> A = [a b c; b c a; c a b] A = [ a, b, c ]
[ b, c, a ]
[ c, a, b ]
Nous pouvons traiter A comme dans le cas dune variable numrique, nous avons :
>> sum(A(1,:)) ans =a+b+c
>> sum(A(1,:)) = = sum(A(:,2)) % This is a logical test. ans = 1
>> syms alpha beta;
>> A(2,3) = beta;
>> A = subs(A,b,alpha) A = [ a, alpha, c]
[ alpha, c, beta]
[ c, a, alpha]
A.TIMESLI MATLAB

8.2. Symbolique et conversion numrique


La commande sym permet aussi de faire des reprsentations symboliques des valeurs numriques.
Exemple :
>> rho=(1+sqrt(5))/2 rho = 1.6180
>> sym(rho,'r') ans = 7286977268806824*2^(-52) %Format rational (par dfaut)
>> sym(0.25,'r') ans = 1/4
>> sym(rho,'d') ans = 1.618033988749894902525739 % Format dcimal
On peut contrler le nombre de chiffres aprs la virgule laide de la fonction digits
>> digits(12)
>> sym(rho,'d') ans =1.61803398875
Lutilisation de sym peut stendre une matrice :
>> A=hilb(3) A = 1.0000 0.5000 0.3333
0.5000 0.3333 0.2500
0.3333 0.2500 0.2000
>> A=sym(A) A = [ 1, 1/2, 1/3]
[ 1/2, 1/3, 1/4]
[ 1/3, 1/4, 1/5]

8.3 Cration des fonctions symboliques


Il y a deux manire pour crer les fonctions symbolique :
Utilisation expressions symboliques
Creation de M-file
Utilisation des expressions symboliques
La squence des commandes,
>> syms x y z
>> r = sqrt(x^2 + y^2 + z^2)
>> t = atan(y/x)
>> f = sin(x*y)/(x*y)
gnrent des expressions symboliques r, t, et f.
Remarque : r, t, et f tant issues dune opration symbolique est automatiquement une variable
symbolique sans quon ait eu la dfinir avec la commande sym, (ou syms).
Nous pouvons rcrire les expressions symboliques en utilisant les commandes suivantes :
simplify(expression) - Simplifier lexpression.
simple(expression) - Recherche dune forme plus compacte.
pretty(expression) - met une expression symbolique plus lisible
Exemple
>> syms x,f= (sin(x))^2+(cos(x))^2 ;
>> simplify(f) ans =1
>> f = x^3-6*x^2+11*x-6
>> pretty(f) 3 2
x - 6 x + 11 x - 6
Si on veut appliquer la fonction une valeur numrique on utilise :
subs(expression,symbole,valeur numrique)
Exemple :
>> syms x,f= x^2+x-1 ;
>> subs(f,x,0)ans=-1
Creation de M-File
Les M-files permet aussi de dfinir des fonctions symboliques. Si on veut, par exemple, crer la
fonction sinc = sin(x)/x, On cre le M-file ci-dessous dans le rpertoire
c:\matlab61\toolbox\symbolic\ @sym
A.TIMESLI MATLAB

function z = sinc(x)
%SINC The symbolic sinc function
% sin(x)/x. This function
% accepts a sym as the input argument.
if isequal(x,sym(0))
z = 1;
else
z = sin(x)/x;
end

8.4. Fonctions danalyse


La Toolboxe Symbolic contient des fonctions qui permet deffectuer des oprations de base comme
le drivation, limite, intgration, sommation et dveloppement en sries de Taylor.
Drivation
La fonction correspondant la drivation est diff. Exemple :
>> syms a x
>> f = sin(a*x)
>> diff(f) % drivation par rapport x ans =cos(a*x)*a
Pour driver par rapport a, on utilise un deuxime argument :
>> diff(f,a) ans =cos(a*x)*x
Les drives seconde par rapport x et a, respectivement, scrivent :
>> diff(f,2) ans = -sin(a*x)*a^2
>> diff(f,a,2) ans = -sin(a*x)*x^2
En gnral, la syntaxe de la drivation est diff(fonction,ordre,variable)
La fonction diff peut tre applique une matrice symbolique. Dans ce cas, la drivation sapplique
chaque lment, exemple :
syms a x
>> A = [cos(a*x),sin(a*x);-sin(a*x),cos(a*x)] A = [ cos(a*x), sin(a*x)]
[ -sin(a*x), cos(a*x)]
>> diff(A) ans = [ -sin(a*x)*a, cos(a*x)*a]
[ -cos(a*x)*a, -sin(a*x)*a]
Integration
int(fonction,variable) - Intgrale indfinie c'est--dire primitive.
int(fonction,variable,borne inf,borne sup) - Intgrale dfinie.
Exemple :
>> syms x f
>> f = cos(x) ;
>>int(f) f= -- sin(x);
>> int(sin(2*x),0,pi/2) ans =1
Nous pouvons aussi integrer des fonctions paramtres :
>> syms x k real
>> int(f,x,-inf,inf) ans = signum(k)/k*pi^(1/2)
Limites
Syntaxes :
limit(f) lim f ( x)
x0

limit(f,x,a) or limit(f,a) lim f ( x)


xa
A.TIMESLI MATLAB

limit(f,x,a,'left') lim f ( x)
x a

limit(f,x,a,'right') lim f ( x)
x a
Exemples :
>> limit(1/x) ans =NaN
>> limit(1/x,x,0,'left') ans =-inf
>> limit(1/x,x,0,'right') ans = inf
Sommation Symbolique
On peut calculer des sommations symboliques quand elles existent, en utilisant la commande
symsum. Par exemple, la somme des termes des series :
>> syms x k
>> s1 = symsum(1/k^2,1,inf) s1 = 1/6*pi^2
>> s2 = symsum(x^k,k,0,inf) s2 =-1/(x-1)
Dvelopement deTaylor
Syntaxe : taylor( fonction,ordre de dveloppement)
taylor( fonction,ordre de dveloppement,au voisinage de)
Exemple s:
>> syms x
>> f = 1/(5+4*cos(x));
>> T = taylor(f,8) T =1/9+2/81*x^2+5/1458*x^4+49/131220*x^6
>> pretty
2 4 49 6
1/9 + 2/81 x~ + 5/1458 x~ + ------ x~
131220
>> syms x
>> g = exp(x*sin(x))
>> t = taylor(g,12,2); % dveloppement dordre 12 au voisinage de 2
Reprsentons la fonction g et son dveloppement dans un mme graphique pour les comparer :

>> xd = 1:0.05:3; yd = subs(g,x,xd);


>> ezplot(t, [1,3]); hold on;
>> plot(xd, yd, 'r-.')
>> title('Taylor approximation vs. actual
function');
>> legend('Function','Taylor')

8.5. Rsolution dquations

8.5.1. Equations algbriques


Si S est une expression symbolique, solve(S) permet de rsoudre lquation S=0 Par exemple,
>> syms a b c x
>> S = a*x^2 + b*x + c;
>> solve(S) % linconnu est x par dfautans = [1/2/a*(-b+(b^2-4*a*c)^(1/2))]
[1/2/a*(-b-(b^2-4*a*c)^(1/2))]
>> b = solve(S,b) % linconnu est b b = -(a*x^2+c)/x
Nous pouvons aussi crire lquation sous forme dune chane de caractres
A.TIMESLI MATLAB

>> s = solve('cos(2*x)+sin(x)=1') s= [ 0]
[ pi]
[ 1/6*pi]
[ 5/6*pi]
Systme dquations
>> syms x y alpha
>> [x,y] = solve(x^2*y^2-1, x-y/2-alpha)
x = [ 1/2*alpha+1/2*(alpha^2+2)^(1/2)] y = [ -alpha+(alpha^2+2)^(1/2)]
[ 1/2*alpha-1/2*(alpha^2+2)^(1/2)] [ -alpha-(alpha^2+2)^(1/2)]
[ 1/2*alpha+1/2*(alpha^2-2)^(1/2)] [ -alpha+(alpha^2-2)^(1/2)]
[ 1/2*alpha-1/2*(alpha^2-2)^(1/2)] [ -alpha-(alpha^2-2)^(1/2)]
Les commandes suivantes donnent le mme rsultat
>> eqs1 = 'x^2*y^2=1, x-y/2-alpha'
>> [x,y] = solve(eqs1)
Un autre exemple o nous crivons la solution avec une seul sortie
>> syms u v x y
>> S = solve(x+2*y-u, 4*x+5*y-v);
>> sol = [S.x;S.y] sol = [ -5/3*u+2/3*v]
[ 4/3*u-1/3*v]

8.5.2 Equation Differentielle


La rsolution dune quation diffrentielle se fait laide de la commande dsolve. La variable
indpendante est par dfaut t. La syntaxe est dsolve(quation,conditions limites,variable)
Exemple 1
>> dsolve('Dy=1+y^2') ans = tan(t+C1)
Pour dterminer la constante, on doit prciser les conditions initiales :
>> y = dsolve('Dy=1+y^2','y(0)=1') y = tan(t+1/4*pi)
Notons que seul y est dans le workspace. Pour utiliser la variable indpendante t, il faut la crer en
utilisant syms t.
Exemple 2 : il sagit dquations non linaires ayant des solutions multiples :
>> x = dsolve('(Dx)^2+x^2=1','x(0)=0') x = [-sin(t)]
[ sin(t)]
Exemple 3 : quation diffrentielle de second ordre
>> y = dsolve('D2y=cos(2*x)-y','y(0)=1','Dy(0)=0', 'x')
y=(1/2*sin(x)+1/6*sin(3*x))*sin(x)+(1/6*cos(3*x)-1/2*cos(x))*cos(x)+4/3*cos(x)
>> simplify(y) y = -2/3*cos(x)^2+1/3+4/3*cos(x)
Systme dquations diffrentielles
>> S = dsolve('Df = 3*f+4*g', 'Dg = -4*f+3*g');
>> f = S.f f =exp(3*t)*(cos(4*t)*C1+sin(4*t)*C2)
>> g = S.g g =exp(3*t)*(-sin(4*t)*C1+cos(4*t)*C2)
Avec les conditions initiales :
>> [f,g] = dsolve('Df=3*f+4*g, Dg =-4*f+3*g', 'f(0) = 0, g(0) = 1')
f = exp(3*t)*sin(4*t)
g = exp(3*t)*cos(4*t)
Dans le tableau suivant, nous reprsentons quelques exemples
A.TIMESLI MATLAB

Vous aimerez peut-être aussi