MATLAB - Cours et exercices corrigés 9789947341032

105 16 2MB

Français Pages [194] Year 2017

Report DMCA / Copyright

DOWNLOAD FILE

Polecaj historie

MATLAB - Cours et exercices corrigés
 9789947341032

Table of contents :
Avant propos
Introduction
Présentation de MATLAB
Les premiers pas
Les variables
Matrices
Opérations sur les matrices
Opérations de calcul sur les matrices
Opérateurs de comparaison
Opérateurs logiques
Instructions de contrôle
Fonctions de matrices
Manipulation des matrices
Aide
Exercices
Fonctions
Introduction
Fonctions prédéfinies
Les fonctions inline
Les fonctions 'anonymes'
Fichier .m
Edition de fichiers
Fichiers fonctions .m
Sous-fonctions
Fonctions locales
Fonctions imbriquées
Fonctions de fonctions
Exercices
Graphisme
Graphes à deux-dimensions
Tracé de fonction
Superposition de 2 fonctions
La fonction fplot
Courbes paramétrées
Tracé en coordonnées polaires
Tracé en échelle semi-logarithmique ou log-log
Remplissage
Cas de données discrètes
La commande subplot
Graphes 3D
plot3()
Contour
Surfaces
Gestion des fenêtres graphiques
Ouverture-fermeture
Sauvegarde sous un format d'impression
Sauvegarde dans un fichier au format MATLAB (.fig)
Animation
comet
movie
Exercices
Programmation
Script
Entrées/Sorties
Instructions de contrôle
La boucle for
La boucle conditionnelle while...end
Instructions conditionnelles
Test conditionnel
Choix multiple
Vectorisation
Fichiers
Exercices
Calcul symbolique
Introduction
Objets Symboliques
Calcul symbolique avec MATLAB
Calcul
Simplification d'expressions symboliques
Substitution dans des expressions symboliques
Dérivation
Limites
Integration
Sommation symbolique
Produit symbolique
Séries de Taylor
Transformation intégrale
Résolution d'équations
Graphes
Exercices
Equations Différentielles
Introduction
Exemples d'étude
Exemple 1
Exemple 2 : Oscillateur harmonique
Exemple 3 : Oscillateur amorti
Exemple 4 : Equation de van der Pol
Equations Différentielles avec conditions aux limites
Exercices
Appel de programmes externes
Solutions des exercices
Index

Citation preview

Avant Propos de ce manuel est l’apprentissage des notions de base du langage de programmation et de calcul scientifique MATLAB 1 . Cet ouvrage a été écrit sur la base d’un cours MATLAB destiné aux étudiants de la licence de Physique (L3-S5). Nous avons fait l’effort de présenter les cours et les exercices sous une forme simple et directe pour permettre une assimilation rapide des notions de base de la programmation sous MATLAB . Les chapitres sont plus au moins indépendants et peuvent être lus dans l’ordre voulu à l’exception du chapitre I dont la lecture est pré-requise pour la compréhension des autres chapitres. Dans ce chapitre sont introduites les principales commandes de base ainsi que les règles du langage. Le chapitre II est consacré à la notion de fonction. Les commandes graphiques sont présentées dans le chapitre III. La programmation proprement dite fait l’objet du chapitre IV dans lequel toutes les commandes préalablement étudiées sont revues ; on y a introduit également la notion de fichier pour la sauvegarde de l’ensemble des instructions qui constituent un programme. Le chapitre V est destiné à la maîtrise des commandes de calcul symbolique de la boîte à outils Symbolic Toolbox. Les principaux solveurs pour la résolution des équations différentiels font l’objet du chapitre VI. Chaque chapitre se termine par un ensemble d’exercices dont les solutions sont proposées en annexe.

L’

OBJECTIF

1. La version disponible en 2022 est 9.11 (R2021b). Pour les systèmes open source il y a plusieurs programmes équivalents à l’instar d’Octave.

ii

MATLAB

Ce manuel peut servir de document de travail à toute personne (étudiant, ingénieur ou chercheur) désireuse de s’initier à MATLAB pour résoudre des problèmes scientifiques (simulation, traitement numérique de données, etc....).

M. Djebli H. Djelouah

Table des matières Avant propos 1

2

i

Introduction 1.1 Présentation de MATLAB . . . . . . . . . 1.2 Les premiers pas . . . . . . . . . . . . . . 1.3 Les variables . . . . . . . . . . . . . . . . 1.4 Matrices . . . . . . . . . . . . . . . . . . . 1.5 Opérations sur les matrices . . . . . . . . . 1.5.1 Opérations de calcul sur les matrices 1.5.2 Opérateurs de comparaison . . . . . 1.5.3 Opérateurs logiques . . . . . . . . 1.5.4 Instructions de contrôle . . . . . . . 1.5.5 Fonctions de matrices . . . . . . . 1.5.6 Manipulation des matrices . . . . . 1.6 Aide . . . . . . . . . . . . . . . . . . . . . Exercices . . . . . . . . . . . . . . . . . . . . . Fonctions 2.1 Introduction . . . . . . . . . 2.2 Fonctions prédéfinies . . . . 2.3 Les fonctions inline . . . . 2.4 Les fonctions ’anonymes’ . . 2.5 Fichier .m . . . . . . . . . . 2.5.1 Edition de fichiers . 2.5.2 Fichiers fonctions .m 2.6 Sous-fonctions . . . . . . . 2.6.1 Fonctions locales . . 1

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . .

. . . . . . . . . . . . .

5 6 7 9 15 20 20 26 27 28 31 35 37 39

. . . . . . . . .

43 44 45 47 49 52 52 53 61 62

MATLAB

2

2.6.2 Fonctions imbriquées . . . . . . . . . . . . . . . . . . 63 2.7 Fonctions de fonctions . . . . . . . . . . . . . . . . . . . . . 64 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 3

Graphisme 3.1 Graphes à deux-dimensions . . . . . . . . . . . . . . . . . . . 3.1.1 Tracé de fonction . . . . . . . . . . . . . . . . . . . . 3.1.2 Superposition de 2 fonctions . . . . . . . . . . . . . . 3.1.3 La fonction fplot . . . . . . . . . . . . . . . . . . . . 3.1.4 Courbes paramétrées . . . . . . . . . . . . . . . . . . 3.1.5 Tracé en coordonnées polaires . . . . . . . . . . . . . 3.1.6 Tracé en échelle semi-logarithmique ou log-log . . . . 3.1.7 Remplissage . . . . . . . . . . . . . . . . . . . . . . 3.1.8 Cas de données discrètes . . . . . . . . . . . . . . . . 3.1.9 La commande subplot . . . . . . . . . . . . . . . . 3.2 Graphes 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 plot3() . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2 Contour . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.3 Surfaces . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Gestion des fenêtres graphiques . . . . . . . . . . . . . . . . 3.3.1 Ouverture-fermeture . . . . . . . . . . . . . . . . . . 3.3.2 Sauvegarde sous un format d’impression . . . . . . . 3.3.3 Sauvegarde dans un fichier au format MATLAB (.fig) . 3.4 Animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.1 comet . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.2 movie . . . . . . . . . . . . . . . . . . . . . . . . . . Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4

Programmation 4.1 Script . . . . . . . . . . . . . . . . . . . . . . 4.2 Entrées/Sorties . . . . . . . . . . . . . . . . . 4.3 Instructions de contrôle . . . . . . . . . . . . . 4.3.1 La boucle for . . . . . . . . . . . . . 4.3.2 La boucle conditionnelle while...end 4.4 Instructions conditionnelles . . . . . . . . . . . 4.4.1 Test conditionnel . . . . . . . . . . . . 4.4.2 Choix multiple . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

69 70 70 73 76 78 79 80 81 82 84 85 85 86 87 88 88 89 89 89 89 90 91 95 96 98 99 99 103 104 104 108

4.5 Vectorisation . . . . . . . . . . . . . . . . . . . . . . . . . . 111 4.6 Fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 5

6

Calcul symbolique 5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . 5.2 Objets Symboliques . . . . . . . . . . . . . . . . . . . 5.3 Calcul symbolique avec MATLAB . . . . . . . . . . . 5.4 Calcul . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4.1 Simplification d’expressions symboliques . . . 5.4.2 Substitution dans des expressions symboliques 5.4.3 Dérivation . . . . . . . . . . . . . . . . . . . . 5.4.4 Limites . . . . . . . . . . . . . . . . . . . . . 5.4.5 Integration . . . . . . . . . . . . . . . . . . . 5.4.6 Sommation symbolique . . . . . . . . . . . . 5.4.7 Produit symbolique . . . . . . . . . . . . . . . 5.4.8 Séries de Taylor . . . . . . . . . . . . . . . . . 5.4.9 Transformation intégrale . . . . . . . . . . . . 5.4.10 Résolution d’équations . . . . . . . . . . . . . 5.5 Graphes . . . . . . . . . . . . . . . . . . . . . . . . . Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . Equations Différentielles 6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . 6.2 Exemples d’étude . . . . . . . . . . . . . . . . . . . 6.2.1 Exemple 1 . . . . . . . . . . . . . . . . . . 6.2.2 Exemple 2 : Oscillateur harmonique . . . . . 6.2.3 Exemple 3 : Oscillateur amorti . . . . . . . . 6.2.4 Exemple 4 : Equation de van der Pol . . . . . 6.3 Equations Différentielles avec conditions aux limites Exercices . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . . . . . . . . . .

127 128 128 128 130 130 132 133 135 135 136 137 137 138 138 139 141

. . . . . . . .

143 144 144 144 146 149 152 154 157

A Appel de programmes externes

159

B Solutions des exercices

161

Index

189

4

MATLAB

Chapitre 1 Introduction

L

’objectif de ce chapitre est la prise en main de MATLAB en introduisant les commandes et opérations, arithmétiques ou logiques, les plus élémentaires, nécessaires à la suite de la lecture de ce livre.

MATLAB

6

1.1

Présentation de MATLAB

MATLAB (Matrix Laboratory) est un environnement de calcul numérique produit par Mathworks. La première version a été développée à l’université du nouveau Mexique dans les années 1970. Destinée aux étudiants, son objectif était de simplifier l’accès aux libraires de calcul numérique. Ayant connu un succès rapide, en particulier dans la communauté des mathématiques appliquées, MATLAB est devenu une solution commerciale utilisée pour résoudre des problèmes scientifiques et techniques aussi bien dans le milieu académique que dans l’industrie. L’intérêt principal de MATLAB est de combiner un langage de programmation simple et efficace (appelé lui aussi MATLAB ) avec un système interactif de calcul numérique et de visualisation graphique. MATLAB est basé sur les matrices, ce qui facilite la formulation des concepts et des problèmes mathématiques et scientifiques. Le langage MATLAB définit tout un ensemble d’opérateurs pour manipuler ces matrices, permettant l’élaboration d’un code plus facile à écrire et à lire. Concernant l’aspect graphique, il est possible de réaliser différents types de visualisation allant du tracé linéaire 2D simple au tracé de surface 3D. En plus de cela, MATLAB offre de nombreuses librairies de fonctions. Certaines sont au cœur de MATLAB et sont incluses dans toutes les versions. C’est le cas des fonctions d’algèbre linéaire. D’autres bibliothèques de fonctions sont plus spécialisées et sont souvent regroupées en boites à outils (Toolboxes). On peut notamment citer les boites à outils de robotique ou de traitement d’images. On peut acquérir différentes licences de MATLAB en fonction de l’utilisation finale et des boites à outils présentes.

MATLAB est un interpréteur : les instructions sont interprétées et exécutées ligne par ligne. MATLAB est un environnement de programmation complet avec de nombreux avantages tel qu’un outil de débogage qui permet, par exemple, l’exécution pas à pas des programmes ou des interfaces vers d’autres langages comme le C/C++. MATLAB fonctionne dans plusieurs environnements tels que Linux, Windows et Macintosh. Plusieurs versions (commerciales) sont disponibles désignées par X.yz. X indique que la version présente un changement majeur dans la philosophie, particulièrement dans le mode graphique. Par contre yz indique des changements mineurs ou des ajouts.

Introduction

1.2

7

Les premiers pas

Pour lancer l’exécution de MATLAB : il faut cliquer sur 1. Démarrage, 2. ensuite Programme, 3. ensuite MATLAB . Une fois lancé en mode graphique, MATLAB (version 8.10) se présente comme indiqué par la Figure (1.1). Une barre de menu apparait (par défaut) tout en haut suivie de trois fenêtres faisant apparaitre : — Command window : cette fenêtre se distingue par l’invite : ». — Directory : permet d’afficher l’arborescence des répertoires et fichiers. — History : indique l’historique des commandes exécutées. La date est affichée comme suit :%- -2/7/10 9:24- -% ( date suivie de l’heure de l’ouverture de la session, une session veut dire que MATLAB a été lancé). On peut restituer n’importe quelle commande (double clic sur la ligne correspondante). Il existe deux modes de fonctionnement : 1. mode interactif : Au niveau élémentaire, MATLAB peut être utilisé comme une calculatrice. MATLAB exécute les instructions au fur et à mesure qu’elles sont données par l’utilisateur. On écrit les commandes à la suite de l’invite  ; les calculs sont effectués lorsqu’on appuie sur la touche Entrée (Enter). Sur une ligne, on écrit une seule commande comme on peut aussi regrouper plusieurs commandes mais elle doivent être séparées par ';' (point virgule). 2. mode exécutif : MATLAB exécute ligne par ligne un "fichier .m" (programme en langage MATLAB ). En mode interactif ou calculatrice, les commandes sont saisies à la suite de l’invite :  qui apparaît dans la fenêtre Command window. En mode ligne de commande (ou mode calculatrice) les instructions sont exécutées une à une, de façon séquentielle lors de leur saisie au clavier. 9+7 ans= 16

MATLAB

8

F IGURE 1.1 – L’environnement de MATLAB (8.10)

Introduction

9

 sin(pi/4); ans = 0.7071 Si aucun argument de sortie n’est donné, le résultat est stocké dans la variable ans (abréviation de answer). La variable ans ne contient que le résultat de la dernière opération exécutée.

