introduction matlab stéphane blin (2008) introduction à matlab · introduction à matlab ... ,1);...

10
Introduction à Matlab Notes destinées aux personnes souhaitant une rapide initiation Matlab. Ce document est donc loin d'être un cours exhaustif, son intérêt est uniquement d'offrir un aperçu du fonctionnement et des possibilités de Mat- lab. Introduction Matlab est un language de programmation évolué. Il n'est pas nécessaire d'allouer des cases mémoires lors de la création d'une variable comme en assembleur ; il est possible d'utiliser des fonctions prédéfinies et uti- les telle que la recherche de maximum par exemple, ce qui n'est pas directement possible en C. Le prix à payer est une exécution plus lente du programme, mais une utilisation plus facile. Organisation et aides Matlab comporte deux fenêtre principales : - la fenêtre de commande, - la fenêtre d'édition. Dans la fenêtre de commande, il est possible d'exécuter des opérations, de lancer de programmes. Il suffit de taper la commande ou le nom du programme après le symbole >>. La fenêtre d'édition est utilisée pour sauvegarder des programmes, donc des suites d'opérations. Les pro- grammes Matlab sont enregistrés avec l'extension m. Il est conseillé de commencer un programme par les fonctions clear all, close all, et clc afin de respectivement effacer toutes les variables en mémoires, fermer toutes les figures et effacer la fenêtre de commande. Les variables définies dans un programme ne sont pas connues des autres sauf si la fonction global est utilisée. Pour obtenir de l'aide en Matlab, il y a plusieurs solutions. Connaissant le nom de la commande Matlab pour laquelle nous souhaitons de l'aide, par exemple la fonction max, il suffit de taper dans la fenêtre de com- mande : >> help max ou >> doc max L'utilisation de doc offre plus de détails. Si nous chercheons de l'aide sur une fonction mais ne connaissons pas sa syntaxe, il suffit de taper doc di- rectement dans la fenêtre de commande, ce qui ouvre une fenêtre de documentation dans laquelle une re- cherche par mots-clefs est possible. Introduction Matlab Stéphane Blin (2008)

Upload: dinhnguyet

Post on 12-Sep-2018

249 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Introduction Matlab Stéphane Blin (2008) Introduction à Matlab · Introduction à Matlab ... ,1); Introduction Matlab Stéphane Blin (2008) L'accès des colonnes 1 à 2 de la ligne

Introduction à MatlabNotes destinées aux personnes souhaitant une rapide initiation Matlab. Ce document est donc loin d'être un cours exhaustif, son intérêt est uniquement d'offrir un aperçu du fonctionnement et des possibilités de Mat-lab.

IntroductionMatlab est un language de programmation évolué. Il n'est pas nécessaire d'allouer des cases mémoires lors de la création d'une variable comme en assembleur ; il est possible d'utiliser des fonctions prédéfinies et uti-les telle que la recherche de maximum par exemple, ce qui n'est pas directement possible en C. Le prix à payer est une exécution plus lente du programme, mais une utilisation plus facile.

Organisation et aidesMatlab comporte deux fenêtre principales :- la fenêtre de commande,- la fenêtre d'édition.Dans la fenêtre de commande, il est possible d'exécuter des opérations, de lancer de programmes. Il suffit de taper la commande ou le nom du programme après le symbole >>.La fenêtre d'édition est utilisée pour sauvegarder des programmes, donc des suites d'opérations. Les pro-grammes Matlab sont enregistrés avec l'extension m. Il est conseillé de commencer un programme par les fonctions clear all, close all, et clc afin de respectivement effacer toutes les variables en mémoires, fermer toutes les figures et effacer la fenêtre de commande. Les variables définies dans un programme ne sont pas connues des autres sauf si la fonction global est utilisée.

Pour obtenir de l'aide en Matlab, il y a plusieurs solutions. Connaissant le nom de la commande Matlab pour laquelle nous souhaitons de l'aide, par exemple la fonction max, il suffit de taper dans la fenêtre de com-mande :>> help maxou>> doc maxL'utilisation de doc offre plus de détails.

Si nous chercheons de l'aide sur une fonction mais ne connaissons pas sa syntaxe, il suffit de taper doc di-rectement dans la fenêtre de commande, ce qui ouvre une fenêtre de documentation dans laquelle une re-cherche par mots-clefs est possible.

