Beruflich Dokumente
Kultur Dokumente
Marc Buffat UFR de Mcanique Universit Claude Bernard, Lyon I 11 septembre 2006
1.2. ALGORITHME
1.2.2 Exemple
Problme : dtermination du PGCD de 2 nombres entiers a et b Analyse : proprit du PGCD PGCD(a,b)=PGCD(a-b,b) (si a > b) PGCD(a,b)=PGCD(a,b-a) (si a < b) PGCD(a,a)=a Algorithme PGCD
a,b entiers positifs tant-que a = b faire si a > b alors a a b sinon b b a n tant-que PGCD a Programme Matlab 1. % calcul le PGCD de 2 nombres entiers a et b 2. % initialisation alatoire 3. A=round(1000*rand(1)) ; B=round(1000*rand(1)) ; 4. % algorithme 5. a=A ; b=B ; 6. while (a~=b) 7. 8. 9. if (a>b) a=a-b ; else b=b-a ; end
1.2 Algorithme
Algorithme : ensemble de rgles prcises, qui permettent dobtenir un rsultat partir doprations lmentaires Algorithme numrique : donnes et rsultats = nombres Calcul scientique : utilisation dun ordinateur pour rsoudre un modle mathmatique dun problme physique laide dalgorithmes numriques.
1.3. MATLAB
1. Conception modulaire descendante Dcomposer le problme gnral en une succession de sous-problmes plus simples et si possibles indpendants. Dterminer les points essentiels 2. Rechercher dune solution algorithmique Utilisation de bibliothques 3. Programmation structure ascendante Des sous-programmes (procdures) au programme principal Soigner le fond en priorit et non la forme Programmer simplement (sans astuces)
1.3. MATLAB
oprations *, -, / , \ : X=A\B ; ou X=inv(A)*B ; fonctions sappliquent aux matrices sin(A) ; A^2 ; A.^2 ; sin(A).^2+cos(A).^2-ones(size(A))
chanes caractres entre 2 , concatenation S=[un et deux] (tableau de car.) entre sortie disp(X) ; X=input(X=) ;
1.3 Matlab
Matlab langage de manipulation numrique de matrices (voir aussi Scilab (http ://www-rocq.inria.fr/scilab)) Matlab est une boite outils danalyse numrique, avec un environnement agrable pour faire du calcul numrique avec sa programmation matricielle. Il dispose des mthodes usuelles de lanalyse numrique : 1. rsolution de systme linaire 2. dtermination des valeurs propres 3. rsolution de problme non-linaire 4. rsolution dquations diffrentielles (raides) 5. intgration numrique 6. optimisation et contrle 7. graphique 2D et 3D Utilisation de laide en ligne ! ! !
Un premier exemple X=rand(1,5) ; S=0 ; for K=X, S=S+K^2, end ; qui peut scrire plus classiquement X=rand(1,5) ; S=0 ; for i=1 :length(X), S=S+X(i)^2, end ; En gnral, on peut viter les boucles explicites Exemple calcul dun rsidu partiel des lignes 2 4 dun systme 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 lon peut crire plus efcacement 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) ;
Marc BUFFAT, UFR Mcanique, UCBLyon
7
Test si
1.3. MATLAB
1.3. MATLAB
Script
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 oprateurs logiques : & (et), | (ou), ~ (ngation) oprateurs relationnels : <, <= ,> ,>= ,== ,~= fonctions logiques : any(Y==1), all(X==0) 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 Boucle tant que while cond, inst., end excute les instructions tant que la cdt est vrai n=1 while prod(1 :n)<1.0e100 n=n+1 end continue passage litration suivante break arrt de la boucle interne
Marc BUFFAT, UFR Mcanique, UCBLyon
Un programme ou suite dinstructions Matlab peut tre sauvegard dans un chier script (M-File) ayant une extension .m chier 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. 8. a=x ; fa=fx ; b=x ; fb=fx ; 7. else 9. end 10. end 11. x Pour excuter le script, il suft de taper le nom du chier sans lextension > > program Rem : les variables du script sont globales Fonctions Une fonction sont crites dans un chier avec une extension .m (M-File) et le nom du chier doit tre le nom de la premire fonction dnie (la seule visible). On lexcute en tapant le nom avec des arguments. fonction function arguments de sortie = nom(arguments dentre) fonction racine 1. function x=racine(a,b) 2. % calcul la racine de la fonction f(x) dnie ci-aprs 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
9. 10. 11. 12. 13. 14. 15. else b=x ; fb=fx ; end end % denition de f(x) (fonction locale) function y=f(x) y=x^3-2*x-5
1.3. MATLAB
1.3. MATLAB
10
1.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 1 t1 t2 .. tn 2 1 t 2 t 2 .. tn 2 1 At = .. .. .. .. .. m t m .. t m 1 t1 n 2 premire version : mthode 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 sexcute en 4,87 sec version matricielle optimise 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 sexcute en 0,06 s, soit 80 fois plus rapidement
Exemples Fonction calculant n! 1ere version rcursive 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 optimise 1. function y=fact(n) 2. y=prod(1 :n) ; Pointeurs vers une fonction function handle pointeur vers une fonction=adresse ptr_fonct=@fonction evaluation feval(ptr_fonct,liste arguments) R Calcul de lintgrale I = ab f (x) dx par la mthode des trapzes 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)
Marc BUFFAT, UFR Mcanique, UCBLyon
11
ouverture du chier d=fopen(nomchier,permisson) permission=r,w (sous windows) rt,wt lecture dans le chier A=fscanf(d,format) format=%d %g %f %s %c ecriture dans le chier count=fprintf(d,format,A1,A2,..) fermeture du chier status=fclose(d)
1.3. MATLAB
1.3. MATLAB
12
13
14
Le nombre condition dune matrice traduit le degr de singularit de la matrice. Une matrice identit un nombre condition gale 1 alors quune matrice singulire un nombre condition qui tend vers linni. >>cond(eye(6)) ans= 1 >>A=[1 1 ;1 1+0.000001] ; >>cond(A) ans= 4.0000e+006
addition de deux matrices soustraction de deux matrices produit de deux matrices rsolution de A.X=B
Explication exponentiel dune matrice valeurs propres et vecteurs propres dune matrice dcomposition LU dune matrice dcomposition QR dune matrice
Explication inverse dune matrice dterminant dune matrice rang dune matrice condition dune matrice nxn matrice identit sommation des termes de la diagonale dune matrice n m matrice dlments nulles
o sont les sont les valeurs propres et les vecteurs propres. >>e=eig(A) % donne les valeurs propres de A >>[V,D]=eig(A) % V est une matrice dont les colonnes sont les composantes des vecteurs propres D est une matrice dont les diagonales sont les valeurs propres. >>A=[5 3 2 ;1 4 6 ;9 7 2] >>[V,D]=eig(A)
15
2.3. DCOMPOSITION LU
16
2.3 Dcomposition LU
>>[L,U]=lu(A) >>L*U >>[L,U,P]=lu(A) P*A=L*U
2.4 Dcomposition QR
La matrice A peut tre dcompose en un produit de deux matrice, une matrice orthonorme Q et une autre triangulaire suprieure R.>>[Q,R]=qr(A)
Exemples : >>poly([r1 ,r2 , ...,rn ]) >>roots([1 15 136 498 968 592]) >>y=polyval([1 3 4 -5],2) % evaluation du polynme s3 +3s2 +4s -5 s=2 Multiplication de deux polynmes a(s)= s2 +3 s-1, b(s)=s3 -2s2 +6s-7 >>c=conv([1 3 -1],[1 -2 6 7]) c= 1 1 -1 13 -27 7 qui sont les coefcients du polynme produit Dcomposition dun polynme
a(s)=b(s) m(s) + r(s) >>[m,r]=deconv(a,b) >>[m,r]=deconv([1 -2 6 7],[1 3 -1]) m= 1 -5 r= 0 0 22 -12 Nombres complexes>>2 +3*i >>i=sqrt(-1) i=0 +1.0000i >>c=-10 + 9* i>>[real(c), imag(c)] ans=-10 9 Conjugu dun nombre complexe>>conj(-1+5*i) ans= -1-5*i
17
18
Oprateurs logiques et relationnels symbole == = <= (>=) <(>) & | Explication les deux conditions sont gales les deux conditions ne sont pas gales une est infrieure (suprieure) ou gale lautre une est infrieure (suprieure) lautre loperateur et loprateur ou
19
20
Explication sauvegarde les variables courantes charge un chier Matlab dj sauvegard sauvegarde les donnes sur lcran dans un chier en format texte
La forme de ces symboles save nomchier var1 var2 .... Le chier gnr par la commande save possde lextension .mat appel mat f ile Dans le cas o nous voulons sauvegarder le chier dans un format standard : save nomchier var1 var2 ..../ascii/double
load nomchier var1 var2 .... >>a=[1 3 4] >>b=3 >>save test >>clear all % efface toutes les variables >>who % afche toutes les variables utilises >>load test >>who diary Cette commande capture tout le texte, avec les lignes de rponse, afch sur lcran. Le texte est sauvegard dans un chier qui peut tre dit plus tard. >>diary on >>a=1 ; b=4 ; c=5 ; >>[a b c] >>d=a*b >>e=g*h >>diary off A ce stade on peut utilis tout diteur de chier pour modier le fochier diary.
disp(Deux racines distinctes) ; end Une fois cette fonction est cre, on fait appel elle comme suit :>>[r1,r2]=secroot(3,4,5) ou>>[p1,p2]=secroot(3,4,5) Remarque : Il est important de spcier le chemin (pathname) du sous programme. Un autre souprogramme fct.m est donn ci-dessous function [f] = f ct (x) f = (1 x)2 ; Dans la ligne de commande du programme Matlab on introduit :>>y=fct(9) ; Ce type de sous programme permet une grande souplesse dans lcriture des programmes.
Marc BUFFAT, UFR Mcanique, UCBLyon
21
22
On peut aussi introduire les commandes suivantes : xlabel(text) et ylabel(text) pour introduire la lgende des axes x et y. axis[xmin, xmax , ymin , ymax ] La commande text est utilise pour introduire du texte dans la fentre graphique une position (x,y) donne text(x,y,contenu du texte) Exemple >>t=0 :0.1 :20 ; >>plot(t,sin(t)) >>xlabel(Time(sec)) >>ylabel(ydata) >>title(Ceci est un exemple) >>grid >>gtext(sin(t)) >>axis([0 20 -1.5 1.5]) La commande grid rajoute le maillage dans la gure. La commande gtext introduit un texte dans la gure en utilisant la sourie. subplot est utilise pour introduire plusieurs graphiques sur une mme fentre Matlab >>subplot(pqr) Les nombres p et q donnent la dimension de la gure et le nombre r permet didentier (ou sparer) la gure >>x=0 :0.1 :3*pi ; y=sin(x) ; z=cos(x) ; >>subplot(222) >>plot(x,y) >>title(x et y) >>subplot(223)
Marc BUFFAT, UFR Mcanique, UCBLyon
23
>>plot(x,z) >>title(x et z) >>subplot(224) >>plot(x, y, -, x, z, - -) >>title(x et [y z])