10+8 ans = 18 9+4 ans = 13 Lorsqu’on écrit la série de commandes suivantes :

20*5;20/5; aucun résultat n’est affiché, car le ';' en plus de son rôle de séparateur, supprime l’affichage des résultats. Si on écrit ans on obtient 4. Bien que l’opération 20*5 ait été précédemment exécutée, seul le résultat de la dernière opération 20/5 est sauvegardé dans la variable ans. Remarque 1: A l’aide des flèches du clavier (haut, bas), on peut faire appel aux lignes de commandes déjà exécutées (historique) sans les réécrire(Fig.1.2). Ceci n’est possible que si on est dans la même session (MATLAB n’a pas été fermé), dans le cas contraire l’historique permet de remonter à n’importe quelle commande.

1.3

Les variables

Pour sauvegarder un résultat intermédiaire, on lui associe un nom (paramètre ou variable) :

MATLAB

10

F IGURE 1.2 – Touches de rappel (les touches haut et bas permettent de se déplacer dans l’historique)

z=16+5 z= 21 A partir de ce moment MATLAB reconnaîtra la variable z. Sous MATLAB une variable est caractérisée par un nom : x, y, . . . . Ce dernier est limité à 61 caractères alphanumériques (tout dépend de la version MATLAB et de l’architecture du système). Variables prédéfinies Il existe un certain nombre de variables pré-existantes : • ans contient le dernier résultat de calcul si celui-ci n’a pas été affecté à une autre variable. √ • i et j représentent le complexe −1 s’ils n’ont pas déjà été prédéfinis. Remarque 2: Un nombre complexe peut s’écrire 2+3*i ou 2+3*j. Il n’est pas nécessaire d’écrire le signe de multiplication * avant i ( ou j). On peut écrire 2 + 3i au lieu de z = 2 + 3*i. Il est conseillé d’utiliser la première notation (sans le symbole de multiplication * et sans espace entre 3 et i) pour éviter toute ambiguïté, surtout si on a défini une variable i à laquelle on a affecté une valeur.

Introduction

11

Exemple :

 w=(-1)0.25 w = 0.7071 + 0.7071i  z=conj(w) z = 0.7071 - 0.7071i  real(z) ans = 0.7071  imag(z) ans = -0.7071  exp(i*pi) ans = -1.0000 + 0.0000i • pi représente le nombre π. • NaN (Not a Number) représente le résultat d’un calcul qui n’est pas numérique (Forme indéterminée 00 par exemple). • Inf représente la valeur infinie (Par exemple 1/0). • realmax donne la valeur maximale en valeur absolue qui peut être utilisée dans un calcul en double précision. Si le résultat positif d’une opération est supérieur à realmax alors MATLAB renverra : inf. Si le résultat negatif d’une opération est inférieur à -realmax alors MATLAB renverra : -inf. • realmaxmin donne la valeur maximale minimale en valeur absolue qui peut être utilisée dans un calcul en double précision. • eps représente la précision numérique relative eps=2−52 .

 realmin ans = 2.2251e-308  realmax ans = 1.7977e+308

MATLAB

12

 eps ans = 2.2204e-16 Remarque 3: Pour nommer une variable, il faut éviter les noms réservés de MATLAB . Il est préférable de commencer par un caractère alphabétique. On évite de commencer par un chiffre, sinon le compilateur comprend qu’il s’agit d’une opération arithmétique. Exemple : nommer une variable par 4xy n’est pas pratique.

MATLAB a été développé sur la base du langage C dans lequel majuscule et minuscule représentent deux variables différentes ( Key sensitive). Dans l’exemple ci-dessous, la variable x a été initialisée à 0.5. Si on écrit X (X majuscule) on obtient un message d’erreur. Exemple : x=0.25; X Undefined function or variable 'X'. Remarque 4: Les commandes MATLAB sont toujours en caractères minuscules. Pour une maîtrise plus rapide de MATLAB , il faut lire attentivement les message d’erreurs (en rouge dans la fenêtre des commandes). Les messages d’erreurs se répètent, ce qui permet des corrections plus faciles. Exemple :

 x=pi/4; y=sin(x) y = 0.7071 Remarque 5: Lorsqu’une expression ou une commande prend plus d’une ligne, on écrit à la fin de cette ligne de saisie trois points de suspension . . . pour indiquer que la saisie de la suite d’instructions continue à la ligne suivante.

Introduction

13

Variables existantes et mémoire — La commande who liste l’ensemble des variables définies lors de la session de travail. — whos fait la même chose en donnant en plus des renseignements sur la nature des variables. — la commande clear permet d’effacer des variables de l’espace mémoire. La commande clear x y supprime les variables x et y. La commande clear all (ou clear nom argument) efface toutes les variables de l’espace mémoire. — La commande clc permet d’effacer l’écran, sans effacer les variables. Prenons l’exemple suivant : on veut calculer l’expression T = x + 3y/z pour x = 1, y = 4 et z = 6. Pour cela, on effectue les opérations suivantes :

 x=1;y=4;z=6;  T=x+3*y/z T = 3 Si on veut calculer T pour x = 2, y = 8 et z = 4 et que l’on écrive (en oubliant de saisir la valeur de y) :

 x=2;z=4;  T=x+3*y/z T = 4 on obtient T = 4 alors que le résultat exact est T = 8. Le résultat erroné affiché correspond à y = 4 car la valeur y = 8 n’a pas été introduite. Pour vérifier il suffit de taper :

y y =

4

De même, si on efface la mémoire avec clear all ou clear, on obtient :

 clear all  x=2;z=6;  T=x+3*y/z ??? Undefined function or variable 'y'.

MATLAB

14

Si une valeur n’est pas attribuée à une variable ou un paramètre, le calcul ne s’effectue pas et un message d’erreur est généré. Cette particularité constitue un atout de MATLAB lors de la mise au point des programmes. Un autre avantage de MATLAB est lié au fait que l’utilisateur peut ne pas se préoccuper de l’allocation mémoire (pas de type ni de taille à déclarer). Remarque 6: Pour interrompre un calcul (pour une raison ou une autre, par exemple lorsque le calcul ne donne aucun résultat après un certain temps) on tape simultanément Ctrl C. Remarque 7: Généralement les erreurs de syntaxes les plus communes sont : oublier une parenthèse ou un opérateur (par exemple on écrit souvent par inadvertance 2h au lieu de 2 ∗ h) ou oublier le "." lors des opérations élément par élement. Format : En MATLAB les calculs sont toujours effectués en double précision (16 chiffres après la virgule). Mais l’affichage sur l’écran du nombre de décimales des nombres dépend du format. Le format est la forme sous laquelle un chiffre est affiché. Les formats possibles sont : • format short : 5/3 = 1.6667 (4 chiffres après le point) • format short e : (scientifique)1.3333e + 1 • format long : (14 chiffres après le point) • format long e : (scientifique)1.3...e + 1 • format bank : (2 chiffres après le point) • format rat : (rationnel) 7/5. • format compact : supprime les lignes vides pour avoir un plus grand champ d’affichage. Lorsqu’on applique un format d’affichage au début d’une session MATLAB tous les résultats seront affichés sous ce format jusqu’à ce qu’on le change avec la commande format. Par exemple, si on écrit :

format short 1/6 ans = 0.1667

Introduction

15

tous les résultats, durant cette session (i.e tant qu’on n’a pas relancé MATLAB ), seront donnés avec quatre chiffres après la virgule. Les trois principaux types de variables utilisés par MATLAB sont les types réel, complexe et chaîne de caractères. Il est inutile de déclarer le type d’une variable. Ce type est établi automatiquement à partir des valeurs affectées à la variable. Par exemple les instructions x = 2; z = 2+3i; rep = 'oui'; définissent une variable x de type réel, une variable z de type complexe et une variable rep de type chaîne de caractères.

1.4

Matrices

MATLAB est une abréviation de MATrix LABoratory. MATLAB est avant tout un programme de calcul matriciel. Une matrice est un objet mathématique représentant des données numériques dans un tableau. Pour MATLAB toute variable est considérée comme étant un tableau d’éléments d’un type donné (réel, complexe ou chaîne de caractères). Il y a essentiellement trois formes particulières de tableaux : — Les scalaires qui sont des tableaux à une ligne et une colonne, — les vecteurs qui sont des tableaux à une ligne ou à une colonne, — les matrices qui sont des tableaux ayant plusieurs lignes et colonnes. Les éléments d’un tableau peuvent être : — des nombres (réels ou complexes), — des caractères ou des chaînes de caractères (string). Exemples : — un scalaire est considéré comme une matrice 1 × 1, — un vecteur colonne de dimension n est considéré comme une matrice   x1 x2    n × 1 :  ..  . xn — un vecteur n est considéré comme une matrice  ligne de dimension  1 × n. : x1 x2 · · · xn — un tableau de m lignes et n colonnes :

MATLAB

16 

x11 x12  x21 x22  ··· ··· xm1 xm2 — une chaîne ractères de éléments.

 · · · x1n · · · x2n   · · · · · ·n  · · · xmn de n caractères est considérée comme un tableau de ca1 ligne et n colonnes, ou comme un vecteur ligne de n

Remarque 8: Il faut faire attention : dans MATLAB on différencie les vecteurs ligne et colonne. Une matrice m × n est un tableau de m lignes et n colonnes. Pour saisir une matrice au clavier : 1. on ouvre un crochet '[', 2. on saisit la première ligne en séparant les éléments d’une ligne par un espace ou par une virgule ',', 3. le passage d’une ligne à la suivante s’effectue par la frappe de la touche Entrée ou par le point-virgule 0 ;0 , 4. on termine la saisie par le crochet ']'. Par exemple pour définir la matrice Mat on écrit :

 Mat=[1 2 3 4;5 6 7 11;8 9 10 12;13 14 15 16] Le résultat affiché est

Mat= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 On peut accéder à l’élément se trouvant à l’intersection de la ligne i et de la colonne j en tapant Mat(i,j).

 Mat(2,3) ans = 7

Introduction

17

Un vecteur ligne s’écrit :  V=[1 2 3 4] V= 1 2 3 4 et un vecteur colonne  C=[1;2;3;4] C= 1 2 3 4 Taille des tableaux — L’instruction size permet de connaître les dimensions de la matrice,

 a=[1 2;3 4; 5 6] a= 1 2 3 4 5 6  size(a) ans = 3 2 Le premier nombre (3) indique le nombre de lignes et le second (2) correspond au nombre de colonnes. — l’instruction length donne la plus grande des deux dimensions.

 length(a) ans = 3 On obtient la longueur(i.e le nombre d’éléments) d’un vecteur C en écrivant : length(C).  length(C) ans = 4

MATLAB

18

La lecture des éléments d’une matrice se fait colonne par colonne. On peut construire une nouvelle matrice à partir de vecteurs. Par exemple

 A=[V,V,V] donne :

A= 1 2 3 4 1 2 3 4 1 2 3 4 qui est un vecteur ligne. Mais

 A=[V;V;V] nous donne la matrice :

A=

1 2 3 4 1 2 3 4 1 2 3 4

Il est possible de construire une matrice à partir de commandes MATLAB ou à partir de vecteurs et matrices donnés. Il est toutefois impératif de respecter les règles de combinaison de lignes et de colonnes (par exemple on ne peut pas construire une matrice à partir d’un vecteur ligne de trois colonnes avec un autre vecteur ligne de cinq colonnes). Une matrice est obligatoirement rectangulaire. Pour saisir une matrice on peut également : — utiliser des doubles crochets [ [ ] ; [ ] ]

a=[[1 2 3];[4 5 6]] a= 1 2 3 4 5 6 — ou utiliser une commande telle que :

Introduction

19

