Sunteți pe pagina 1din 18

1

LUCRAREA 11

Programe m-file. Comenzi de intrare - ieire.

Programele surs n MATLAB,numite generic m-files,sunt de
dou tipuri: script i funcie (function n englez). Sintactic diferena fa
de un script este c funcia 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. Totui noi
recomandm editorul MATLAB care are nite faciliti proprii pentru
programele MATLAB (de aceea l vom utiliza). Pentru crearea unui
program selectai meniul File, aici selectai New, iar n pup-up selectai
M-file. Se va deschide o fereastr de editare ca mai jos:



Se introduc comenzile apoi se va salva n modul urmtor. Se selecteaz
meniul File din editor,iar apoi Save as. Va apare o fereastr n care se
2
introduce numele fiierului (obligatoriu!) i eventual directorul sau tipul
dorit (obligatoriu .m) . Recomandm ca s introducei doar numele
lsnd pe celelalte la valorile implicite alese de MATLAB. Pentru
execuie n cazul sciptului se introduce pur i simplu numele (introdus la
salvare),iar In cazul funciei trebuie introdus o comand asemntoare
cu prima linie dar fr function. (recomandm, la funcie, ca numele cu
care a fost salvat s coincid cu nume-functie din prima linie).
Prezentm 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.
Deschidei cu File>New>M-file fereastra Edit i Introducei comanda:
y=2*sin(x).*cos(x);
Apoi cu File>: Save As salvai cu numele sindoix. Apoi n Command
window dai comenzile:
>> x=pi/3;
>> sindoix
>> y
y =
0.8660
Al doilea exemplu va defini o funcie numit cosdoix ce va
calcula cos 2x .
Deschidei cu File>New>M-file fereastra Edit i Introducei comenzile:
function y=cosdoix(x)
y=cos(x).*cos(x)-sin(x).*sin(x);
Apoi cu File>: Save As salvai cu numele cosdoix. Apoi n Command
window dai 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.
Observaie. Funcia a putut fi utilizat ntr-o formul (atenie la situaia
cnd exist mai muli parametrii n lista de ieire!), pe cnd scriptul nu.
Deci MATLAB consider scriptul ca un ir de instruciuni ,pe cnd la
funcie importani sunt parametrii de ieire. n cazul cnd exist doar un
parametru de ieire (care poate fi un scalar,vector sau matrice)
3
parantezele ptrate 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 diferenele dintre ele.
Scriptul este pur i simplu o secven de instruciuni i a aprut
din necesitatea reutilizrii multiple a secvenei respective de instruciuni.
Avantaje:
- utile n cazul programelor mari cu secvene de comenzi care se
repet aleatoriu (nu sunt bucle pur i simplu) deci utile doar
programatorilor avansai;
Dezavantaje:
- creeaz i modific variabile din zona de lucru fr nici un
avertisment;
- sunt sursa unor erori greu detectabile (n argou, bugs);
- nu pot fi utilizate n expresii.
Spre deosebire de script funcia este tratat drept un subprogram,
adic drept o unitate distinct de restul programului.
Avantaje:
- Funcia comunic cu programul apelant prin cele dou liste: lista-
param-iesire i lista-param-intrare.
- Nu modific datele din zona de lucru a programului apelant.
- Permite organizarea structural a programrii.
Dezavantaje:
- Folosirea n exces a funciilor poate duce la frmiarea excesiv a
programului pierzndu-se din claritate.
Vom discuta acum despre cteva funcii de intrare/ieire
predefinite.
Pentru a introduce date de la tastatur n program date se
utilizeaz funcia input:
nr=input(text)
sir=input(text,s)
n primul caz pe ecran apare text, iar calculatorul ateapt pn
introducei un numr 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 urmtor exemplificm introducerea de date cu varianta
implicit:
y=input(Continuati y/n [y] :,s)
if isempty(y)
y=y;
4
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.
Observaie. Pe ct posibil evitai funcia input deoarece ntrerupe
execuia i duce la pierderi de timp de execuie.
Pentru afiarea datelor pe ecran se folosesc dou funcii. Prima
dintre ele disp are o structur simpl i are rolul de a obine ct mai rapid
datele pe ecran (n detrimentul aspectului).
Dis(text) va lista un text
Dis(x) va lista matricea x si are acelai efect cu comanda:
>>x
Pentru obinerea unor ecrane cu date aranjate sugestiv, se
utilizeaz funcia fprintf care permite formatarea ecranului. Comanda
difer foarte puin de cea din limbajul C++.
Fprintf(format,lista-parametrii)
Format este un ir ce conine pri de test dar i indicaii de poziionare a
parametrilor din list n ordine. Parametrul de poziionare ncepe cu
caracterul %. Numrul acestor parametrii de poziionare este egal cu cel
al parametrilor din list, iar corespondena lor se face n ordine de la
stnga la dreapta. Astfel primului parametru de poziionare i corespunde
primului parametru din list, . a. m. d.
Parametrii de poziionare 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 numrul
de zecimale
%l.ve ca i f dar cu notaie tiinific
%l.vg cea mai compact form dintre e, f sau d

