Sunteți pe pagina 1din 5

LABORATOR NR.1 COMPLEXITATEA ALGORITMILOR NUMERICI 1.

Elemente teoretice : Calitatea unui algoritm este apreciat prin eficiena sa spaial (memoria necesar datelor i programului ) i temporal ( timpul de calcul necesar obinerii soluiei ) . Pentru a determina dependena timpului de calcul de dimensiunea problemei rezolvate de algoritm se consider ca referin timpul necesar efecturii unei operaii elementare , adunare sau nmulire de numere reale i apoi se evalueaz numrul acestor operaii . O problem poate avea doi sau mai muli algoritmi de rezolvare cu ordine de complexitate diferite . n algoritmii numerici timpul de calcul este consumat preponderent n operaiile repetate ciclic . De aceea ordinul de complexitate este dat , n general , de numrul ciclurilor : c = a b ; ordinul 0 pentru c = a b i i i pentru i =1, n
j = 1, n pentru c = a b ij i j

i = 1, n

; ordinul 1

; ordinul 2

pentru i =1, n i pentru j =1, n pentru k =1, n


c ij = a ik b kj

; ordinul 3

2. Chestiuni de studiat : 2.1. Studierea funciilor Matlab rand , clock , etime , sum , for , a operaiilor cu tablouri , polyfit , polyval . 2.2. Determinarea eficienei temporale a algoritmului de obinere a produsului scalar a doi vectori aleatori n dimensionali . 2.3. Determinarea eficienei temporale a algoritmului de obinere a produsului a dou matrici ptratice aleatoare n dimensionale . 2.4. Determinarea erorii relative de rotunjire pentru staia de lucru curent . 3. Modul de lucru : 3.1. Determinarea eficienei temporale a algoritumului de obinere a produsului scalar a doi vectori n dimensionali :

Lucrarea i propune s determine dependena timpului de calcul a produsului scalar n funcie de dimensiunea vectorilor i s estimeze ordinul de complexitate temporal . Se va crea un program Matlab . Cei doi vectori vor fi generai aleator folosind funcia rand() din Matlab . Aceast funcie genereaz o secven de numere aleatoare uniform distribuite n intervalul (0,1) . Apelat cu rand(n) genereaz o matrice patratic de numere aleatoare , de dimensiune n . Pentru generarea celor doi vectori , x(n) i y(n) funcia va fi apelat cu rand(1,n) . Pentru determinarea timpului de execuie se folosete funcia Matlab etime . Timpul de execuie al unei secvene de instruciuni se determin cu etime n felul urmtor : t0=clock; instruciuni etime(clock,t0) Funcia clock determin ora i data curent . Pentru determinarea produsului scalalr se folosete funcia sum , care sumeaz elementele unui vector . Utilizarea operatorului .* (operaii cu tablouri ) permite nmulirea celor doi vectori , component cu component . Instruciunea x.*y genereaz un vector ale crui componente sunt produsele x(i)*y(i) . Instruciunea sum(x.*y) determin suma lor . Funcia plot permite reprezentarea grafic a vectorului timp de execuie tf n funcie de vectorul n care conine valorile dimensiunilor vectorilor . Instruciunea n=100:200:1000 genereaz un vector ale crui componente variaz cu pasul 200 pn la 1000 . Generarea vectorilor cu o anumit dimensiune , determinarea produsului scalar corespunztor acesteia i a timpului de execuie tf se fac n interiorul unui ciclu for . La fiecare valoare a lui n se determin un i care este un contor pentru vectorul tf . De exemplu cnd n=100 i=1 i deci n prima component a vectorului tf , tf(1) se stocheaz prima valoare a timpului de execuie corespunztoare lui n=100 . Algoritmul se repat pn cnd n=100 . Apoi i este incrementat la i+1 pentru a se memora tf-ul urmtor n locaia 2 din vectorul tf . O versiune de program Matlab ce poate fi folosit pentru scopul lucrrii este : t0=clock; i=1; for n=100:200:1000, x=rand(1,n) y=rand(1,n) P=sum(x.*y); tf(i)=etime(clock,t0); i=i+1; end

n=100:200:1000; plot(n,tf)
0.4

0.35

0.3

0.25

0.2

0.15

0.1

0.05 100

200

300

400

500

600

700

800

900

Se observa o variatie cvasi liniara care este in concordanta cu teoria care afirma ca algoritmul are ordinul de complexitate temporala liniar O(n) . 3.2 Determinarea eficientei temporale a algoritmului de obtinere a produslui a doua matrici patratice aleatoare n dimensionale Se va crea un program in Matlab . Cele doua matrice patratice vor fi generate aleator folosind functia rand () din Matlab , apelata cu sintaxa rand(n) . O versiune de program Matlab ce poate fi folosit pentru scopul lucrarii este :

t0=clock; i=1; for n=100:200:1000, A=rand(n); B=rand(n);

C=A*B; tf(i)=etime(clock,t0); i=i+1; end n=100:200:1000; plot(n,tf)


1.6 1.4 1.2 1 0.8 0.6 0.4 0.2 0 100

200

300

400

500

600

700

800

900

Se observa o variatie care confirma faptul ca algoritmul este de ordinul 3 , T=O(n) . 3.3 Determinarea erorii relative de rotunjire . Aceasta eroare relativa de rotunjire specifica sistemului de calcul care este cel mai mare numar real care adaugat la unitate nu modifica valoarea acesteia . Ordinul de marime al erorii relative de rotunjire la calculatoarele numerice uzuale este de 10 5 10 20 si poate di determinat pentru fiecare sistem de calcul cu urmatorul algoritm :

real err err=1

repeta err=err/2 pana cand 1+err=1 scrie err Eroarea relativa de rotunjire err este cunoscuta sub numele de zeroul masinii sin u trebuie confundata cu cel mai mic numar pozitiv , nenul , reprezentabil in calculator , care este de ordinul 10 64 . err=1; while(1+err)~=1, err=err/2 end err Pentru un computer cu procesor de 3 GHz si 512 MB de RAM s-a obtinut valoarea err= 1.1102e-016 Care este cuprinsa in intervalul teoretic .