Sunteți pe pagina 1din 18

LUCRAREA 11 Programe m-file. Comenzi de intrare - ie ire.

Programele surs n MATLAB,numite generic m-files,sunt de dou tipuri: script i func ie (function n englez ). Sintactic diferen a fa de un script este c func ia are o prim linie de forma: function [lista-param-iesire]=nume-functie(lista-param-intrare). Pentru creare lor se poate utiliza orice editor de texte. Totu i noi recomand m editorul MATLAB care are ni te facilit i proprii pentru programele MATLAB (de aceea l vom utiliza). Pentru crearea unui program selecta i meniul File, aici selecta i New, iar n pup-up selecta i M-file. Se va deschide o fereastr de editare ca mai jos:

Se introduc comenzile apoi se va salva n modul urm tor. Se selecteaz meniul File din editor,iar apoi Save as. Va apare o fereastr n care se

introduce numele fi ierului (obligatoriu!) i eventual directorul sau tipul dorit (obligatoriu .m) . Recomand m ca s introduce i doar numele l snd pe celelalte la valorile implicite alese de MATLAB. Pentru execu ie n cazul sciptului se introduce pur i simplu numele (introdus la salvare),iar In cazul func iei trebuie introdus o comand asem n toare cu prima linie dar f r function. (recomand m, la func ie, ca numele cu care a fost salvat s coincid cu nume-functie din prima linie). Prezent m n continuare dou exemple simple. Primul exemplu va crea un script numit sindoix ce va calcula sin 2x , va defini x i va apela scriptul. Deschide i cu File>New>M-file fereastra Edit i Introduce i comanda: y=2*sin(x).*cos(x); Apoi cu File>: Save As salva i cu numele sindoix. Apoi n Command window da i comenzile: >> x=pi/3; >> sindoix >> y y= 0.8660 Al doilea exemplu va defini o func ie numit cosdoix ce va calcula cos 2 x . Deschide i cu File>New>M-file fereastra Edit i Introduce i comenzile: function y=cosdoix(x) y=cos(x).*cos(x)-sin(x).*sin(x); Apoi cu File>: Save As salva i cu numele cosdoix. Apoi n Command window da i comenzile: >> y=cosdoix(x) >>y y= -0.5000 >> (1+cosdoix(x))./cosdoix(x) ans = -1.0000 >> 1+sindoix ??? Attempt to execute SCRIPT sindoix as a function. Observa ie. Func ia a putut fi utilizat ntr-o formul (aten ie la situa ia cnd exist mai mul i parametrii n lista de ie ire!), pe cnd scriptul nu. Deci MATLAB consider scriptul ca un ir de instruc iuni ,pe cnd la func ie importan i sunt parametrii de ie ire. n cazul cnd exist doar un parametru de ie ire (care poate fi un scalar,vector sau matrice)

parantezele p trate pot lipsi. Parantezele rotunde de la lista-param-intrare pot lipsi doar dac nu exist nici un parametru de intrare. Vom analiza pe rnd cele dou tipuri si vom sublinia avantajele, dezavantajele i diferen ele dintre ele. Scriptul este pur i simplu o secven de instruc iuni i a ap rut din necesitatea reutiliz rii multiple a secven ei respective de instruc iuni. Avantaje: - utile n cazul programelor mari cu secven e de comenzi care se repet aleatoriu (nu sunt bucle pur i simplu) deci utile doar programatorilor avansa i; Dezavantaje: i modific variabile din zona de lucru f r nici un - creeaz avertisment; - sunt sursa unor erori greu detectabile (n argou, bugs); - nu pot fi utilizate n expresii. Spre deosebire de script func ia este tratat drept un subprogram, adic drept o unitate distinct de restul programului. Avantaje: - Func ia comunic cu programul apelant prin cele dou liste: listaparam-iesire i lista-param-intrare. - Nu modific datele din zona de lucru a programului apelant. - Permite organizarea structural a program rii. Dezavantaje: - Folosirea n exces a func iilor poate duce la f rmi area excesiv a programului pierzndu-se din claritate. Vom discuta acum despre cteva func ii de intrare/ie ire predefinite. Pentru a introduce date de la tastatur n program date se utilizeaz func ia input: nr=input(text) sir=input(text,s) n primul caz pe ecran apare text, iar calculatorul a teapt pn introduce i un num r terminat cu tastarea return. n al doilea caz ce se tasteaz este interpretat drept un ir. Dac nu se tasteaz dect tasta return atunci n variabila de intrare se introduce matricea vid (empty matrix). n exemplul urm tor exemplific m introducerea de date cu varianta implicit : y=input(Continuati y/n [y] :,s) if isempty(y) y=y;