B=[[1 2 3]' [2 4 7]' [3 5 8]'] B =

1 2 3 2 4 5 3 7 8

Remarque 9: On peut discrétiser un intervalle avec un incrément régulier en faisant appel aux deux points ( :), x = [d ebut ´ : pas : f in]. Si on omet l’incrément 0 pas0 , par défaut il est pris égal à 1.

 v=1:5 v = 1 2 3 4 5  v=1:2:5 v = 1 3 5  y=0.5:-0.1:0 y = 0.5000 0.4000 0.3000 0.2000 0.1000 0 La fonction linspace(start,stop,npoints) permet d’avoir npoints régulièrement espacés entre start et stop.

 linspace(1,10,5) ans= 1.0000 3.2500 5.5000 7.7500 10.0000 Certaines matrices particulières peuvent être générées de façon automatique : • zeros(n) : matrice carrée n × n dont tous les éléments sont égaux à zéro.

 B=zeros(2) B = 0 0 0 0

MATLAB

20

Elle est souvent utilisée pour la réservation d’un espace mémoire pour les tableaux. • ones(n) : matrice carrée de rang n dont tous les éléments sont égaux à 1.

 ones(2) ans = 1 1 1 1 • rand(n) : matrice carrée de rang n dont tous les éléments sont donnés aléatoirement selon une distribution uniforme. • randn(n) : matrice carrée de rang n dont tous les éléments sont donnés aléatoirement selon la distribution normale. • eye(n): matrice carrée unitaire de rang n (tous les éléments sont nuls sauf ceux de la diagonale qui sont égaux à 1). C’est la matrice identité.

 eye(3) ans = 1 0 0 0 1 0 0 0 1 Pour la génération de ces matrices particulières, l’utilisation d’un seul argument génère des matrices carrées. Si on souhaite générer des matrices rectangulaires m×n, il suffit d’utiliser 2 arguments comme par exemple ones(m,n).

1.5 1.5.1

Opérations sur les matrices Opérations de calcul sur les matrices

On peut les classer en : — Opérations élémentaires définies au sens du calcul matriciel, représentées par les symboles +, -, ∗ , /, \ et ˆ. — Opérations qui permettent d’effectuer des multiplications et des divisions de matrices termes à termes, représentées par un point précédant

Introduction

21

les opérateurs de multiplication, de division et d’exponentiation : .∗ , ./ et .ˆ . Ces opérations constituent un outil très puissant pour gérer et effectuer des opérations avec des éléments de tableaux à l’aide d’instructions simples. Opérateurs matriciels Symbole Opération Exemple + Addition A+B Soustraction A-B * Multiplication A*B / Division gauche A/B \ Division à droite A\B ˆ Puissance Aˆ2 Symboles de calcul matriciel Exemple : Soit à calculer le volume d’une sphère de rayon R, défini par la formule : V = 4 3 3 πR où R = 4 cm. Pour calculer V , on exécute les commandes suivantes :

R=4  V=4/3*pi*R3 On obtient l’affichage suivant :

R = 4 V = 268.0826 Exemple : Pour calculer P(x) = 4x2 − 2x + 3/(x3 + 1) pour x = 2, on écrit les lignes de commande suivantes :  x=2  P=(4*x2-2*x+3)/(x3+1 ) On obtient :

MATLAB

22

x= 2 P = 1.6667 Priorité des opérations élémentaires — Priorité 1 : Les parenthèses internes sont évaluées avant les parenthèses extérieures, — Priorité 2 : Exponentiation, — Priorité 3 : Multiplication, division (même priorité), — Priorité 4 : Addition et soustraction (même priorité) Par exemple :

5+8/3*2 ans = 10.3333  (5+8)/3*2 ans = 8.6667 ne donnent pas le même résultat (pour le deuxième exemple (5 + 8) est évalué en premier). On ne peut faire la somme et la différence de deux matrices que si elles sont de même dimension :

U=[0.9575, 0.1576, 0.9572; 0.9649 0.9706 0.4854]; S=[0.8003 0.4218 0.7922;0.1419 0.9157 0.9595]; S=U+V S = 1.7578 0.5794 1.7494 1.1068 1.8863 1.4449 D=U-V D = 0.1572 −0.2641 0.1650 0.8230 0.0549 −0.4741 Si X et Y sont deux matrices, le produit X*Y ne peut avoir lieu que si le nombre de colonnes de la première est égal au nombre de lignes de la deuxième matrice.

Introduction

23

A=[0.2769 0.6948 0.0462 0.3171 0.0971 0.9502 0.8235 0.0344 ];  B=[0.6557, 0.8491, 0.6787;0.0357, 0.9340, 0.7577 ];  A*B ans = 0.2064 0.8841 0.7145 0.0416 0.3354 0.2716 0.0976 0.9700 0.7859 0.5412 0.7314 0.5850  B*A Error using * Inner matrix dimensions must agree. On peut effectuer la division de deux matrices par division à droite avec / ou division à gauche avec \. Si A est inversible, A/B correspond à A*inv(B) (le nombre de colonnes de A doit être le même que le nombre de colonnes de B ), tandis que A\B correspond à inv(A)*B (le nombre de lignes de A doit être le même que le nombre de lignes de B). inv(A) et inv(B) sont les matrices inverses de A et B respectivement. Exemple : a = [ 1 2 3 ; 4 5 6; 7 8 9]; b = [ 7 5 6 ; 2 0 8; 5 7 1]; c = a / b c= −0.52542 0.68644 0.66102 −0.42373 0.94068 1.01695 −0.32203 1.19492 1.37288 d = a \ b d = −3.27778 −1.05556 −4.86111 −0.11111 0.11111 −0.27778 3.05556 1.27778 4.30556 Exemple : La division matricielle est souvent utilisée pour la résolution d’un système d’équations. Pour résoudre le système d’équations suivant :

MATLAB

24 

3x + 2y = 2 4x + 7y = 3 on l’écrit sous   matricielle : A X = B où  une forme  3 2 x 2 A= ; X= ; B= . 4 7 y 3 La méthode de résolution formelle consiste à multiplier à gauche ces deux expressions par A−1 , soit A−1 A X = A−1 B =⇒ X = A−1 B Les commandes MATLAB permettant cette opération s’écrivent :

 A=[3 2;4 7] A = 3 2 4 7  B=[2;3] B = 2  X=A\B 3 X = 0.6154 0.0769  x=X(1) x = 0.6154  y=X(2) y = 0.0769

Opérateurs de calcul élément par élément Symbole Opération Exemple .* Multiplication A.*B ./ Division A./B .ˆ Puissance A.ˆ2 Symboles de calcul élément par élément Si deux matrices X et Y sont de même dimension, on peut effectuer le produit élément par élément en écrivant X.*Y. Le résultat de l’opération est une matrice de même dimension que X et Y dont les éléments sont égaux au produit

Introduction

25

des éléments correspondants de X et Y. Ceci est aussi vrai pour la division et la puissance. Exemple :

 C =[0.2760 0.6551 0.1190 0.6797 0.1626 0.4984];  D=[0.9597 0.5853 0.7513 0.3404 0.2238 0.2551]; C.*D ans = 0.2649 0.3834 0.0894 0.2314 0.0364 0.1271 D.*C ans = 0.2649 0.3834 0.0894 0.2314 0.0364 0.1271 Exemple : Si pour calculer P(x) = 4x2 − 2x + 3/(x3 + 1), avec x = [2, 3, 0.25], on écrit les lignes de commande suivantes :

 x=[2,3,0.25];  P=(4*x2-2*x+3)/(x3+1 ) on obtient : Error using  Inputs must be a scalar and a square matrix. To compute elementwise POWER, use POWER (.) instead. Pour obtenir un résultat correct, il faut mettre un point avant les opérateurs de multiplication, de division et d’exponentiation.

 x=[2,3,0.25];  P=(4*x.2-2*x+3)./(x.3+1 ) on obtient : P = 1.6667 1.1786 2.7077

MATLAB

26

1.5.2

Opérateurs de comparaison

Le résultat d’une opération de comparaison est 1 si le résultat de la comparaison est "VRAI" et 0 si le résultat de la comparaison est "FAUX". Cette comparaison peut porter sur des nombres, des vecteurs, des matrices ou des chaînes de caractères. Symbole == ∼= < > =

Test Exemple égal à A==B différent de A∼=B inférieur à AB inférieur ou égal à A=B

Opérateurs de comparaison Exemple :

a=5;b=1;c=5; a==b ans = 0 a==c ans = 1 a>b ans = 1

Remarque 10: Le résultat de a==b sera 0 si a est différent de b et 1 si a est égal à b. Par contre l’écriture a=b signifie que l’on remplace la valeur dans l’adresse mémoire a par celle contenue dans b. Exemple :

Introduction

27

   

a=1; b=4; a==b ans= 0  a=b;  a= 4 Si a et b sont deux matrices de même dimension, le résultat du test est une matrice de même dimension que a et b dont les éléments sont constitués de 1 ou de 0 selon que le résultat de la comparaison des éléments correspondants de a et b est VRAI ou FAUX. Exemple :

a=[1 a= 1 3 b=[2 b= 2 3 a==b ans= 0 1  a0.5) b = 1 Lors d’un test, toute variable non nulle est considérée comme une expression logique VRAIE : if a disp('a est non nul') else disp('a est nul') end a est non nul La fonction exist permet de savoir si une variable existe :

if exist('inconnu') inconnu=inconnu+1 else inconnu=0 end

Introduction

31

Il existe une séquence conditionnée sous forme d’alternatives dont la syntaxe est : ifexpression logique séquence d’instructions 1 else séquence d’instructions 2 end où — expression logique est une expression dont le résultat peut être VRAI ou FAUX, — séquence d’instructions 1 est la séquence d’instructions à exécuter dans le cas où expression logique est VRAIE, — séquence d’instructions 2 est la séquence d’instructions à exécuter dans le cas où expression logique est FAUX. Exemple :

a=5; forme='cercle'; if (forme=='carré'),surface= a2, else, surface=pi*a2, end

1.5.5

Fonctions de matrices

Si f est une fonction ( au sens mathématique), f (A) donne une matrice de la même taille que A dont les éléments sont les valeurs de f pour les éléments respectifs de A. Exemple :

 A=[2 3;6 7];log(A) ans = 0.6931 1.0986 1.7918 1.9459 La transposée d’une matrice A(m × n) est une matrice AT (n × m), telle que AT (k, l) = A(l, k). Pour calculer la matrice transposée de A on écrit T = A0 . La transposée d’un vecteur colonne est un vecteur ligne.

MATLAB

32 Exemple :

A =[0.5060 0.8909 0.5472 0.6991 0.9593 0.1386]; T=A' T = 0.5060 0.6991 0.8909 0.9593 0.5472 0.1386  V=linspace(1,5,5) V = 1 2 3 4 5 C=V' C= 1 2 3 4

Si la matrice A contient des nombres complexes, sa matrice transposée sera constituée des conjugués des éléments correspondants de A.

 A=[1 3+2*i; i 4-3i; 2i+1 3.53] A = 1.0000 3.0000 + 2.0000i 0 + 1.0000i 4.0000 − 3.0000i 1.0000 + 2.0000i 42.8750  A' ans = 1.0000 0 − 1.0000i 1.0000 − 2.0000i 3.0000 − 2.0000i 4.0000 + 3.0000i 42.8750

det(M) : calcule le déterminant de la matrice M.

Introduction

33

 M=[2 2 3;5 6 7;8 9 10] M = 2 2 3 5 6 7 8 9 10  det(M) ans = -3 diag(M) : donne la diagonale de M (sous forme de vecteur colonne).  diag(M) ans = 2 6 10 inv(A) : donne l’inverse de la matrice A. L’inverse d’une matrice n’existe pas toujours. Si le déterminant de la matrice est nul, la matrice inverse n’existe pas et la matrice est dite singulière. A = [ 1 2 3; 2 3 A = 1 2 3 2 3 4 1 2 5  det(A) ans = -2 B=inv(A) B = −3.5000 2.0000 3.0000 −1.0000 −0.5000 0

4; 1 2 5]

0.5000 −1.0000 0.5000

MATLAB

34

 A*B ans = 1 0 0 0 1 0 0 0 1  B*A ans = 1 0 0 0 1 0 0 0 1 Si la matrice est mal conditionnée on obtient un avertissement (warning) en orange :

Warning: matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 8.606380e-18. Remarque 12: Important : Pour la résolution de systèmes d’équations, utilisez toujours la commande A\B et jamais la commande inv(A)*B !

eig(M) : donne les valeurs propres et les vecteurs propres de la matrice M :  [v,e]=eig(M) v = -0.2164 -0.7127 -0.6096 -0.5490 0.6989 -0.3127 -0.8073 -0.0606 0.7284 e = 18.2648 0 0 0 0.2940 0 0 0 -0.5587 où les colonnes de v représentent les trois vecteurs propres correspondant aux valeurs propres définies par les éléments de la diagonale de e.

find est utile pour identifier simplement les éléments vérifiant un critère logique donné.

Introduction

35

Exemple :

A =[0.0377 0.3622 -0.9336 1.3339 -0.1812 -0.1574 -2.7588 -1.8077 3.0784] ans = 0.0377 0.3622 −0.9336 1.3339 −0.1812 −0.1574 −2.7588 −1.8077 3.0784 % Pour trouver les éléments positifs de A, on écrit : A(find(A>0)) ans = 0.0377 1.3339 0.3622 3.0784

1.5.6

Manipulation des matrices

Les opérations suivantes permettent d’extraire un élément ou un mini tableau à partir de la matrice Mat. Mat(end) permet d’accéder au dernier élément d’un tableau. Mat(2,3) : représente l’élément de la 2ème ligne et 3ème colonne. Mat(:,1) : donne tous les éléments de la première colonne. Mat(2,:) pour extraire la deuxième ligne. D=Mat(2:4,1:3) : sous-matrice construite à partir de la 2ème ligne à la 4ème et de la 1ère colonne à la 3ème colonne. Ce qui correspond à :

 D= Mat(2:4,1:3) D = 5 6 7 9 10 11 13 14 15 Mat(:) : donne les éléments de la matrice Mat sous la forme d’un vecteur colonne.

MATLAB

36

A=randn(2,3) D = 0.5377 −2.2588 0.3188 1.8339 0.8622 −1.3077  D(:) ans = 0.5377 1.8339 −2.2588 0.8622 0.3188 −1.3077 Pour modifier un élément on y accède directement :

   B

B=[1 2 3 4;5 6 7 11;8 9 10 12;13 14 15 16]; B(2,4)=0; B = 1 2 3 4 5 6 7 0 9 10 11 12 13 14 15 16

Pour éliminer une ligne ou une colonne on la remplace par []. Exemple : Pour éliminer la deuxième colonne de la matrice B, on écrit :

 B(:,2)=[ ] B= 1 3 4 5 7 0 9 11 12 13 15 16 Pour dupliquer une matrice on fait appel à la fonction repmat(A,i,j) où i correspond au nombre de répétitions des lignes et j au nombre de répétitions des colonnes.

Introduction

37

 A=[2 3;6 7];  K=repmat(A,2,2) K = 2 3 2 3 6 7 6 7 2 3 2 3 6 7 6 7 La matrice K contient deux fois le nombre de lignes et deux fois le nombre de colonnes de A. La concaténation (permet de fusionner deux matrices qui doivent avoir le même nombre de lignes) : [M, T ].

   L

1.6

M=[2 2 3;5 6 7;8 9 1]; H=[1 3 5;7 3 4;2 6 4]; L=[M,H] = 2 2 3 1 3 5 5 6 7 7 3 4 8 9 1 2 6 4

Aide

MATLAB est un langage de programmation en évolution continuelle. De ce fait, il ne pourrait exister un document unique qui englobe toute les commandes et possibilités offertes. Savoir chercher l’information en un temps le plus court possible est un enjeu indispensable pour la maîtrise de MATLAB . Trois techniques sont utilisées pour la recherche de l’aide : — Ligne commande : Cette méthode s’applique lorsque le syntaxe de la commande MATLAB est connue. Par exemple si on veut connaître l’usage de la commande tic on fait :  help tic On obtient

MATLAB

38

 TIC Start a stopwatch timer. TIC and TOC functions work together to measure elapsed time. TIC saves the current time that TOC uses later to measure the elapsed time. The sequence of commands: TIC operations TOC measures the amount of time MATLAB takes to complete the one or more operations specified here by "operations" and displays the time in seconds. See also toc, cputime. Reference page in Help browser doc tic — Mode graphique : Dans la barre du menu MATLAB , un double clic sur l’icône ? ouvre la fenêtre d’aide. Dans cette dernière un menu est offert en plus d’un moteur de recherche où on peut écrire le sujet de la recherche (en anglais). — Recherche web : Internet reste la meilleure source pour trouver une assistance rapide et efficace : — en utilisant un moteur de recherche (Google, Bing,....) avec les mots clés adaptés. — en consultant la documentation en ligne sur le site de la société MathWorks, à l’adresse URL : http://www.mathworks.fr/fr/help/index.html.

Introduction

39

Exercices Exercice 1 : Evaluer les expressions suivantes : 1. 4 + 5 + 6 2. 312 3. sin (0.1π) 4. (2 − (3 − 4(3 + 7(1 − 2(3 − 5))))) 5.

2 5

− 34 × 23 .

Exercice 2 : 1. Définir la variable x = π4 et calculer y1 = sin(x) et y2 = cos(x), puis z = tan(x) à partir de y1 et y2 .   2. Définir la variable x = π6 , π4 , π3 et calculer y1 = sin(x) et y2 = cos(x), puis z = tan(x) en utilisant exclusivement les vecteurs y1 et y2 précédents. Exercice 3 : Construire : 1. une suite partant de -8 et allant à -5 par pas de 0.25. 2. une suite décroissante d’entiers de 15 à 3. 3. une suite de longueur 100 de −π à π. Exercice 4 : Créer les matrices suivantes A :     1 2 3 −1 −2 −3 0 −1  , A =  0 0 1 , B =  0 1 0 0 −1 0 0 et calculer : 1. A + B, 2. A ∗ B, 3. A−2 , 4. A. ∗ B, 5. A/B.

MATLAB

40

Exercice 5 : Créer les matrices suivantes A :       1 2 −1 1 2 3 2 1 1 0  , B =  1 1 2  , C =  0 1 −1  , A= 0 1 3 −1 2 0 1 2 4 2 2 et calculer : 1. A+4BC, 2. l’inverse de chaque matrice si elle existe, 3. A3 , 4. le déterminant de C, 5. les valeurs propres et les vecteurs propres de B. Exercice 6 : Définir le vecteur V = [0 1 2 3 . . . 49 50]. 1. Quelle est la taille de ce vecteur ? 2. Définir le vecteur W contenant les cinq premiers éléments de V , 3. Définir le vecteur X contenant les cinq premiers et les cinq derniers éléments de V . 4. Définir le vecteur Z = [0 2 4 · · · 48 50] à partir de V . Exercice 7 : Résolution matricielle de systèmes linéaires. Résoudre matriciellement les systèmes suivants. Si MATLAB affiche un message d’erreur, dire pourquoi.   6x + y − 5z = 10 2x + 2y + 3z = 11 1.  4x − 9y + 7z = 12   6x + y − 5z = 10 2x + 2y + 3z = 2 2.  8x + 3y − 2z = 12  x + 2y + 3z + 4t = 1    2x + 3y + 4z + t = −2 3. −2x + 4y − 5z + 2t = 0    8x + y − z + 3t = 1

Introduction

41

Exercice 8 : Entrer la matrice

 A=[1 2 3 ; 2 3 1 ; 3 1 2 ] Quels sont les résultats des commandes suivantes ?

      

A([2 3],[1 3]) A([2 3],1:2) A([2 3],:) A([2 3],end) A(:) A(5) reshape(A(:),size(A))

Exercice 9 :



1 2 3 4 5 6  Définir la matrice M = 11 12 13 14 15 16 21 22 23 24 25 26  1  1. Extraire de cette matrice la matrice N = 11 21   8 9 10 2. Extraire de M la matrice P =  18 19 20  28 29 30   3 7 3. Extraire de M la matrice Q = . 23 27

 7 8 9 10 17 18 19 20  27 28 29 30  2 12  22

4. Extraire de la matrice M la matrice R obtenue en prenant dans la matrice M une colonne sur 2. Exercice 10 : Executer et commenter l’effet des instructions suivantes (Aidez-vous du help) :

MATLAB

42

                  

x=rand(1,5) mean(x) std(x) median(x) sort(x) A=rand(3) sort(A) [B, I]=sort(A) sort(A') max(A) max(A') max(max(A)) sum(A) cumsum(A) prod(A) diff(A) D=A([1,2],1:3) sum(D,1) sum(D,2)

Chapitre 2 Fonctions

L

a notion de fonction sous MATLAB fait l’objet de ce chapitre. Les exemples proposés permettent de saisir les notions de fonction inline, anonymous et l’importance des fichiers .m qui constituent un élément important dans la programmation d’applications sous MATLAB où les fonctions jouent le rôle des fonctions et procédures des langages de programmation usuels.

MATLAB

44

2.1

Introduction

Les fonctions sont des enchaînements de commandes MATLAB regroupées sous un nom de fonction permettant de commander leur exécution. On peut mettre dans une fonction un groupe de commandes destiné à être exécuté plusieurs fois au cours du calcul avec éventuellement des valeurs de paramètres différentes. Les premières fonctions que l’on rencontre dans MATLAB sont les fonctions internes, ou prédéfinies. Pour les utiliser, il faut connaître la syntaxe standard de MATLAB . A titre d’exemple la fonction exponentielle s’écrit exp(x) et le logarithme néperien log(x) :

 x=exp(1) x= 2.7183  log(x) ans= 1 Le logarithme décimal s’écrit log10(x).

 log10(10) ans= 1 On dispose également de fonctions permettant de manipuler des nombres complexes. Par exemple :

 x=-2+5i x = -2.0000 + 5.0000i  a=real(x) a = -2

Fonctions

45

 b=imag(x) b = 5  X=abs(x) X = 5.3852  alpha=angle(x) alpha = 1.9513

En général, les fonctions peuvent être : — des fonctions prédéfinies dans la bibliothèque de MATLAB , — des fonctions dites inline, définies par l’utilisateur dans le corps du programme, — des fonctions dites anonymes précédées par le symbole @, définies par l’utilisateur , — des fonctions enregistrées dans des fichiers externes indépendants appelés fichiers .m.

2.2

Fonctions prédéfinies

MATLAB contient une riche bibliothèque de fonctions prédéfinies. Pour les utiliser on doit connaître leur nom. L’aide en ligne dans la fenêtre de commande, en mode graphique ou à l’aide d’un moteur de recherche sur Internet, permettent de se documenter sur une fonction donnée. Les fonctions les plus courantes sont résumées dans les tableaux ci-dessous. Fonctions trigonométriques sin(x) cos(x) tan(x) asin(x) acos(x)

Description sinus d’un angle en radian cosinus d’un angle en radian tangent d’un angle en radian fonction inverse du sinus en radian fonction inverse du cosinus en radian

MATLAB

46 −π/2 ≤ atan(x) ≤ π/2 atan(x/y) : −π/2 ≤ atan2(x,y) ≤ π/2 sinus hyperbolique cosinus hyperbolique tangent hyperbolique arc sinus hyperbolique arc cosinus hyperbolique arc tangent hyperbolique

atan(x) atan2(x,y) sinh(x) cosh(x) tanh(x) asinh(x) acosh(x) atanh(x)

Fonctions trigonométriques

Autres fonctions abs(x) angle(x) sqrt(x) real(x) imag(x) conj(x) round(x) fix(x) floor(x)(x) ceil(x) rem(x,y) exp(x) log(x) log10(x)

Description Valeur absolue de x Argument du complexe x Racine carrée de x Partie réelle de x Partie imaginaire de x complexe conjugué de x arrondi entier de x arrondi par défaut de x arrondi au voisnage de −∞ de x arrondi au voisinage de +∞ de x Le reste de la division x/y exponentielle de base e Log (de base e) log (de base 10)

Autres fonctions mathématiques courantes

Dans le chapitre précédent nous avons déjà utilisé quelques fonctions relatives aux matrices, comme l’inverse ( inv(A)), le déterminant ( det(A)). D’autres fonctions sont disponibles.

Fonctions Commande det(A)

trace(A) rank(A) diag(A) norm(v) mean(A) sum(A) prod(A) max(A) min(A) length(A)

47 Description Renvoie le déterminant de A ; celleci doit être carrée. Renvoie la trace de A. Renvoie le rang de A (dimension de l’image de l’application associée à A). Renvoie la première diagonale de A. Renvoie la norme euclidienne de v ; v est un vecteur. Renvoie une liste contenant la moyenne des éléments de chaque colonne. Renvoie une liste contenant la somme des éléments de chaque colonne. Renvoie une liste contenant le produit des éléments de chaque colonne. Renvoie une liste contenant la valeur maximale de chaque colonne. Renvoie une liste contenant la valeur minimale de chaque colonne. Renvoie le maximum entre le nombre de lignes et de colonnes ; si A est un vecteur, length(A) est le nombre d’éléments dans le vecteur. Principales opérations sur les matrices.

2.3

Les fonctions inline

Une façon relativement simple pour définir une fonction sous MATLAB consiste à utiliser la commande inline qui permet d’écrire des expressions mathématiques dépendant d’un argument d’entrée. La syntaxe est : fonction=inline('expression','var')

MATLAB

48

— fonction est le nom de la fonction, — inline est le mot réservé pour définir une fonction inline, — expression est l’expression de la fonction sous sa forme mathématique, — var est le nom de la variable. Par exemple, la commande suivante permet de définir la fonction x 7−→ f (x) = x3 + x/5 + 1

 f=inline('x3+x/5+1','x') Si on veut calculer la valeur de cette fonction pour x = 5 on écrit

f(5) ans= 127 Pour pouvoir appliquer cette fonction à un vecteur il est nécessaire d’utiliser les opérateurs appropriés : .ˆ, .∗ et ./. Pour l’exemple précédent l’écriture générale est

f=inline('x.3+x/5+1','x') En appliquant cette fonction au vecteur ligne x = [0 : 0.3 : 1] on trouve :

f(x) f= 1.0000 1.0870 1.3360 1.9090 On peut également écrire :

f(0:0.3:1) La commande inline peut aussi être utilisée pour définir des fonctions qui dépendent de plusieurs variables :

Fonctions

49

f2=inline('x.3.*y+x/5+1+y','x','y') Inline function: f2(x,y) = x.3.*y+x/5+1+y  f2(3,2) ans = 57.6000

2.4

Les fonctions ’anonymes’

On utilise également les fonctions dites anonymes définies par la commande @. Cette fonction est dite anonyme car il n’est pas nécessaire de la sauvegarder dans un fichier. La syntaxe est :

nom_de_fonction=@(input_variable) (expression) où — le symbole @ définit la fonction anonyme nom_de_fonction, — input_variable est le nom de la variable d’entrée , — expression est l’expression mathématique de la fonction qui doit être écrite sur une seule ligne. Le résultat est un tableau (nombre, vecteur ou matrice) de la même taille que le tableau input_variable. Par exemple, le code suivant permet de définir 2 la fonction f (x) = ex (ln x)2 .

 f=@(x) exp(x.2).*(log(x)).2 f = @(x)exp(x2)*(log(x))2

Pour calculer la valeur de f en x = 2 ou pour v = [0.1 : 1.2 : 7.7] on écrit :

MATLAB

50

f(2) ans = 26.2318  v=[0.1:1.2:7.7]' v = 0.1000 1.3000 2.5000 3.7000 4.9000 6.1000 7.3000  f(v) ans = 1.0e + 23∗ 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 5.4996 % On change le format pour afficher plus de chiffres  format shortE  f(v) ans = 5.3552e + 00 3.7305e − 01 4.3492e + 02 1.5098e + 06 6.7575e + 10 4.7275e + 16 5.4996e + 23 % On remet le format sous sa forme initiale  format short On peut également définir une fonction anonyme de plusieurs paramètres.

Fonctions

51

Par exemple pour définir la fonction de Bessel de première espèce d’ordre n : Jn (x), on écrit :

 Jn=@(x,n) besselj(n,x) Jn = @(x,n)besselj(n,x) Valeur de J0 (π) :

 Jn(pi,0) ans = -0.3042 Valeur de J1 (π) :

 Jn(pi,1) ans = 0.2846 Valeurs de Jn (π) pour n = 0, 1, . . . , 3 :

 n=[0:1:3] n = 0 1 2 3  Jn(pi,n) ans = −0.3042 0.2846 0.4854 0.3335 Remarque 1: On utilise généralement les fonctions "anonymes" pour des morceaux de code très courts qui sont utilisés de façon répétitive. Les fonctions "inline" s’exécutent plus lentement que les fonctions "anonymes". Il est donc préférable d’utiliser les fonctions "anonymes" à chaque fois que cela est possible, d’autant plus qu’à partir de la version R2016b de MATLAB les fonctions "inline" sont considérées comme obsolètes et seules les fonctions "anonymes" peuvent être utilisées.

MATLAB

52

2.5

Fichier .m

L’essentiel du travail sous MATLAB consiste à créer ou à modifier des fichiers avec l’extension ".m" qui est l’extension standard pour les procédures MATLAB . Lorsque l’on réalise une tâche sous MATLAB , il est très souvent possible de le faire en utilisant uniquement la Command Window. Cependant lorsque cette tâche devient plus complexe (plusieurs dizaines de ligne de code) ou que l’on souhaite pouvoir la transmettre à un autre utilisateur, on utilise la fenêtre Editor pour créer un fichier .m qui contiendra toutes les instructions à exécuter

2.5.1

Edition de fichiers

Un fichier .m est soit un script ou une fonction (function en anglais). Un script est une suite de commande qui auraient pû être saisies directement dans la Command Window. Une fonction quant à elle permet d’étendre les possibilités au delà des fonctions prédéfinies. MATLAB offre la possibilité de sauvegarder une suite d’instructions dans des fichiers ayant l’extension .m, appelés fichiers .m. Il y a deux types de fichiers .m : les fichiers scripts et les fonctions. La notion de fichier script sera étudiée en détail dans le chapitre 4. Les instructions des fichiers function ne sont pas exécutées dans le Workspace courant mais dans un Workspace différent qui est créé à chaque fois que la fonction est appelée. Comme conséquence, on est obligés de transférer les variables de l’espace de travail Current Workspace vers le Workspace de la fonction et de spécifier explicitement les variables de retour, en d’autres termes on doit spécifier les arguments d’entrée et de sortie. Pour éditer un fichier .m, on choisit New ou Open à partir de File du menu. L’éditeur de MATLAB s’ouvre dans une fenêtre appelée MATLAB Editor dans laquelle on peut commencer à éditer un nouveau fichier ou charger en mémoire un fichier pré-existant sur le disque dur ou sur un autre support. Si on utilise l’option du menu New → function, l’éditeur s’ouvre directement selon la figure (Fig.2.1). Pour sauvegarder un ancien fichier il faut utiliser Save ; pour sauvegarder un nouveau fichier ou renommer un ancien fichier, il faut utiliser Save As. Le répertoire dans lequel les fichiers sont sauvegardés est appelé Working Folder.

Fonctions

53

F IGURE 2.1 – Edition d’un fichier function

2.5.2

Fichiers fonctions .m

La structure d’une fonction comporte nécessairement : — le mot réservé function ; — le nom de la fonction, par exemple mafonction ; — un ensemble de paramètres d’entrée e1, e2, ..., en ; — un ensemble de paramètres de sortie s1, s2, ..., sn ; Les arguments d’entrée et de sorties, s’ils existent, peuvent être un nombre, un vecteur, une matrice, une chaîne de caractères, ...). Exemple de lignes à saisir dans l’éditeur de MATLAB pour définir la fonction mafonction :

function [s1, s2, ...] = mafonction(e1, e2, ...) % Mettre ici les lignes commentaires à afficher % dans la fenêtre de commandes suite à une demande d'aide

MATLAB

54

% avec help mafonction. instruction1 instruction2 ... end Exemple : La fonction suivante appelée mafc permet le calcul de l’expression mathématique : f (x) = x4 + 2x − 5/x :

function y=mafc(x) % C'est ma première fonction % La fonction n'est pas définie pour x=0 y=x.^4+2*x-5./x; % deuxième série de commentaire L’argument de sortie est y et l’argument d’entrée est x. La fonction sous MATLAB a le nom ’mafc’. Il est préférable de sauvegarder cette fonction dans un fichier qui porte le même nom. D’ailleurs c’est le nom suggéré par MATLAB (En cliquant sur l’icône de sauvegarde représentée par une disquette ou bien en tapant simultanément Ctrl+s). La première série de commentaires sert à documenter la fonction, on y a accès avec la commande help mafc ou doc('mafc'). Exemple :

 help mafc C'est ma première fonction La fonction n'est pas définie pour x=0 Remarquons que seule la série de commentaires précédant la première instruction est affichée dans la Command Window. Remarque 2: Dans la fonction mafc, le point virgule a été introduit délibérément pour éviter l’affichage des résultats à l’intérieur du corps de la fonction. Pour pouvoir utiliser la fonction mafc, le fichier mafc.m doit avoir été sauvegardé dans le répertoire de travail (Current Folder). Pour évaluer cette fonction en x = 4 on écrit dans la fenêtre de commande :

Fonctions

55

 mafc(4) ans= 252.7500 ou bien

 x=4 x = 4  mafc(x) ans = 252.7500 Le paramètre d’entrée x est dit muet ; on peut utiliser n’importe quel nom de variable lors de l’appel à la fonction. Exemple :

 z=4 z = 4  mafc(z) ans = 252.7500 Le paramètre d’entrée x est une variable locale, on ne peut pas y accéder en dehors du fichier de la fonction. Dans l’exemple qui suit on autorise l’affichage de la valeur de x dans le corps de la fonction pour mettre en évidence la différence entre la variable x du Current Workspace et la variable x du Workspace de la fonction :

function y=mafc(x) % On affiche la valeur de x à l'intérieur de la fonction x y=x.^4+2*x-5./x;

MATLAB

56

 clear  x=10 x = 10  mafc(5) x = 5 ans = 621  x x = 10 la valeur 10 attribuée dans la Command Window, à la variable x ne sera pas visible à l’intérieur du corps de la fonction. C’est la valeur 5 qui a été transférée à la fonction qui sera attribuée à x à l’intérieur de la fonction. Lorsque la fonction est exécutée, on constate que la valeur de x définie dans la Command Window avant l’appel de la fonction n’a pas été modifiée. Prenons un autre exemple pour illustrer la notion de variable locale. Considérons la fonction :

function y=mafc(x) % On introduit un paramètre 'a' sans donner sa valeur y=a*x.^4+2*x-5./x; Si on veut calculer la valeur de la fonction pour x = 4, on obtient un message d’erreur :

 clear  mafc(4) Undefined function or variable 'a'. Error in mafc (line 4) y=a*x.4+2*x-5./x; Si dans la Command Window on donne à ’a’ une valeur

 a=1

Fonctions

57

on obtient le même message d’erreur car la variable a est locale, elle est définie uniquement dans le Workspace . Pour que a soit visible à l’intérieur de la fonction il faut déclarer a comme variable globale dans le Workspace et dans le corps de la fonction. Pour cela on utilise la commande global dans la fonction :

function y=mafc(x) global a % On déclare 'a' comme variable globale y=a*x.^4+2*x-5./x; et également dans la Command Window :

 global a Dans ce cas le calcul s’effectue.

 global a  a=1 a = hspace*0.3cm1  mafc(4) ans = 252.7500 Exemple : Ecrire un fichier function définissant la fonction mathématique y(x) = [e−x /(x2 + 1) + sin2 (x)]2 + 0.2

function y=fun(x) u=exp(-x)./(x.^2+1); v=sin(x).^2; w=u+v; y=w.^2+0.2;

MATLAB

58

Après avoir sauvegardé ce fichier sous le nom fun.m on peut évaluer la valeur de fun pour une variable quelconque var (nombre, vecteur ou matrice) en écrivant fun(var) dans la fenêtre de commande. Notons que les variables u,v et w, définies à l’intérieur du corps de la fonction, ne seront pas renvoyées dans le Current Workspace. Une fonction ne peut être appelée que si elle est sauvegardée dans le répertoire de travail (Working Folder) ou dans l’un des répertoires déclarés dans le path. Dans le cas contraire l’appel de la fonction génère le message d’erreur :

Undefined function or variable 'mafct'. Pour accéder à une fonction sauvegardée dans un répertoire intitulé par exemple monrepertoire, on signale ce répertoire et son chemin d’accès à l’aide de la commande :

 addpath C:\chemin\monrépertoire Dans une fonction on peut avoir plusieurs paramètres d’entrée et plusieurs paramètres de sortie. Exemple : On veut écrire une fonction permettant de passer des coordonnées cartésiennes (x, y) aux coordonnées polaires (ρ, θ ). Paramètres d’entrée — Abscisse x — Ordonnée y Paramètres de sortie p y2 — Rayon vecteur ρ = x2 + y — Argument θ = arctan x Pour réaliser cette opération, on écrit un fichier polaire.m contenant les lignes de commandes suivantes :

function [r,theta]=polaire(x,y) %fonction pour passer %en coordonnées polaires r=sqrt(x.^2+y.^2); theta=atan(y./x) ; Dans ce fichier :

Fonctions

59

— polaire : est le nom de la fonction, — function : est le mot réservé pour la définition de la fonction, — % : précède les commentaires accessibles à l’aide de help polaire, — r, theta : sont les paramètres de sortie — x, y : sont les paramètres d’entrée Pour l’utiliser à partir de la fenêtre MATLAB on écrit les instructions suivantes dans la fenêtre de commandes : — Si seul le rayon nous intéresse

 r=polaire(2,3) ou bien

 polaire(2,3) ans = 3.6055513 — Si on veut récupérer à la fois le rayon et l’angle

 [r,t]=polaire(2,3) r = .932 t= 3.6056 Exemple : Calcul de la moyenne d’un ensemble de nombres. On écrit le fichier fonction suivant :

function y=moyenne(x) % moyenne ou valeur moyenne y=sum(x)/length(x); Exemple d’appel de moyenne :

 z=1:99 moyenne(z) Exemple : Un fonction peut avoir plusieurs paramètres d’entrée et plusieurs paramètres de sortie.

60

MATLAB

function [A,C]=mafun2(E,F,G) % A et C deux matrices de sortie % E, F et G trois matrices d'entrée % La matrice A et le produit des matrices E et F A=E*F; % C correspond aux valeurs propres de G C=eig(G);

Remarque 3: Les variables des fonctions sont définies localement. Si deux fonctions sauvegardées avec deux noms de fichiers différents contiennent la même variable x, chacune des fonctions la considère indépendamment de l’autre. La commande nargin : permet de tester le nombre de paramètres d’entrée d’une fonction. Exemple :

function y=produit_somme(a,b,c) % Si nombre d'arguments d'entrée =2, on calcule la somme % Si nombre d'arguments d'entrée =3, on calcule le produit if (nargin3) disp('Erreur : il faut au moins 2 paramètres') else if nargin==2 y=a*b; else y=a+b+c; end end

Fonctions

61

 produit_somme(4.5) Erreur : il faut au moins 2 paramètres  produit_somme(4.5,2) ans = 9  produit_somme(4.5,2,-1) ans = 5.5000  produit_somme(4.5,2,-1,7) ??? Error using ==> produit_somme Too many input arguments. Des fonctions sans arguments de sortie peuvent être définies ; il suffit de donner le nom et l’argument d’entrée, quand il existe. Par exemple la fonction suivante, ne donne pas un résultat numérique ; elle efface l’écran et la mémoire de travail et affiche le message :

Attendre. Calculs en cours

function mafct3 % La fonction \texttt{clc} permet de rafraîchir la fenêtre %'command window' % la commande \texttt{clear} efface la mémoire % la commande \texttt{disp()} affiche un message clc clear all\index[command]{clear all} disp['Attendre. Calculs en cours']}

