Académique Documents
Professionnel Documents
Culture Documents
Automatique
Laboratoire Robotique et Productique
2014/2015
Laboratoire Robotique et Productique Cours Initiation Matlab
2
Laboratoire Robotique et Productique Cours Initiation Matlab
0. Introduction
Cette introduction au logiciel Matlab est proposée aux étudiants du département Génie électrique de
l’EMP avant le début de leur première année de formation. Ce cours permet aux étudiants de travailler
individuellement sur les exemples et exercices présentés ci-après.
Par ce recueil d’exemples, on souhaite montrer que l’usage de l’outil Matlab dans le domaine de
l’ingénierie est simple et efficace et ainsi inciter nos étudiants à l’appliquer dans les cours et les travaux
de laboratoires qu’ils auront à faire durant leur cursus.
Les commandes Matlab sont présentées dans des situations réelles et suffisamment explicites pour que
leurs utilisations soient claires par elles-mêmes. Les détails syntaxiques doivent être recherchés par les
étudiants en recourant de manière intensive à l’aide en ligne Matlab.
1. Informations préliminaires
Matlab est un système interactif et convivial de calcul numérique et de visualisation graphique destiné
aux ingénieurs et scientifiques. La facilité de développement des applications dans son langage fait qu’il
est pratiquement devenu le standard dans son domaine. Il possède un langage de programmation puissant
et simple à utiliser avec lequel l’utilisateur peut effectuer des calculs en ligne ou par l’intermédiaire d’un
fichier de commandes.
3
Laboratoire Robotique et Productique Cours Initiation Matlab
Le logiciel Matlab (Matrix Laboratory) est basé sur le calcul matriciel numérique. Tous les objets utilisés
dans Matlab sont donc définis au travers de matrices ou vecteurs dont les valeurs sont, par définition, des
grandeurs complexes. Il existe un très grand nombre d’opérateurs et fonctions distribuées dans le logiciel
de base et dans des boîtes à outils spécialisées. A ceci peut s’ajouter un outil de programmation
graphique : Simulink, essentiel pour la simulation de systèmes dynamiques non linéaires.
4
Laboratoire Robotique et Productique Cours Initiation Matlab
N.B. : Eviter l’utilisation de mots clés ou des noms de valeurs spéciales pour un nom de variable.
MATLAB peut produire des messages d’erreurs ou des résultats étranges si l’un de ces mots
réservés ou noms de fonctions est redéfini. Les mots réservés sont listés par la commande
iskeyword.
La constante i ou j est le nombre imaginaire pré déclaré, de même que certaines constantes
5
Laboratoire Robotique et Productique Cours Initiation Matlab
Exercice 1
Exercice 2
Utiliser Matlab pour évaluer
Exercice 3
Calculer :
1.
2.
3.
Exercice 4
Définir une variable x = 13.5 et évaluer :
1.
2.
3.
Exercice 5
Définir les variables x et z avec x = 9.6 et z = 8.1 et évaluer
1.
2.
Exercice 6
Calculer (par une seule commande) le rayon r d’une sphère qui a un volume de 350 cm3 . Une fois r est
calculé, l’utiliser pour calculer la surface de la sphère.
Exercice 7
6
Laboratoire Robotique et Productique Cours Initiation Matlab
3. Vecteurs et Matrices
3.1 Les vecteurs
Création de vecteurs
vecteur colonne :
>> xcol = x'
xcol =
0
0.3142
0.6283
0.9425
1.2566
1.5708
1.8850
2.1991
2.5133
2.8274
3.1416
7
Laboratoire Robotique et Productique Cours Initiation Matlab
Columns 1 through 7
0 0.3142 0.6283 0.9425 1.2566 1.5708 1.8850
Columns 8 through 11
2.1991 2.5133 2.8274 3.1416
Adressages et indexages
ans =
0.3142 0.6283 0.9425
L'utilisation d'indice hors limite provoque une erreur, comme le montre cet exemple:
>> x(12)
Combinaison de vecteurs
>> a = [1 : 3]
a =
1 2 3
>> b = [10 : 10 : 30]
b =
10 20 30
>> c = [a b]
c =
1 2 3 10 20 30
>> c = [a b]
c =
8
Laboratoire Robotique et Productique Cours Initiation Matlab
1 2 3 10 20 30
Exercice 8
Une matrice est un ensemble de lignes comportant toutes le même nombre de colonnes Matlab, depuis la
version 5, supporte les matrices à n dimensions (n > 2)
9
Laboratoire Robotique et Productique Cours Initiation Matlab
m1 =
1 2 3
4 5 6
7 8 9
On peut étendre aux matrices les autres manières de définir des vecteurs.
Par exemple:
>> m2 = [1 : 3 ; 11 : 1 : 13]
m2 =
1 2 3
11 12 13
Utilisant les propriétés spéciales des matrices carrées ‘ magique’ par la sommation de différentes façons
ces éléments. Si on prend la somme le long des lignes et colonnes. Ou le long des deux diagonales
principales, on trouve toujours le même nombre. Vérifiant ces propriétés en utilisant MATLAB.
>> A = magic(4)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
sum(A)
ans =
34 34 34 34
10
Laboratoire Robotique et Productique Cours Initiation Matlab
Quand on ne spécifie pas une variable de sortie, MATLAB utilise la variable ans, abréviation de answer
pour mémoriser le résultat du calcul. On a calculé un vecteur rangé contenant les sommes des colonnes de
A. chaque colonne a la même somme, la somme magic 34.
Qu’on t il de la somme des rangées ? MATLAB préfère travailler avec des colonnes d’une matrice, alors,
la façon la plus facile pour la somme des rangées est de transposer la matrice, et calculer la somme des
colonnes de la matrice transposée puis re-transposé le résultat Le transpose est noté par l’apostrophe '.
Alors
A'
produit
ans =
16 5 9 4
2 11 7 14
3 10 6 15
13 8 12 1
et sum(A')'
ans =
34
34
34
34
La somme des éléments de la diagonale principale est facile à obtenir avec l’aide de la fonction diag,
diag(A)
donne
ans =
16
11
6
1
et
sum(diag(A))
produit
ans =
34
11
Laboratoire Robotique et Productique Cours Initiation Matlab
L’autre diagonale, qu’on appelle antidiagonal, on utilise la fonction fliplr, qui tourne la matrice de la
gauche vers la droite.
>> sum(diag(fliplr(A)))
ans =
34
B = A(4,5)
B = A;
B(4,5) = 17
B=
16 2 3 13 0
5 11 10 8 0
9 7 6 12 0
4 14 15 1 17
B(2 : 5 , 5 : 6) = 5
B=
16 2 3 13 0 0
5 11 10 8 5 5
9 7 6 12 5 5
4 14 15 1 5 5
0 0 0 0 5 5
On peut supprimer des rangées et des colonnes d’une matrice en utilisant une paire de crochet carré.
Soit
X = A;
X(:,2) = [ ]
12
Laboratoire Robotique et Productique Cours Initiation Matlab
X devient
X=
16 3 13
5 10 8
9 6 12
4 15 1
Si on supprime un élément d’une matrice, le résultat n’est plus une matrice. Alors, une expression
comme
X(1 , 2) = [ ]
La concaténation est l’opération de joindre de ’petites matrices’ ensemble pour former une matrice plus
grande. La paire de crochet carrée, [], est l’opérateur de concaténation. Par exemple, commençons par
une matrice ‘magique’ carrée, A, et formant
B = [A A + 32 ; A + 48 A + 16]
Le résultat est une matrice 8-par-8, obtenue en joignant quatre sous matrices.
B=
16 2 3 13 48 34 35 45
5 11 10 8 37 43 42 40
9 7 6 12 41 39 38 44
4 14 15 1 36 46 47 33
64 50 51 61 32 18 19 29
53 59 58 56 21 27 26 24
57 55 54 60 25 23 22 28
52 62 63 49 20 30 31 17
Cette nouvelle matrice est une demi-matrice ‘magique’. La somme des colonnes est la valeur correcte
pour une matrice carrée ‘magique’ 8-par-8.
>> sum(B)
ans =
Mais, les sommes des rangées, sum(B')', ne sont pas toutes les mêmes.
13
Laboratoire Robotique et Productique Cours Initiation Matlab
Opérations scalaires-matrices
10.0000 10.0000
20.0000 31.6228
30.0000 100.0000
Une exception:
>> m2^2
La solution est l’usage du point qui force l’opération sur chaque élément:
>> m2.^2
ans =
1 2 3
4 5 6
7 8 9
m2 =
1.0000 2.0000 3.0000
1.0000 3.1623 10.0000
>> m1*m2' % le produit matriciel n’est possible que si les dimensions des matrices sont cohérents
ans =
14.0000 37.3246
14
Laboratoire Robotique et Productique Cours Initiation Matlab
32.0000 79.8114
50.0000 122.2982
>> m1*m2
??? Error using ==> mtimes
Inner matrix dimensions must agree.
Soit :
m3 = [1 : 3 ; 11 : 1 : 13]
m3 =
1 2 3
11 12 13
Divisions
ans =
1.0000 1.0000 1.0000
0.0909 0.2635 0.7692
ans =
1.0000 1.0000 1.0000
11.0000 3.7947 1.3000
15
Laboratoire Robotique et Productique Cours Initiation Matlab
Matrices particulières
De même, il existe des syntaxes particulières permettant d'extraire des lignes, des colonnes de matrices :
Une des difficultés que rencontre le débutant est le mauvais maniement des matrices du à une mauvaise
connaissance des tailles des matrices. Pour vérifier ces tailles, on pourra utiliser la commande size:
16
Laboratoire Robotique et Productique Cours Initiation Matlab
Cet opérateur est l’un des plus importants des opérateurs de MATLAB. Il apparaît sous plusieurs formes.
L’expression
1:10
est un vecteur rangé contenant des entiers de 1 à 10
1 2 3 4 5 6 7 8 9 10
Pour obtenir un pas non unitaire, on spécifie un pas d’incrémentation. Par exemple,
100:-7:50
donne
100 93 86 79 72 65 58 51
et
0:pi/4:pi
donne
Les expressions d’indexages des deux points délimitent une partie de la matrice.
A(1:k,j)
17
Laboratoire Robotique et Productique Cours Initiation Matlab
sum(A(1:4,4))
Calcule la somme des quatre premiers éléments de la 4eme colonne. Mais il y a mieux. L’opérateur colon
par lui-même représente tous les éléments au sens des colonnes ou rangées d’une matrice et le mot clé fait
référence à la dernière rangée ou la dernière colonne. Alors
sum(A(:,end))
ans =
34
Décomposition de matrices
Elle produit une matrice diagonale S de même dimension que X, avec les éléments diagonaux non nuls
rangés en ordre décroissant, et des matrices unitaires U et V telles que X = U*S*V'.
>> R = chol(X);
Elle utilise uniquement la partie triangulaire supérieure de X (et considère que la partie triangulaire
inférieure de X est la transposée conjuguée de la précédente). Elle produit un message d'erreur si X n'est
pas définie positive, sinon elle produit la matrice triangulaire supérieure R telle que R'*R=X.
produit une matrice triangulaire supérieure Q de même dimension que X et une matrice unitaire R telle
que X = Q*R.
exprime une matrice carrée X sous forme d'une matrice triangulaire supérieure U et d'une permutation
d'une matrice triangulaire inférieure L, telle que X = L*U.
18
Laboratoire Robotique et Productique Cours Initiation Matlab
Comme on l'a vu précédemment, toute variable de Matlab est une matrice. Cependant, il est peut-être
utile de conserver des chaînes de caractères dans des variables, et cela se fait d’une façon toute à fait
naturelle :
On peut alors réaliser des manipulations de même type que pour les vecteurs
On peut convertir des nombres en chaîne de caractères à l'aide des fonctions num2str, int2str, sprintf.
Par exemple :
Deux fonctions peuvent être très utiles lors de manipulations de chaînes de caractères : eval et feval. Si
l'on possède une instruction Matlab dans une chaîne de caractères, la commande eval évaluera cette
chaîne de caractères comme si elle avait été tapée à la ligne de commande de Matlab; voici un exemple
:
» expr='1/x+x^2-2';
» x=1;
» eval(expr) %evaluation de l’expression expr avec la valeur x=1
ans =
Cette utilisation des séries des caractères est présente dans l’implantation de la boîte à outils Maple
Symbolic Toolbox, qui utilise la technologie achetée de chez Maple Software, les leaders dans le
domaine de la mathématique symbolique. Même sans cette boîte à outils, on peut toujours utiliser cette
technique pour des fonctions rudimentaires de mathématique symbolique.
De même, la commande feval est comme la fonction eval, sauf qu’elle est utilisée pour évaluer la fonction
citée.
str = ’sin’;
t = linspace(0,2*pi);
q = feval(str,t);
plot(t,q)
3.4 Polynômes
19
Laboratoire Robotique et Productique Cours Initiation Matlab
Les polynômes sont représentés comme des vectrices lignes qui contiennent les
coefficients dans l’ordre descendant de puissances. Par exemple, le polynôme
x 4 35
. x 3 3.9 x 2 8 x 20 s’écrit :
p =
» r=roots(p)
r =
-4.8285
-0.0843 + 1.6613i
-0.0843 - 1.6613i
1.4970
» poly(r)
ans =
Columns 1 through 4
Column 5
-20.0000 + 0.0000i
On utilise sans aucun problème les opérateurs et les fonctions pour la manipulation
de matrices sur ces vecteurs qui représentent des polynômes.
Exercice 9
Sans utiliser de boucles d’itération, ajouter aux éléments d’une matrice l’indice de leur colonne.
Exercice 10
20
Laboratoire Robotique et Productique Cours Initiation Matlab
Exercice 11
Exercice 12
21
Laboratoire Robotique et Productique Cours Initiation Matlab
Exercice 13
Exercice 14
22
Laboratoire Robotique et Productique Cours Initiation Matlab
Exercice 15
Exercice 16
En utilisant les commandes ones et zeros, créer une matrice 4x5 dans laquelle les deux premières lignes
sont des 0 et le reste des 1.
Exercice 17
Créer une matrice 6x6 dont les 2 lignes du milieu sont des 1 et le reste des 0.
Exercice 18
23
Laboratoire Robotique et Productique Cours Initiation Matlab
v=
Créer ces trois matrices dans la fenêtre des commandes, et puis en utilisant une seule commande,
remplacer les 4 dernières colonnes de la première et troisième lignes de A avec les 4 premières colonnes
des 2 premières lignes de B, les 4 dernières colonnes de la quatrième lignes de A avec les éléments 5 à 8
de v, et les 4 dernières colonnes de la cinquième ligne de A avec les colonnes 3 à 5 de la troisième ligne
de B.
Exercice 19
Créer la matrice suivante en utilisant la notation vectorielle pour la création des vecteurs avec un
espacement constant et/ou la commande linespace pour les lignes.
Exercice 20
En utilisant la commande eye créer une matrice A ci-dessous. En utilisant les deux points d’adressage ‘’ :
’’ des éléments de la matrice, changer la matrice A en matrice B.
Exercice 21
Créer une matrice A 3x3 dont tous les éléments sont des 1 et créer une matrice B dont tous les éléments
sont des 5. Ajouter des éléments à A par concaténation de la matrice B de façon à avoir
24
Laboratoire Robotique et Productique Cours Initiation Matlab
Exercice 22
Deux vecteurs sont donnés par : U = 4i + 9j -5k, et V = -3i + 6j - 7k
Utiliser Matlab pour calculer le produit intérieur U.V des deux vecteurs de deux manières :
1. Définir U comme un vecteur ligne et V comme vecteur colonne et utiliser alors le produit
matriciel.
2. Utiliser directement la fonction dot.
Exercice 23
Utiliser Matlab pour montrer que la somme d’une série infinie converge vers /6.
Faire le calcule de la somme pour n = 100, n = 1000 et n = 10000.
Exercice 24
Créer les matrices suivantes :
1. Calculer A + B et B + A pour voir la commutativité des matrices ;
2. Calculer A + (B + C) et (A + B) + C pour voir l’associativité des matrices ;
3. Calculer 5(A + C) et 5A + 5C et calculer A*(B + C) et A*B + A*C ;
Exercice 25
5x + 4y - 2z + 6w = 4
3x + 6y + 6z + 4.5w = 13.5
6x + 12y - 2z + 16w = 20
4x - 2y + 2z - 4w = 6
Exercice 26
Le graphe d’une fonction passe par les points (-2,-3.4), (-0.5, 5.525),
(1,16.7) et (2.5, 70.625). Déterminer les constantes a, b, c et d.
25
Laboratoire Robotique et Productique Cours Initiation Matlab
4. Programmer en Matlab
4.1 Opérateurs logiques et relationnels
Avant de décrire la syntaxe du test sous Matlab, indiquons les principaux opérateurs de relation ainsi que
les opérateurs booléens qu'utilisent Matlab.
Le résultat d'un test est un booléen, qui sous Matlab, prend la valeur 1 pour vrai et 0 pour faux. Par
exemple, on a les résultats suivants :
>> r = ~ ((1>2 ))
r=
>> r = ~ ((1 > 2 ) | ( 0 ~ = 0 )) (traduction Matlab de l’expression logique : non(1>2 ou 0 différent de 0))
r=
Il existe d'autres fonctions booléennes, par exemple xor, isfinite, isnan, isinf, dont on trouvera la
description en faisant help ops.
26
Laboratoire Robotique et Productique Cours Initiation Matlab
Exemples
a)For
Boucles de vectorisation
27
Laboratoire Robotique et Productique Cours Initiation Matlab
On peut augmenter la vitesse d’exécution du code du fichier (.m) par la vectorisation des opérations.
Vectorisation veut dire convertir les boucles for et while en opérations équivalentes vectorielles ou
matricielles.
Exemple simple
Les fonctions zeros et ones, permettent parfois d'éviter de mettre en œuvre une boucle.
Par exemple, au lieu de faire la boucle :
r = 1:10000;
A = []; % initialisation de A à vide
for i = 1:5,
A = [A ; r];
end
On peut écrire
r = 1: 10000;
A = ones(5,1)*r;
Le deuxième exemple s’exécute plus rapidement que le premier et de cette façon que MATLAB doit être
utilisé. Tester cette exemple dans votre PC en créant un fichier script contenant le programme ci-dessus,
puis, utiliser les commandes tic et toc pour chronométrer les deux versions du programme.
b) While
La boucle while répète un groupe d’instructions indéfiniment sous le contrôle d’une condition logique.
La commande end arrête l’exécution des instructions quand la condition logique est remplie.
Voici un programme complet, pour illustrer les commandes while, if, else, et end, qui utilise
la bissection par intervalle pour trouver le zéro d’un polynôme.
a = 0; fa = -Inf; b = 3; fb = Inf;
while b-a > eps*b
x = (a+b)/2;
fx = x^3-2*x-5;
if sign(fx) == sign(fa)
a = x; fa = fx;
else
b = x; fb = fx;
end
end
28
Laboratoire Robotique et Productique Cours Initiation Matlab
x = 2.09455148154233
L'instruction break permet de sortir d'une boucle FOR ou d'une boucle WHILE. L'exécution se
poursuit alors séquentiellement à partir de l'instruction suivant le "end" fermant la boucle.
Attention: en cas de boucles imbriquées, on interrompt seulement l'exécution de la boucle
intérieure contenant l'instruction break.
L'instruction return provoque un retour au programme appelant (ou au clavier).
c) If-then-else
La commande if évalue une expression logique et exécute un groupe d’instruction, quand l’expression
est vraie. Les mots clés optionnels elseif et else donnent une exécution alternative d’un groupe
d’instructions. Le mot clé end, qui suit le if, termine le dernier groupe d’instructions. Les groupes
d’instruction sont entourés par les quatre mots clés – pas de parenthèse ni de crochets, sont nécessaires.
%Calcul du factorielle
%entrée = u numéro n quelconque
%sortie = -1 si n non-entier
%sortie = n! si n entier
ent=6 ;
if ~(ent==round(ent))
resultat=-1;
elseif (ent==0)
resultat = 1;
else resultat=ent*fact(ent-1);
end
Il est important de comprendre comment les opérateurs relationnels et les instructions if marchent avec
les matrices. Quand vous voulez tester l’égalité entre deux variables, on utilise
if A == B, ...
Ceci est un code juste dans MATLAB, et donne ce que vous espérer quand A et B sont des scalaires. Mais
quand A et B sont des matrices, A == B ne teste pas si (if) elles sont égales, elle teste là ou les éléments
des deux matrices sont égaux ; le résultat est une autre matrice de 0 et de 1 montrant l’égalité élément par
29
Laboratoire Robotique et Productique Cours Initiation Matlab
La façon adéquate de tester l’égalité entre deux variables est d’utiliser la fonction isequal,
if isequal(A,B), ...
Dans cet exemple, on développera ce point. Si A et B sont des scalaires, le programme suivant n’atteindra
jamais la situation imprévisible. Mais pour la majorité des paires de matrices, aucune des conditions
matricielles A > B, A < B or A == B est vraie pour tous les éléments et alors la clause else est exécuter.
if A > B
'greater'
elseif A < B
'less'
elseif A == B
'equal'
else
error('Unexpected situation')
end
Plusieurs fonctions existent pour réduire les résultats de comparaisons de matrice aux conditions scalaires
avec l’utilisation de if, on peut citer
isequal
isempty
all
any
Expression de conditions
Il faut éviter d’exprimer des conditions trop complexes, introduisez des variables logiques
temporaires à la place.
L’expression :
if (value>=lowerLimit)&(value<=upperLimit)&~ismember(value,…valueArray)
:
end
Le cas le plus fréquent doit être mis dans la partie if, le cas exceptions dans la partie else.
30
Laboratoire Robotique et Productique Cours Initiation Matlab
Cette pratique permet d’augmenter la lecture et empêche que les exceptions cachent le chemin normal
de l’exécution
fid = fopen(fileName);
if (fid~=-1)
:
else
:
end
d) switch et case
La commande switch exécute un groupe d’instructions en se basant sur la valeur d’une variable ou
d’une expression. Les mots clés case et otherwise délimitent les groupes d’instructions. Seul le
premier cas adéquat est exécuté. Il doit avoir toujours un end relatif à switch.
L’exemple de l’algorithme de matrice carrée magique peut être décrit aussi par
switch x
case 1
disp(’x est 1’)
case {2,3,4}
disp(’x est 2, 3 or 4’)
case 5
disp(’x est 5’)
otherwise
disp(’x n est pas 1, 2, 3, 4 ou 5’)
end
La commande switch doit toujours inclure la condition otherwise, ne pas l’incorporer peut conduire à
résultats inattendus.
La variable switch doit toujours être une chaine de caractères de type string.
Exercice 27
Écrire le script Matlab pour générer la matrice M de Vandermonde à partir d’un vecteur A.
Avec deux méthodes :
a) Sans utiliser de boucles d’itération
b) En utilisant de boucles d’itération
Exercice 28
31
Laboratoire Robotique et Productique Cours Initiation Matlab
Utiliser une boucle for-end dans un programme script pour calculer la somme des n premiers éléments de
la série : .
Exécuter le programme pour n = 4 et n = 20.
Exercice 29
Un vecteur est donné par V = [ 5 17 -3 8 0 -1 12 15 20 -6 6 4 -7 16]. Écrire un programme script qui
double les éléments qui sont positifs et sont divisibles par 3 et/ou 5, et élever à la puissance 3 les éléments
qui sont négatifs, mais plus grand que -5.
Exercice 30
Un vecteur est défini par x = [15 -6 0 8 -2 5 4 -10 0.5 3], en utilisant les expressions conditionnelles et les
boucles, écrire un programme qui détermine la somme des éléments positifs du vecteur.
5. Scripts et fonctions
5.1 Les scripts
L’extension classique d’un fichier MATLAB est .m. On peut trouver 2 types de fichiers m : les fichiers de
fonctions (abordés plus loin dans cet exercice) et les fichiers de script qui sont un ensemble de
commandes pouvant s’enchaîner. L’utilisation de fichiers script permet de sauvegarder vos commandes
d’une session Matlab à une autre. Pour ouvrir un fichier script :
- soit vous tapez la commande edit,
- soit vous cliquez : file→ new → M-file,
- soit vous cliquez directement sur l’icône représentant une page blanche.
Un script (ou M-file) est un fichier (message.m par exemple) contenant des instructions Matlab.
32
Laboratoire Robotique et Productique Cours Initiation Matlab
Matlab vous offre un éditeur pour écrire et mettre au point vos M-files :
Les M-files sont exécutés séquentiellement dans le “workspace”, c'est-à-dire qu’ils peuvent accéder aux
variables qui s’y trouvent déjà, les modifier, en créer d'autres, etc.
args1,args2,... sont les arguments de sortie de la fonction et peuvent être de n'importe quel type
arge1,arge2,... sont les arguments d'entrée de la fonction et peuvent être de n'importe que type
instructions est un bloc d'instructions quelconque devant affecter les arguments de sortie args1,args2,...
[vars1,vars2,...] = nomfonction(vare1,vare2,...)
Lorsqu'il n'y a qu'un seul argument de sortie, on peut utiliser la syntaxe plus simple :
33
Laboratoire Robotique et Productique Cours Initiation Matlab
Avec compatibilité des variables d'entrées vare1,vare2,... avec les arguments d'entrée arge1,arge2,... et
compatibilité des variables de sorties vars1,vars2,..., si celles-ci ont déjà été utilisées, avec les arguments
de sortie args1,args2,....
Remarque : il n'est pas obligatoire de fournir tous les arguments d'entrées et de sortie lors de l'appel
d'une fonction, mais ceux que l'on omet doivent être les derniers des listes d'entrée ou de sortie. Ainsi,
supposons nomfonction soit une fonction à 2 arguments d'entrée et 2 arguments de sortie, on peut alors
utiliser l'appel suivant :
La limitation du nombre d'arguments de sortie est gérée de façon automatique dans Matlab. Par contre, les
variations du nombre d'arguments d'entrée doivent être gérées par le concepteur de la fonction à l'aide du
paramètre nargin qui indique le nombre d'arguments en entrée lors de l'appel de la fonction.
Par exemple, si sur le disque dur se trouve un fichier qui s’appelle fact.m et son contenu est :
%Fonction factorielle
%un exemple pour le cours d'initiation Matlab
%entrée = u numéro n quelconque
%sortie = -1 si n non-entier
%sortie = n! si n entier
if ~(ent==round(ent))
resultat=-1;
elseif (ent==0)
resultat = 1;
else resultat=ent*fact(ent-1);
end
Nous pouvons maintenant utiliser cette fonction pour calculer le factoriel d’un nombre entier n.
» fact(10)
ans =
3628800
La convention de définition de la fonction ressemble tout à fait aux autres langages de programmation
structurée. Cet exemple en apparence trivial contient plusieurs informations importantes. On observe que
Matlab accepte aussi des fonctions récursives, ce qui est quand même remarquable pour un langage
interprété. Cela ne veut pas dire que l’utilisation de ce genre de fonctions est souhaitable, mais juste pour
montrer que, de point de vue de flexibilité, Matlab n’a rien à envier aux langages compilés.
34
Laboratoire Robotique et Productique Cours Initiation Matlab
Comme vous avez déjà deviné, le symbole % précède une ligne de commentaires qui seront
ignorés. Mais si ces lignes sont en début de fonction, on va voir que la commande :
» help fact
Fonction factorielle
un exemple pour le cours d'initiation Matlab
entrée = un numéro n quelconque
sortie = -1 si n non-entier
sortie = n! si n entier
On peut déclarer des fonctions dans un script principal à la suite des instructions du script principal. Mais
il est souvent plus recommandé, pour des raisons d'organisation, de les placer dans un autre script, voire
plusieurs. Dans ce cas, le nom du script externe devra porter le nom de la fonction avec l'extension .m. Si
dans ce script externe, on y place plusieurs fonctions, seule la fonction dont le script porte le nom sera
accessible depuis le script d'appel. Les autres fonctions ne seront accessibles que dans le script où elles
ont été déclarées; on parle, dans ce cas, de sous fonctions.
Egalement liée aux fonctions, la notion de variable globale permet de rendre visible des variables d'un
script à l'autre. Par défaut, aucune variable n'est globale. Supposons que l'on ait un script principal et un
script secondaire contenant la déclaration de la fonction nomfonction. Pour déclarer de façon globale, la
35
Laboratoire Robotique et Productique Cours Initiation Matlab
variable de nom varg, on introduira l'instruction suivante dans le script principal et la fonction
nomfonction :
global varg
Matlab offre plusieurs moyens de vérifier les arguments d’entrées et de sorties d’une fonction:
En résumé :
Les fichiers fonction (.m) peuvent contenir des codes pour plus d’une fonction. La première fonction dans
le fichier est la fonction primaire, la fonction est appelée avec le nom du fichier. Des fonctions
additionnelles dans le fichier sont les sous fonctions qui sont seulement visibles pour la fonction primaire
ou pour les autres sous fonctions dans le même fichier.
Chaque sous fonction commence par sa propre ligne de définition de fonction. Les fonctions se suivent
immédiatement l’une après l’autre. Les différentes sous fonctions peuvent être dans ordre quelconque, de
moment que la fonction primaire apparaît en premier.
36
Laboratoire Robotique et Productique Cours Initiation Matlab
% Calculate average.
a = sum(v)/n;
Les sous fonctions mean et median calcule la moyenne et la médiane de la liste d’entrée. La fonction
primaire newstats détermine la longueur de la liste et appelle les sous fonctions, en passant la longueur
n de la liste. Les fonctions contenues dans un même fichier .m ne peuvent accéder les mêmes variables
sous réserve de les déclarées variables globales dans les sous fonctions pertinentes, ou les faire passées
comme arguments.
Quand on appelle une fonction à partir d’un fichier .m, MATLAB teste en premier si la fonction est une
sous fonction. Puis il contrôle si elle est une fonction privée ayant le même nom, et puis cherche la
fonction .m standard dans le répertoire de travail.
Exercice 31
Écrire un fichier fonction n qui prend un vecteur comme entré et retourne 1 si tous les éléments sont
positives et -1 si tous les éléments sont tous négatifs et 0 si autrement N.B.: Tapez help all.
Exercice 32
Ecrivez une fonction “index_of_max” qui retourne l’index de l’élément le plus grand d’un vecteur A
donné comme argument d’entrée.
Exercice 33
Quand plusieurs résistances sont connectées dans un circuit électrique en série, la tension à la borne de
chaque résistance est donnée par la règle du diviseur de tension :
Où Vn et Rn sont la tension aux bornes de la résistance n et sa résistance correspondante, Req = ∑Rn est
la résistance équivalente. La puissance dissipée dans chaque résistance est :
37
Laboratoire Robotique et Productique Cours Initiation Matlab
Écrire un programme script qui calcule la tension à la borne de chaque résistance, et la puissance dissipée
dans chaque résistance. Quand le programme script est exécuté, il demande à l’utilisateur de faire entrer
la tension de la tension puis les valeurs des résistances dans un vecteur. Le programme affiche une table
avec les résistances listées dans la première colonne, les tensions dans la seconde colonne et la puissance
dans la troisième colonne. Ensuite, le programme affiche le courant dans le circuit et la puissance totale.
Exercice 34
Écrire une fonction Matlab pour la fonction suivante :
L’entrée pour la fonction est (en radians) et la sortie est r. écrire la fonction de façon que peut être un
vecteur.
1. Utiliser la fonction pour calculer r(π/3) et r(3π/2).
2. Utiliser la fonction pour tracer (en coordonnées polaire) r( ) pour
Exercice 35
La fonction sin(x) peut-être écrite en série de Taylor par :
Écrire une fonction qui calcule sin(x) en utilisant la série de Taylor. Le nom de la fonction et les
arguments utilisés : y = Tsin(x,n). Les arguments d’entrées sont l’angle x en degrés et n le nombre de
termes dans la série. Utiliser la fonction pour calculer sin(150°) en utilisant 3 puis 7 termes.
Exercice 36
Utiliser Matlab de deux différentes façons pour tracer la fonction :
38
Laboratoire Robotique et Productique Cours Initiation Matlab
Dans les scripts d'exécution, l'affichage d'un résultat est exceptionnel. Il sert, essentiellement, à détecter
les erreurs et à afficher des résultats finaux. On prendra donc garde à ne pas oublier le ';' à la fin de
chaque ligne de commande.
Deux commandes utiles pour gérer le workspace, dont la taille dépend de votre espace de swap:
>> save % écrit toutes les variables du workspace dans le fichier matlab.mat
>> load % charge dans le workspace toutes les variables du fichier matlab.mat
Impressions à l'écran
La commande standard d'écriture dans la fenêtre d'exécution est fprintf qui a la structure générale
suivante :
fprintf(format,var1,var2,...)
Où format est une chaîne de caractères décrivant le format d'écriture des variables var1,var2,... que l'on
souhaite afficher. Les principaux types de formats d'écriture sont :
Par souci de simplicité, on peut se contenter d'utiliser les formats %d, %f, %e sans spécifier de longueur
précise.
Par ailleurs, on dispose de certains opérateurs de mise en forme, par exemple \n pour passer à la ligne.
Ainsi, on écrira, par exemple :
39
Laboratoire Robotique et Productique Cours Initiation Matlab
Il est également possible d'écrire les résultats dans un fichier (et souhaitable lorsqu'il y en a beaucoup).
Pour ce faire, on utilise encore la commande fprintf, mais en spécifiant un numéro fid associé à un nom
de fichier de résultats, nommé ici monfichier. On effectue, les opérations suivantes :
L'opération d'ouverture de fichier par la commande fopen a échoué si fid vaut -1 et status renvoie 0 si
l’opération de fermeture par la commande fclose est réussie et -1 sinon.
Lecture de données
Afin de lire des données utiles à l'exécution, on peut procéder de deux façons : soit en interrompant
l'exécution du programme et en demandant à l'utilisateur d'indiquer les données, soit en lisant un fichier
de données. Cette deuxième solution étant bien souvent préférable.
Pour interrompre l'exécution et demander une valeur, on utilise la commande input, dont voici un
exemple d'utilisation :
A l'issue de la réponse, la variable data contiendra la réponse envoyée, qui peut prendre n'importe quel
type et même prendre la valeur vide [] si on a tapé sur enter. C'est d'ailleurs par ce moyen que l'on gère
les valeurs par défaut :
Pour lire des fichiers de donnée, on utilise la commande fscanf dont le principe de fonctionnement est
proche de la commande fprint. Pour lire la donnée data dans le fichier ficdon, on utilisera la suite de
commande suivante :
40
Laboratoire Robotique et Productique Cours Initiation Matlab
Pour plus d'informations, faire help fscanf, help fopen et help fclose. Il existe d'autres méthodes de
lecture et d'écriture sur fichier, faire help iofun pour plus d’informations.
7. Graphisme
Nous donnons ici les indications minimales. Utilisez help et les autres commandes d’aide pour affiner vos
connaissances et vos graphiques.
7.1 Graphiques à 2D
Courbes: plot
Exemple:
>> t=0:0.01e-3:0.06;
>> y=10*exp(-60*t).*cos(120*pi*t);
>> z=10*exp(-60*t).*sin(120*pi*t);
>> plot(t,y,'r',t,z,'g'),grid
>> a=10*exp(-60*t);
>> hold on %Current plot held
>> plot(t,a,'b--')
>> plot(t,-a,'b--')
>> title('Fonctions sinusoidales amorties')
>> xlabel('Temps , s'),ylabel('Tension , V')
>> hold off
>> plot(y,z),grid
>> axis equal
>> xlabel('y'),ylabel('z')
41
Laboratoire Robotique et Productique Cours Initiation Matlab
On peut bien évidemment vouloir afficher plusieurs courbes à l'écran. Pour cela deux solutions s'offrent
à nous :
On peut effectuer plusieurs affichages sur une même figure en utilisant la commande subplot qui
subdivise la fenêtre graphique. Sa syntaxe est :
subplot(nombre_lignes,nombre_colonnes,numéro_subdivision)
Les subdivisions sont numérotés de 1 à nombre_lignes*nombre_colonnes, de la gauche vers la droite puis
de haut en bas.
Exemple :
>> subplot(3,2,1)
>> plot(x,y)
>> subplot(3,2,2)
>> plot(x,y.^2)
1 2
3 4
5 6
On peut aussi ouvrir une deuxième fenêtre graphique à l'aide de la commande figure.
Le passage d'une fenêtre graphique à une autre pourra alors se faire à la souris ou en précisant le numéro
correspondant dans la commande figure(n).
Exemple :
>> w = logspace(0,3,1000);
>> s=j*w;
42
Laboratoire Robotique et Productique Cours Initiation Matlab
>> H=225./(s.*s+3*s+225);
>> AdB=20*log10(abs(H));
>> phase=angle(H)*(180/pi);
>> subplot(2,1,1),semilogx(w,AdB),grid
>> xlabel('w , rad/s'),ylabel('Amplitude , dB')
>> subplot(2,1,2),semilogx(w,phase),grid
>> xlabel('w , rad/s'),ylabel('Phase , degre')
Exercice 37
7.2 Graphiques à 3D
43
Laboratoire Robotique et Productique Cours Initiation Matlab
44
Laboratoire Robotique et Productique Cours Initiation Matlab
45
Laboratoire Robotique et Productique Cours Initiation Matlab
46
Laboratoire Robotique et Productique Cours Initiation Matlab
Exercice 38
Exercice 39
Exercice 40
Un circuit électrique qui comprend une source de tension Vs avec une résistance
interne rs et une résistance de charge Rl. La puissance dissipée dans la résistance de
charge est donnée par :
Exercice 41
L’amplitude M, dans l’échelle de Richter d’un tremblement de terre est donnée par :
Exercice 42
Une résistance R = 4 Ohm et une inductance L = 1.3 H, sont connectées comme montré dans la figure ci-
dessous. Quand la source de tension applique une tension impulsion rectangulaire d’amplitude 12V et de
durée 0.5 s. Le courant i(t) dans le circuit est fonction du temps et donné par :
47
Laboratoire Robotique et Productique Cours Initiation Matlab
Exercice 43
Un projectile est tiré avec une vitesse initiale de 250m/s avec un angle θ = 65° relative à la terre. Le
projectile est dirigé directement vers le nord mais un vent l’a dévié vers l’ouest. Le projectile aussi a une
vitesse constante de 30 m/s. Déterminer et tracer la trajectoire du projectile jusqu’à ce qu’il touche la
terre. Par comparaison, tracer sur la même figure, la trajectoire en absence de vent.
7.3 Animations
Cet exemple illustre l’utilisation des animations pour visualiser la quantité fft(eye(n)), qu’est une
matrice complexe n-par-n dont les éléments sont les différentes puissances de la n-ieme racine unité,
exp(i*2*pi/n).
Création de l’animation
48
Laboratoire Robotique et Productique Cours Initiation Matlab
Créer l’animation dans une boucle for en appelant getframe pour capturer le graphe. Vu que la
commande plot reset les propriétés des axes, appeler axis equal dans la boucle avant getframe.
for k = 1:16
plot(fft(eye(k+16)))
axis equal
M(k) = getframe;
end
Exécution de l’animation
Apres la génération de l’animation, on peut la faire jouer plusieurs fois. Pour l’exécuter 30 fois tapé
movie(M,30)
8. Introduction à SIMULINK
Simulink est l'extension graphique de MATLAB permettant de représenter les fonctions mathématiques et
les systèmes sous forme de diagramme en blocs, et de simuler le fonctionnement de ces systèmes.
Pour démarrer Simulink, Dans la fenêtre Commande de MATLAB, taper simulink. La fenêtre Simulink
va s'ouvrir.
Cette fenêtre contient des collections de blocs que l'on peut ouvrir en cliquant (double) dessus:
Sources Sources de signaux
Sinks Systèmes d’affichage
49
Laboratoire Robotique et Productique Cours Initiation Matlab
50
Laboratoire Robotique et Productique Cours Initiation Matlab
Pour démarrer la simulation, dans le menu Simulation, on choisit Run. On peut aussi cliquer sure le
triangle vert pour démarrer la simulation.
Une structure peut être modifiée simplement par suppression de champs ou par attachements de champs.
Alors, par exemple,
51
Laboratoire Robotique et Productique Cours Initiation Matlab
9. Applications
définit une image de L lignes et C colonnes dont l'information portée est définit dans un espace à p
dimensions. Si I est une image binaire, alors p, M 1,1 Si I est une image en niveaux de gris, alors
p 1 et le plus souvent M 255 Si I est une image couleur, alors p 3 et le plus souvent M 255 .
L’image digitale est représentée sous la forme d’un tableau de pixels. Traditionnellement, on numérote les
lignes de haut en bas et de gauche à droite, et on numérote (0, 0) le coin gauche supérieur de l’image.
Dans les problèmes de vision tridimensionnelle, il est plus commun de placer le pixel (0, 0) au centre de
l’image, là ou l’axe optique perce le plan de l’image (la location précise de ce point est définie par
étalonnage (calibrage) du système optique).
Matlab dispose un « Image Processing Toolbox » pour la lecture, le traitement et l’affichage de plusieurs
types d’images.
Exemple :
1. Ecrire un scripte Matlab qui fait la binairisation (noire et blanc) de l’image I avec un
seuil .
52
Laboratoire Robotique et Productique Cours Initiation Matlab
2. L’histogramme « H(x) » d’une image «I» traduit le nombre d'apparitions du niveau de gris « x »
dans l'image I. Ecrire un programme Matlab qui calcule l’histogramme de l’image I pour x allant
de 0 jusqu’à 255.
[Tout,Yout] = ode23(ODEFUN,TSPAN,Y0)
avec
TSPAN = [T0 Tfinal],
Y0 est la condition initiale,
ODEFUN est la fonction f, pour un scalaire T et un vecteur Y
ODEFUN(T,Y)donne en sortie un vecteur colonne qui correspond à f(t,
y).
Exemple :
Résoudre l’équation différentielle suivante :
y’’= (1-y2)y’-y. pour tϵ[0 20], et les conditions initiales: y(0)=2,
y’(0)=2;
>> Y = filter(B,A,X);
La fonction roots qui calcule les zeros d'un polynôme, peut lui être associée afin de trouver les zéros et les
pôles d'un ARMA ; Par exemple le polynôme P(z)=z3-6z2-72z-27 est représenté par le vecteur :
>> r=roots(p)
r = 12.1229 -5.7345 -0.3884
53
Laboratoire Robotique et Productique Cours Initiation Matlab
Pour calculer la valeur du polynôme en certain points on pourra utiliser la fonction polyval :
La fonction poly effectue l'opération inverse de roots : étant donné un polynôme unitaire défini par ses
racines, poly le développe en donnant les coefficients de ses monômes en puissance décroissante.
>> p=poly(r)
p = 1.000 -6.000 -72.000 -27.000
D'autre part, si l'argument de poly est une matrice, la fonction renvoie les coefficients du polynôme
caractéristique de cette matrice.
>> Z = conv(X,Y);
Cette convolution est complète dans le sens où la longueur de Z est la somme des longueurs de X et Y
moins 1. Elle peut aussi être interprétée comme le développement du produit de deux polynômes.
En dimension 2 les fonctions correspondant à filter et conv sont filter2 et conv2.
Une fonction fournie mais dont l'utilisation doit vous sembler délicate est la fonction deconv. Elle est
sensée effectuer une déconvolution, ce qui peut sembler ambitieux (pour ceux qui ont suivi un cours sur
les problèmes inverses). Néanmoins cette fonction est utile pour la division de polynômes.
La transformation de Fourier rapide (Fast Fourier Transform) est implémentée sous Matlab et s'appelle fft,
de même on a la transformation inverse ifft; en dimension 2 on a fft2 et ifft2. Matlab nous donne la FFT
pour les fréquences normalisées sur [0, 1], pour les représenter sur [-0.5, 0.5] on utilisera la fonction
fftshift.
Matlab possède deux instructions pour générer des nombres pseudo-aléatoires : rand et randn.
>> Y=rand(p,q);
Génère une matrice de taille p×q contenant des nombres uniformément répartis sur l'intervalle [0,1]. De
même randn génère une matrice de taille p×q contenant des nombres répartis selon une loi gaussienne de
moyenne nulle et de variance unité. Ces générateurs de nombres pseudo-aléatoires sont toujours activés
avec la même graine au démarrage de Matlab. On veillera à utiliser l'option seed si l'on veut, pour
commencer, une autre séquence que celle offerte par défaut.
Matlab possède des fonctions permettant d'analyser des nombres pseudo-aléatoires. Ainsi les fonctions
mean, std, et cov, fournissent des estimations de la moyenne, de l'écart-type et de la matrice de covariance
de vecteurs et matrices correspondants à des réalisations de variables aléatoires.
54
Laboratoire Robotique et Productique Cours Initiation Matlab
On illustre par un exemple. Supposant qu’on veut combiner certaines propriétés graphiques MATLAB
comme :
Ce listing inclus des nombres, des vecteurs numériques et des chaines de caractères. On définit la
structure Graphic de la façon suivante:
>> Graphic
Graphic =
title: 'Example'
xlabel: 'time / s'
ylabel: 'voltage / V'
num: 2
color: 'rb'
grid: 1
55
Laboratoire Robotique et Productique Cours Initiation Matlab
xVals: [0 5]
yVals: [-1 1]
Une structure peut être aussi définit en utilisant la fonction Matlab struct. Par exemple :
56
Laboratoire Robotique et Productique Cours Initiation Matlab
57
Laboratoire Robotique et Productique Cours Initiation Matlab
58
Laboratoire Robotique et Productique Cours Initiation Matlab
59
Laboratoire Robotique et Productique Cours Initiation Matlab
60
Laboratoire Robotique et Productique Cours Initiation Matlab
61
Laboratoire Robotique et Productique Cours Initiation Matlab
62
Laboratoire Robotique et Productique Cours Initiation Matlab
63
Laboratoire Robotique et Productique Cours Initiation Matlab
64
Laboratoire Robotique et Productique Cours Initiation Matlab
65
Laboratoire Robotique et Productique Cours Initiation Matlab
66
Laboratoire Robotique et Productique Cours Initiation Matlab
67