Programmation sous Matlab

Download Report

Transcript Programmation sous Matlab

Programmation sous Matlab
Invite, fichiers *.m, répertoire, aide
>>
Fenêtre de commande :
invitation à entrer des :
- commandes, cad des instructions
- noms de fonctions avec leurs arguments d’entrée et de sortie
- noms de programmes
Les fonctions (y=f(x))et les programmes (suite de commandes) sont des fichiers avec
une extension ***.m. Ne pas utiliser des caractères exotiques: accents, tirets, chiffres
en première position, ...
Créer ou éditer un fichier => cliquer File/New/M-file ou File/Open dans le coin
supérieur gauche du menu principal, trouver/selectionner/charger le fichier en
double-cliquant sur son nom et/ou commencer à l’éditer dans la fenêtre Editor.
Si le chemin du fichier à executer n’est pas dans le Current Directory ni listé dans le
MATLAB search path, le fichier ne sera pas reconnu par Matlab. Dans ce cas changer
de répertoire courant en cliquant sur la petite icône :
1
Programmation sous Matlab
Espace de travail, création de matrices, « ; »
-Matlab mémorise toutes les variables utilisées lors d’une session à moins que la
commande clear ait été utilisée.
- Matlab manipule entre autres variables des matrices. Par exemple pour entrer :
Taper les commandes suivantes et entrer:
% les point-virgules entre les crochets mettent en colonne
% le point virgule en fin de commande, annule l’affichage
2
Programmation sous Matlab
Input, format d’affichage
- La commande input permet d’entrer des données via le clavier.
exemple:
L’affichage ne présente pas la valeur stockée en mémoire. Utiliser la commande format
pour augmenter le nombre de décimales affichées ou changer la nature de la
représentation:
% décimal avec 14 digits
% notation scientifique long
% codage hexadécimal
% retour au format court (format par défaut)
- La commande fprintf permet des affichages plus controlés...
3
Programmation sous Matlab
Plot, décorations
>> temp=[25, 12; 20, 9; 22, 10; 16, 9; 14, 5];
>> plot(temp)
>> title('the highest/lowest temperature of these days')
>> ylabel('degrees[°C]'), xlabel('day')
>> days=[11, 12, 14, 16, 17];
>> plot(days, temp)
>> plot(days,temp(:, 1), 'b*', days, temp(:, 2), 'ro')
% décorations, ...
4
Programmation sous Matlab
fonction R  R :
function y = f1(x)
y = 1 ./ (1 + 8 * x.^2);
end
Fonctions à 1 entrée et 1sortie
>> f1(1) % valeur renvoyée pour x=1
ans = 0.1111
>> f1([0, 1]) % valeur renvoyée pour le
% vecteur [0, 1]
ans = 1 0.1111
Fichiers à écrire dans
l’éditeur et à sauver
fonction R2  R2 :
function y = f49(x)
y(1) = x(1)*x(1) + 4*x(2)*x(2) - 5;
y(2) = 2*x(1)*x(1) - 2*x(1) - 3*x(2) - 2.5;
y = y(:);
end
>> f49([2; 3]) % valeur renvoyée pour x=[2; 3]
ans =
35.0000
-7.5000
>> f49(1)
??? Attempted to access x(2); index out of bounds
because numel(x)=1.
Error in ==> f49 at 2
y(1) = x(1)*x(1) + 4*x(2)*x(2) - 5;
5
Programmation sous Matlab
function y = f49(x1, x2)
y(1) = x1*x1 + 4*x2*x2 - 5;
y(2) = 2*x1*x1 - 2*x1 - 3*x2 - 2.5;
y = y(:);
end
function [y1, y2] = f49(x1, x2)
y1= x1*x1 + 4*x2*x2 - 5;
y2 = 2*x1*x1 - 2*x1 - 3*x2 - 2.5;
end
Fonctions à entrées et sorties multiples
>> f49(2, 3) % valeur renvoyée pour x1=2
% et x2=3
ans =
35.0000
-7.5000
>> f49(2, 3) % valeur renvoyée pour x1=2 et x2=3
ans =
35.0000
>> [u, v] = f49(2, 3)
u = 35
v = -7.5000
6
Programmation sous Matlab
Fonctions « anonymes »
fonction R  R :
>> f1 = @(x) 1./(1 + 8*x.^2); % création de la «poignée de fonction» f1 (EN: handle)
>> f1(1/sqrt(8))
ans = 0.5000
fonction R2  R2 :
>> f49 = @(x1, x2) [x1*x1 + 4*x2*x2 - 5; 2*x1*x1 - 2*x1 - 3*x2 - 2.5];
>> f49(1, 2)
ans =
40
12.0000
-8.5000
a x2+b x+c
30
>> a = 1; b = 2; c = 3; % passage de paramétres
>> parabole = @(x) a*x.^2 + b*x + c;
>> ezplot(parabole, [-5, 5])
20
10
0
-5
0
x
5
Programmation sous Matlab
Polyval, indexation des matrices
- Pour calculer rapidement les valeurs d’une fonction polynomiale, on la définit
simplement par ses coefficients rangés par ordre décroissant:
>> p = [1 0 -3 2];
% fonction polynomiale p(x) = 1x3 + 0x2 − 3x + 2
>> polyval (p, [-1 0 1 2 3 4 5])
ans = 4 2 0 4 20 54 112
-Manipulation de matrices:
>> A = [1 2 3; 4 5 6], B = [3; -2; 1]
>> A = [A; 7 8 9]
% [..]=concaténation
A= 1 2 3
4 5 6
7 8 9
>> B = [B, [1, 0, -1]’]
B= 3 1
-2 0
1 -1
>> A(3,3) = 0
A= 1 2 3
4 5 6
7 8 0
% le prime transpose (ligne => colonne)
>> A(2:3, 1:2)
ans = 4 5
78
>> A(2, :)
ans = 4 5 6
% lignes 2 à 3 et colonne 1 à 2
% 2ieme ligne, toutes les colonnes
8
Programmation sous Matlab
Création de vecteurs, taille
>> t = 0 : 0.1 : 2
t = [0.0 0.1 0.2 ... 1.9 2.0]
% de zéro à 2 par pas de 0.1
>> t = 0:2
t=012
% par défaut le pas est +1
>> t = 0 : -1 : -6
t = [0 -1 -2 -3 -4 -5 -6]
% pas négatif
>> D = zeros(4, 1); D(2) = 2; D(4) = 3
D=0
2
0
3
% prédéfinir un vecteur vertical nul
>> D(5)
??? Index exceeds matrix dimensions.
>> D(0) = 1;
??? Index into matrix is negative or zero.
>> length(D)
ans = 4
>> [M,N] = size(D)
M=4
N=1
>> D(1.2)
??? Subscript indices must either be real positive integers ..
9
Programmation sous Matlab
Opérations avec les matrices
Marices
10
Programmation sous Matlab
Génération rapide, transformations
>> Z = zeros(2,3)
Z= 0 0 0
0 0 0
>> E = ones(2, 2)
E=1 1
1 1
>> I = eye(2)
I=1 0
0 1
% retourne la matrice identité 2X2
>> B = fliplr(A) %flip left-right
B = 3 2 -1
2 5 4
>> C = reshape(A, 3, 2)
C = -1 5
4 3
2 2
>> D = flipud(A)
D= 4 5 2
-1 2 3
%flip up-down
11
Programmation sous Matlab
Nombres aléatoires
- rand(m,n) retourne une matrice mXn de nombres aléatoires uniformément distribués.
- randn(m,n) retourne une matrice mXn de nombres aléatoires normalement distribués.
>> u_noise = rand(1000, 1)
>> subplot(221), hist(u_noise, 20)
>> u_noise1 = 2*u_noise-1
>> subplot(222), hist(u_noise1, 20)
>> n_noise = randn(1000, 1)
>> subplot(223), hist(n_noise, 20)
>> n_noise1 = n_noise/2+1
>> subplot(224), hist(n_noise1, 20)
12
Programmation sous Matlab
% exemple 1
t= input(t = ')
if t > 0
sgnt = 1;
else
sgnt = -1;
end
If, floor, switch, while, for
% exemple 2
point = input('point= ') % note sur 100
switch floor(point/10)
% floor(x): arrondi à l’entier < ou = à x
case 9, grade = ’A’
case 8, grade = ’B’
case 7, grade = ’C’
case 6, grade = ’D’
otherwise grade = ’F’
end
% exemple 4
point = [76, 85, 91, -1, 65, 87];
for n = 1:length(point)
if point(n) >= 80, pf(n, :) = 'pass';
elseif point(n) >= 0, pf(n, :) = 'fail';
else % point(n)< 0
pf(n, :) = '????';
display('Quelque chose ne va pas ...')
end
end
pf
% exemple 3
continuer=true;
while continuer
x=rand
pause(0.2)
if x>0.8, continuer=false; end
end
x = 0.7140
x = 0.5762
x = 0.8668
Quelque chose ne va pas ...
pf =
fail
pass
pass
????
fail
pass
13
Programmation sous Matlab
Fichiers *.mat et *.dat, load, save
Matlab utilise 2 types de fichiers de données.
Le premier est en format binaire (***.mat), peut contenir plusieurs variables, ne peut
pas être utilisé par d’autres programmes.
Le second est en format ASCII (***.dat), ne peut contenir qu’une variable mais peut
être lu par d’autres programmes.
Nom de
fichier
Nom des
variables
>> save mesdata A B C % sauve les variables A, B et C dans le fichier ‘mesdata.mat’
Utiliser la commande load mesdata pour recharger les variables A, B et C.
>> save fileB B –ascii
% sauve les valeurs de B dans le fichier ‘fileB.dat’
Nom de
fichier
format
Nom de la
variable
14
Programmation sous Matlab
Exercice: quadrature de la fonction sinc
Le développement de Taylor au 1ier ordre sans reste, constitue l’algorithme d’Euler
pour intégrer une fonction connue g(x).
Soit g(t)=sinc(t) la fonction à intégrer et G(t) son intégrale
supposée inconnue.
a) Montrer qu’on a l’approximation G(t+h) = G(t) + h*sinc(t).
b) Donner l’expression de Gn = G(t+n*h) en fonction de Gn-1 = G(t+(n-1)h) sous une
forme similaire à celle donnée en a).
c) Représenter sinc(t) (fonction native dans Matlab) sur le domaine discret t  [-1, 1] avec
100 points (length(t) = 100) et en utilisant la fonction linspace.
d) On donne la condition initiale: G(t=-1) = 0. Déduire de a) et b), un algorithme pour
calculer G(t) sur [-1, 1]. Réaliser l’algorithme dans un programme. Représenter G(t) sur le
même graphe que c).
Si vous avez des difficultés, permutez les lignes de code suivantes dans le bon ordre et ajouter une boucle ‘for..end’:
h = t(2)-t(1);
G(1) = 0;
plot(t, G, 'r')
G(i) = G(i-1) + h*sinc(t(i-1));
t = linspace(-1, 1, N);
hold on
plot(t, sinc(t), '.')
N=100;
Programmation sous Matlab
Exercice: dérivée numérique
Ecrire une fonction df = derive(f, x) qui calcule la dérivée numérique ‘df’ de la fonction
‘f’ sur le domaine ‘x’. La dérivée sera estimée en utilisant une différence finie centrée.
L’incrément sera x = max(x)/1000. En effet, si x est fixé à une faible valeur arbitraire,
par exemple 10-12 et que les valeurs de x sont grandes, disons de l’ordre de 1010, on a
f(x) = f(x + 10-12) car l’ordinateur ne distingue pas 2 nombres de l’ordre de grandeur de
x et ne différant que d’une quantité inférieure à une certaine valeur appelée
« epsillon ». Cela rend impossible le calcul de la différence finie.
La définition choisie pour x donnerait : x = 107 >> epsillon.
1.5
Effectuer un test du genre:
1
>> x = -10 : 0.01 : 10;
>> f=@sinc;
>> plot(x, f(x), x, derive(f, x))
>> grid on
0.5
0
-0.5
-1
-1.5
-10
-8
-6
-4
-2
0
2
4
6
8
10
Programmation sous Matlab
Représenter la fonction sinc
- Exécuter ce programme:
x = [-100:100]*pi/25;
y = sin(x)./x;
plot(x, y)
axis([-15,15, -0.4, 1.2])
- Quelle différence avec celui-ci:
x = [-4*pi : 0.1 : +4*pi];
y = sin(x)./x;
plot(x, y)
axis([-15, 15, -0.4, 1.2])
Indice: essayer : >> sin(0)/0
Exercice: NaN, sum, prod
Opérations sur les vecteurs
- Donner l’expression mathématique dont le calcul
pourrait être réalisé avec les commandes :
>> n=0:100;
>> S=sum(2.^-n)
- Ecrire les commandes Matlab réalisant le calcul :
- Ecrire une fonction utilisant prod() et sum() pour
calculer le produit des sommes de chaque ligne
d’une matrice 3X3 à valeurs aléatoires.
17
Programmation sous Matlab
Exercice: Taylor
On veut faire une expérience numérique en comparant la fonction sinus avec son
approximation de Taylor à l’ordre 11.
a) Générer le vecteur x de longueur 100 s’étendant de 0 à 2 .
b) Générer le vecteur y égal à la série de Taylor sans reste de
sin(0 +x) = sin(0) + x/1! (cos(0)) + x2/2! (-sin(0)) + … + ... = y(x)
jusqu’à l’ordre 11 (on utilisera la commande factorial).
a) Représenter y et sin(x) sur le même graphique qui sera décoré.
1
0
-1
-2
sin(x)
Taylor 11
-3
-4
0
2
4
6
8
Programmation sous Matlab
Exercice: while, input, save, load, axis
- En utilisant l’éditeur Matlab, écrire un programme qui permette à l’utilisateur d’entrer des données
par paires « hauteur/poids » pour autant de personnes que nécessaire jusqu’à ce qu’il appuie sur la
touche Entrée. Le programme sauvera l’ensemble des données sous la forme d’une matrice mX2
dans un fichier ***.dat et dont le nom sera saisi par l’utilisateur. Si vous n’avez aucune idée pour
réaliser ce programme, vous pouvez permuter les lignes de code ci-dessous dans le bon ordre.
Exécuter le programme et entrer les données ci-dessous (nom de fichier à utiliser ‘hp.dat’):
Hauteur: 1.85
Poids:
82
-Ecrire un programme qui charge les
données du fichier hp.dat et les
représente avec le symbôle ‘+’. Les
axes couvriront le domaine [1.50, 2.00]
et [60, 85] (utiliser la commande axis).
1.78
80
1.88
78
1.68
65
1.70
64
% Entrée de données, sauvegarde
clear
k = 0;
continuer = 1;
while continuer
end
k = k + 1;
X(1,k) = h;
h = input('Entrer la hauteur ')
x(2,k) = input('Entrer le poids ')
if isempty(h), continuer = 0; break, end
filename = input(‘Entrer le nom de fichier (.dat):', 's');
filename = [filename, '.dat'];
save(filename, 'x', '/ascii')
19