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