2.6

Sous-fonctions

Dans un même fichier function on peut avoir plusieurs fonctions. La première fonction est appelée fonction principale et les autres fonctions locales ou sous-fonctions. Celles-ci ont la même structure que les fonctions définies précédemment, mais ne sont pas accessibles en dehors de la fonction principale. Les sous-fonctions favorisent le partage de lignes de commandes, sans

MATLAB

62

multiplier inutilement les fichiers. L’ordre des fonctions n’a aucune importance. Les sous-fonctions et la fonction principale peuvent être définies dans n’importe quel ordre, à condition qu’elles soient dans le même fichier.

2.6.1

Fonctions locales

Une fonction locale est une fonction définie dans le même fichier que la fonction principale (portant le nom du fichier) mais qui n’est utilisable que localement dans la fonction principale, ou par d’autres fonctions locales de ce même fichier.

function y=mafct4(x) % --------Fonction principale : mafct4-----a=1.3; b=2; y=fct5(x)*(b*x)^a; end %--------Fonction secondaire : fct5----------------function z=fct5(t) z=log(t)/t; end La première fonction mafct4 fait appel à la deuxième fct5. Les noms des paramètres ne sont pas forcément les mêmes, puisqu’ils sont muets. la commande end indique le début et la fin de chaque fonction. On peut faire appel à plusieurs fonctions écrites dans le même fichier. Exemple : Le fichier function ci-dessous appelé statistiques.m contient une fonction principale, statistiques, et deux fonctions locales moyenne et mediane.