Introduction Matlab Stéphane Blin (2008)

Page 2: Introduction Matlab Stéphane Blin (2008) Introduction à Matlab · Introduction à Matlab ... ,1); Introduction Matlab Stéphane Blin (2008) L'accès des colonnes 1 à 2 de la ligne

J'utilise souvent Google pour trouver le nom de la fonction que je recherche, puis l'aide de Matlab pour me renseigner sur son utilisation.

Vecteurs et indicesNous voulons tracer la fonction f (x) = x n pour x ∈ [0,4].

Pour créer le vecteur x, nous pouvons écrire :>> x=linspace(0,4,9);

Le vecteur x est un tableau allant de 0 à 4 et comportant 9 éléments régulièrement espacés, nous pourrions aussi définir le vecteur x en donnant une valeur minimale (0), un pas (0,5) et une valeur maximale (4) :>> x=[0:0.5:4];

Le vecteur x est représenté par le tableau ci-dessous :

0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0

1 2 3 4 95 6 7 8

x

Il faut considérer le vecteur x comme une matrice 1 x 9. Notons que si le point virgule ; n'est pas utilisé après la commande à excécuter, le résultat de la commande est affiché.

Si nous voulons calculer x 2, nous pouvons écrire :>> f=x.*x;

Nous savons que multiplier des matrices est un produit scalaire, mais ici, nous voulons faire une multiplica-tion élément par élément, c’est pourquoi un point est nécessaire avant la multiplication. f est aussi un tableau 1 x 9.

0.0 0.25 1.0 2.25 4.0 6.25 9.0 12.25 16.0

1 2 3 4 95 6 7 8

f

L‘appel du troisième élément du vecteur f n’est pas f (3) = 9 mais 1.0, le troisième élément du vecteur f. >> f(3)

ans =

1

Pour trouver la valeur de f en x = 3, il faut d’abord trouver l’indice du tableau x correspondant à la valeur 3. La méthode recommandée, car ne dépendant pas de la taille du vecteur x, est d’utiliser la fonction find : >> find(x>=3)

ans =

Introduction Matlab Stéphane Blin (2008)

Page 3: Introduction Matlab Stéphane Blin (2008) Introduction à Matlab · Introduction à Matlab ... ,1); Introduction Matlab Stéphane Blin (2008) L'accès des colonnes 1 à 2 de la ligne

7 8 9

La condition x >= 3 est plus astucieuse qu’une condition x==3 car la valeur 3 n’est pas nécessairement pré-sente dans le tableau. Ainsi, pour trouver la valeur la plus proche de f (3), il suffit de demander :>> f(min(find(x>=3)))

ans =

9

Il est évidemment possible d'utiliser des nombres complexes sous Matlab, en utilisant par exemple :>> z=1+2*i;

Pour ce dernier exemple, il faut s'assurer que la variable i n'a pas été auparavant définie, notamment dans une boucle. Une autre méthode est d'utiliser la fonction complex :>> z=complex(1,2);

Graphiques simplesPour tracer la fonction f (x), nous pouvons écrire :>> figure;%Créer une nouvelle figureplot(x,f);%Génère un graphe avec x en abscisse et y en ordonnéeaxis tight%Ajuste les axes à la figuregrid on%Trace une grillexlabel('Titre abscisse')%Titre de l'axes des abscissesylabel('Titre ordonnée')%Titre de l'axe des ordonnéestitle('Tracé de la fonction y = x * x')%Titre de la figurelegend('x*x')%Légende de la figure

Introduction Matlab Stéphane Blin (2008)

Page 4: Introduction Matlab Stéphane Blin (2008) Introduction à Matlab · Introduction à Matlab ... ,1); Introduction Matlab Stéphane Blin (2008) L'accès des colonnes 1 à 2 de la ligne

0 0.5 1 1.5 2 2.5 3 3.5 40

2

4

6

8

10

12

14

16

Titre abscisse

Titre

ord

onné

e

Tracé de la fonction y = x * x

x*x

Nous noterons pour cet exemple que le symbole pourcent % est utilisé pour les commentaires, et que les chaines des caractères (string) sont indiquées par des apostrophes '.

L'utilisation de la fonction hold on permet de superposer un prochain graphe sur la figure.

Les propriétés du tracé, telles la couleur, les marqueurs, etc., peuvent être choisis, par exemple une couleur rouge r avec des marquers circulaires o et une ligne pointillée -- :plot(x,f,'ro--');

