Cours de Matlab
Cours de Matlab
Cours de Matlab
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
2
A.TIMESLI MATLAB
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
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);
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).
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
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
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
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 :
Lgendes :
C'est l'instruction legend. Il faut lui communiquer
autant de chanes de caractres que de courbes
9
A.TIMESLI MATLAB
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.
10
A.TIMESLI MATLAB
11
A.TIMESLI MATLAB
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.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
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.
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.
5. Structures de contrle
On va parler ici de tests et de boucles. Commenons par les oprateurs de comparaison et les
oprateurs logiques
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
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
>> 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.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.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 :
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
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))
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
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
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 :
>> 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]