Tutoriel MATLAB

Transcription

Tutoriel MATLAB
Tutoriel MATLAB
Introduction aux méthodes numériques et projet
Premier bachelier en sciences de l'ingénieur
Année académique 2009-2010
1 Débuter une session MATLAB
Depuis les salles de laboratoire : introduire votre login et votre password, ouvrir un
terminal via le menu, puis introduire la commande MATLAB.
Pour quitter : terminer la session MATLAB en allant dans le menu <File> en haut à
gauche et en cliquant sur <Exit MATLAB>, puis fermer la session sur l'ordinateur en
appuyant sur le bouton rouge de la barre en haut de l'écran et en choisissant l'option
log out.
Depuis Internet : suivre les instructions se trouvant à l'adresse
http://www.montefiore.ulg.ac.be/services/ail/cours/algo1/putty.html.
Lors de votre première connexion, ouvrir un terminal et lancer la commande
/home/algo/LAM/idstudent. Si vous vous connectez de chez vous, il est conseillé de
lancer MATLAB avec la commande MATLAB
-nojvm.
L'interface de MATLAB est illustrée à la Fig. 1.
2 Command Window
La fenêtre de commande permet à l'utilisateur d'entrer des commandes, après l'invite de
commande >> . On peut notamment utiliser les opérateurs d'addition +, de soustraction
-, de multiplication *, de division / et de puissance ^.
>> 2+2
ans =
4
L'opérateur d'assignation = permet de dénir des variables. Une variable est un conteneur d'information, sous la forme d'un scalaire ou d'un tableau, contenant des nombres, des
caractères, etc.
>> a = 2+2
a =
4
Pour une dénition silencieuse, l'instruction doit se terminer par ;
1
Figure 1 Interface MATLAB
>> b = a-3;
>> b
b =
1
Le caractère % permet d'ajouter des commentaires qui ne sont pas pris en compte par
l'interpréteur de commande. La commande clc permet de nettoyer la fenêtre de commande.
>> % ceci est un commentaire
>> clc % la fenêtre de commande est nettoyée
Enn, il est utile de remarquer que la touche tab permet l'autocomplétion des commandes.
3 Aide
L'utilisateur peut d'abord trouver de l'aide localement grâce aux commandes help (dans
la fenêtre de commande) et doc (dans le navigateur d'aide de MATLAB).
>> help clc
CLC
Clear command window.
CLC clears the command window and homes the cursor.
See also home.
Reference page in Help browser
doc clc
>> doc clc
2
Figure 2 Command history
Ensuite, toujours localement, MATLAB intègre des démonstrations qu'il peut être utile
de consulter.
>> demo
Enn, parmi les ressources disponibles sur Internet, de nombreuses informations sont rassemblées sur le site web :
http://www.mathworks.com/products/matlab/
Exercice
1)
Rechercher dans l'aide des informations sur les fonctions format
long et format short
et tester leur fonctionnement.
4 Command History
L'historique des commandes (Fig. 2) ore à l'utilisateur une vue sur les commandes entrées
lors de la session courante et des sessions précédentes. Il permet ainsi de réévaluer facilement
une commande ou un groupe de commandes. Dans la fenêtre de commande, il est parcouru
grâce aux touches ↑ et ↓.
5 Workspace
L'espace de travail fournit à l'utilisateur des informations sur les variables dénies à un
l'instant présent. Il ore des fonctionnalités pour la gestion des variables (création, édition,
suppression, etc.).
Ces informations sont également accessibles par le biais des commandes who et whos.
La variable ans correspond à la réponse non-assignée la plus récente de MATLAB (ici il
s'agit donc du résultat après les commande décrites à la Section 2).
>> who
Your variables are:
a
ans b
>> whos
3
Name
a
ans
b
Size
1x1
1x1
1x1
Bytes Class
8 double
8 double
8 double
Attributes
La commande clear sert à supprimer une variable, voire à nettoyer l'ensemble de l'espace
de travail si elle est appelée avec le mot-clef all.
>> clear a
>> who
Your variables are:
ans b
>> clear all
>> who
6 Current Directory et Editor
Le répertoire courant est le répertoire où l'utilisateur travaille. Le contenu de ce répertoire
est aché et des fonctionnalités pour la gestion de son contenu sont fournies.
L'achage du contenu du répertoire courant est obtenu dans la fenêtre de commande à
l'aide de la commande dir. Pour l'instant ce répertoire est vide, à l'exception de . qui est
le répertoire courant et de .. qui est le répertoire parent du répertoire courant.
>> dir
. ..
On crée un chier hello.m à l'aide de la commande edit.
>> edit hello
L'éditeur s'ouvre et on peut y dénir les commandes
% Script affichant 'Hello World!'
text = 'Hello World!';
disp(text);
On sauve le chier et on retourne dans la fenêtre de commande. La commande what ache
les chiers spéciques MATLAB du répertoire courant.
>> dir
.
..
hello.m
>> what
M-files in the current directory /home/sburton/matlab
hello
Les chiers MATLAB du répertoire courant peuvent être appelés directement depuis la
ligne de commande. L'exécution du chier hello.m se fait en entrant son nom, sans l'ex-
tension .m dans la fenêtre de commande. Les commandes enregistrées dans le chier sont
alors exécutées, c'est à dire l'assignation du texte Hello
achage.
4
World!
à la variable text et son
>> hello
Hello World!
On constate donc
>> who
Your variables are:
text
>> text
text =
Hello World!
Enn, l'appel à
help hello
renvoie le premier bloc de commentaires du chier.
>> help hello
Script affichant 'Hello World!'
7 Fonctions
Le chier hello.m est un script, c'est-à-dire un ensemble de commandes exécuté dans
l'environnement de travail. Par contre, une fonction est un ensemble de commandes exécuté
dans un sous-environnement qui n'existe que pendant l'exécution de la fonction.
On crée un chier byebye.m
edit byebye
On y entre les commandes
% Fonction affichant 'Bye bye World!'
function byebye
text = 'Bye bye World!';
disp(text);
end
On sauve le chier et on retourne dans la fenêtre de commandes. L'exécution du chier
byebye.m donne
>> byebye
Bye bye World!
Dans ce cas, on constate
>> who
Your variables are:
text
>> text
text =
Hello World!
5
La fonction byebye se déroulant dans un sous-environnement de travail, la variable text
de l'environnement de travail n'a pas été altérée par l'exécution de la fonction.
Les variables globales, dénies à l'aide du mot-clef global, constituent une exception
notable à ce comportement en ce sens que leur portée n'est plus locale mais globale. Il existe
aussi des variables persistantes, dénies à l'aide du mot-clef persistent, qui conservent leur
valeur entre les appels de la fonction où elles sont dénies. Par sécurité, l'usage de variables
globales et de variables persistantes est généralement déconseillé.
Les fonctions peuvent prendre plusieurs arguments en entrée et en sortie. Par exemple,
voici une fonction
polarToCartesian
qui reçoit les coordonnées polaires d'un point du plan
en entrée et qui fournit ses coordonnées cartésiennes en sortie.
% Fonction qui calcule les coordonnées cartésiennes d'un point
% à partir de ses coordonnées polaires.
function [x y] = polarToCartesian(rho,theta)
x = rho * cos(theta);
y = rho * sin(theta);
end
On l'appelle par la commande
[x y] = polarToCartesian(rho,theta)
De nombreuses fonctions sont intégrées nativement dans MATLAB. Par exemple, on retrouve les fonctions mathématiques :
pi : renvoie la valeur de π ;
sin : renvoie le sinus d'un angle en radians ;
sqrt : revoie la racine d'un nombre ;
ceil : renvoie l'arrondi supérieur d'un nombre.
L'aide et ses options de recherche permettent de trouver facilement les fonctions utiles et
d'obtenir des informations pour leur utilisation.
Exercices
1)
Soit l'équation algébrique
ax2 + bx + c = 0
Créer une fonction qui reçoit en argument les coecients
(1)
a, b
et
c
et qui fournit en sortie les
deux racines.
8 Structures de contrôle
MATLAB intègre des structures de contrôle parmi lesquelles on retrouve :
if : contrôle conditionnel sur une expression logique ;
switch : contrôle conditionnel sur une expression logique ;
for : contrôle de boucle sur un compteur ou un itérateur ;
while : contrôle de boucle sur une expression logique.
L'aide donne une description précise de ces structures de contrôle.
6
Exercices
1)
La fonction exponentielle admet le développement en série
exp(x)
=
∞
X
xi
i=0
(2)
i!
Ecrire une fonction MATLAB qui calcule cette série limitée aux
n+1
premiers termes. On
peut utiliser la fonction factorial et l'opérateur ^.
2)
Même exercice que précédemment mais sans utiliser la fonction factorial ni l'opérateur
^ (seuls les opérateurs +, * et / sont autorisés).
9 Vecteurs et matrices
MATLAB est un langage de programmation qui permet la manipulation de scalaires,
de vecteurs, de matrices et de tableaux d'ordre plus élevé encore. Ainsi, on peut faire des
opérations avec des matrices et, en toute généralité, les fonctions peuvent prendre en argument
des matrices.
Diérentes méthodes permettent de dénir des vecteurs
>> a = [1 5 2 4 3]
a =
1
5
2
4
3
>> b = 1:2:10
b =
1
3
7
9
5
>> c = linspace(-pi,pi,5)
c =
-3.1416 -1.5708
>> d = rand([1 5])
d =
0.2785
0.5469
0
1.5708
3.1416
0.9575
0.9649
0.1576
On peut accéder aux éléments d'un vecteur en utilisant les indices linéaires (ceux-ci vont
de 1 pour le premier élément à end pour le dernier élément)
>> a(1)
ans =
1
>> b([2 end])
ans =
3
9
7
>> c(3:end-1)
ans =
0
1.5708
>> d(a(2))
ans =
0.1576
On peut modier les éléments d'un vecteur
>> a(1) = 10
a =
10
5
2
4
>> b([end+1 10]) = [11 12]
b =
1
3
5
7
3
9
>> c([1 2 3]) = c([3 2 1])
c =
0 -1.5708 -3.1416
11
0
1.5708
0
0
12
3.1416
L'opérateur : représente l'ensemble des composantes du vecteur
>> d(:) = 2
d =
2
2
2
2
2
La fonction length renvoie la longueur d'un vecteur et la fonction sort permet de
trier les valeurs d'un vecteur (le second argument de sortie repérant les index correspondants
dans la conguration initiale).
>> length(a)
ans =
5
>> [a index] = sort(a)
a =
2
3
4
5
index =
3
5
4
2
10
1
On peut aussi dénir des matrices
>> A = [1 2;3 4]
A =
1
2
3
4
>> B = eye(3)
8
B =
1
0
0
0
1
0
0
0
1
>> C = zeros(2,3)
C =
0
0
0
0
0
0
>> D = diag([7 1 3])
D =
7
0
0
0
1
0
0
0
3
L'aide contient une explication détaillée de ces fonctions. On peut accéder aux éléments
d'une matrice en utilisant les indices de ligne et de colonne, ou les indices linéaires
>> A(2,1)
ans =
3
>> B(1,:)
ans =
1
0
0
>> C(:,end)
ans =
0
0
>> D(9)
ans =
3
On peut évidemment modier les éléments d'une matrice.
La fonction size renvoie les dimensions d'une matrice et la fonction find permet de
trouver les indices linéaires correspondant aux valeurs non-nulles d'un tableau.
>> size(A)
ans =
2
2
>> find(A > 2)
ans =
2
4
9
>> A(find(A > 2)) = 0
A =
1
2
0
0
Remarquons trois pièges courants : d'abord la diérence entre l'opérateur de multiplication
matricielle * et l'opérateur de multiplication élément par élément .*, ensuite la diérence
entre l'opérateur de transposition .' et l'opérateur de transposition et complexe-conjugué
' et enn l'existence de l'élément vide [] repérable à sa longueur nulle.
Exercices
1)
Créer un vecteur ligne x de 5 nombres successifs entre 2 et 3 et séparés par des
intervalles égaux.
Ajouter 1 au deuxième élément.
Créer un deuxième vecteur ligne y de la même dimension mais dont les éléments sont
les nombres pairs successifs en commençant à 4.
Créer une matrice A, dont la première ligne est égale à x, la deuxième ligne est une
ligne de 1 et la troisième ligne est égale à y.
2)
Soit deux matrices
A=
où
i
√4 −5
3 π/4
, B=
2
3+i
−72/3 0.2
est le nombre imaginaire. Calculer les éléments suivants
A + B, AB, A2 , AT , B −1 , B T AT , A2 + B 2 − AB
3)
(3)
(4)
En utilisant la commande polyval...
10 Résolution de systèmes d'équations
Pour résoudre un système linéaire
Ax = b,
l'opérateur \ de division à gauche peut être
utilisé :
x = A\b
A carrée ou rectangulaire. D'autres fonctions utiles
pour la résolution de systèmes linéaires sont lu pour la décomposition LU, det pour le
calcul du déterminant, inv pour l'inverse d'une matrice carrée, rank pour le rang, cond
pour le nombre de conditionnement en norme 2, ou encore rcond pour l'estimation de
Cet opérateur s'applique pour une matrice
l'inverse du nombre de conditionnement en norme 1.
10
Exercice
1)
Résoudre le système d'équations linéaires
5x + 6y + 10z = 4
(5)
−3x + 14z = 10
(6)
−7y + 21z = 0
(7)
11 Polynômes
MATLAB représente un polynôme comme un vecteur ligne qui contient les coecients des
termes rangés selon les puissances décroissantes. Par exemple,
p = [ 1 -12 0 5 0]
représente
x4 − 12x3 + 5x.
Voici quelques fonctions utiles pour travailler avec des polynômes :
roots calcule les racines d'un polynôme, poly détermine un polynôme à partir de ses
racines, polyval évalue un polynôme en un point, enn, +, conv et deconv permettent
respectivement l'addition, le produit et la division de deux polynômes.
12 Graphiques
MATLAB ore des fonctionnalités puissantes pour la création de graphiques. L'achage
le plus simple se fait à l'aide de la fonction plot. La gestion des diérentes gures se fait à
l'aide de la fonction figure. Pour acher plusieurs courbes sur une même gure, on active
le maintien du graphique à l'aide de la commande hold
l'aide de la commande hold
off.
on.
Ce maintien est désactivé à
Pour sauver une gure on utilise la fonction print. La
fonction close ferme la gure active alors que la commande close
all
ferme toutes les
gures.
D'autres fonctions permettent de dénir la zone d'achage ( axis), une grille ( grid),
un titre ( title) ou des labels pour les diérents axes ( xlabel, ylabel) :
t = 0:pi/20:2*pi;
y = sin(t);
plot(t,y)
axis ([0 2*pi -1.5 1.5])
grid
title('sinus')
xlabel('temps t')
ylabel('sinus(t)')
Exercices
1)
Tracer le graphique de la fonction
y(x) = e−0.8x sinωx
pour
ω = 10
rad/s et
x ∈ [0 10]
(8)
s. Utiliser l'opérateur : pour dénir le vecteur x avec un
incrément de 0.1 s.
11
2)
Soit la fonction
y(x) = 10 + 5e−x cos(ωx + 0.5)
(9)
ω = 1, 3, 10 rad/s et x ∈ [0 5] s. Les trois courbes
ω = 1 rad/s, une ligne en traits
en pointillés pour ω = 10 rad/s.
Ecrire un script qui trace le graphique pour
doivent apparaître en noir, avec une ligne continue pour
discontinus pour
ω=3
rad/s et une ligne
13 Résolution d'équations diérentielles
Considérons l'équation diérentielle
dy1
dt
dy2
dt
dy3
dt
avec les conditions initiales
= y2 y3
(10)
= −y1 y3
(11)
= −0.51 y1 y2
(12)
y1 (0) = 0, y2 (0) = 1
et
y3 (0) = 1.
Dans MATLAB, cette équation
diérentielle est représentée par une fonction dénie comme suit
function dy = rigid(t,y)
dy = zeros(3,1);
dy(1) = y(2) * y(3);
dy(2) = -y(1) * y(3);
dy(3) = -0.51 * y(1) * y(2);
et enregistrée sous le nom
rigid.m. La résolution numérique se fait alors dans un autre chier
.m en faisant référence à la fonction rigid. La fonction ode45 utilise une méthode de
Runge-Kutta explicite pour la résolution de l'équation et les paramètres d'intégration peuvent
être ajusté avec la fonction odeset. Le code suivant résout l'équation diérentielle entre 0
et 12 et trace le résultat à l'écran.
[T,Y] = ode45(@rigid,[0 12],[0 1 1]);
plot(T,Y(:,1),'-',T,Y(:,2),'-.',T,Y(:,3),'.')
Exercices
1)
L'oscillateur de Van der Pol est décrit par l'équation suivante
dx1
dt
dx2
dt
= x2
(13)
= ω(1 − x21 )x2 − ω 2 x1
(14)
Ecrire un programme qui résout cette équation pour
de la solution
x1 (t)
pour
ω=1
et
= 0.1
t ∈ [0 100]
et qui ache le graphique
et pour diérentes conditions initiales. Vérier que
la réponse converge vers des oscillations stables lorsque les conditions initiales sont diérentes
de
x1 (0) = x2 (0) = 0.
12
14 Entrées/sorties
Pour le développement d'un programme interactif, la sortie écran et l'entrée clavier se font
respectivement à l'aide des fonctions disp et input.
La sauvegarde et le chargement des variables se font respectivement à l'aide des fonctions
save et load. Pour une gestion plus souple de la lecture et de l'écriture d'un chier, on
peut être amené à utiliser les fonctions fopen, fclose, fprintf, fscanf, fgetl et
fgets.
La concaténation de chaînes de caractères se fait à l'aide de l'opérateur []. Il peut être
utile de transformer des nombres en chaînes de caractères et vice versa à l'aide des fonctions
num2str et str2num. Pour une gestion plus souple des chaînes de caractères, on peut
employer les fonctions sprintf et sscanf.
15 Fonctions vectorielles
An d'améliorer l'ecacité d'un programme, il est souhaitable d'éviter les instructions
de boucle for et while et de leur préférer les fonctions vectorielles de MATLAB. Ces
fonctions dénissent des opérations sur l'ensemble des éléments d'une matrice ou d'un vecteur
en une seule commande.
Par exemple, les fonctions prod, sum et diff dénissent des opérations de produit,
de somme et de diérence pour tous les éléments d'une matrice ou d'un vecteur. On citera
également max, min et mean. Parmi les fonctions déjà rencontrées, rappelons enn sort,
find, zeros, ones ainsi que l'opérateur :. L'utilisation de ces fonctions est donc vive-
ment recommandée.
Exercice
1)
Sans utiliser d'instruction de boucle, écrire une fonction qui reçoit un argument un vecteur
x de dimension inconnue n et un scalaire t et qui calcule un scalaire y tel que
y = (x(1) − t) ∗ . . . ∗ (x(n) − t)
(15)
16 Ça coince. . .
Il n'y a pas que l'aide qui puisse aider l'utilisateur en cas de problème. D'abord en cas
de mauvaise utilisation de MATLAB, un message d'erreur apparait. Par exemple, le sinus du
caractère a n'a pas de sens, un message d'erreur explicite est renvoyé.
>> sin('a')
??? Undefined function or method 'sin' for input arguments of
type 'char'.
Ensuite, l'éditeur comprend un analyseur syntaxique mettant en évidence en soulignant
en rouge et dans la marge de droite les avertissements et les erreurs d'un chier qui y est
édité. Une aide contextuelle à la résolution de ces problèmes est fournie.
Il est utile de mentionner l'existence des nombres i (le nombre imaginaire), Inf
(l'innité positive) et NaN (le nombre indéni ou Not-a-Number ). Il est également utile
de mentionner l'existence des fonctions is* permettant de détecter l'état d'une entité (par
13
Figure 3 Outils de débogage : menu et barre d'outils
exemple les trois nombre précédents peuvent être testés avec les fonctions isreal, isinf
ou isnan). Pour terminer il est important de prendre conscience que la précision de calcul
n'est pas innie (c'est facilement observable avec la fonction eps).
17 Outils de débogage
MATLAB comprend un debugger intégré à l'éditeur. Cet outil permet d'arrêter un programme en cours d'exécution pour examiner la valeur des diérentes variables et détecter
d'éventuelles erreurs. A cet eet, des points d'arrêt doivent être créés au préalable dans le(s)
chier(s) .m. Pour créer un point d'arrêt (breakpoint), il sut d'appuyer sur F12 et un point
rouge apparaît à gauche de la ligne de courante. De manière équivalente, on peut cliquer sur
le tiret dans la marge de gauche de l'éditeur, ou utiliser la barre d'outil de débogage.
L'exécution du programme est alors réalisée en pressant F5 ou via le bouton Debug->Run
du menu (voir Fig. 3). Le programme s'arrête au point d'arrêt indiqué par une èche verte.
Vous pouvez examiner le contenu des variables du Workspace, avancer d'une ligne, continuer
ou arrêter le programme. Lorsqu'une ligne fait appel à une fonction, il est possible de rentrer
à l'intérieur de cette fonction ou de sauter directement à la ligne suivante.
Des fonctionnalités de débogage sont également accessibles lorsqu'un programme produit
une erreur. Dans la Fig. 4, le message d'erreur en rouge indique alors la ligne à laquelle l'erreur
s'est produite. On peut y accéder directement en cliquant sur le texte wrongProgram
at 3.
18 Outils d'analyse des performances
Pour tester la performance d'un code et éventuellement l'améliorer, l'utilisateur peut tirer avantage du proler de MATLAB. Celui-ci se contrôle via la commande profile, ou
directement via son interface graphique (accessible par la commande profile
viewer).
Le proler donne des statistiques sur le nombre d'appels et le temps passé lors de l'exécution
d'un code. Ces informations permettent de mettre en évidence les parties les plus gourmandes
du codes. Pour l'analyse d'un code très rapide, il peut se révérer utile de répéter celui-ci un
certain nombre de fois, de manière à observer des temps d'exécution non-négligeables.
14
Figure 4 Outils de débogage lors d'une erreur d'exécution
Les fonctions tic et toc sont également très pratiques pour évaluer le temps d'exécution d'une section de programme.
Exercices
1)
Comparer les deux programmes suivants
tic;
for i=1:1000,
for j=1:1000,
x(i,j)=i+j;
end
end
toc
et
tic;
x=zeros(1000);
for i=1:1000,
for j=1:1000,
x(i,j)=i+j;
end
end
toc
Comment pouvez-vous expliquer ce résultat ?
15