Il est aussi possible de tracer dans un repère logarithmique en remplaçant plot par loglog, ou encore de n'avoir que l'abscisse (ordonnée) en échelle logarithmique avec les fonctions semilogx (semilogy), plotyy pour deux ordonnées (gauche et droite).

Enfin, plusieurs graphes peuvent être tracés dans une même fenêtre en utilisant la fonction subplot. La fig-ure est alors considérée comme un tableau avec un graphe par case, il faut donc spécifier le nombre de lig-nes i et de colonnes j, puis le numéro de la figure à tracer k (les figures sont numérotées de gauceh à droite et de haut en bas) en tapant subplot(i,j,k) puis plot(x,y).

FonctionsIl est possible de créer des fonctions en Matlab en utilisant l'éditeur. Par exemple, nous pouvons créer une fonction qui calcule x n pour un x et un n donnés. La syntaxe est la suivante :function [y]=puissancen(x,n)y=x.^n;

Introduction Matlab Stéphane Blin (2008)

Page 5: Introduction Matlab Stéphane Blin (2008) Introduction à Matlab · Introduction à Matlab ... ,1); Introduction Matlab Stéphane Blin (2008) L'accès des colonnes 1 à 2 de la ligne

La commande function annonce la création d'une fonction, entre crochets [] sont les variables de sortie séparées par des virgules, après le signe = est le nom que nous souhaitons donner à la fonction (puissancen), et entre parenthèses () sont les variables d'entrée de la fonction séparées par des virgules. Il est conseillé d'enregistrer ce fichier sous le même nom que celui donné à la fonction, soit ici sous le nom de fichier puissancen.m. Par défaut, les variables utilisées dans la fonction sont locales, i.e., elles ne sont pas connues du programme principal ou de la fenêtre de commande.

Dans le programme principal ou dans la fenêtre de commande, il sera alors possible d'utiliser la fonction en tapant tout simplement :>> [f]=puissancen(x,2);

Manipulation des caractères (string)Les caractères sont crées en utilisant les apostrophes ', par exemple la variable a définie ci-dessous comporte le caractère plot :>> a='plot';

Les chaines de caracatères peuvent être concaténées en les séparant par des virgules et en imbriquant le tout entre des crochets [], par exemple :>> b=[a,'(x,f)']

b =

plot(x,f)

La chaîne de caractères contenues dans la variable b est donc plot(x,f). Cette chaîne de caractères peut être évaluée comme une commande par Matlab en utilisant la fonction eval.>> eval(b);

L'évaluation de la chaîne de caractères b par Matlab trace donc f en fonction de x.

Afin d'insérer un apostrophe dans une chaîne de caractères, il faut doubler l'apostrophe afin d'éviter toute confusion avec l'indication de la fin de la chaîne de caractère (apostrophe aussi), par exemple :>> a='L''apostrophe';

La commande disp permet d'afficher une chaîne de caractères dans la fenêtre de commande, par exemple :>> disp(b);plot(x,f)

Enfin, la commande num2str permet de convertir un nombre en caractère pour l'affichage, par exemple : >>disp(['La valeur de f en x = 3 est ',num2str(f(min(find(x>=3)))),'.']);La valeur de f en x = 3 est 9.

Introduction Matlab Stéphane Blin (2008)

Page 6: Introduction Matlab Stéphane Blin (2008) Introduction à Matlab · Introduction à Matlab ... ,1); Introduction Matlab Stéphane Blin (2008) L'accès des colonnes 1 à 2 de la ligne

Manipulation des vecteurs & matricesLes opérations élément par élément sur des vecteurs ou des matrices, par exemple la multiplication, division, etc., requièrent l'utilisation d'un point . avant le symbole de l'opération, par exemple :>> x.^2;

La taille d'un vecteur ou d'une matrice peut être demandée en utilisant la fonction size qui retourne respec-tivement le nombre de lignes et de colonnes de la matrice :>> size(x)

ans =

1 9

La fonction length ne donne que la dimension maximale :>> length(x)

ans =

9

Un vecteur ou une matrice peuvent être transposés en utilisant le symbole apostrophe ', une matrice n x p devient donc une matrice p x n après transposition, par exemple :>> y=x';