end Tastarea doar a tastei return a introdus n y matricea vid pe care isempty o va detecta i atunci n y se va introduce irul y. Observa ie. Pe ct posibil evita i func ia input deoarece ntrerupe execu ia i duce la pierderi de timp de execu ie. Pentru afi area datelor pe ecran se folosesc dou func ii. Prima dintre ele disp are o structur simpl i are rolul de a ob ine ct mai rapid datele pe ecran (n detrimentul aspectului). Dis(text) va lista un text Dis(x) va lista matricea x si are acela i efect cu comanda: >>x Pentru ob inerea unor ecrane cu date aranjate sugestiv, se utilizeaz func ia fprintf care permite formatarea ecranului. Comanda difer foarte pu in de cea din limbajul C++. Fprintf(format,lista-parametrii) Format este un ir ce con ine p r i de test dar i indica ii de pozi ionare a parametrilor din list n ordine. Parametrul de pozi ionare ncepe cu caracterul %. Num rul acestor parametrii de pozi ionare este egal cu cel al parametrilor din list , iar coresponden a lor se face n ordine de la stnga la dreapta. Astfel primului parametru de pozi ionare i corespunde primului parametru din list , . a. m. d. Parametrii de pozi ionare au forma: %ls pentru iruri cu lungimea cel mult l; %ld pentru numere ntregi, l lungimea maxim %l.vf pentru numere n virgul flotant , l lungimea maxim , v num rul de zecimale %l.ve ca i f dar cu nota ie tiin ific %l.vg cea mai compact form dintre e, f sau d
2 sqrt(2) sqrt(2e-11) sqrt(2e11)

Num r

2.0000 1.4142 0.0000 447213.5955

%8.4f

%12.3e

2.000e+000 1.414e+000 4.472e-006 4.472e+005

2 1.41421 4.47214e-006 447214

%10g

2 1.414214e+000 4.472136e-006 4.472136e+005

%8d

Tabelul 1 n afara acestor parametrii se mai utilizeaz irul \n pentru sal la linie nou . Tabelul 1 exemplific leg tura dintre num r i reprezentarea lui pe ecran n func ie de parametrul de pozi ionare utilizat. Exemplu:

>> x=1:4; >> y=sqrt(x); >> fprintf(' %9.4f\n' y= ,y) y= 1.0000 y= 1.4142 y= 1.7321 y= 2.0000
Pentru a salva matricea A ntr-un fi ier text data1.dat utiliz m urm toarea comand : save data1.dat A ascii Matricea A s-a memorat n fi ierul data1.dat Pentru a nc rca o matrice memorat ntr-un fi ier utiliz m comanda: load data1.dat s-a nc rcat matricea n memorie i a primit numele data1. Vom prezenta acum un script care deseneaz banda lui Mebus. Defini i scriptul urm tor:

for a=0:112; for b=0:60; u=a/2; w=b/2; v=w/50-0.3; X(a+1,b+1)=cos(u)+v*cos(u/2)*cos(u); Y(a+1,b+1)=sin(u)+v*cos(u/2)*sin(u); Z(a+1,b+1)=v*sin(u/2); end end surf(X,Y,Z) view(55, 50) shading interp
Salva i-l cu numele bandam. Apoi n Command Window tasta i bandam. Efectul va fi apari ia benzii Mebus n fereastra de grafic . 1 x Se tie c , dac x>0, irul an = an 1 + converge la x . an 1 2 Folosind acest ir vom crea o func ie care s calculeze dorit . Pentru aceasta scrie i n edit comenzile:

x cu o precizie