%----Fonction principale : statistiques---function [avg, med] = statistiques(x) n = length(x); avg = moyenne(x,n); med = mediane(x,n); end %------Fonction locale moyenne-------------

Fonctions

63

function a = moyenne(v,n) a = sum(v)/n; end %------Fonction locale mediane-------------function m = mediane(v,n) w = sort(v); if rem(n,2) == 1 m = w((n + 1)/2); else m = (w(n/2) + w(n/2 + 1))/2; end end La fonction principale statistiques détermine le nombre d’éléments n de la liste et le transfère aux fonctions locales moyenne et mediane qui calculent respectivement la valeur moyenne et la valeur médiane d’une liste. Exemple d’utilisation à partir de la fenêtre de commande :

 x=rand(1,100);  [moy med]=statistiques(x) moy = 0.4723 med = 0.4487

2.6.2

Fonctions imbriquées

Une fonction imbriquée (ou nested function) est une fonction qui est complètement contenue à l’intérieur d’un fonction appelée fonction parent. Par exemple, la fonction ci-dessous appelée fparent contient une fonction imbriquée appelée fimbriquee

function fparent disp('Nous sommes dans la fonction parent') fimbriquee function fimbriquee

MATLAB

64

disp('Nous sommes dans la fonction imbriquée') end end La différence essentielle entre les fonctions imbriquées et les autres types de fonction est qu’une fonction imbriquée peut accéder à des variables définies dans la fonction qui l’englobe, et les modifier. Les fonctions imbriquée peuvent ainsi modifier des variables qui n’ont pas été transmises en tant que paramètres lors de leur appel. Remarque 4: En général le mot end est facultatif à la fin d’une fonction principale. Toutefois lorsqu’on utilise des fonctions imbriquées, end est obligatoire à la fin de toutes les fonctions y compris la fonction principale.

2.7

Fonctions de fonctions

Le paramètre d’entrée d’une fonction peut lui-même être une fonction. Exemple : Calcul numérique de l’intégrale d’une fonction simple : il est possible de calculer numériquement l’intégrale d’une fonction préalablement définie, à l’aide de la commande integral.

   

f=@(x) exp(x)./(1+x.2) integral(f,-1,1) integral(f,-Inf,0) integral(f,0,Inf)

