15
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 progr ame 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:

6cnacap4 Realizarea Aplicaţiilor În Matlab

Embed Size (px)

Citation preview

Page 1: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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:

Page 2: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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

Page 3: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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

Page 4: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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.

Page 5: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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ă

Page 6: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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

Page 7: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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

Page 8: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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

Page 9: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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

Page 10: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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

Page 11: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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.

Page 12: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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

Page 13: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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

Page 14: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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

Page 15: 6cnacap4 Realizarea Aplicaţiilor În Matlab

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