function y=radpat(x,prec) % Functia radpat calculeaza radacina patrata a lui x % Se utilizeaza faptul ca sirul a(n)=0.5*(a(n-1)+x/a(n-1)) tinde catre % radicalul lui x % Apelul se face cu y=radpat(x,prec) sau radpat(x,prec) % parametrii intrare % x numarul din care se extrage radicalul % prec precizia dorita % parametrii iesire % y radacina patrata a lui x cu precizia prec % variabile locale % maxit numarul maxim de iteratii % it iteratia curenta % yold valoarea lui y din iteratia anterioara maxit=1000; it=0; y=0.1; yold=1; while abs(yold-y)>prec & it<maxit yold=y; y=0.5*(yold+x/yold); it=it+1; end if it==maxit disp(' Atentie!! S-au depasit numarul maxim de iteratii' ); end Salva i cu numele radpat Apoi n Command Window da-ti comanda care va calcula r d cina p trat din 7 cu precizia 0.001. >> radpat(7,0.001) ans = 2.6458 Observa ie liniile care ncep cu %. Ele autodocumenteaz func ia. Remarca i ce informa ii s-au men ionat - ce face func ia; - ce se utilizeaz pentru ob inerea parametrilor de ie ire (foarte sumar); - cum se fac apelurile func iei; - descrierea parametrilor de intrare;

- descrierea parametrilor de ie ire; - descrierea variabilelor locale; - alte informa ii n comunitatea utilizatorilor MATLAB aceste comentarii sunt ca o lege nescris . Da i comanda:

>> help radpat Functia radpat calculeaza radacina patrata a lui x Se utilizeaza faptul ca sirul a(n)=0.5*(a(n-1)+x/a(n-1)) tinde catre radicalul lui x Apelul se face cu y=radpat(x,prec) parametrii intrare x numarul din care se extrage radicalul prec precizia dorita parametrii iesire y radacina patrata a lui x cu precizia prec variabile locale maxit numarul maxim de iteratii it iteratia curenta yold valoarea lui y din iteratia anterioara
Observa i c aceste comentarii au ap rut pe ecran. n acest mod pute i ob ine informa ii sumare dar folositoare despre orice func ie din MATLAB. Dac ve i tasta: type radpat ve i ob ine lista programului radpat.

Aplica ii
1.Defini i func ia tipvar care pornind de la o variabil x ne r spunde cu tipul ei: scalar,vector sau matrice. 2.Defini i func ia care are ca date de intrare o lungime x i unitatea de m sur um a lui x, iar ca date de ie ire lungimea n metrii. Unit ile de m sur valide sunt - ft pentru picior 1 ft=0.3048 m; - in pentru inch 1 in= 0.0254 m; - km pentru kilometru; - mm pentru milimetru; - yd pentru yard 1 yd= 0.91 m;

- mlt pentru mila terestr 1 mlt= 1609.3 ; - mlm pentru mila marin 1 mlm= 1852 m.

1 1 i bn = 1 + au aceia i limit e 3. Se tie c irurile: an = 1 + n k =1 k ! (num rul lui Euler), adic n MATLAB exp(1)=2.71828182845905. Defini i func iile e1, (respectiv e2), care utiliznd irul an, (respectiv bn), s calculeze pe e (dat ie ire) cu precizia prec(dat intrare), indicnd i c i termeni din ir au fost evalua i n it (dat ie ire) . Comparnd cei doi it ob ine i deduce i care din cele dou iruri converge mai rapid la e.
n

4. Revenire la problema berii reci. n ex.7 Lucrarea 10 s-a presupus c temperatura mediului ambient este de 30oC. n realitate uneori au fost i 39oC. De aceea trebuie s rezolv m complet problema aceasta important . Va trebui s construim un tabel cu valorile de timp de r cire pentru temperaturi cuprinse ntre 20oC i 45oC. Timpi vor fi calcula i cu o func ie brrc (a se citi be-re-re-ce) ce are ca parametru de intrare temperatura ambiental , iar ca parametru de ie ire durata de r cire n minute. 5. Se tie c MATLAB memoreaz matricile coloan dup coloan . De aceea o matrice poate fi privit ( i deseori MATLAB o face!) ca un vector de lungime r*c (r num r linii, c- num r coloane). S se defineasc o func ie indvect pentru care dndu-se o matrice x i indicii (i,j) ai unui element s se ob in indicele k al aceluia i element n x privit ca vector. De asemenea fiind dat o matrice x i indicele k al unui element din x fiind privit ca un vector s se scrie o func ie vectind ce determin indicii (i,j) ai aceluia i element din x privit ca o matrice.