Commentaires : — La ligne de commande integral(f,a,b) calcule l’intégrale de f entre a et b, — Nous utilisons ici les opération ./ et . car il est nécessaire de pouvoir appliquer, terme à terme, la fonction f à une matrice. Exemple : Utilisation de la fonction fzero pour trouver une racine d’une fonction d’une

Fonctions

65

variable. Syntaxe d’appel :

x = fzero(fun,x0) x = fzero(fun,x0,options) x = fzero(fun,x0,options,P1,P2,...) [x,fval] = fzero(...) [x,fval,exitflag] = fzero(...) [x,fval,exitflag,output] = fzero(...) Description — fun peut aussi bien être une fonction inline, une fonction prédéfinie MATLAB , une fonction anonyme ou une fonction définie par un fichier function. — x = fzero(fun,x0) trouve un zéro près de x0, si x0 est un scalaire. La valeur x renvoyée par fzero est près d’un point où fun change de signe ou bien NaN si la recherche a échoué. — Si x0 est un vecteur à 2 composantes, fzero le considère comme un intervalle tel que fun(x0(1)) et fun(x0(2)) sont de signes opposés. Si ce n’est pas le cas il y a une erreur. — x = fzero(fun,x0,[],P1,P2,...) permet de passer des paramètres supplémentaires P1, P2, etc,... à la fonction fun. Exemple : 1. Trouver les zéros de la fonction p(x) = x2 − x − 2

p=inline('x2-x-2') p = Inline function: p(x) = x2-x-2  x=fzero(p,-2.5) x = -1  x=fzero(p,3) x = 2 Les zéros de p(x) = x2 − x − 2 sont x = −1 et x = 2.

MATLAB

66 2. Trouver un zéro de sin(x) au voisinage de x = 3

fun = @sin; % définition de la fonction x0 = 3; % point initial x = fzero(fun,x0) x = 3.1416 3. Trouver le zéro de la fonction cosinus entre 1 et 2.

fun = @cos; % définition de la fonction x0 = [1 2]; % intervalle initial x = fzero(fun,x0) x = 1.5708 Notons que cos(1) et cos(2) sont de signes différents. 4. Racine d’une fonction définie par un fichier function. Par exemple, pour trouver les zéros de f (x) = x3 − 2x − 5. — On crée d’abord dans l’éditeur un fichier appelé f.m

function y = f(x) y = x.^3 - 2*x - 5; — on sauvegarde ce fichier dans le répertoire de travail sous le nom f.m. — Pour rechercher le zéro au voisinage de x = 2, on écrit dans la fenêtre de commande :

fun = @f; % function x0 = 2; % initial point z = fzero(fun,x0) z = 2.0946 Si l’on cherche plusieurs racines, il sera nécessaire de modifier la valeur d’initialisation pour espérer trouver de nouvelles racines, d’où l’importance du choix de la valeur d’initialisation de la recherche.Une description plus détaillée de la fonction fzero est disponible dans l’aide en ligne.

Exercices Exercice 1 :  Définir la fonction h(x) = x sin πx 2 : — sous la forme d’une fonction inline, — sous la forme d’une fonction anonyme Exercice 2 : R Comment définir l’expression mathématique g(c) = 02π x sin

πx c



?

Exercice 3 : Créer un fichier function définissant la fonction k(x), et calculer sa valeur pour x = [−2.5,  0.25, 2.5]. si x ≤ −1,  0 ln(2 + x) si −1 ≤ x ≤ 1, k(x) =  sin(x) si 1 < x Exercice 4 : 1. Écrire un fichier .m pour la fonction x5 − 3 f1 (x) = √ x2 + 1 2. Dans la fenêtre de commandes, tester la fonction sur quelques valeurs, par exemple f1 (1) et f1 (0). 3. Créer un tableau x de valeurs allant de -5 à 5 par pas de 0.5 ; calculer les valeurs f1 (x). 4. Sauvegarder x et f1 (x) dans un tableau à 2 colonnes à l’aide de la commande save. 5. Dans la fenêtre de commande taper clc et clear, puis recharger les valeurs sauvegardées ; vérifier le bon déroulement de l’opération. Exercice 5 : Utiliser la commande quadl puis la commande integral pour calculer les intégrales suivantes : Z π

1.

esin x dx

0

2.

Z 1p

x3 + 1 dx

0

MATLAB

68

Exercice 6 : Proposer deux méthodes différentes d’utilisation de la commande fzero pour trouver les zeros de g(x) = x − cos(x) au voisinage de x = 1. Exercice 7 : Utiliser la commande fminsearch pour rechercher les minima au voisinage de [x1 , x2 ] = [−1.5, 2] de la fonction de deux variables : f2 = 100 x2 − x12

2

+ (1 − x1 )2

Chapitre 3 Graphisme

C

chapitre constitue une introduction aux commandes MATLAB qui permettent de tracer des graphes à deux et à trois dimensions, et de réaliser des animations. E

MATLAB

70

Les résultats d’expérimentations ou de calculs se présentent sous forme de données numériques ou d’expressions mathématiques qui sont le plus souvent difficiles à analyser sous leur état brut. Une représentation graphique de ces données en permet une meilleure analyse. La représentation "à la main" de ces données peut être une tâche ardue et souvent imprécise. MATLAB , comme beaucoup d’autres logiciels, offre une large palette d’outils permettant des représentations graphiques en 2D ou en 3D.

3.1 3.1.1

Graphes à deux-dimensions Tracé de fonction

La représentation graphique d’une fonction nécessite les trois étapes suivantes : 1. Spécifier l’intervalle des valeurs de la variable xmin ≤ x ≤ xmax , 2. Définir la fonction à représenter y = f (x), 3. Appeler la fonction MATLAB : plot(x,y). Par exemple pour tracer la fonction f (x) = x log(x + 1) sur l’intervalle [0, 5], il faut : 1. Spécifier l’intervalle des valeurs de la variable 0 ≤ x ≤ 4 en définissant le vecteur x par la commande : x=[xmin:incrément:xmax]. Le choix d’un petit incrément permet d’obtenir une courbe plus "lisse". Néanmoins pour un bon rendu il n’est pas nécessaire de choisir un incrément très petit. 2. Définir la fonction à représenter y = f (x) : y=x.*log(x+1). Attention à ne pas oublier le '.' avant l’asterisque '*' ! 3. Appeler la fonction MATLAB : plot(x,y).Cette instruction graphique ouvre une fenêtre dans laquelle sera affiché le résultat de cette commande. L’ensemble des commandes MATLAB suivantes permet d’obtenir le résultat de la figure (Fig.3.1).

 x=[0:0.1:4]; %x varie de 0 à 4 par pas de 0.1  y=x.*log(x+1);  plot(x,y)

Graphisme

71

7 6 5 4 3 2 1 0 0

0.5

1

1.5

2

2.5

3

3.5

4

F IGURE 3.1 – Graphe de y = x log(x + 1). On peut rendre cette figure plus lisible en ajoutant : — un quadrillage : grid on — un titre : title('Représentation de la fonction y=xlog(x+1)') (par défaut le titre est inséré en haut de la figure, on peut changer sa position). — des labels sur les axes : xlabel('x');ylabel('y') Voici un exemple de commandes qui donnent le résultat de la figure (Fig.3.2) :

      

x=[0:0.1:4]; y=x.*log(x+1); plot(x,y); grid xlabel('x') ylabel('y') title('y=x*log(x+1)')

MATLAB

72 y=x*log(x+1) 7 6 5 y

4 3 2 1 0 0

0.5

1

1.5

2 x

2.5

3

3.5

4

F IGURE 3.2 – Graphe de y = x log(x + 1) avec quadrillage et légendes. On peut aussi choisir le style et la police des caractères. MATLAB attribue par défaut une couleur et un style de ligne aux courbes. Le changement se fait par :

 plot(x,y,':k') Le signe ’:’ indique que la courbe est représentée par une ligne discontinue, tandis que 0 k0 signifie que la ligne est de couleur noire (black). Les styles de ligne, couleur et marqueur sont donnés dans les tableaux ci-dessous.

Symbole − −− : −.

Ligne trait plein pointillé long pointillé court pointillé mixte

Styles de ligne

Symbole Couleur r rouge g vert b bleu c cyan m magenta y jaune k noir w white Styles de couleur

Graphisme

73 Symbole + o * . x s d ^ v > < p h

Marqueur signe + cercle étoile point marque × carré losange triangle(haut) triangle(bas) triangle(droit) triangle (gauche) pentagone hexagone

Styles de marqueur

3.1.2

Superposition de 2 fonctions

On peut également tracer 2 ou plusieurs fonctions sur le même graphe. L’exemple suivant permet de tracer la fonction y = x ∗log (x + 1) et la fonction y = 5e−0.2x cos2 x

             

clear close clc x1=[0:0.1:4]; y1=x1.*log(x1+1); plot(x1,y1); grid on xlabel('x') ylabel('y') hold x2=[0:0.1:10]; y2=5*exp(-0.2*x2).*cos(2*x2).2; plot(x2,y2,'r-') legend('x*log(x+1)', '5*exp(0.2*x)*cos(2*x)2')

MATLAB

74

Le résultat est représenté sur la figure (Fig.3.3). 7

x*log(x+1) 5*exp(0.2*x)*cos(2*x)^2

6 5 y

4 3 2 1 0 0

1

2

3

4

5 x

6

7

8

9

10

F IGURE 3.3 – Représentation de deux fonctions sur un même graphe. La commande hold est nécessaire pour la superposition des deux courbes. En son absence la figure aurait été réinitialisée et on aurait obtenu uniquement la deuxième courbe car, par défaut, une nouvelle instruction graphique telle que plot provoque un nouveau tracé en effaçant le tracé précédent. Enfin la commande legend('chaine1', 'chaine2) permet d’afficher sous forme d’étiquette les définitions des deux fonctions. Une variante de plot permet d’obtenir les deux courbes avec une seule ligne : plot(x1,y1,x2,y2). Par défaut MATLAB attribue la couleur bleue à la première courbe et verte à la seconde. La figure (Fig.3.4) représente le résultat obtenu à partir des lignes de commande suivantes :

     

x=[0:0.1:4*pi]; y1=sin(x); y2=cos(x); plot(x,y1,x,y2) xlabel('x'); legend('sin(x)','cos(x)')

Graphisme

75 1 0.8 0.6 0.4 0.2 0 −0.2 −0.4 −0.6 −0.8 −1 0

sin(x) cos(x)

2

4

8

6

10

12

14

x

F IGURE 3.4 – Graphe de y1 = sin x et y2 = cos x. On remarque que pour cet exemple les axes ne s’adaptent pas aux valeurs extrémales des abscisses. La commande MATLAB axis([xmin xmax ymin ymax]) permet d’afficher la portion de courbe désirée. Par exemple si on veut représenter la courbe précédente dans le cadre défini par 0 ≤ x ≤ 4π et −1.2 ≤ y ≤ 1.2, il suffit d’écrire :

 axis([0 4*pi -1.2 1.2 ]); pour obtenir le résultat de la figure (Fig.3.5). 1.2 sin(x) 1 cos(x) 0.8 0.6 0.4 0.2 0 −0.2 −0.4 −0.6 −0.8 −1 −1.2 0 1 2 3 4 5 6 7 8 9 10 11 12 x

F IGURE 3.5 – Résultat de la commande axis([0 4*pi -1.2 1.2 ])

MATLAB

76 Remarque 1:

Lorsque l’expression de la fonction y = f (x) contient un produit, une puissance ou une exponentiation, l’omission du point '.' dans l’expression de y génère un message d’erreur car la variable x pour plot est un vecteur.

3.1.3

La fonction fplot

Dans les exemples précédents, pour représenter une fonction y = f (x)), nous avions d’abord construit le vecteur x puis le vecteur y = f (x) et utilisé la fonction plot(x,y). La commande fplot('fonction',[xmin xmax]) permet d’obtenir le tracé plus simplement avec une optimisation du choix de l’intervalle permettant ainsi une meilleure représentation de la fonction. L’exemple ci-dessous permet de représenter les oscillations amorties d’un système dynamique définies par x = e−2t sin(5t) (Fig.3.6) :

 close  fplot('exp(-2*t)*sin(5*t)',[0,4])  grid  xlabel('t')  ylabel('f(t)')  title('Oscillations amorties')

Oscillations amorties 0.6 0.5 0.4

f(t)

0.3 0.2 0.1 0 −0.1 −0.2 0

0.5

1

1.5

2 t

2.5

3

3.5

4

F IGURE 3.6 – Graphe de x = e−2t sin(5t) avec fplot( )

Graphisme

77

Une autre syntaxe de la commande fplot est fplot(@f,[xmin xmax]) où f est le nom du fichier script qui définit la fonction à représenter graphiquement. Par exemple soit une fonction définie par le fichier script mafct :

function y=mafct(x) y=cos(1./x); La ligne de commande suivante nous donne la figure (Fig.3.7) :

y=cos(1/t)

 fplot(@mafct,[0.01 2])  xlabel('t')  ylabel('y=cos(1/t)')

1 0.8 0.6 0.4 0.2 0 −0.2 −0.4 −0.6 −0.8 −1

0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 t

F IGURE 3.7 – Graphe de y = cos(1/t) avec fplot() Une autre variante, faisant appel à la notion de fonction anonyme, permet de définir la variable indépendante, t par exemple, et évite de créer un fichier.m :

 sn = @(t) sin(1./t);  fplot(sn,[0.01,0.1]) Le résultat obtenu est représenté sur la figure (Fig.3.8).

MATLAB

y=sin(1/t)

78 1 0.8 0.6 0.4 0.2 0 −0.2 −0.4 −0.6 −0.8 −1

0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 t

F IGURE 3.8 – Graphe de y = sin(1/t) avec fplot()

3.1.4

Courbes paramétrées

La commande plot permet aussi de représenter graphiquement des fonctions paramétrées. Prenons par exemple deux variables x et y qui dépendent d’un paramètre θ , définies par x = cos(θ ) et y = sin(θ ). On souhaite faire la représentation graphique de y en fonction de x pour 0 ≤ θ ≤ π. Les commandes suivantes :

      

