Sous-sections

2.3 Matlab

Matlab
langage de manipulation numérique de matrices
(voir aussi Scilab (http://www-rocq.inria.fr/scilab))
Matlab est une boite à outils d'analyse numérique, avec un environnement agréable pour faire du calcul numérique avec sa programmation matricielle. Il dispose des méthodes usuelles de l'analyse numérique:

  1. résolution de système linéaire
  2. détermination des valeurs propres
  3. résolution de problème non-linéaire
  4. résolution d'équations différentielles (raides)
  5. intégration numérique
  6. optimisation et contrôle
  7. graphique 2D et 3D
Utilisation de l'aide en ligne !!!

2.3.1 Rappel sur Matlab

clear
efface toutes les variables
variable
définition lors de l'initialisation
instruction
si terminer par un $;$ pas d'affichage du résultat
vecteur ligne
X=[1 2 3]; X=[1:0.5:3]; X=ones(1,5);
vecteur colonne
Y=[1;2;3]; Y=X'; Y=zeros(5,1);
matrice
A=[ 1 0; 0 1]; A=eye(2,2); M=[X;X]; M=[Y Y]; M=[Y;Y];M=A';
opérations
*, -, / , \ : X=A\B; ou X=inv(A)*B;
fonctions
s'appliquent aux matrices
sin(A); A^2; A.^2;
sin(A).^2+cos(A).^2-ones(size(A))
chaînes
caractères entre 2 ' , concatenation S=['un' ' et deux'] (tableau de car.)
entrée sortie
disp(X); X=input('X=');

2.3.2 Structures de contrôle

2.3.2.1 boucles

for var=exp, inst., end
boucle sur les colonnes de exp
for var=1:n, inst, end
boucle classique de 1 à n
Un premier exemple

X=rand(1,5);

S=0; for K=X, S=S+K^2, end;
qui peut s'écrire plus classiquement

X=rand(1,5);

S=0; for i=1:length(X), S=S+X(i)^2, end;
En général, on peut éviter les boucles explicites

Exemple
calcul d'un résidu partiel des lignes 2 à 4 d'un système 5*5
A=rand(5,5); X=rand(5,1); B=rand(5,1); R=zeros(5,1);

for i=2:4

  R(i)=B(i)

  for j=1:5

    R(i)=R(i)-A(i,j)*X(j)

  end

end
que l'on peut écrire plus efficacement

for i=2:4, R(i)=B(i)-A(i,1:5)*X(1:5), end
ou encore

R(2:4)=B(2:4)-A(2:4,1:5)*X(1:5);

2.3.2.2 Test si

if cond , inst1 ,else inst2, end
test classique (possibilité de elseif)
if x<0, y=x, else, y=-x, end
valeur logique:
0=faux, 1=vrai
opérateurs logiques:
& (et), | (ou), ~ (négation)
opérateurs relationnels:
<, <= ,> ,>= ,== ,~=
fonctions logiques:
any(Y==1), all(X==0)

2.3.2.3 Choix multiple

switch var, case val1, exp1; case val2, exp2; ...;otherwise, exp; end
 
switch num

case -1

  disp('moins un');

case 1

  disp('plus un');

case 0

  disp('zero');

otherwise

  disp('autres valeurs');

end

2.3.2.4 Boucle tant que

while cond, inst., end
exécute les instructions tant que la cdt est vrai
n=1

while prod(1:n)<1.0e100

  n=n+1
end
continue
passage à l'itération suivante
break
arrêt de la boucle interne

2.3.2.5 Script

Un programme ou suite d'instructions Matlab peut être sauvegardé dans un fichier script (M-File) ayant une extension .m

fichier program.m

  1. a=0; fa=-Inf;
  2. b=3; fb=-fa;
  3. while (b-a) >eps*b
  4.   x=(a+b)/2; fx=x^3-2*x-5;
  5.   if (sign(fx) == sign(fa))
  6.      a=x; fa=fx;
  7.   else
  8.      b=x; fb=fx;
  9.   end
  10. end
  11. x
Pour exécuter le script, il suffit de taper le nom du fichier sans l'extension

>> program

Rem: les variables du script sont globales

2.3.2.6 Fonctions

Une fonction sont écrites dans un fichier avec une extension .m (M-File) et le nom du fichier doit être le nom de la première fonction définie (la seule visible). On l'exécute en tapant le nom avec des arguments.

fonction
function arguments de sortie = nom(arguments d'entrée)
fonction racine

  1. function x=racine(a,b)
  2. % calcul la racine de la fonction f(x) définie ci-après sur [a,b]
  3. fa=f(a); fb=f(b); x=(a+b)/2;
  4. if (fa*fb>0) x=-Inf; return; end;
  5. while (b-a)>eps*x
  6.   x=(a+b)/2; fx=f(x);
  7.   if(sign(fx)==sign(fa))
  8.    a=x; fa=fx;
  9.   else
  10.    b=x; fb=fx;
  11.   end
  12. end
  13. % definition de f(x) (fonction locale)
  14. function y=f(x)
  15. y=x^3-2*x-5

2.3.2.7 Exemples

Fonction calculant $n!$

1ere version récursive

  1. function y=fact(n)
  2. if (n<=1) y=1
  3. else y=n*fact(n-1)
  4. end
2nd version avec une boucle

  1. function y=fact(n)
  2. y=1;
  3. for i=2:n, y=y*i, end
3ieme version optimisée

  1. function y=fact(n)
  2. y=prod(1:n);

2.3.2.8 Pointeurs vers une fonction

function handle
pointeur vers une fonction=adresse
ptr_fonct=@fonction

evaluation
feval(ptr_fonct,liste arguments)
Calcul de l'intégrale $I=\int_{a}^{b}f(x)\, dx$ par la méthode des trapézes

  1. function A=trapezes(ptr_f,a,b,n)
  2. h=(b-a)/n; X=[a:h:b]; Y=feval(ptr_f,X);
  3. A=h*((Y(1)+Y(n+1))/2+sum(Y(2:n)));
  4. % ou A=trapz(X,Y);
Utilisation

>> fp=@sin

>> A=trapezes(fp,0,pi)

2.3.3 Optimisation

Matlab est un langage matricielle!

il faut donc utiliser en priorité les notations matricielles

Exemple: calcul de la matrice de Vandermond $A$


\begin{displaymath}
A^{t}=\left[\begin{array}{ccccc}
1 & t_{1} & t_{2} & .. & t_...
...\
1 & t_{1}^{m} & t_{2}^{m} & .. & t_{n}^{m}\end{array}\right]\end{displaymath}

première version: méthode naturelle (identique au C)

  1. t=[0:1:200]; n=100;
  2. cpu0=cputime();
  3. m=size(t,1);
  4. for i=1:m
  5.   for j=1:n+1
  6.     A(i,j)=t(i)^(j-1);
  7.   end
  8. end
  9. cputime()-cpu0
qui s'exécute en 4,87 sec

version matricielle optimisée

  1. cpu0=cputime();
  2. m=size(t,1);
  3. A=zeros(m,n+1);
  4. for i=1:n
  5.   A(:,i+1)=A(:,i).*t;
  6. end
  7. cputime()-cpu0
Alors que la version matricielle s'exécute en 0,06 s, soit 80 fois plus rapidement

2.3.4 E/S avec Matlab

E/S formattées
générales et similaires au C

2.3.4.1 ouverture du fichier

fid=fopen(nomfichier,permisson)
permission='r','w' (sous windows) 'rt','wt'

2.3.4.2 lecture dans le fichier

A=fscanf(fid,format)
format='%d %g %f %s %c'

2.3.4.3 ecriture dans le fichier

count=fprintf(fid,format,A1,A2,..)

2.3.4.4 fermeture du fichier

status=fclose(fid)


Pr. Marc BUFFAT
marc.buffat@univ-lyon1.fr
2008-01-29