Indica ii
1.Vezi Ex.2 de la Lucrarea 10. 2. Vezi Ex.3 de la Lucrarea 10. 3. Structura func iilor e1 i e2 de calcul a lui e este asem n toare cu cea a func iei radpat din exemplul de mai sus.

4.Vezi Ex. 4 lucrarea 10. n plus trebuie impuse ni te condi ii ca problema s aib sens: - Temperatura mediului (adic cea ini ial a berii) trebuie s fie cea de var s zicem n intervalul [20, 45]; - Temperatura final a berii trebuie s fie evident mai mic dect cea ini ial Si evident mai mare dect temperatura frigiderului; - Coeficientul de conduc ie trebuie s fie un num r pozitiv subunitar. Dac nu sunt verificate condi iile de mai sus nu se calculeaz nimic i se iese din func ie cu comanda return (asta chiar face aceast comand . Vom construi un tabel n care fiecare linie va corespunde unei temperaturi ini iale ,prima coloan va con ine aceste temperaturi. Restul coloanelor vor con ine durata de r cire pentru o temperatur din intervalul 12oC, , 16oC, intervalul optim de r cire. Tabelul l vom construi ntr-un script ca s -l putem testa. La tip rire vom utiliza func ia fprintf. 5.Formula de calcul a lui k este dat de (r num rul de linii al matricii) : k = ( j 1) r + i Dac cunoa tem indicele k atunci di formula de mai sus deducem c i este restul mp r irii lui k la r iar j va fi dat de formula: k i j= +1 r Reamintim c restul mp r irii unui num r n la m este rem(n,m).

Solu ii
1.

>> x=1; >> tipvar(x) ans = scalar >> z=[1 2 3]; >> tipvar(z) ans = vector

10

>> w=[1 2;3 4]; >> tipvar(w) ans = matrice 2.

11

>> x=1.82; >> u=' ; yd' >> lmet(x,u) ans = 1.6562 >> x=0.023; >> u=' ; mlm' >> lmet(x,u) ans = 42.5960 >> u=' ; kkk' >> lmet(x,u) Atentie unitate inexistenta!! ans = NaN 3. Func ia e1:

12

13

Func ia e2:

>> [y1,i1]=e1(0.001); >> [y2,i2]=e2(0.001); >> i1 i1 = 7 >> i2 i2 = 1359 Se observ faptul c primul ir este mult mai rapid convergent. Dar chiar dac rul m programele la infinit nu vom ob ine niciodat valoarea exact a lui e !!! (nici exp(1) nu este valoarea exact a lui e!!). Num rul e este o abstrac ie tipic uman . Este un num r cu o infinitate de zecimale care este caracterizat exact de faptul c este limita irurilor de mai sus. 4. Func ia brrc:

14

15

Scriptul tabel este:

Dac tast m n MATLAB >> tabel ob inem: Tabel racire bere [min] Temp. mediu durata durata durata durata durata durata grd.Celsius[gC] la 13gC la 14gC la 15gC la 16gC la 17gC la 18gC =================================================== 20 25 19 15 11 8 6 21 27 21 17 13 10 8 22 29 23 19 15 12 9 23 30 24 20 17 14 11 24 32 26 22 18 15 12 25 33 27 23 19 16 14 26 34 29 24 21 18 15 27 35 30 25 22 19 16 28 36 31 26 23 20 17 29 37 32 28 24 21 18 30 38 33 29 25 22 19 31 39 34 29 26 23 20

16

32 33 34 35 36 37 38 39 40 41 42 43 44 45

40 41 42 43 44 44 45 46 46 47 48 48 49 49

35 36 36 37 38 39 39 40 41 41 42 43 43 44

30 31 32 33 34 34 35 36 36 37 38 38 39 39

27 28 29 29 30 31 32 32 33 34 34 35 35 36

24 25 26 26 27 28 29 29 30 31 31 32 32 33

21 22 23 24 24 25 26 27 27 28 29 29 30 30

De exemplu durata de r cire a berii n cazul temperaturii mediului de 30oC i cea de r cire de 14oC este de 33 minute.(la intersec ia liniei 30 cu coloana 14). 5. Func ia indvect:

17

>> a=[1 2 3;4 5 6;7 8 9] a= 1 2 3 4 5 6 7 8 9 >> indvect(a,2,3) ans = 8 >> [i,j]=vectind(a,8) i= 2 j= 3

18