Le produit * du vecteur x par le vecteur y correspond au produit scalaire sans normalisation, soit la somme du produit des éléments des vecteurs. Pour des matrices, le produit * est le produit matriciel usuel tel que défini en mathématiques. Le produit * entre deux matrices n'est donc possible qu'entre une matrice n x p par une matrice p x n.

Afin d'obtenir exactement le produit scalaire entre deux vecteurs, il faut diviser le produit par la norme des vecteurs, la norme est calculée par la fonction abs :>> x*y/(abs(x)*abs(y))

ans =

1

Nous pouvons définir une matrice 2 x 3 comportant des éléments aléatoires compris entre 0 et 1 suivant une loi normale en utilisant la fonction randn :>> m1=randn(2,3);

Si nous souhaitons avoir accès à tous les éléments de la première colonne de la matrice m1 peut s'obtenir en utilisant : soit :>> m1(:,1);

Introduction Matlab Stéphane Blin (2008)

Page 7: Introduction Matlab Stéphane Blin (2008) Introduction à Matlab · Introduction à Matlab ... ,1); Introduction Matlab Stéphane Blin (2008) L'accès des colonnes 1 à 2 de la ligne

L'accès des colonnes 1 à 2 de la ligne 1 peut se demander par :>> m1(1,1:2);

L'accès du dernier élément de la deuxième ligne est accessible en utilisant end :>> m1(2,end);

De nombreuses fonctions utiles et intuitives existent en Matlab, par exemple :cos, sin, tan, acos, log (logarithme népérien !), log10, exp, real, imag, phase, conj, max, min, abs, sum (somme des éléments du tableau, soit l'intégrale si multiplication par le pas), diff (différences entre deux éléments consécutifs du tableau, soit la dérivée si division par le pas), det (déterminant), eig (vecteurs propres), etc.

Il est important d'éviter de nommer une variable par le nom d'une fonction Matlab ! Une solution est de tou-jours utiliser une majuscule comme première lettre de la variable, car les fonctions Matlab sont toutes en minuscules.

Boucles, conditionsMatlab permet évidemment de réaliser de boucles en utilisant par exemple une combinaison de for et end, par exemple :>> for k=1:length(x) z(k)=x(k)+k;end

Il est aussi possible d'utiliser une boucle while avec une condition. La condition d'égalité est représentée par ==, la différence par ~=, le "et" par &&, le "ou"par |, l'inférieur ou égal par <=, par exemple :>> k=1;while k<=length(x) && x(k)>0 z(k)=log(x(k)); k=k+1;end

L'exécution d'une commande en fonction d'une condition s'effectue en utilisant if, else, et end :>> if x(2)~=0 x(2)=log(x(2));else x(2)=log(-x(2));end

Introduction Matlab Stéphane Blin (2008)

Page 8: Introduction Matlab Stéphane Blin (2008) Introduction à Matlab · Introduction à Matlab ... ,1); Introduction Matlab Stéphane Blin (2008) L'accès des colonnes 1 à 2 de la ligne

La combinaison de case et switch est aussi pratique dans la même thématique, permettant d'éviter de multiples if.

Manipulation de fichiersUne méthode pour importer un fichier en Matlab est d'utiliser la fonction load. Admettons qu'un analyseur de spectre optique ait enregistré le spectre dans un fichier nommé osa.dat, nous pouvons récupérer les données avec la commande :>> m=load('osa.dat');

Les donnés du spectre peuvent être sauvegardées de nouveau dans un autre fichier en utilisant la fonction save : >> save 'osa2.dat' m -ascii -double

Graphes avancésAdmettons que nous souhaitions tracer une série de Gaussiennes normalisées en puissance (intégrale) et de largeurs variables. Nous souhaitons calculer les Gaussiennes avant de les tracer. Nous allons calculer les Gaussiennes y en fonction de x pour un paramètre a, avec G (x) = exp (- a * x2). y sera une matrice dans laquelle la ligne j représentera la Gaussienne de paramètre a (j) en fonction de x.

Nous commençons par définir x et a :>> x=linspace(-2,2,1000);a=[1:0.1:4];

La pire méthode en terme de temps de calcul est de calculer point par point les Gaussiennes :>> for j=1:length(a) for k=1:length(x) G(j,k)=sqrt(a(j)/pi)*exp(-a(j)*(x(k))^2); endend

