Upload
claudiu-nechita
View
32
Download
2
Tags:
Embed Size (px)
Citation preview
49
Capitolul 4
REALIZAREA APLICAŢIILOR ÎN MATLAB
„The ultimate goal of mathematics is to eliminate any need for intelligent thought.”
(Alfred North Whitehead, 1861-1947)
4.1. Introducere
O aplicaţie reprezintă un program sau un ansamblu de programe utilizate
pentru rezolvarea unei probleme. Cerinţele unei aplicaţii sunt legate de necesitatea
existenţei unei interfeţe prietenoase cu utilizatorul, de protecţia la datele incorect
introduse precum şi cerinţe legate de eficienţa programului cum ar fi numărul
operaţiilor elementare pe care le efectuează sau memoria internă necesară.
Datorită varietăţii mari de probleme la care trebuie să răspundă, în general,
la realizarea unei aplicaţii trebuie ca să contribuie personal de diferite specializări, în
echipe multidisciplinare compuse din:
- analişti de sistem, persoane capabile să proiecteza logic aplicaţia, care au
cunoştinţe solide de informatică dar şi calificare de bază în domeniul în care se
realizează aplicaţia. Ei furnizează programatorilor documentaţia după care aceştia
elaborează programele;
- programatori, persoane care scriu în limbaj de programare aplicaţia, conform
documentaţiei primite;
- ingineri de sistem, persoane specializate în informatică atât hard cât şi soft, care au
rolul de a întreţine reţeaua de calculatoare utilizată şi de a sprijini tehnic activitatea
programatorilor;
- testers, specialişti în testarea programelor.
Realizării unei aplicaţii complexe necesită parcurgerea următorilor paşi:
1. Analiza problemei, presupune
- formularea problemei (considerarea problemei în mod abstract);
- identificarea datelor de intrare şi a celor de ieşire prin construirea unui model
matematic;
2. Elaborarea algoritmului de rezolvare a problemei:
Calcul numeric asistat – Teorie şi aplicaţii în MATLAB
50
- verificarea existenţei unor algoritmi consacraţi care să rezolve problema dată; în
caz că nu se găsesc aceştia se trece la stabilirea metodelor de calcul necesare,
elaborarea mai multor algortimi şi alegerea celui mai performant;
- redactarea algoritmului sub formă de pseudocod sau schemă logică;
- simularea funcţionării algoritmului pe câteva seturi de date şi verificarea soluţiilor
obţinute;
3. Scrierea programului, presupune transcrierea algoritmului din pseudocod sau
schemă logică într-un limbaj de programare. De obicei se întocmeşte şi o
documentaţie aferentă ce cuprinde datele de intrare şi de ieşire, o listă a
variabilelor etc.;
4. Testarea programului, verificarea şi validarea programului prin rularea acestuia
cu mai multe seturi de date de intrare şi verificarea soluţiilor obţinute. Se caută
erorile ascunse, aşa numitele „bug-uri” care se manifestă foarte rar în exploatare;
5. Rezolvarea problemei sau execuţia/rularea programului utilizând date reale.
4.2. Algoritmi Conform Dicţionarului explicativ al limbii române, prin cuvântul algoritm
se înţelege: 1. Ansamblu de simboluri folosite în matematică și în logică, permițând
găsirea în mod mecanic (prin calcul) a unor rezultate; 2. Succesiune de operații
necesare în rezolvarea unei probleme oarecare.
Ȋn latină „algor” însemnă rece iar în limba greacă reprezintă durere. Nici
unul dintre aceste cuvinte nu este rădăcina cuvântului algoritm care provine din
traducerea în latină a numelui celui care a fost Mohammed ibn-Musa al-Khwarizmi
(780- 850). Ȋn secolul 9, acesta a scris unul dintre cele mai importante tratate de
matematică care se intitulează ” Al-Kitab al-mukhtasar fi hisab al-jabr wa'l-
muqabala (Tratat asupra calculului prin completare și compensare).” Traducerea în
latină a titlului cărţii (Liber algebrae et almucabala) în 1140, a generat şi cuvântul
„algebră”, ramură a matematicii care are ca domeniu studiul regulilor operațiilor,
relațiilor matematice şi a structurilor algebrice precum ecuaţiilor, polinoame etc.
Ȋmpreună cu Diophantus (200-298) sau Brahmagupta (598-668), al-Khwarizmi a
fost unul dintre printre primii matematicieni care au observat şi prezentat importanţa
metodelor pentru rezolvarea problemelor; cartea acestuia prezentând metode de
rezolvare a ecuaţiilor de ordinul întâi şi doi şi aplicaţii practice pentru diferite
măsurători.
Putem defini algoritmul ca fiind un sistem de calcule care, pentru o
anumită clasă de probleme (cu anumite date iniţiale) permite să se obţină soluţia
cu ajutorul unui şir finit şi ordonat de operaţii univoc determinate, efectuate
mecanic, fără aportul creator al omului. Proprietăţile algoritmilor sunt:
- Generalitate/Universalitate, un algoritm trebuie ca să ofere o modalitate generală
de rezolvare a unei întregi clase de probleme asemănatoare, pentru date de intrare
arbitrare (de exemplu algoritmul lui Euclid pentru determinarea celui mai mare
divizor comun a două numere naturale);
Capitolul 4 - REALIZAREA APLICAŢIILOR ÎN MATLAB
51
- Unicitate/Claritate, procesul de calcul trebuie să fie descris clar, riguros, fără
ambiguităţi;
- Finitudine/Eficacitate, execuţia algoritmului trebuie se facă într-un număr finit de
paşi. Un algoritm este cu atât mai performant cu cât oferă rezultatele aşteptate cu un
efort de calcul cât mai mic.
Ȋn revista “Computing in Science & Engineering” s-au publicat încercări de
a ierarhiza algoritmii în funcţie de influenţa pe care au avut-o asupra dezvoltării
ştiinţei şi tehnicii în decursul timpului. Aici sunt enumeraţi algoritmii de mai jos:
algoritmul Metropolis sau metoda Monte Carlo (1946); metoda simplex pentru
programarea liniară (1947); metoda iteraţiei pe subspaţii Krylov (1950);
descompunerea matriceală Householder (1951); optimizarea Fortran (1957);
algortimul QR (1957); algoritmul Quicksort pentru sortarea bazelor de date (1962);
transformata Fourier rapidă (1965); algoritmul Ferguson–Forcade pentru detectarea
legăturilor dintre numere întregi (1979), metoda rapidă multipolă (1987).
Un algoritm reprezintă o succesiune finită de reguli de calcul, simboluri,
operatori matematici şi logici care conduc la determinarea efectivă a soluţiilor din
cadrul cazurilor specifice unei anumite clase de probleme. Astfel, plecând de la un
set de elemente cunoscute, se poate obţine un anumit rezultat prin aplicarea
succesiunii de operaţii prevăzute de algoritm. Trebuie remarcat faptul că, în cadrul
companiilor comerciale sunt utilizate/standardizate aşa numitele proceduri
documentate care specifică modul de efectuare şi de control a unei activităţi/proces
din cadrul companiei, similar algoritmilor de calcul elaboraţi în domeniul
calculatoarelor.
Rezolvarea teoretică a unei probleme, prin creearea unui algoritm de calcul,
nu garantează şi rezolvarea practică a acelei probleme. Este nevoie de cunoştinţe şi
experienţă în utilizarea calculatorului. Ȋn cazul programării, scrierea programelor
presupune utilizarea unui anumit limbaj denumit şi limbaj de programare, care are
regulile sale specific ce sunt “înţelese” de calculator. Ȋn etapa de elaborare a
algoritmului nu este necesar a fi respectat acest limbaj cerut de calculator. Pentru
uşurinţă, în practică se utilizează un limbaj mai relaxat în privinţa regulilor de
sintaxă sau o reprezentare grafică denumită schemă logică. Acesta se numeşte
limbaj de tip pseudocod şi nu poate fi executat pe un calculator. El permite însă
înţelegerea mai uşoară a algoritmului elaborat, independent de limbajul în care
acesta va fi transpus. De exemplu, acelaşi algoritm scris în limbaj pseudocod poate fi
convertit, cu uşurinţă, într-o aplicaţie MATLAB dar şi Matematica, Maple, Derive
ori LabView. În general, un anumit limbaj de programare se pretează mai bine unor
anumite tipuri de algoritmi şi deci facilitează rezolvarea unor anumite clase de
probleme. Este nevoie de experienţă pentru a alege limbajul de programare
corespunzător, limbaj care permite codificarea algoritmului cu eficienţă şi
performanţă.
Algoritmii utilizează două tipuri de obiecte, şi anume: date şi variabile.
Datele pot fi întregi, reale, logice sau şiruri de caractere. Constantele reprezintă un
tip special de date care nu se modifică pe parcursul execuţiei aplicaţiei şi nu sunt
obţinute din calcule. Variabilele sunt obiecte care sunt asociate unei anumite zone de
memorie destinate unui anumit tip de date. Numele variabilei reprezintă
identificatorul care trimite la zona de memorie corespunzătoare. Tipul variabilei
Calcul numeric asistat – Teorie şi aplicaţii în MATLAB
52
(întreg, real, logic, şir) oferă tipul datei care poate fi reţinută de variabila respectivă.
Variabila are un nume unic dar conţinutul ei poate să se modifice pe parcursul
execuţiei programului.
Algoritmii presupun utilizarea unor expresii şi executarea unor operaţii,
cum ar fi operaţii de intrare/ieşire(citire/scriere), operaţii de atribuire şi operaţii de
decizie.
Operaţia de intrare, denumită şi operaţia de citire a datelor presupune
preluarea unei date de la un dispozitiv de intrare către memoria internă a
calculatorului, într-o variabilă. Ȋn MATLAB, pentru introducerea datelor de la
tastatură de către utilizatorul programului de cele mai multe ori se utilizează
comanda input cu sintaxa de mai jos: variabila = input(’Textul care va contine cererea de
introducere a datelor’)
Operaţia de atribuire, permite preluarea unei date din memoria
calculatorului şi transferul acesteia către un un dispozitiv de ieşire (ecran,
imprimantă etc.) Operaţia de atribuire poate avea mai multe forme, cum ar fi cele de
mai jos scrise în limbaj pseudocod:
a) v ← dată, unde v este numele unei variabile. Tipul variabilei v trebuie să fie
compatibilă cu tipul valorii atribute. Ȋn Matlab, crerea de variabile prin introducerea
de la tastatură a datei se poate face cu ajutorul funcţiei input, care are sintaxa: v=input(’valoarea datei care trebuie atribuita’)
OBS. Dacă în memorie există deja o variabilă v, valoarea nou citită/atribuită se
scrie în memorie peste cea veche, care se pierde;
b) v1 ← v2, unde v1 şi v2 sunt nume de variabile. După operaţia de atribuire,
conţinutul iniţial al variabilei v1 se pierde iar conţinutul variabilei v2 rămâne
neschimbat.
OBSERVAŢIE:
1) Tipurile celor două variabile trebuie să fie compatibile. De exemplu,
unei variabile de tip real v1 , i se poate atribui valoarea unei variabile v2 de tip întreg,
dar invers atribuirea se face prin pierdere de informaţie;
2) Atribuirea v1 ← v2 nu este echivalentă cu operaţia v2 ← v1 ;
c) v ← expresie, operaţia de atribuire se face în urma evaluării expresiei, tipul
variabilei trebuie ca să fie compatibil cu tipul valorii expresiei.
Operaţia de decizie, se poate scrie în limbaj pseudocod în forma
prezentată mai jos: Dacă condiţie atunci
Operaţia 1
Altfel
Operaţia 2
OBS. Ramura Altfel este opţională. Este testată valoarea de adevăr pentru condiţie şi,
dacă este adevărată se execută Operaţia 1 iar dacă nu, se execută Operaţia 2.
Capitolul 4 - REALIZAREA APLICAŢIILOR ÎN MATLAB
53
4.3. Programarea structurată
La începutul anilor 70 a apărut noţiunea de programare structurată. Aceasta
presupune gândirea rezolvărilor aplicaţiilor doar prin anumite structuri permise.
Aceste structuri, denumite şi structuri de bază sunt suficiente pentru elaborarea
oricărui algoritm. Exită trei structuri de bază, elementare, utilizate în descrierea
algoritmilor şi anume structura liniară, structura alternativă şi structura repetitivă
(figura 4.1). Structura algoritmului înseamnă o anumită formă de îmbinare a
operaţiilor. Problemele complexe sunt descompuse în subprobleme care la rândul lor
sunt descompuse folosindu-se aceleaşi reguli până la nivel elementar.
4.3.1. Structura liniară
Orice operaţie de citire/scriere, atribuire sau decizie se poate considera a
avea o structură liniară. Ȋn figura 4.1.a), ansamblul prezentat construit cu ajutorul
structurilor S1 şi S2 are structură liniară. Ȋntr-o altă prezentare, structura liniară poate
avea următoarea formă: Operaţia 1
Operaţia 2
.....
Operaţia n
EXEMPLU 4.1:
Să se realizeze o aplicaţie care calculează costul unui teren de forma unui dreptunghi
cu laturile l1 şi l2 , costul unui metru pătrat fiind c, valoare cerută a fi introdusă de la
tastatură de către utilizator. Citeşte l1,l2,c
S1
S2
E
S1 S2
E
S
da nu da nu
a) b) c)
Fig. 4.1. Structurile de bază utilizate în descrierea algoritmilor
a) structură liniară
b) structură alternativă
c) structură repetitivă
Calcul numeric asistat – Teorie şi aplicaţii în MATLAB
54
arie= l1 ∙ l2
cost=arie ∙ c
Scrie cost
Ȋn limbaj Matlab se poate scrie următoarea secvenţă: l1=input('introduceti valoarea lungimii dreptunghiului [m], l1=')
l2=input('introduceti valoarea latimii dreptunghiului [m], l2=')
arie=l1*l2
c=input('introduceti valoarea costului unitar pentru teren [lei/m^2] ,
c= ')
cost = c*arie
4.3.2. Structura alternativă - – instrucţiuni condiţionale în MATLAB
O structură alternativă are forma prezentată în figura 4.1.b şi scrisă în
limbaj pseudocod mai jos. Condiţia E este evaluată; dacă acesta este adevărată, se
trece la execuţia structurii S1 iar dacă nu se execută S2. Dacă E atunci
S1
Altfel
S2
EXEMPLU 4.2:
Să se realizeze o aplicaţie care
rezolvă o ecuaţie de gradul întâi.
Trebuie ca să se citescă două
numere reale a şi b iar apoi să fie
rezolvată ecuaţia ax+b=0.
Algoritmul scris în limbaj
pseudocod se prezintă sub forma de
mai jos iar schema logică
corespunde figurii 4.2. Citeşte a,b
Dacă a ≠ 0 atunci
x= -b/a
Altfel
Dacă b ≠ 0 atunci
Scrie
„Ecuaţia nu are nici o soluţie”
Altfel
Scrie „Ecuaţia are o infinitate de soluţii”
Aplicaţia scrisă în limbaj Matlab este: %Rezolvarea ecuatiei a*x+b=0
a=input('Introduceti valoarea lui a, real a=')
b=input('introduceti valoarea lui b, real b=')
if a==0 ;deschiderea primei bucle
if b==0 ;deschiderea celei de-a doua bucla
'Ecuatia are o infinitate de solutii'
else
'Ecuatia nu are solutie'
end
else
Fig. 4.2. Schema logică corespunzătoare
algoritmului de rezolvare a ecuaţiei de
gradul I
b ≠ 0
Ecuaţia nu are nici
o soluţie
Ecuaţia are o
infinitate de soluţii
DA NU
a ≠ 0
x = -b/a
DA NU
a, b
Capitolul 4 - REALIZAREA APLICAŢIILOR ÎN MATLAB
55
x=-b/a
end
4.3.2.1. Instrucţiunea condiţională if în MATLAB
Această instrucţiune permite alegerea pentru execuţie a uneia dintre
secvenţele de instrucţiuni din mai multe varinte posibile, pe baza evaluării unei
condiţii al cărui rezultat poate fi adevărat sau fals. Se poate utiliza cu sau fără
clauzele else sau elseif. Forma generală utilizată în Matlab este cea de mai jos: if expresie_logică_1
instrucţiuni_1
elseif expresie_logică_2
instrucţiuni_2
elseif expresie_logică_3
instrucţiuni _3
...
elseif expresie_logică_n
instrucţiuni _n
else
instrucţiuni_n+1
end
EXEMPLU 4.3:
Să se genereze o matrice M, cu m linii şi n coloane are cărui elemente sunt conform:
1, pentru i = j
2, pentru |i-j| = 1
3, pentru |i-j| = 2
4, pentru |i-j| = 3
5, pentru |i-j| = 4
0, în rest
Pentru parcurgerea tuturor elementelor matricei M se foloseşte
instrucţiunea de ciclare for (v. 4.2.3) iar aplicaţia este: %Generarea matricei M
m=input('Introduceti numarul liniilor matricei M, m =')
n=input('Introduceti numarul coloanelor matricei M, n =')
for i=1:n
for j=1:m
if i==j
M(i,j)=1
elseif abs(i-j)==1
M(i,j)=2
elseif abs(i-j)==2
M(i,j)=3
elseif abs(i-j)==3
M(i,j)=4
elseif abs(i-j)==4
M(i,j)=5
else
M(i,j)=0
end
end
end
),( jiM
Calcul numeric asistat – Teorie şi aplicaţii în MATLAB
56
4.3.2.2. Instrucţiunea condiţională switch în MATLAB
Instrucţiunile switch şi case selectează o variantă din mai multe posibile pe
baza valorilor rezultate din evaluarea unor expresii. Expresia poate fi numerică sau
şir de caractere, caz în care se face compararea şirurilor expresie cu cea a valorii
case. Sintaxa de apelare este: switch expresie
case valoare 1
instrucţiuni_1
case valoare 2
instrucţiuni_2
...
otherwise
instrucţiuni
end
4.3.3. Structura repetitivă – instrucţiuni de ciclare în MATLAB
Instrucţiunile de ciclare permit execuţia repetată a unei secvenţe de
instrucţiuni, pe baza incrementării unei variabile şi utilizând o expresie logică care
condiţionează numărul repetărilor (figura 4.1.c). Instrucţiunea for se foloseşte pentru
reluarea execuţiei structurii de un număr cunoscut de ori iar instrucţiunea while se
bazează pe o expresie logică care trebuie să fie îndeplinită. Ca forme generale se pot
prezenta variantele:
- instrucţiunea for: Pentru E execută S
- instrucţiunea while:
Cât timp E execută S.
4.3.3.1. Instrucţiunea for în MATLAB
O structură de tip for este o structură condiţionată anterior cu ajutorul unei
variabile i (de tip întreg), numită şi variabilă de ciclare, contor sau index, care ia
valori între valoarea iniţială a şi valoarea finală b.
Ȋn Matlab, forma generală a unei bucle for este: for i = expresie
instrucţiune_1
instrucţiune_2
...
end
De cele mai multe ori, incrementarea se face cu ajutorul unui vector generat
prin sintaxa cunoscută (v. Cap. 3): i = valoare_iniţială: pas :valoare_finală
unde
valoare_iniţială - este prima valoare pe care o ia i
valoare_iniţială – pasul de incrementare (dacă este omis, atunci valoarea
implicită este 1)
valoare_finală - cea mai mare este valoare pe care o poate lua i
Capitolul 4 - REALIZAREA APLICAŢIILOR ÎN MATLAB
57
La fiecare parcurgere a buclei de ciclare i are valoarea unuia dintre elementele
vectorului generat prin expresie.
Se poate folosi o incrementare cu pas negativ
EXEMPLU 4.4:
Să se realizeze, în limbaj Matlab, o aplicaţie care calculează n! fără a face apel la
funcţia prod şi folosind o buclă for: n=input('Introduceti valoarea lui n, intreg, n = ')
nfact=1
for i=1:n
nfact=nfact*i
end
[int2str(n),'! este egal cu ', int2str(nfact)]
O a doua variată de rezolvare a exerciţiului este cel prezentat mai jos, în care a fost
folosită instrucţiunea while (v. 4.2.3.2): n=input('Introduceti valoarea lui n, intreg, n = ')
i=1
nfact=1
while i<=n
nfact=nfact*i
i=i+1
end
[int2str(n),'! este egal cu ', int2str(nfact)]
EXEMPLU 4.5:
Utilizând o valoare întreagă n cerută de la tastatură, să se calculeze suma:
n
k
knS1
!...321...4321321211
n=input('Introduceti valoarea lui n, intreg, n = ')
S=0
k=1
for i=1:n
k=k*i
S=S+k
end
['Suma de n! cu n=',int2str(n),' este egala cu ', int2str(S)]
4.3.3.2. Instrucţiunea while în MATLAB
Fiind date o condiţie logică şi un grup de instrucţiuni, bucla se reia de un
număr infinit de ori atât timp cât expresia de control este îndeplinită, adică atât timp
cât este adevărată şi ia valoarea 1
(true). Forma generală a unei bucle
while este: while expresie
instrucţiuni
end
Tabel 4.1. Paşii algoritmului lui Euclid
pentru aflarea cmmdc al numerelor 78 şi 30
Nr.
crt.
m n p - Câtul
împărţirii
m/n
q - Restul
împărţirii
m/n
Iniţial 78 30 2 18 ≠ 0
1 30 18 1 12 ≠ 0
2 18 12 1 6 ≠ 0
3 12 6 3 0
Calcul numeric asistat – Teorie şi aplicaţii în MATLAB
58
EXEMPLU 4.6:
Să se scrie o aplicaţie Matlab pentru determinarea celui mai mare divizor comun a
două numere naturale şi fără a face apel la funcţia dedicată gcd. Să se utilizeze
algoritmul lui Euclid conform schemei logice din figura 4.3, care presupune
realizarea de operaţii repetate de împărţire; cel mai mare divizor comun fiind ultimul
rest diferit de 0. Exemplificarea paşilor parcurşi pentru aflarea celui mai mare
divizor comun al numerelor 78 şi 30 este prezentată în tabelul 4.1. %Algoritmul lui Euclid pentru aflarea cmmdc al numerelor naturale m si
n, fara utilizarea functiei dedicate gcd(x,y)
m=input('Introduceti valoarea lui m, natural m=')
n=input('introduceti valoarea lui n, natural, n<m, n=')
%calculul catului impartirii
p=fix(m/n)
%calculul restului impartirii
q=m-n*p
while q~=0
m=n, n=q
p=fix(m/n)
q=m-n*p
end
['Cel mai mare divizor comun al
celor doua numere este
',int2str(n)]
O altă soluţie pentru aflarea celui mai mare divizor
comun este algoritmul lui Nicomahus, care prin
scăderi repetate (din numarul mai mare se scade
numarul mai mic) atât timp cât cele doua numere
sunt diferite află rezultatul. Mai jos este prezentat
codul în Matlab: %Algoritmul lui Nicomahus pentru aflarea
cmmdc al numerelor naturale m si n, fara
utilizarea functiei dedicate gcd(x,y)
m=input('Introduceti valoarea lui m, natural m=')
n=input('introduceti valoarea lui n, natural, n=')
while m~=n
if m>n
m=m-n
else
n=n-m
end
end
['Cel mai mare divizor comun al
celor doua numere este
',int2str(m)]
Fig. 4.3. Algoritmul lui Euclid
q = 0
m = n
n = q
cmmdc = n
DA NU
m, n, m>n
naturale
m /n
p = câtul împărţirii
q = restul împărţirii
Tabel 4.2. Paşii algoritmului Nicomachus
pentru aflarea cmmdc al numerelor 78 şi 30
Nr.
crt.
m n Diferenţa
Iniţial 78 30 m > n 78-30=48
1 48 30 m > n 48-30=18
2 18 30 n > m 30-18=12
3 18 12 m > n 18-12=6
4 12 6 m > n 12-6=6
5 6 6 m = n cmmdc=6
Capitolul 4 - REALIZAREA APLICAŢIILOR ÎN MATLAB
59
4.3.3.3. Instrucţiunile continue şi break în MATLAB
Aceste două instrucţiuni permit un control suplimentar asupra buclelor de
ciclare for sau while. Funcţia continue transferă controlul următoarei iteraţii,
ignorând instrucţiunile rămase în buclă iar break termină execuţia buclei înainte ca
aceasta să se fi terminat.
EXEMPLU 4.7:
Fiind dat un vector x, să se calculeze media aritmetică a elementelor acestui vector
de la primul element până la primul element egal cu zero. Codul este: x=[6 8 7 4 5 0 1 2 3 4]
for i=1:length(x)
if x(i) ==0
break
else y(i)=x(i)
mean(y)
end
end
4.4. Dezvoltarea programelor în MATLAB – fişiere de tip M, fişiere funcţie
Matlab este un limbaj de programare de înalt nivel care permite două
moduri de lucru şi anume: modul linie de comandă, caz în care fiecare linie este
evaluată imediat iar rezultatele sunt afişate numaidecât pe ecran sau modul
programat cu ajutorul fişierelor de tip „script” sau fişiere de tip funcţie. Programele
Matlab sunt scrise în format ASCII, fiind posibil a se utiliza aşa cunoscutele fişiere
script (text) sau fişiere denumite fişiere funcţie.
4.4.1. Fişier „script”
Acest tip de fişier nu conţine argumente de intrare sau de ieşire, fiind doar o
succesiune de comenzi care sunt executate în fereastra de lucru în momentul
apelării. Fişierele script operează doar cu variabilele existente în spaţiul de lucru dar
poate crea date care se pot utiliza ulterior. Ȋn general, atunci când rezolvarea în
modul linie de comandă necesită o succesiune lungă şi greoaie de comenzi de face
apel la un fişier script. Apelarea numelui fişierului de la promptul » are ca efect
executarea seriei de comenzi conţinute de acest fişier iar variabilele folosite vor
rămâne în zona de lucru de bază Matlab denumită workspace. De regulă, fişierele
„script” nu pot fi itegrate în programe complexe care sunt elaborate pe principiul
modularizării.
EXEMPLU 4.8
Să se realizeze o aplicaţie pentru transformarea temperaturii din grade Fahrenheit în
grade Celsius. Utilizatorul să fie întrebat care este valorea temperaturii. Se cunoaşte
că 1 grad Celsius = 33.8 grade Fahrenheit, °C = (°F − 32) ÷ 1,8.
Calcul numeric asistat – Teorie şi aplicaţii în MATLAB
60
transformareFC.m tempF=input('Introduceti valoarea temperaturii in grade Fahrenheit,
F=')
tempC=(tempF-32)/1.8
[num2str(tempF),' grade Fahrenheit reprezinta ',num2str(tempC), 'grade
Celsius']
Dacă fişierul transformareFC.m este salvat în subdirectorul work atunci
comenzile sunt executate cu rezultatul de mai jos: » transformareFC
Introduceti valoarea temperaturii in grade Fahrenheit, F=100
tempF =
100
tempC =
37.7778
ans =
100 grade Fahrenheit reprezinta 37.7778 grade Celsius
EXEMPLU 4.9
Să se realizeze o aplicaţie care calculează primele 20 de numere ale şirului lui
Fibonacci (0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,
4181, 6765, 10946, 17711, 28657 ....) în care fiecare termen reprezintă suma celor
două numere precedente. Se defineşte f = 0, f1=1, fn+2=fn+1+fn , pentru orice n ≥ 0. f=[0 1 ]
i=1
while i<=18
f(i+2)=f(i)+f(i+1)
i=i+1
end
f
EXEMPLU 4.10
Să se realizeze o aplicaţie care, plecând de la o anumită lungime (cerută de la
tastatură), cu o anumită unitate de măsură (cerută de asemenea de la tastatură) să
transforme această valoare în metri liniari. Sunt cunoscute relaţiile de transformare
pentru inch 1 in= 0,0254 m; pentru picior 1 ft=0,3048 m; pentru yard 1 yd= 0,9144
m; pentru mila terestră 1 mlt= 1609,34 m şi pentru mila marină 1 mlm= 1852 m.
um=input('Introduceti unitatea de masura a lungimii dintre optiunile:
in/ft/yd/mile/nmile, ')
val=input('Introduceti valoarea numerica a lungimii in unitatea de
masura aleasa mai sus')
switch um
case 'in'
lm=val*0.0254
case 'ft'
lm=val*0.3048
case 'yd'
lm=val*0.9144
case 'mile'
lm=val*1609.34
case 'nmile'
lm=val*1852
otherwise
lm=NaN;disp('Unitatea de masura aleasa este inexistenta')
Capitolul 4 - REALIZAREA APLICAŢIILOR ÎN MATLAB
61
end
[num2str(val),' ',um,' reprezinta ',num2str(lm), ' m']
Execuţia fişierului de mai sus are rezultatul: » Introduceti unitatea de masura a lungimii dintre optiunile:
in/ft/yd/mlt/mlm, 'ft'
um = ft
Introduceti valoarea numerica a lungimii in unitatea de masura aleasa
mai sus = 100
val = 100
lm = 30.4800
ans =
100 ft reprezinta 30.48 m
4.4.2. Fişier „funcţie”
Un fişier „funcţie”, spre deosebire de un fişier „script”, utilizează
argumente de intrare şi furnizează rezultate ca argumente de ieşire. Variabilele cu
care funcţia a lucrat rămân valabile doar în zona de memorie a funcţiei (variabile
definite local) iar la finalul execuţiei funcţiei, în memoria spaţiului de lucru nu
rămân decât variabilele de ieşire.
Sintaxa necesară definirii unui fişier „funcţie” sau a unei aşa numite funcţii Matlab
necesită respectarea următorului format, salvat în directorul work cu numele de
fişier nume_funcţie.m:
- linia de definiţie, care precizează numele funcţiei, numărul şi ordinea
argumentelor de intrare şi de ieşire function[param_ieşire]=nume_funcţie(param_intrare)
- comentarii, explicaţii referitoare la funcţie. Pentru inserarea comentariilor este
utilizat caracterul %, dacă textul nu depăşeşte lungimea unei linii sau grupul %{ şi
%}, ce trebuie să apară pe liniile care preced şi, respectiv urmează blocul de text.
- instrucţiuni de comandă.
Numele funcţiilor respectă regulile cunoscute pentru definirea variabilelor iar pentru
a verifica dacă un nume de funcţie este valid se poate utiliza comanda isvarname.
EXEMPLU 4.11
Transformaţi aplicaţia de la exerciţiul 4.8 într-o funcţie MATLAB cu denumirea
trFC. Trebuie respectată sintaxa funcţiilor Matlab iar fişierul trFC.m trebuie salvat
în subdirectorul work. Argumentul funcţiei definite va consta în valoarea
temperaturii în grade Farenheit care trebuie transformată în grade Celsius. Apelarea,
pentru 100 grade Fahrenheit, se face ca în secvenţa următoare: » trFC(100)
trFC =
37.7778
ans =
100 grade Fahrenheit reprezinta 37.7778 grade Celsius
Fişierul funcţie trFC.m conţine: function[trFC] f=trFC(F)
trFC=5/9*(F-32)
[num2str(F),' grade Fahrenheit reprezinta ',num2str(trFC),' grade
Celsius']
Calcul numeric asistat – Teorie şi aplicaţii în MATLAB
62
EXEMPLU 4.12
Să se creeze o funcţie Matlab care calculează pătratul sinusului unui unghi introdus
în grade. Denumiţi funcţia sin2.
Fişierul funcţie sin2.m (salvat în subdirectorul work) conţine: function[sin2]=sin2(x)
sin2=sin(x*pi/180)^2
Funcţia creată se poate utiliza ca orice altă funcţie Matlab, un exemplu se poate
vedea mai jos: » sin2(45)
sin2 = 0.5000
ans = 0.5000
» sqrt(sin2(45))
sin2 = 0.5000
ans = 0.7071
EXEMPLU 4.13
Să se creeze o funcţie Matlab care calculează valorile funcţiei F de mai jos şi să se
reprezinte grafic.
F =
50] [20, pentru x ,15
1
20) [5, pentru x ,18015
5) [-20, pentru x ,310
3
2
x
x
xx
Fişierul funcţie fctex413.m: function[fctex513]=fctex513(x)
if x>=-20 & x<5
fctex513=10*x^2-3*x
elseif x>=5 & x<20
fctex513=15*x+180
elseif x>=20 & x<= 50
fctex513=abs((1-x^3)/15)
else 'Argumentul x este mai mic ca -20 sau mai mare decat 50.'
end
Succesiunea de comenzi care permite calcularea valorilor funcţiei pentru
argumente întregi între -20 şi 50 şi trasarea graficului este: x=-20:50
for n=1:length(x)
f(n)=fctex512(x(n))
end
plot(x,f)
O altă rezolvare a problemei se poate face prin
elaborarea un fişier script de forma:
x1=-20:4
f1=10*x1.^2-3*x1
x2=5:19
f2=15*x2+180
x3=20:50
f3=abs((1-x3.^3)./15)
plot(x1,f1,x2,f2,x3,f3);grid on
-20 -10 0 10 20 30 40 500
2000
4000
6000
8000
10000
Fig. 4.4. Graficul funcţiei din
exemplul 4.13 cu ajutorul
funcţiei plot
Capitolul 4 - REALIZAREA APLICAŢIILOR ÎN MATLAB
63
sau x=-20:50
for i=1:length(x)
if x(i)>=-20 & x(i)<5
fct(i)=10*x(i)^2-3*x(i)
end
if x(i)>=5 & x(i)<20
fct(i)=15*x(i)+180
end
if x(i)>=20 & x(i)<= 50
fct(i)=abs((1-x(i)^3)/15)
end
end
plot(x,fct);grid on
4.5. Exportul şi importul datelor din şi în MATLAB
MATLAB are funcţii sperciale care permit exportul şi importul fişierelor
text (save şi load), foilor de lucru EXCEL (xlswrite şi xlsread), fişierelor ASCII
delimitate de diferite caractere (dmlwrite şi dmlread), fişierelor xml (xmlwrite şi
xmlread), fişirelor de imagine (imwrite şi imread), fişierelor audio (auwrite şi
auread) etc. Trebuie remarcat faptul că versiunile mai noi ale programului Matlab
oferă mai multe facilităţi legate de importul sau exportul fişierelor. O soluţie
frecvent utilizată ca salvarea datelor care trebuie importate în Matlab să se facă în
format text. Restricţia este legată de faptul că datele trebuie să fie în format numeric.
Formatul dedicat pentru salvarea datelor în Matlab, date existente la un moment dat
în spaţiul de lucru, este cel al fişierelor cu extensia mat.
EXEMPLU 4.13
Să se creeze în spaţiul de lucru 3 variabile, prima să fie un scalar, a doua o matrice
1x3 iar a treia un şir de caractere. Să se salveze datele într-un fişier cu denumirea
ex413. Pentru a verifica operaţia făcută, să se şteargă variabilele definite din spaţiul
de lucru, să se importe datele din fişierul salvat şi apoi să se verifice corectitudinea. » a=10
a =
10
» b=[1 10 100]
b =
1 10 100
» c='exercitiul5.13'
c =
exercitiul5.13
» save ex513
» clear
» load ex513
» whos
Name Size Bytes Class
a 1x1 8 double array
b 1x3 24 double array
c 1x14 28 char array
Grand total is 18 elements using 60 bytes
-20 -10 0 10 20 30 40 500
2000
4000
6000
8000
10000
Fig. 4.5. Graficul funcţiei din
exemplul 4.13 cu ajutorul
a trei bucle if