Généralités sur MatLab
Entrée et traitement des données
Matrices
Comme il a déjà été mentionné MATLAB travaille essentiellement sur des objets de type matriciel qui peuvent être réels ou complexes. Par conséquent un scalaire est une matrice 1×1 et un vecteur une matrice N×1.
Les matrices peuvent être définies de plusieurs façons:
• sous forme d’une liste explicite: A = [ 12 1 4; 8
5 13; 7 9 2] est la matrice :
1214
A=8 513
7 9 2
• qui peut aussi être définie par:
4
A =[12 1 4
8 5 13
7 9 2 ]
Les éléments d’une même ligne sont séparés par un espace ou une virgule, les lignes sont elles-mêmes séparées par un point virgule ou un retour chariot.
Une matrice à éléments complexes sera définie de manière très simple :
Soit A = [ 12 1; 4 8] +i*[ 5 3; 9 7]
Soit A = [ 12+5i 1+3i; 4+9i 8+7i]
Les imaginaires purs i ou j peuvent être utilisés indifféremment. Attention de ne pas insérer d’espace dans la définition d’un nombre complexe.
• générées par une suite d’instructions : Certaines fonctions de MATLAB génèrent automatiquement des matrices, ce sont par exemple les fonctions magic ou randn. Ecrire A=magic(n) va créer un carré magique A de dimension n×n. Ecrire A=randn(m,n) va créer une matrice m×n dont les éléments seront aléatoirement distribués suivant une loi normale centrée.
• chargées à partir d’un fichier.
Chaque élément d’une matrice est accessible par ses indices écrits entre parenthèses. L’élément de la 3è me ligne et 4ème colonne est A ( 3,4) . Pour un vecteur x la 2ème composante est x( 2) . Attention les indices sont forcément strictement positifs. L’indexation des éléments d’un tableau commence toujours à 1.
Lignes d’instructions
MATLAB utilise un langage interprété. Chaque expression écrite est interprétée et évaluée. La syntaxe est généralement de la forme:
• variable = expression ;
• expression ;
Le point virgule de terminaison de ligne indique si le résultat de l’évaluation est affiché ou non à l’écran selon qu’il est absent ou présent. Cela facilite la mise au point en offrant la possibilité d’obtenir très simplement des résultats intermédiaires de calcul.
Sous la première forme l’expression est évaluée et le résultat assigné à la variable définie. Sous la deuxième forme l’expression est évaluée et le résultat est assigné à une variable interne appelée ans.
Différentes expressions, séparées par des virgules ou des points virgules, peuvent apparaître sur une même ligne.
Une ligne d’instructions est généralement terminée par un retour chariot, cependant pour des lignes trop longue on peut répartir sur plusieurs lignes en utilisant comme indicateur de continuation une suite d’au moins 3 points.
Ainsi: x = [ 1 2 3 4] est équivalent à: x = [1 2 … 3 4]
Il y a distinction entre majuscule et minuscule. Ainsi variable est différent de Variable.
L’exécution peut être arrêtée par l’utilisation de CTRL_C ou CTRL_BREAK.
Pour visualiser l’état d’une session, la commande who ou whos renvoie la liste des variables existantes ainsi que leur type (réel ou complexe) et leur taille. Pour libérer de l’espace mémoire on peut éliminer une variable par clear nom_de_la_variable.
Si l’on veut sauvegarder simplement la totalité des variables avant de quitter une session MATLAB, la commande save sauvegarde l’ensemble dans un fichier appelé matlab.mat que l’on pourra recharger avec la commande load à la session suivante.
Opérations sur les Matrices
Les opérations suivantes sont directement accessibles:
+ addition
– soustraction multiplication
^ élévation à la puissance ‘ transpose conjugué
\ division à gauche / division à droite
Il y a vérification des dimensions des éléments mis en jeu pour chaque opération et un message d’erreur est délivré en cas de problème. Un seul cas échappe à cette règle c’est celui d’une opération entre un scalaire et une matrice pour lequel l’opération ( +, -,*,/) a lieu entre le scalaire et chacun des éléments de la matrice. Les deux divisions possibles sont définies comme suit: Si A est une matrice carrée inversible et b est un vecteur colonne (resp. ligne) de dimension compatible, alors: x = A\b résout le système A*x = b (resp. x = b/A résout le système x*A = b).
Dans le cas de la division à gauche si la matrice A n’est pas carrée, elle est factorisée selon la méthode d’orthogonalisation de Householder et les facteurs sont utilisés pour résoudre le système sur ou sous dimensionné au sens des moindres carrés.
On pourra aisément vérifier que les divisions à gauche et à droite sont liées par: b/A = ( A \b ) .
Les opérations *, , et / peuvent agir élément par élément si on les fait précéder d’un point. On pourra vérifier la différence de résultat entre A*B et A.*B.
Instructions de contrôle
Comme dans la plupart des langages il existe des instructions de contrôle de la forme for, while ou if. On notera ici qu’en raison du caractère interprété du langage il faut, dans la mesure du possible, éviter de les utiliser et les remplacer par la notion de boucle implicite que l’on verra plus loin.
FOR
La syntaxe est de la forme:
for compteur = début : pas : fin, ou for Matrice expression,
expression;
end
La séquence suivante:
>> x = [ ]; for k = 1:n, x = [x, 2*k], end ou de manière équivalente:
x = [ ];
for k = 1:n, x = [x, 2*k], end
va créer un vecteur x de longueur n. Le vecteur renversé serait créé par: x = [ ];
for k = n:-1:1,
x = [x, 2*k],
end
On remarquera ici qu’il existe des fonctions MATLAB permettant de manipuler simplement les lignes ou colonnes de matrices. Ainsi renverser les composantes d’un vecteur s’effectue simplement en écrivant y = flipud(x). flipud étant la contraction de flip up down. On trouvera de même fliplr (pour left right) etc…
Si on utilise une matrice au lieu d’un compteur la boucle est exécutée autant de fois que le nombre de colonnes de la matrice. Exemples:
s = 0; s = 0;
A = randn(3) A = randn(2)
for cmpt = A for cmpt = A
s = s+1 s = s+sum(cmpt)
end end
WHILE
La boucle est répétée tant que la relation reste vraie.
La syntaxe est de la forme:
while relation
expression;
end
Supposons que l’on dispose d’une observation de signal représentée par un vecteur x de taille N et que l’on veuille en calculer le spectre sur M points où M =
2n ≥ N. M peut être calculé par la séquence suivante:
n = 0;
while 2n size(x)
n = n+1;
end
M = 2n
Il suffira alors d’exécuter y = fft(x,M) pour obtenir le résultat désiré, la fonction fft complétant le vecteur x par M-N zéros.
IF
La syntaxe peut revêtir les formes:
1. if relation expression; end
2. if relation expression; else expression; end
3. if relation expression; elseif relation expression; else
expression;
end
L’expression n’est exécutée que si la relation est vraie. La notion de relation au sens de MATLAB est donnée dans le paragraphe suivant.
Relations
Les opérateurs de relation sont:
< inférieur à > supérieur à
<= inférieur ou égal à >= supérieur ou égal à == égal à
~= différent de
Les évaluations de relations peuvent elles-mêmes être manipulées par des opérateurs logiques tels que & (et), | (ou) et ~ (non). Quand une relation intervient entre des scalaires, le résultat est un scalaire qui vaut 1 ou 0 suivant que la relation est vraie ou fausse. Quand une relation intervient entre deux matrices de même dimension, le résultat est une matrice constituée de 1 et de 0 suivant que la relation entre les éléments correspondants des matrices est vraie ou fausse.
Si on utilise une relation entre matrices dans un while ou un if l’interprétation sera vraie si tous les éléments de la matrice résultante de l’évaluation de la relation sont à 1. Suite à cette interprétation il faudra prendre quelques précautions d’usage. Ainsi le programme suivant:
• if A ~= B
expression
end
résultera dans l’exécution de expression si et seulement si tous les éléments de mêmes indices dans A et B sont différents. Ce qui n’est pas forcément le résultat escompté.
Pour se ramener à la différence au sens mathématique du terme il faudra utiliser l’instruction any et le programme devient:
• if any(any(A ~= B)) expression
end
On applique deux fois any, car any est un opérateur vectoriel qui s’applique aux matrices dimension par dimension.
Les Fonctions
On peut en distinguer trois types : les fonctions scalaires, les fonctions vectorielles et les fonctions matricielles.
Les fonctions scalaires
Comme leur définition l’indique elles agissent principalement sur des scalaires. On peut citer sans les commenter: sin asin cos acos tan atan exp log abs sqrt sign round etc…
Cependant on peut aussi les faire agir sur des matrices. Dans ce cas elles agissent élément par élément, ainsi sin(A) est la matrice où chaque élément est la racine carrée de chaque élément de A.
Les fonctions vectorielles
Elles sont prévues pour opérer sur des vecteurs lignes ou colonnes. On peut citer sans les commenter: max min sum prod mean std any etc…
De même que pour les fonctions scalaires, on peut les faire opérer sur des matrices. Dans ce cas elles agissent sur chacune des colonnes de la matrice. Pour obtenir une action ligne par ligne il suffit d’utiliser l’opérateur de transposition. Ainsi si A est une matrice, max(A) renvoie un vecteur ligne dont chaque composante correspond au maximum de chacune des colonnes de A, alors que max(max(A)) renvoie l’élément maximum de A.
Les fonctions matricielles
La plupart des fonctions de MATLAB opèrent sur des matrices et c’est ce qui fait en grande partie la puissance du logiciel. On peut citer eig (vecteur propre, valeur propre), chol (décomposition de Cholesky), svd (décomposition en valeurs singulières), lu (factorisation LU), qr (factorisation QR), det (déterminant), rank (rang) etc…
Ces fonctions peuvent renvoyer un ou plusieurs arguments. Ainsi [X, V] = eig[A], renvoie une matrice X dont les colonnes sont les vecteurs propres de A et une matrice diagonale V constituée des valeurs propres de A. Alors que X = eig[A] renvoie un vecteur colonne X dont les composantes sont les valeurs propres de A.
Matrices creuses
MATLAB est particulièrement gourmand en place mémoire, aussi a-t-il été prévu de ne stocker que les éléments non nuls des matrices. La manipulation s’effectue avec les commandes sparse et full. Ainsi sA = sparse(A) génère une matrice sA qui ne comporte (en mémoire) que les éléments non nuls de A. On peut revenir à A par A = full(sA).
On consultera l’aide de spdiags, speye, sparse, spones et sprandn.
Notations et raccourcis
Boucle implicite
MATLAB étant un langage interprété l’utilisation de boucles ralentit considérablement l’exécution. Pour pallier cet inconvénient il existe la notion de boucle implicite qui, elle, est exécutée vectoriellement donc plus rapidement. Ainsi écrire n = 1:5, revient à créer le vecteur ligne n = [1 2 3 4 5]. On peut changer le pas d’incrémentation en écrivant n = 1:2:7, ce qui équivaut
à n = [1 3 5 7]. Ceci s’étend aux nombres non entiers (x = .1:.01:1.) et le pas d’incrémentation peut être négatif.
Exemples:
Soit le vecteur t = [-1;0;1;3;5] et la matrice A de Vandermonde construite à partir de t. La construction directe en est:
n = length(t); for j = 1:n for i = 1:n A(i,j) = t(i) (n-j); end
end
Utilisation du ‘:’
La notation ‘:’ est très utile pour travailler sur des sous matrices. Nous en donnons quelques variantes ci-dessous.
• A(1:3,4) est le vecteur colonne dont les composantes sont les trois premiers éléments de la quatrième colonne de la matrice A.
• A(:,2) est la deuxième colonne de la matrice A
• A(1:3,:) est la matrice constituée des trois premières lignes de A
• A(:,[3 6]) est la matrice à deux colonnes qui correspondent aux colonnes 3 et 6 de A.
• A(:,[3 6]) = B(:,1:2) remplace les colonnes 3 et
6 de A par les deux premières colonnes de B. etc…
Les fichiers
MATLAB peut exécuter une suite d’instructions figurant dans des fichiers. De tels fichiers sont appelés fichiers M ou ‘M-files’ car leur extension est toujours
.m. Ces fichiers sont crées à l’aide d’un éditeur de texte standard. Il en existe deux types: les fichiers textes ou scripts et les fichiers fonctions.
De même pour les fichiers de données, on trouve des fichiers d’un format spécifique à MATLAB comportant un en-tête que l’on crée par la commande save et que l’on charge par la commande load.
Fichiers script
Un fichier script est une suite d’instructions MATLAB. Taper le nom du fichier sans son extension sur la ligne de commande MATLAB résulte en l’éxécution des instructions contenues dans le fichier. Un M-file peut en appeler un autre ou s’appeler récursivement.
Il est cependant plus courant d’utiliser des fichiers fonctions.
Fichiers function
Les fichiers fonctions permettent d’étendre les possibilités de MATLAB. Ils sont l’équivalent des SUBROUTINE FORTRAN, des fonctions C etc… Ces fonctions utilisent des variables qui par défaut sont locales, mais peuvent être déclarées global. La syntaxe est de la forme:
• function [out1, out2, …] = function_name(in1, in2, …) où outi désigne une variable de sortie, et ini désigne une variable d’entrée.
Exemple1:
function a = aleat(m,n,min,max)
% aleat(m,n) renvoie une matrice m×n dont les éléments suivent
% une loi normale centrée.
% aleat(m;n;min,max) renvoie une matrice m×n dont les éléments
% suivent une loi uniforme entre min et max.
if nargin 3,
a = randn(m,n); else
a = (max – min + 1)*rand(m,n) + min; end
Ce script sera sauvegardé dans un fichier nommé aleat.m, le nom du fichier et de la fonction doit être le même. Les lignes précédées d’un % qui suivent la déclaration de la fonction sont utilisées comme aide. On y accède par help aleat.
Cette fonction est appelée sous la forme x = aleat(2,3), ou sous la forme x = aleat(2,5, -2,2). La fonction nargin est utilisée pour tester le nombre d’arguments d’entrée. On peut également utiliser nargout pour traiter le nombre d’arguments de sortie.
Exemple 2:
function [moyenne, ecart-type] = stat(x)
% Si x est une matrice elle est traitée colonne par colonne
% moyenne est le vecteur des moyennes
% ecart-type est le vecteur des ecart-type. [m,n] = size(x);
if m == 1 m = n; end
moyenne = sum(x) / n;
ecart-type = sqrt(sum(x.2)/m – moyenne.2);
On peut facilement obtenir le listing d’un M-file en exécutant type file_name sur la ligne de commande MATLAB.
Visibilité des variables
Seules les variables d’un script sont affichables à l’aide de who ou whos, les variables internes à une function sont locales au même titre que dans le langage C. On peut cependant rendre des variables globales, ce qui évitent de les transmettre à éventuellement plusieurs fonctions.
Fichiers de données
Les fichiers MATLAB
Il est possible à tout instant de sauvegarder une ou plusieurs variables dans un fichier spécifique MATLAB dont l’extension sera .mat. La commande à utiliser est save. Les différents formats et options sont listés ci-dessous:
save fname X sauve seulement X.
save fname X Y Z sauve X, Y, et Z.
save fname X Y Z -ascii utilise le format ASCII 8-digit au lieu du binaire.
save fname X Y Z -ascii -double utilise le format ASCII 16-digit.
save fname X Y Z -ascii -double -tabs utilise le format ASCII 16-digit délimité par des tabs.
Pour recharger un tel fichier on utilisera load fname. Chaque variable ayant été sauvegardée par son nom, les variables rechargées auront les noms, dimensions et valeurs au moment de la sauvegarde.
Les fichiers standards
On appelle fichier standard tout fichier crée à partir d’un langage de programmation que ce soit un fichier texte ou binaire. Ces fichiers sont accessibles en lecture ou écriture à l’aide d’une syntaxe proche de celle du langage C. L’ouverture s’effectue en allouant un pointeur de fichier par la fonction fopen. Les lecture et écriture s’effectuent à l’aide des fonctions fread et fwrite. La fermeture du fichier est réalisée par fclose.
• Ouverture de fichier: fid = fopen(‘fname’, permission)
‘fname’ est une chaîne de caractères spécifiant le nom du fichier. Permission prend les formes suivantes:
‘r’ lecture ‘w’ écriture (création si nécessaire)
‘a’ ajout (création si nécessaire)
‘r+’ lecture et écriture (pas de création)
‘w+ ‘ troncation ou création pour lecture et écriture ‘a+’ lecture et ajout (création si nécessaire)
Par défaut les fichiers sont ouverts en mode binaire.
Pour les ouvrir en mode texte il faut utiliser ‘rt’ ou ‘wt’.
• Lecture d’un fichier: [a, count] = fread(fid,size,precision)
Lecture des données binaires du fichier spécifié par fid et écriture dans la matrice a.
L’argument de sortie optionnel count renvoie le nombre d’éléments lus.
1. Introduction
1.1 Démarrage d’une session MatLab
1.2 Type des fichiers. Compatibilité entre DOS et Unix. Edition
1.3 Documentation. Aide en ligne
1.4 Information sur l’espace de travail
1.5 Coopération de MatLab avec des logiciels externes
2. Généralités
2.1 Entrées et traitement des données
2.2 Instructions de contrôle
2.3 Les fonctions
2.4 Notations et raccourcis
2.5 Les fichiers
2.6 Commandes systèmes
2.7 Chaînes de caractères et messages
2.9 Copie d’écran texte
2.10 Les graphiques
3. Résumé des commandes MatLab
4. Applications
4.1 Systèmes d’équations non linéaires
4.2 Traitement des polynômes
4.3 Interpolation linéaire et non linéaire
4.4 Intégration numérique
4.5 Différentielles totales
4.6 Equations aux dérivées partielles
4.7 Optimisation linéaire et non linéaire
4.8 Calcul symbolique
4.9 Graphiques 2D et 3D
5. Références bibliographiques