Numr %8.4f %12.3e %10g %8d
2 2.0000 2.000e+000 2 2
sqrt(2) 1.4142 1.414e+000 1.41421 1.414214e+000
sqrt(2e-11) 0.0000 4.472e-006 4.47214e-006 4.472136e-006
sqrt(2e11) 447213.5955 4.472e+005 447214 4.472136e+005

Tabelul 1

n afara acestor parametrii se mai utilizeaz irul \n pentru sal la
linie nou. Tabelul 1 exemplific legtura dintre numr i reprezentarea
lui pe ecran n funcie de parametrul de poziionare utilizat. Exemplu:

5

>> x=1:4;
>> y=sqrt(x);
>> fprintf('y= %9.4f\n',y)
y= 1.0000
y= 1.4142
y= 1.7321
y= 2.0000

Pentru a salva matricea A ntr-un fiier text data1.dat utilizm
urmtoarea comand:
save data1.dat A ascii
Matricea A s-a memorat n fiierul data1.dat
Pentru a ncrca o matrice memorat ntr-un fiier utilizm comanda:
load data1.dat
s-a ncrcat matricea n memorie i a primit numele data1.
Vom prezenta acum un script care deseneaz banda lui Mebus.
Definii scriptul urmtor:

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

Salvai-l cu numele bandam. Apoi n Command Window tastai bandam.
Efectul va fi apariia benzii Mebus n fereastra de grafic.
Se tie c, dac x>0, irul
1
1
1
2
n n
n
x
a a
a


= +


converge la x .
Folosind acest ir vom crea o funcie care s calculeze x cu o precizie
dorit. Pentru aceasta scriei n edit comenzile:

6
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

Salvai cu numele radpat
Apoi n Command Window da-ti comanda care va calcula rdcina
ptrat din 7 cu precizia 0.001.

>> radpat(7,0.001)
ans =
2.6458
Observaie liniile care ncep cu %. Ele autodocumenteaz funcia.
Remarcai ce informaii s-au menionat
- ce face funcia;
- ce se utilizeaz pentru obinerea parametrilor de ieire (foarte
sumar);
- cum se fac apelurile funciei;
- descrierea parametrilor de intrare;
7
- descrierea parametrilor de ieire;
- descrierea variabilelor locale;
- alte informaii
n comunitatea utilizatorilor MATLAB aceste comentarii sunt ca o lege
nescris. Dai 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

Observai c aceste comentarii au aprut pe ecran. n acest mod putei
obine informaii sumare dar folositoare despre orice funcie din
MATLAB. Dac vei tasta:
type radpat
vei obine lista programului radpat.

Aplicaii

1.Definii funcia tipvar care pornind de la o variabil x ne rspunde cu
tipul ei: scalar,vector sau matrice.

2.Definii funcia care are ca date de intrare o lungime x i unitatea de
msur um a lui x, iar ca date de ieire lungimea n metrii. Unitile de
msur 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;
8
- mlt pentru mila terestr 1 mlt= 1609.3 ;
- mlm pentru mila marin 1 mlm= 1852 m.

3. Se tie c irurile:
1
1
1
!
n
n
k
a
k
=
= +

i
1
1
n
n
b
n

