Sous-sections
- 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:
- résolution de système linéaire
- détermination des valeurs propres
- résolution de problème non-linéaire
- résolution d'équations différentielles (raides)
- intégration numérique
- optimisation et contrôle
- graphique 2D et 3D
Utilisation de l'aide en ligne !!!
- 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=');
- 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);
- 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)
- 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
- 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
Un programme ou suite d'instructions Matlab peut être sauvegardé dans
un fichier script (M-File) ayant une extension .m
fichier program.m
- a=0; fa=-Inf;
- b=3; fb=-fa;
- 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
- 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
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
- function x=racine(a,b)
- % calcul la racine de la fonction f(x) définie ci-après sur [a,b]
- fa=f(a); fb=f(b); x=(a+b)/2;
- if (fa*fb>0) x=-Inf; return; end;
- while (b-a)>eps*x
- x=(a+b)/2; fx=f(x);
- if(sign(fx)==sign(fa))
- a=x; fa=fx;
- else
- b=x; fb=fx;
- end
- end
- % definition de f(x) (fonction locale)
- function y=f(x)
- y=x^3-2*x-5
Fonction calculant
1ere version récursive
- function y=fact(n)
- if (n<=1) y=1
- else y=n*fact(n-1)
- end
2nd version avec une boucle
- function y=fact(n)
- y=1;
- for i=2:n, y=y*i, end
3ieme version optimisée
- function y=fact(n)
- y=prod(1:n);
- function handle
- pointeur vers une fonction=adresse
ptr_fonct=@fonction
- evaluation
- feval(ptr_fonct,liste arguments)
Calcul de l'intégrale
par la méthode des
trapézes
- function A=trapezes(ptr_f,a,b,n)
- h=(b-a)/n; X=[a:h:b]; Y=feval(ptr_f,X);
- A=h*((Y(1)+Y(n+1))/2+sum(Y(2:n)));
- % ou A=trapz(X,Y);
Utilisation
>> fp=@sin
>> A=trapezes(fp,0,pi)
Matlab est un langage matricielle!
il faut donc utiliser en priorité les notations matricielles
Exemple: calcul de la matrice de Vandermond
première version: méthode naturelle (identique au C)
- t=[0:1:200]; n=100;
- cpu0=cputime();
- m=size(t,1);
- for i=1:m
- for j=1:n+1
- A(i,j)=t(i)^(j-1);
- end
- end
- cputime()-cpu0
qui s'exécute en 4,87 sec
version matricielle optimisée
- cpu0=cputime();
- m=size(t,1);
- A=zeros(m,n+1);
- for i=1:n
- A(:,i+1)=A(:,i).*t;
- end
- cputime()-cpu0
Alors que la version matricielle s'exécute en 0,06 s, soit
80 fois plus rapidement
- E/S formattées
- générales et similaires au C
fid=fopen(nomfichier,permisson)
permission='r','w' (sous windows) 'rt','wt'
A=fscanf(fid,format)
format='%d %g %f %s %c'
count=fprintf(fid,format,A1,A2,..)
status=fclose(fid)
Pr. Marc BUFFAT
marc.buffat@univ-lyon1.fr
2008-01-29