theta=0:0.1:pi; plot(cos(theta),sin(theta)) axis equal %axes x et y avec la même échelle axis([-1 1 0 1]) xlabel('x=cos(\theta)') ylabel('y=sin(\theta)') title('Courbe paramétrée')

permettent d’obtenir le résultat de la figure (Fig.3.9).

Graphisme

79 Courbe paramétrée 1

y=sin(θ )

0.8 0.6 0.4 0.2 0 −1 −0.8 −0.6 −0.4 −0.2 0

0.2 0.4 0.6 0.8

1

x=cos(θ )

F IGURE 3.9 – Courbe paramétrée : x = cos θ , y = sin θ , 0 ≤ θ ≤ π.

3.1.5

Tracé en coordonnées polaires

Les tracés en coordonnées polaires (r, θ ) sont obtenus à l’aide de la commande polar( , ). Les commandes suivantes permettent de tracer la spirale d’Archimède (Fig.3.10) définie par r = aθ où

     

close a=2; theta = [0:pi/90:2*pi]; rho = a*theta; polar(theta,rho) title('Spirale dArchimede : \ rho=2\ theta')

Spirale d’Archimede : ρ=2θ

F IGURE 3.10 – Graphe de la spirale d’Archimède en coordonnées polaires.

MATLAB

80

3.1.6

Tracé en échelle semi-logarithmique ou log-log

Pour tracer en échelle semilogarithmique la fonction 1 g(ω) = r 2 1+ ω ω2 0

on utilise les lignes de commande suivantes (Fig.3.11) :

w0=1; w=[0:0.1:100]; g=1./sqrt(1+(w/w0).2); semilogx(w,g) grid xlabel('\omega/\omega_0'), ylabel('g(\omega)')

g(ω)

      

1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 10−1

100

101

102

ω/ω 0

F IGURE 3.11 – Représentation en échelle semi-logarithmique. Parfois on souhaite une représentation en échelle log-log ; la commande loglog() permet d’obtenir ce type de représentation. Les lignes de commandes suivantes permettent d’obtenir le résultat de la figure (Fig.3.12) :

Graphisme

81

 w0=1;     

w=[0:0.1:100]; g=1./sqrt(1+(w/w0).2); loglog(w,g) grid xlabel('\omega/\omega_0')

 ylabel('g(\omega)')  title('Représentation en échelle log-log.')

g(ω)

100

10−1

10−2 −1 10

100

101

102

ω/ω 0

F IGURE 3.12 – Représentation de g(ω) =

r 1 2 1+ ω 2

en échelle lo-

ω0

garithmique.

3.1.7

Remplissage

Pour colorier une surface fermée, on peut utiliser la commande area. Cette instruction peut être utilisée, par exemple, pour mettre en évidence l’espace compris entre une courbe mathématique et une droite y = constante. Dans l’exemple ci-dessous la commande area permet de colorier en gris l’es-

MATLAB

82

pace correspondant aux valeurs de la fonction sinus supérieures à la valeur 0.5. Figure(3.13)

x = 0:.01:4*pi; y = sin(x); niveau = 0.5; plot(x, y) hold on area(x, max(y,niveau), niveau, 'EdgeColor', 'none', 'FaceColor', [.7 .7 .7])

1

0.8

0.6

0.4

0.2

0

−0.2

−0.4

−0.6

−0.8

−1 0

2

4

6

8

10

12

14

F IGURE 3.13 – Exemple d’utilisation de la commande area

3.1.8

Cas de données discrètes

Souvent les graphes à tracer correspondent à des résultats expérimentaux ou de calculs numériques se présentant sous la forme de deux listes de valeurs numériques discrètes. Ces valeurs doivent être rangées dans deux vecteurs x et y de même dimension. La commande MATLAB plot(x,y) permet d’obtenir un graphe de y en fonction de x. Considérons à titre d’exemple le vecteur x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] auquel correspond le vecteur y = [0, 3, 8, 15, 24, 35, 48, 63, 80, 99]. Les lignes de commande MATLAB suivantes permettent d’obtenir un graphe de y en fonction de x. L’option '-+' permet d’obtenir des '+' reliés par un trait continu (Fig. 3.14).

Graphisme

83

y

 x=[1,2,3,4,5,6,7,8,9,10];  y=[0,3,8,15,24,35,48,63,80,99];  plot(x,y,'-+'), xlabel('x'), ylabel('y') 100 90 80 70 60 50 40 30 20 10 0 1

2

3

4

5

7

6

8

9

10

x

F IGURE 3.14 – Variation de y en fonction de x

y

Les commandes bar(x,y) et stem(x,y) permettent d’obtenir les représentations des figures (Fig.3.15) et (Fig.3.16). 100 90 80 70 60 50 40 30 20 10 0

1

2

3

4

5

6 x

7

8

9 10

F IGURE 3.15 – Variation de y en fonction de x avec la commande bar()

MATLAB

y

84 100 90 80 70 60 50 40 30 20 10 0 1

2

3

4

5

6

7

8

9

10

x

F IGURE 3.16 – Variation de y en fonction de x avec la commande stem()

3.1.9

La commande subplot

La visualisation de plusieurs graphes sur une même figure est possible grâce à l’instruction subplot(n1 , n2 , n). La figure se présente comme un tableau contenant n1 graphes sur la ligne et n2 graphes sur la colonne, donc le nombre total de figures est n1 ×n2 . Le nombre n indique le numéro du graphe ; les graphes sont numérotés de la gauche vers la droite et du haut vers le bas. L’exemple suivant permet d’illustrer cette notion avec 4 graphes sur 2 lignes et 2 colonnes (Fig.3.17).  x=0:0.1:5; y=x.2;  subplot(221), plot(x,y),  xlabel('x'), ylabel('y'), title('y=x2')  x=0:pi/10:5*pi; y=cos(x);  subplot(222), plot(x,y)  xlabel('x'), ylabel('y'), title('y=cos(x)')  axis([0 5*pi -1 1])  x=0:pi/10:4*pi; y=sin(x);  subplot(223), plot(x,y)  xlabel('x'), ylabel('y'), title('y=sin(x)')  axis([0 4*pi -1 1])

Graphisme

   

85

x=0:0.1:10; y=sqrt(1+x.2) subplot(224), plot(x,y) xlabel('x'), ylabel('y'), title('y=sqrt(1+x2)') axis([0 10 1 10])

y=x2

y=cos(x) 1

20

0

y

y

0.5

10

−0.5 0

0

2

4

−1

6

0

10 x y=sqrt(1+x2 ) 5

1

10

0.5

8

0

6

y

y

x y=sin(x)

4

−0.5 −1

15

2 0

10

5 x

0

2

4

6

8

10

x

F IGURE 3.17 – Plusieurs graphes avec subplot(22n)

3.2

Graphes 3D

MATLAB peut générer des graphes plus sophistiqués : graphes de contour, graphes en 3D sous formes de surfaces, etc...

3.2.1

plot3()

La fonction plot3 est utile pour la représentation en trois dimensions de trois fonctions dépendant d’un paramètre unique. Par exemple une fonction hélicoïdale circulaire est définie par   x = cos(ωt) y = sin(ωt)  z = αt

MATLAB

86

On peut obtenir sa représentation graphique à l’aide des commandes suivantes (Fig.3.18).

     

t=0:0.01:10; x=cos(4*t); y=sin(4*t); z=(0.2*t); plot3(x,y,z) xlabel('x'),ylabel('y'), zlabel('z')

2

z

1.5 1 0.5 0 1 0.5 y

0 −0.5

−1 −1

−0.5

0.5

0

1

x

F IGURE 3.18 – Tracé d’une hélice avec plot3()

3.2.2

Contour

Le type contour représente les lignes de contour (ou de niveau) d’une fonction de deux variables sans colorier le plan de représentation. Par exemple, soit z une fonction de deux variables x et y définie par z = f (x, y). La première étape consiste à générer le maillage du plan xy dans un domaine donné, avec un incrément donné. Supposons que nous désirions représenter une fonction quelconque z = f (x, y) dans le domaine −5 ≤ x ≤ 5 et −3 ≤ y ≤ 3 avec le même incrément égal à 0.1. Le maillage du plan xy est réalisé à l’aide de la commande MATLAB meshgrid(). La seconde étape consiste à définir la fonction z = f (x, y).Il faut ensuite appeler la commande contour(x,y,z).Le résultat de la figure (Fig.3.19)est obtenu avec les lignes suivantes :

Graphisme

87

 [x,y]=meshgrid(-2:0.01:2,-2:0.01:2);  z=x.*exp(-x.2-y.2);  contour(x,y,z,'ShowText','on')

2 0 -0.1

0.1

0.4

0.2

0.1 0

-0.4

0.2

0.1

0.3

0.3

-0. -0.3 2

−1

0.2 0.1

-0.1

0

−2 −2

0.1

-0.3

-0.1

0

-0.2

-0.2 -0.1

1

−1.5

−1

−0.5

0

0.5

1

F IGURE 3.19 – Tracé de contour de z = xe−x

3.2.3

1.5

2

2 −y2

Surfaces

Une fonction z = f (x, y) peut également être représentée sous forme de surface. Plusieurs commandes MATLAB permettent d’obtenir différentes représentations :  mesh(x,y,z) permet d’obtenir une surface z maillée aux nœuds [x, y],  meshc(x,y,z) permet d’obtenir une surface z maillée aux nœuds (x, y) avec projection des contours sur le plan défini par x et y,  surf(x,y,z) permet d’obtenir une surface z pleine aux nœuds [x, y]. Les lignes suivantes permettent d’obtenir la figure (Fig.3.20)

    

[x,y]=meshgrid(-2:0.2:2,-2:0.2:2); z=z=x.*exp(-x.2-y.2); subplot(131), mesh(x,y,z), title('mesh(x,y,z)') subplot(132), meshc(x,y,z), title('meshc(x,y,z)') subplot(133), surf(x,y,z), title('surf(x,y,z)')

MATLAB

88 mesh(x,y,z)

meshc(x,y,z)

surf(x,y,z)

0.5

0.5

0.5

0

0

0

−0.5 2

−0.5 2 2

1

−0.5 2

1

0

2

1 1

0

0 −1

−1 −2

−2

2

1 1

0

0 −1

−1 −2

−2

0 −1

−1 −2

−2

F IGURE 3.20 – Figures avec mesh, meshc et surf

Remarque : La commande clf annule toutes les commandes graphiques ( subplot, hold, ...) et efface la fenêtre graphique.

3.3 3.3.1

Gestion des fenêtres graphiques Ouverture-fermeture

Une instruction graphique ouvre une fenêtre dans laquelle est affiché le résultat de cette commande. Par défaut, une nouvelle instruction graphique sera affichée dans la même fenêtre et supprime la figure précédente. On peut ouvrir une nouvelle fenêtre graphique par la commande figure. Chaque fenêtre se voit affecter un numéro n. Ce numéro est visible dans le bandeau de la fenêtre sous forme d’un titre. Le résultat d’une instruction graphique est par défaut affiché dans la dernière fenêtre graphique ouverte qui est la fenêtre graphique active. On rend active une fenêtre graphique précédemment ouverte en exécutant la commande figure(n ), où n désigne le numéro de la figure. La commande close permet de fermer la fenêtre graphique active. On ferme une fenêtre graphique précédemment ouverte en exécutant la commande close(n ), où n désigne le numéro de la figure. Il est également possible de fermer toutes les fenêtres graphiques en tapant close all ou tout simplement close.

Graphisme

3.3.2

89

Sauvegarde sous un format d’impression

Une figure peut être sauvegardée sous plusieurs formats d’impression. Cette sauvegarde peut être exécutée directement à partir de la fenêtre de commande. La syntaxe est print -dformat nomfichier où format représente le format d’impression et nomfichier le nom du fichier de sauvegarde, par exemple : print -dps dessin : enregistre le graphique en PostScript dans un fichier dessin.eps qui peut être visualisé en utilisant le logiciel GhostView, print -dmeta : enregistre le graphique dans un fichier dessin.emf print -dpdf dessin : enregistre le graphique dans le fichier dessin.pdf print -dpng dessin : enregistre le graphique dans le fichier dessin.png. Ces fichiers pourront par la suite être soit imprimés soit inclus dans un document de traitement de texte, mais ils ne pourront pas être modifiés à partir de MATLAB .

3.3.3

Sauvegarde dans un fichier au format MATLAB (.fig)

A la suite d’une commande de représentation graphique, une fenêtre graphique s’ouvre sur laquelle apparaît la figure dont on a demandé la représentation. Cette représentation peut être modifiée à partir de la barre des menus. A l’aide de la souris et par une suite de clics, il est possible d’ajouter un titre, changer le style des traits, ajouter une légende, etc... On peut sauvegarder cette figure dans un fichier avec l’extension .fig, que l’on pourra ouvrir ultérieurement pour une éventuelle modification. Pour effectuer cette sauvegarde, il suffit de cliquer sur la commande Save as du menu File de la fenêtre graphique et entrer un nom de fichier avec l’extension .fig dans l’encadré qui apparaît. Ce fichier pourra par la suite être visualisé à l’aide de la commande Open du menu File.

3.4 3.4.1

Animation comet

La commande comet sert à représenter une trajectoire dans le cas de l’évolution d’un tracé en fonction d’un paramètre. Cette commande permet de suivre l’évolution temporelle dans l’environnement figure. Le résultat est un

MATLAB

90

graphique animé dans lequel un cercle (la tête de la comète) trace les données sur l’écran. Le corps de la comète est un segment qui suit la tête en traçant la fonction avec une ligne pleine (la queue de la comète).

   

3.4.2

r=0:0.01*pi:2*pi; figure;axis equal;axis([-1 1 -1 1]); hold on; comet(cos(r),sin(r))

movie