= +


au aceiai limit e
(numrul lui Euler), adic n MATLAB exp(1)=2.71828182845905.
Definii funciile e1, (respectiv e2), care utiliznd irul a
n
, (respectiv b
n
),
s calculeze pe e (dat ieire) cu precizia prec(dat intrare), indicnd i
ci termeni din ir au fost evaluai n it (dat ieire) . Comparnd cei
doi it obinei deducei care din cele dou iruri converge mai rapid la e.

4. Revenire la problema berii reci. n ex.7 Lucrarea 10 s-a presupus c
temperatura mediului ambient este de 30
o
C. n realitate uneori au fost i
39
o
C. De aceea trebuie s rezolvm complet problema aceasta
important. Va trebui s construim un tabel cu valorile de timp de rcire
pentru temperaturi cuprinse ntre 20
o
C i 45
o
C. Timpi vor fi calculai cu
o funcie brrc (a se citi be-re-re-ce) ce are ca parametru de intrare
temperatura ambiental, iar ca parametru de ieire durata de rcire 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 numr linii, c- numr coloane). S se
defineasc o funcie indvect pentru care dndu-se o matrice x i indicii
(i,j) ai unui element s se obin indicele k al aceluiai 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 funcie vectind ce
determin indicii (i,j) ai aceluiai element din x privit ca o matrice.


Indicaii

1.Vezi Ex.2 de la Lucrarea 10.

2. Vezi Ex.3 de la Lucrarea 10.

3. Structura funciilor e1 i e2 de calcul a lui e este asemntoare cu cea
a funciei radpat din exemplul de mai sus.

9
4.Vezi Ex. 4 lucrarea 10. n plus trebuie impuse nite condiii ca
problema s aib sens:
- Temperatura mediului (adic cea iniial 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
iniial Si evident mai mare dect temperatura frigiderului;
- Coeficientul de conducie trebuie s fie un numr pozitiv subunitar.
Dac nu sunt verificate condiiile de mai sus nu se calculeaz
nimic i se iese din funcie cu comanda return (asta chiar face aceast
comand.
Vom construi un tabel n care fiecare linie va corespunde unei
temperaturi iniiale ,prima coloan va conine aceste temperaturi. Restul
coloanelor vor conine durata de rcire pentru o temperatur din
intervalul 12
o
C, , 16
o
C, intervalul optim de rcire. Tabelul l vom
construi ntr-un script ca s-l putem testa. La tiprire vom utiliza funcia
fprintf.

5.Formula de calcul a lui k este dat de (r numrul de linii al matricii) :
( ) 1 k j r i = +
Dac cunoatem indicele k atunci di formula de mai sus deducem c i
este restul mpririi lui k la r iar j va fi dat de formula:
1
k i
j
r

= +
Reamintim c restul mpririi unui numr n la m este rem(n,m).
















10









Soluii

1.


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

2.


12


>> 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. Funcia e1:

13




14
Funcia 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 rulm programele la infinit nu vom obine niciodat
valoarea exact a lui e !!! (nici exp(1) nu este valoarea exact a lui e!!).
Numrul e este o abstracie tipic uman. Este un numr cu o infinitate
de zecimale care este caracterizat exact de faptul c este limita irurilor
de mai sus.

4. Funcia brrc:

15




16
Scriptul tabel este:

Dac tastm n MATLAB
>> tabel
obinem:
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
17
32 40 35 30 27 24 21
33 41 36 31 28 25 22
34 42 36 32 29 26 23
35 43 37 33 29 26 24
36 44 38 34 30 27 24
37 44 39 34 31 28 25
38 45 39 35 32 29 26
39 46 40 36 32 29 27
40 46 41 36 33 30 27
41 47 41 37 34 31 28
42 48 42 38 34 31 29
43 48 43 38 35 32 29
44 49 43 39 35 32 30
45 49 44 39 36 33 30

De exemplu durata de rcire a berii n cazul temperaturii mediului de
30
o
C i cea de rcire de 14
o
C este de 33 minute.(la intersecia liniei 30 cu
coloana 14).

5. Funcia indvect:


18


>> 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

S-ar putea să vă placă și