Nous pouvons vérifier que les Gaussiennes sont bien normalisées en puissance, par exemple :>> sum(G(3,:))*(x(2)-x(1))

ans =

1

Introduction Matlab Stéphane Blin (2008)

Page 9: Introduction Matlab Stéphane Blin (2008) Introduction à Matlab · Introduction à Matlab ... ,1); Introduction Matlab Stéphane Blin (2008) L'accès des colonnes 1 à 2 de la ligne

Admettons que nous souhaitions tracer en 3D ces Gaussiennes, i.e., y (x,a). Nous allons utiliser les fonctions mesh ou surf. Il faut au préalable créer une grille pour les abscisses (matrice) et une grille pour les or-données (matrice) de telle sorte qu'à l'élément de la ligne i et de la colonne j, Matlab sache quelles sont l'ab-scisse et l'ordonnée associées en allant chercher dans les éléments (i,j) des matrices abscisse et ordonnée (je ne suis pas très clair dans mes propos !). Afin de générer ces matrices, nous utilisons la fonction meshgrid : >> [gridx,grida]=meshgrid(x,a);%Création des grilles abscisses et ordonnéesfigure(1);clf(1);%Création de la figure 1, qui est effacé (en case de figure préalable)surf(gridx,grida,G)%Tracé 3D en utilisant la fonction surfaxis tight%Axes automatiquesgrid on%Grillecolorbar%Légende des couleursview(3)%Vue 3D par défaut, view(2) est une vue par le dessus

21.5

10.5

00.5

11.5

2

1

1.5

2

2.5

3

3.5

4

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

1.1

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

1.1

Notons que meshgrid peut être utilisée pour calculer G avec beaucoup plus d'efficacité :>> G=sqrt(grida/pi).*exp(-grida.*gridx.^2);

Résolution d'un système d'équations différentiellesAdmettons que nous souhaitions étudier la propagation Raman en absence de pertes de propagation et en négligeant le facteur de conversion énergétique, nous avons à résoudre le système :dIp/dz=-g*Ip*IS

dIs/dz=+g*Ip*IS

avec les conditions initiales :Ip (z=0) = 1 GW/m2

IS (z=0) = 1 kW/m2

Introduction Matlab Stéphane Blin (2008)

Page 10: Introduction Matlab Stéphane Blin (2008) Introduction à Matlab · Introduction à Matlab ... ,1); Introduction Matlab Stéphane Blin (2008) L'accès des colonnes 1 à 2 de la ligne

Nous allons utiliser la fonction ode45 pour résoudre ce système, mais il faut au préalable entrer le système d'équations dans une fonction :function dI=systemEDP(z,I)global g%gain RamandI=zeros(2,1);dI(1)=-g*I(1)*I(2);%Pompe déplétéedI(2)=g*I(1)*I(2);%Raman stimuléNous pouvons maintenant utiliser la fonction ode45 qui calculera les intensités pompe (première ligne) et signal (deuxième ligne) en fonction de la distance de propagation (z), allant de 0 à 1 km, avec les conditions initiales demandées :>> global gg=1e-14;[z,I]=ode45(@systemEDP,[0 1000],[1e9 1e3])

Vitesse d'exécutionMatlab est d'autant plus rapide que les opérations sur les matrices sont utilisées au lieu d'opérations éléments par éléments (boucles et boucles imbriquées).

Aussi, il n'est pas recommandé de tracer des graphes durant l'exécution du programme, ou d'afficher du texte dans la fenêtre de commande.

Il est possible d'appeler une fonction en C dans Matlab afin de gagner en rapidité.

Autres fonctionnalités avancéesMatlab bénéficie de nombreuses fonctions pour différentes thématiques scientifiques, regroupées sous la dé-nomination de "toolbox", par exemple pour le traitement numérique du signal, l'acoustique, etc. Ces "tool-box" ne viennent pas par défaut avec Matlab.

Il est possible de créer des interfaces graphiques sous Matlab en utilisant la commande guide (graphic user interface design editor).

Il est possible d'acquérir des données avec Matlab et une carte d'acquisition, et donc de remplacer Labview ou autres logiciels d'interfacage avec les équipements des laboratoires.

Il est possible de générer des excécutables (.exe) avec Matlab, permettant ainsi de protéger le code développé tout en permettant son utilisation.

Il est possible de générer des vidéos, de traiter sons et images.

Introduction Matlab Stéphane Blin (2008)