On peut créer une animation en sauvegardant ses différentes séquences dans un tableau, ou un fichier, qui sera lu avec la commande movie.

 x=0:0.01:1; % La figure est tracée et sauvegardée plusieurs fois for j=0:50 plot(x,sin(j*pi/5)*sin(pi*x)),axis([0,1,-2,2]) % chaque représentation constitue une séquence % qui sera sauvegardé dans le tableau M M(j+1)=getframe; end Pour visionner l’animation, il suffit de taper :

 movie(M)

Graphisme

91

Exercices Exercice 1 : Tracer le graphe des fonctions suivantes sur des figures différentes : 1. y = 3x3 + 2x2 − 5 pour −4 ≤ x ≤ 4 2

2. y = e−x pour −5 ≤ x ≤ 5  3. y = x ln x2 + 1 pour x ∈ [0, 10] Exercice 2 : Tracer le graphe des fonctions suivantes sous la forme de 4 graphes sur la même figure. x 1. f (x) = pour x ∈ [−2, 2], 1 + x2 2. y = x3 + 3x2 − 3x − 1 pour x ∈ [−3, 4], 3. y = cos (xx ) − sin (ex ) pour x ∈ [0.5, 2.5], 4. f (x) = ex − x3 − 1 pour x ∈ [−1.5, 5]. Exercice 3 : Soit f et g les fonctions définies sur l’intervalle [0, 10] par x f (x) = e−x/25 et g(x) = cos 10 Tracer ces deux fonctions à l’aide de fplot : — d’abord dans une même fenêtre mais sur des graphes différents, — puis dans une même fenêtre mais sur le même graphe. Exercice 4 : Tracer les courbes suivantes sous la forme de 4 graphes sur une seule figure (quand 2 courbes sont indiquées, les superposer sur le même graphe) √ 1 1. y = x2 − x et y = x − pour x ∈ [1, 3] x 2. y = sin (sin (x)) pour x ∈ [0, 2π] 3. y = J0 (x) et y = J1 (x) (J0 et J1 sont les fonctions de Bessel de première espèce) pour x ∈ [0, 10π]  hπ i sin x + π4 √ 4. y = J0 (x) et y = pour x ∈ , 10π x 4

MATLAB

92 Exercice 5 : Pour x ∈ [−2, 2], tracer la courbe de la fonction suivante :   1 + x x ∈ [−1, 0] 1 − x x ∈ [0, 1] y=  0 ailleurs Exercice 6 : Tracer la courbe paramétrée définie dans le plan xoy par :  x = t 2 − 3t pour − 4 ≤ t ≤ 4 y = t 3 − 9t

Exercice 7 : Tracer sur la même figure mais sur trois graphes différents les fonctions suivantes définies en coordonnées polaires par : 1. r = 1 + e cos θ 1 2. r = 1 + e cos θ 3. r = sin (2θ ) cos (2θ ) On prendra e = 0.5 Exercice 8 : Afficher la surface définie par la fonction suivante :   −3 ≤ x ≤ 3 et z = 4x2 ey − 2x4 − e−4y pour  −1 ≤ y ≤ 1 Exercice 9 : Afficher la surface définie par : z = sin(x) cos(y) pour x ∈ [0, 1] et y ∈ [2, 5] Exercice 10 : 1. Utiliser la commande randn() pour tirer 100 couples de points (x, y) aléatoirement dans le carré [0, 1] × [0, 1]. 2. Représenter le nuage de points obtenus dans une fenêtre graphique.

Graphisme

93

3. Calculer le centre de gravité G du nuage de points et l’ajouter, en rouge, sur la figure. 4. Sauvegarder la figure sous le nom nuage.fig. Fermer la fenêtre graphique et ouvrir le fichier nuage.fig. 5. Sauvegarder x, y et les coordonnées du point G dans un fichier sauv.mat. Effacer de la mémoire x, y et les coordonnées du point G. Charger sauv.mat pour les récupérer.

Chapitre 4 Programmation

C

chapitre présente les techniques élémentaires de programmation sous MATLAB ainsi que des techniques plus avancées pour optimiser les programmes MATLAB en les rendant plus efficaces et plus conviviaux. E

95

MATLAB

96

Un programme est un ensemble d’instructions liées par des relations pour réaliser un objectif donné. Un programme MATLAB est sauvegardé dans un fichier script ou fichier .m.

4.1

Script

Pour créer ou ouvrir un script ou fichier .m : — En mode graphique : on clique deux fois sur l’icône New Script, — En ligne commande : on écrit dans la fenêtre de commande :

edit('nom_du_script.m') MATLAB demande alors l’autorisation de créer ce script si celui-ci n’existe pas. Dans tous les cas la fenêtre de l’éditeur MATLAB s’ouvre. Dans cette fenêtre on écrit la suite des instructions du programme que l’on sauvegarde selon la procédure utilisée pour les fichiers function précédemment décrite au chapitre (2). Un fichier Script est un fichier constitué d’un ensemble de commandes MATLAB séparées par des ';' ou par des sauts de ligne. Un fichier Script est traité comme si toutes les commandes étaient exécutées séquentiellement dans la Command Window. Toutes les variables définies dans le Workspace sont accessibles et les calculs sont effectués dans le Workspace. Un fichier Script peut contenir un nombre arbitraire de commandes. L’avantage des fichiers Script est la possibilité de refaire les calculs sans avoir à saisir à nouveau les lignes de commande une à une. Exemple : On se propose d’écrire un petit programme de quelques lignes de commandes pour transformer des degrés en radians. Pour cela on écrit un script qui sera sauvegardé sous un nom quelconque qui doit respecter les règles de MATLAB , par exemple monpremier_script.m clc clear xdeg=input('Entrer la valeur de l''angle en degrés : '); xrad=xdeg/180*pi; disp(['Valeur de l''angle en radians : ' num2str(xrad)])

Programmation

97

F IGURE 4.1 – L’éditeur de MATLAB Pour exécuter ce script, il suffit — de taper la touche f5 si on se trouve dans l’éditeur — ou de taper le nom du script si on se trouve dans la fenêtre de commandes.

monpremier_script La fenêtre de commandes se réinitialise (à cause de clc) et on obtient le message suivant :

Entrer la valeur de l'angle en degrés : Si on saisit un nombre, par exemple 45, on obtient : Entrer la valeur de l'angle en degrés : 45 Valeur de l'angle en radians : 0.7854  On peut refaire cette opération autant de fois que l’on veut, il suffit de taper monpremier_script dans la fenêtre de commande.

MATLAB

98

4.2

Entrées/Sorties

Les données à traiter ne sont généralement pas définies à l’intérieur du corps du programme. On peut les introduire directement avec le clavier ou à partir d’un fichier de données. La commande input permet de saisir des données avec le clavier. La commande disp('texte' ) affiche texte sur l’écran.

% Mon premier programme MATLAB clear all clc % Exemple de la commande input: % On introduit une donnée 'a' par le clavier a=input('Donner la valeur de a :')} % On élève a au carré b=a^2; % On affiche le résultat disp(['Le carré de ' num2str(a) ' est :' num2str(b)]) En exécutant le programme on obtient

 Donner la valeur de a : On entre directement la valeur de a, par exemple 10 . La chaîne de caractères 'Donner la valeur de a' est facultative. On obtient alors l’affichage suivant dans la fenêtre de commande :

Donner la valeur de a : 10 Le carré de 10 est :100  La commande disp traite ce qui se trouve entre crochets comme un vecteur constitué de chaînes de caractères. Les chaînes de caractères sont entourées d’apostrophes simples. Les valeurs numériques doivent être converties en chaînes de caractères à l’aide de num2str. On peut aussi afficher directement les valeurs numériques (a, b, c, ....) par disp([a b c]), dans ce cas aucune chaîne ne doit figurer entre les crochets. La commande disp peut être utilisée pour afficher des commentaires lors du déroulement du programme.

Programmation

99

Remarque 1: L’instruction clear permet d’effacer, si on le souhaite, des données déjà stockées dans la mémoire, qui portent le même nom que des variables définies dans le programme à utiliser. Remarque 2: Lorsque le programme est exécuté par F5, il est en même temps sauvegardé. Lorsque le programme est sauvegardé, on peut l’appeler directement à partir d’un autre programme, d’une fonction ou directement à partir du clavier en écrivant le nom sous lequel il a été sauvegardé. Une bonne pratique consiste à sauvegarder un programme systématiquement à la suite de toute modification. Pour afficher un résultat avec un format spécifique on utilise la commande fprintf ( pour les détails voir les exemples ci-dessous).

4.3

Instructions de contrôle

Généralement un programme s’exécute de façon séquentielle, instruction par instruction. Pour rompre cet ordre on fait appel aux instructions de contrôle.

4.3.1

La boucle for

Un bloc de programme, i.e. un ensemble d’instructions, est exécuté un certain nombre de fois de façon répétitive grâce à la boucle for qui se présente sous la forme :

for k=n1:n:n2 ............... bloc à répéter ............... end for...end exécute les instructions entre la valeur initiale n1 et la valeur finale n2 du compteur k. n est le pas, pris par défaut égale à 1 quand il n’est pas défini. On peut utiliser des imbrications de for autant de fois que l’on souhaite.

MATLAB

100 Exemples :

1. Nom du programme : volume Objectif : Calculer le volume de 5 sphères de rayon R = 1, 2, 3, 4 et 5 mètres.

for R=1:5, V=4/3*pi*R^3; disp([' Rayon disp([R' V']); end

Volume'])

2. Nom du programme : surface Objectif : Calculer la surface de 5 sphères de rayon R = 2.5, 2, 1.5 et 1 mètres.

for R=2.5:-0.5:1 S=4*pi*R^2; disp([' Rayon disp([R' S']); end

Surface'])

Il est important de noter que le compteur ici est R. On a délibérément évité de nommer le compteur i ou j. Ainsi, on évite les éventuelles confusions avec les nombres imaginaires i ou j. Nous éviterons également d’appeler un compteur l (lettre `) pour éviter la confusion avec le chiffre 1. Exemple : Nom du programme : sommedecent Objectif : Calculer la somme des cents premiers nombres entiers.

% Calcul des cents premiers nombres entiers clc clear all % on initialise la somme s=0; % la boucle for k=1:100 s=s+k;

Programmation

101

end % Affichage du résultat disp('la somme est égale à :') s Lorsqu’on lance l’éxécution du programme en écrivant dans la fenêtre (Command Window) :

 sommedecent le résultat s’affiche sur cette même fenêtre :

la somme est égale à : s = 5050 Pour les boucles imbriquées, la première boucle ouverte est la dernière à être fermée. Ce déroulement peut être illustré par les lignes suivantes :

for indice1=ndébut:nincrément:nfin .................. for indice2=mdébut:mincrément:mfin ................. end .................... end Exemple : 1. Boucles for imbriquées

% Matrice dont les éléments sont égaux à A(m,n)=m*pi/n. A=zeros(3,3) for m=1:3 for n=1:3 A(m,n)=m*pi/n; end end A

MATLAB

102 2. Le programme suivant permet de calculer la double sommation : 20 10

f=∑

∑ ( j + i/2)

i=1 j=5

.

% Boucles for imbriquées clc clear all g=0; for h=1:20 for k=1:10 g=(k+h/2); end end fprintf('%8.4f',g)} La commande fprintf est une commande d’impression du résultat selon un format à virgule fixe (indiqué par f), avec 4 chiffres après la virgule. Remarque 3: On peut arrêter, à tout moment l’exécution d’un programme en tapant ctrl c (en même temps) dans la fenêtre command window.

4.3.2

La boucle conditionnelle while...end

Lorsqu’on souhaite exécuter un certains nombre d’opérations jusqu’à ce qu’une condition soit vraie on utilise le bloc while...end qui englobe la boucle et le test de condition. Les instructions comprises entre while condition et end sont exécutées tant que le test logique (condition) est vrai. Pour entrer dans la boucle, il faut que condition soit préalablement déclarée vraie. Exemples : 1. Autre formulation du programme de calcul du volume de 5 sphères

R=1; while R suminit % la somme initiale est remplacée % par la nouvelle. % lorsque la différence est égale % à la précision de la machine % le programme s'arrête. suminit = sumnouv; sumnouv = sumnouv + n^(-5); n = n + 1; end sumnouv Le résultat est

sumnouv = 1.0369 Ce qui correspond à n=1553. Si on remplace la condition while sumnouv > suminit par while sumnouv - suminit >1e-5, le nombre d’itérations et la précision diminuent. On remarque qu’à la différence de l’instruction for, le compteur de la boucle while est incrémenté explicitement par la ligne n=n+1.

MATLAB

104

4.4

Instructions conditionnelles

Les instructions conditionnelles ont déjà été définies au chapitre 2.

4.4.1

Test conditionnel

Sous MATLAB les instructions de test conditionnel sont de deux types : if simple : offre un choix selon le résultat d’un test logique :

Bloc 1 if condition Bloc 2 end Bloc 3 Si condition est vraie, le bloc 2, qui vient après if est exécuté puis le bloc 3 est exécuté. Si condition n’est pas vraie alors le bloc 2 est ignoré et le programme passe directement au bloc 3. Exemple : On veut vérifier si la valeur d’un nombre obtenu par le générateur de nombres aléatoires est supérieure à 0.5. Si c’est le cas on affiche ’x est supérieur à 0.5’, sinon le programme continue. Le programme suivant réalise cette tâche.

% exemple de if simple clear x=rand if x>0.5 disp('x est supérieur à 0.5') end disp('Le programme continue')} L’utilisation du if simple convient lorsque la décision à prendre se base simplement sur un "oui" ou un "non". Exemple : Lors de la résolution de l’équation du second degré : ax2 + bx + c = 0, on souhaite avertir l’utilisateur que les racines de cette équation ne sont pas réelles mais dans tous les cas on les calcule.

Programmation

105

% Résolution d'une équation de second degré. % On se donne les coefficients de l'équation a=input('donner le coefficient de x^2 : a = '); b=input('donner le coefficient de x : b = '); c=input('donner le coefficient constant : c ='); % Calcul du discriminant d=b^2-4*a*c; if d