You are on page 1of 68

Gabriela Ciuprina

Algoritmi numerici
- teme laborator -
2009
Cuprins
1 Familiarizarea cu mediul de lucru: Matlab 1
1.1 Variabile si constante. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Atribuiri si expresii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Generarea vectorilor si matricelor . . . . . . . . . . . . . . . . . . . . . . . 6
1.4 Instruct iuni grace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5 Programare n Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.5.1 Editarea programelor . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.5.2 Operat ii de intrare/iesire . . . . . . . . . . . . . . . . . . . . . . . . 10
1.5.3 Structuri de control . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.5.4 Funct ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.6 Implementari eciente ale operat iilor cu matrici . . . . . . . . . . . . . . . 15
1.7 Facilitat i de post-procesare . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.8 Referint e utile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2 Evaluarea algoritmilor 21
2.1 Timpul de calcul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.2 Necesarul de memorie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.3 Erori n calculele numerice . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.3.1 Erori de rotunjire . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.3.2 Erori inerente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.3.3 Erori de trunchiere . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
i
ii CUPRINS
3 Analiza circuitelor electrice rezistive liniare 41
3.1 Metoda potent ialelor nodurilor . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2 Structuri de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.3 Etapa de preprocesare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.4 Etapa de rezolvare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.5 Etapa de postprocesare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.6 Analiza complexitat ii. Optimizarea algorimului. . . . . . . . . . . . . . . . 53
G.Ciuprina, Draft din 23 noiembrie 2009
Capitolul 1
Familiarizarea cu mediul de lucru:
Matlab

In cadrul laboratorului aferent disciplinei Algoritmi numerici se va folosi limbajul de


programare Matlab pentru rezolvarea numerica a unor probleme de circuite electrice si
de camp electromagnetic.
Aceasta tema are ca scop familiarizarea cu mediul de lucru, n vederea rezolvarii
temelor ulterioare. Deoarece acest limbaj de programare l-ati mai folosit si la alte dis-
cipline, acesta tema prezinta doar cateva aspecte ale lucrului cu Matlab. Cei pe deplin
familiarizat i cu acest mediu, pot sari peste exercit iile de nceput. Cei cu mai put ina
experient a trebuie sa citeasca cu atent ie documentul Matlab - getting started.
Lansat i aplicat ia Matlab si parcurget i exercit iile indicate de profesor. Notat i r aspunsurile
pe scurt ntr-un document si, la sfarsitul sedint ei, trimitet i documentul generat pe adresa
de email a profesorului ndrumator.
1.1 Variabile si constante.

In rezolvarea temelor vet i folosi n mare masura matrice cu elemente reale. Un numar
poate considerat o matrice cu un singur element.
Dimensiunea unei matrice nu trebuie declarata explicit.
Exercit iul 1.1:
Care este efectul comenzii:
>> a(10,5) = 1
1
2 Capitolul 1. Familiarizarea cu mediul de lucru: Matlab
Introducerea unei matrice se poate face natural astfel:
>> A = [ 1 2 3
4 5 6
7 8 9 ]

Intr-o scriere compacta, liniile matricei pot separate prin ; astfel:


>> A = [1 2 3; 4 5 6; 7 8 9]
Pentru separarea elementelor unei linii se poate folosi caracterul blank (ca mai sus)
sau virgula:
>> A = [1,2,3;4,5,6;7,8,9]
Exercit iul 1.2:
Stiind ca vectorii sunt un caz particular de matrice, care sunt comenzile cu care se va
introduce un vector linie, respectiv coloana cu elementele 1, 2, 3?
Exercit iul 1.3:
Ce reprezinta e n urmatoarea instruct iune?
>> u = 12.4e-3
Observat ie: variabilele utilizate ntr-o sesiune de lucru ocupa memoria sistemului pe
masura ce sunt denite. Pentru a vizualiza lista variabilelor existente la un moment
dat si memoria disponibila se foloseste comanda who. Pentru a vizualiza cata memorie
ocupa variabilele existente la un moment dat, se foloseste comanda whos. Daca se doreste
eliberarea memoriei de toate variabilele generate se foloseste comanda clear.
Exercit iul 1.4:
Executat i instruct iunea clear. Acum nu mai exista nici o variabila n mediul de lucru
(vericat i cu who). Executat i totusi, urmatoarele instruct iuni. Comentat i rezultatul lor.
>> i
>> j
>> pi
>> eps
G.Ciuprina, Draft din 23 noiembrie 2009
1.2. Atribuiri si expresii 3
1.2 Atribuiri si expresii
Instruct iunea de atribuire are sintaxa:
variabila = expresie
sau simplu:
expresie
n care variabila este numele unei variabile, iar expresie este un sir de operatori si op-
eranzi care respecta anumite reguli sintactice.

In a doua forma, dupa evaluarea expresiei,
rezultatul este atribuit variabilei predenite ans.
Operatorii aritmetici
1
recunoscut i de Matlab sunt:
+ adunare;
- scadere;
* nmult ire;
/ mpart ire la dreapta;
\ mpart ire la stanga;
^ ridicare la putere.
Pentru transpunerea unei matrice se foloseste operatorul apostrof ca n exemplul:
>> B = A
n care matricea B se calculeaza ca transpusa matricei A daca aceasta are elemente reale,
sau ca transpusa si conjugata daca aceasta are elemente complexe.
Observat ii:
1. Adunarea si scaderea pot efectuate:
- ntre doua matrice cu aceleasi dimensiuni;
- ntre o matrice si un numar (caz n care numarul este adunat, respectiv scazut din
ecare din elementele matricei).
2.

Inmult irea poate efectuata:
- ntre doua matrice daca lungimea liniei primei matrice este egala cu lungimea
coloanei celei de a doua matrice;
1
Operatorii aritmetici se aplica unor operanzi aritmetici, iar rezultatul este aritmetic.
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
4 Capitolul 1. Familiarizarea cu mediul de lucru: Matlab
- ntre un numar si o matrice (caz n care numarul este nmult it cu ecare din ele-
mentele matricei);
- ntre doua matrice cu aceleasi dimensiuni (element cu element), caz n care oper-
atorul * este precedat de un punct, ca n exemplul:
--> C = A .* B
3.

Impart irea matricelor poate facuta n mai multe feluri:
- la dreapta (pentru matrice patrate si nesingulare):
--> X = B / A
echivalent cu:
--> X = B * inv(A)
sau cu:
--> X = B * A^(-1)
- la stanga:
--> X = A \ B
echivalent cu:
--> X = inv(A) * B
sau cu:
--> X = A^(-1) * B
Daca A este o matrice dreptunghiulara de dimensiuni m n, iar b este un vector
coloana cu m elemente, atunci mpart irea la stanga x = A \ b calculeaza solut ia
ecuat iei Ax = b n sensul celor mai mici patrate. - mpart irea unei matrice la un
numar (sa l notam cu u):
--> Y = A / u
- mpart irea element cu element a matricelor de dimensiuni egale:
G.Ciuprina, Draft din 23 noiembrie 2009
1.2. Atribuiri si expresii 5
--> C = A ./ B
sau
--> C = A .\ B
4. Ridicarea la putere A^p se face astfel
2
:
- daca p este un ntreg pozitiv: daca matricea A este patrata atunci A se nmult este
cu eansasi de p ori; daca matricea A este dreptunghiulara atunci se ridica la puterea
p ecare element din matricea A
- daca p este un ntreg negativ: daca matricea A este patrata atunci inversa ei se
nmult este cu ea nsasi de p ori; daca matricea A este dreptunghiulara atunci se
ridica la puterea p ecare element din matricea A
- daca p este un numar real (dar nu ntreg) pozitiv: daca matricea A este patrata
atunci calculul se face cu ajutorul vectorilor si valorilor proprii ale matricei; daca
matricea A este dreptunghiulara, atunci se ridica la puterea p ecare element din
matricea A.
- daca p este un numar real (dar nu ntreg) negativ: daca matricea A este patrata
atunci calculul se face cu ajutorul vectorilor si valorilor proprii ale inversei matricei;
daca matricea A este dreptunghiulara, atunci se ridica la puterea p ecare element
din matricea A.
Operatorii de relat ie
3
recunoscut i de Scilab sunt:
< mai mic decat;
<= mai mic sau egal cu;
> mai mare decat;
>= mai mare sau egal cu;
== egal cu;
~= diferit de.
Acestia permit testarea unor condit ii, rezultatul avand valoarea de adevar fals (0) sau
adevarat (1). Daca operanzii sunt matrice de dimensiuni egale, atunci operat iile logice se
fac ntre elementele de pe aceleasi pozit ii, iar rezultatul este o matrice cu elementele 0 si
1.
Operatori logici
4
recunoscut i de Matlab sunt:
& conjunct ia logica;
2
Nu sunt descrise toate situat iile posibile.
3
Operatorii de relat ie se aplica unor operanzi aritmetici iar rezultatul este logic.
4
Operatorii logici se aplica unor operanzi logici iar rezultatul este logic.
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
6 Capitolul 1. Familiarizarea cu mediul de lucru: Matlab
| disjunct ia logica;
~ negat ia logica.
Daca operanzii sunt matrice (logice) cu aceleasi dimensiuni, atunci operat ia se face
element cu element. Daca unul din operanzi este o valoare logica, atunci acesta se combina
cu ecare din elementele celuilalt operand. Alte situat ii nu sunt permise.
Funct ii elementare. Operanzii unor expresii pot si apeluri de funct ii elementare (de
exemplu trigonometrice), sau alte funct ii cunoscute. Aceste funct ii aplicate unei matrice
act ioneaza asupra ecarui element n mod independent.
Exercit iul 1.5:
Fie A =
_
1 2
3 4
_
, b =
_
5
6
_
si v =
_
4 3
_
. Care sunt comenzile Matlab pentru
rezolvarea ecuat iei A
_
v
T
+ x
_
= b.
1.3 Generarea vectorilor si matricelor
Vectorii ai caror elemente formeaza o progresie aritmetic a pot generat i cu construct ia:
valin : pas : valn
Exercit iul 1.6:
Comentat i rezultatele urmatoarelor instruct iuni:
>> x = 1:10
>> y = 1:2:10
>> z = 1:3:10
>> t = 1:-3:10
>> w = -1:-3:-10
>> u = -1:-10
>> v = -10:-1
>> a = 10:-2:-3
Vectorii ai caror elemente formeaza o progresie geometric a pot generat i cu construct ia:
logspace(d1, d2, n)
Exercit iul 1.7:
a) Care este semnicat ia marimilor d1, d2, n din comanda logspace ?
G.Ciuprina, Draft din 23 noiembrie 2009
1.3. Generarea vectorilor si matricelor 7
b) Ce genereaza comanda linspace ?
Descrierea vectorilor si matricelor pe blocuri. Vectorii si matricele pot descrise pe
blocuri, folosind notat ii de forma:
A = [X Y; U V];
cu semnicat ia A =
_
X Y
U V
_
, n care X, Y, U, V sunt matrice sau vectori.
Exercit iul 1.8:
Care este rezultatul comenzii:
>> A = [1:3 ; 1:2:7]
Referirea la elementele unei matrice. Pentru a obt ine valoarea unui element, se
folosesc construct ii de forma a(1, 1), a(1, 2). Se pot obt ine valorile mai multor elemente
prin construct ii de forma a(u, v) unde u si v sunt vectori. De exemplu a(2,1:3) reprezinta
primele trei elemente din linia a doua a matricei a. Pentru a obt ine toate elementele liniei
2 se scrie a(2, :).
Exercit iul 1.9:
Fie A =
_

_
1 10 100 1000
2 20 200 2000
3 30 300 3000
_

_
.
Notat i rezultatele si comentat i urmatoarele comenzi:
>> A(0,1)
>> A(2,3)
>> A(:,3)
>> A(:,:)
>> A(3,:)
>> A(2,2:4)
>> A(2:3,2:4)
Generarea unor matrice particulare utile se poate face cu ajutorul funct iilor:
eye matrice cu elementele unitare pe diagonala si nule n rest;
zeros matrice nula;
ones matrice cu toate elementele unitare;
rand matrice cu elemente aleatoare n intervalul (0,1);
diag construieste o matrice cu o anumita diagonala, sau extrage diagonala dintr-o
matrice.
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
8 Capitolul 1. Familiarizarea cu mediul de lucru: Matlab
Exercit iul 1.10:
Comentat i urmatoarele comenzi (unde A este matricea de la exercit iul 9 iar v = [ 1 2 3 4 5 ]):
>> eye(3)
>> eye(3,3)
>> eye(3,4)
>> diag(A)
>> diag(v)
Exercit iul 1.11:
Comentat i urmatoarele comenzi:
>> A = diag(1:3)
>> B = [A, eye(size(A)); ones(size(A)) zeros(size(A))]
>> C = diag(B)
>> D = C*C
>> E = (D == 14)
Dimensiunile matricelor (vectorilor) pot modicate n timpul execut iei unui pro-
gram. Pentru a obt ine dimensiunea unei matrice X se foloseste instruct iunea:
[m, n] = size(X)
n care m reprezinta numarul de linii si n numarul de coloane. Dimensiunea unui vector
v se obt ine cu:
lenght(v)
care are semnicat ia max(size(v)).
Exercit iul 1.12:
Denit i o matrice oarecare B (de exemplu cu 3 linii si 4 coloane). Executat i si comentat i
urmatoarele instruct iuni:
>> [m,n] = size(B)
>> B = [B; zeros(1, n)]
>> B = [B zeros(m+1,1)]
Matricea vid a. Matlab opereaza si cu conceptul de matrice vida, notata cu [ ] si care
este o matrice de dimensiune nula, fara elemente. Aceasta se dovedeste utila n eliminarea
unor linii sau coloane dintr-o matrice data. De exemplu, instruct iunea
>> B(:, [2 4]) = []
are ca efect eliminarea coloanelor 2 si 4 din matricea B.

In acest fel, dimensiunea unei
matrice poate sa si scada n timpul execut iei unui program, nu numai sa creasca prin
adaugarea de noi elemente.
G.Ciuprina, Draft din 23 noiembrie 2009
1.4. Instruct iuni grace 9
1.4 Instruct iuni grace
Funct ia principala pentru reprezentari grace este:
plot
Ea are diferite variante, printre care:
plot(x,y)
n care x este vectorul variabilei independente, iar y este vectorul variabilei dependente.
Instruct iunea:
plot(A)
n care A este o matrice are ca efect reprezentarea graca a variat iei elementelor coloanelor
matricei An funct ie de indexul lor. Numarul de grace este egal cu numarul de coloane.
Funct iile auxiliare ca title si grid permit completarea gracului cu un titlu si respec-
tiv adaugarea unui rastru. Completarea gracului poate f acuta si cu ajutorul interfet ei
grace, apasand Show plot tools.
Exercit iul 1.13:
Realizat i gracul din gura 1.1. El reprezinta funct ia y(t) = 10 sin(t) pentru t [0, 4].
Punet i etichete axelor, rastrul si legenda ca n gura.
0 2 4 6 8 10 12 14
1
0.8
0.6
0.4
0.2
0
0.2
0.4
0.6
0.8
1
t [s]
y

[

m
]
rezultate
Figura 1.1: Acest grac trebuie obt inut la exercit iul 13.
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
10 Capitolul 1. Familiarizarea cu mediul de lucru: Matlab
1.5 Programare n Matlab
Matlab permite utilizarea unor structuri de control (decizii, cicluri, deniri de funct ii) ca
orice limbaj de programare de nivel nalt. Se pot scrie programe n Matlab, ca n orice
limbaj de programare.
Avantajul folosirii Matlab consta, mai ales, n usurint a cu care se pot postprocesa
rezultatele, t inand seama de facilitat ile grace ale sale. Un alt avantaj deosebit de impor-
tant este acela ca se pot efectua operat ii cu vectori si matrici, operat ii care sunt deosebit
de eciente mai ales pentru vectori si matrici rare.

In acest fel, Matlab este un mediu
foarte potrivit pentru testarea unor noi algoritmi.
1.5.1 Editarea programelor
Pana acum, at i lucrat la consola Matlab. Comenzile introduse pot scrise ntr-un sier
(numit script)si apoi executate e prin tastarea numelui sierului script n consola, e
prin apasarea butonului Run.
Un script n Matlab are urmatoarea structura posibila:
% comentarii
...........
instruct iune; % fara asarea rezultatului
instruct iune % cu asarea rezultatului
Exercit iul 1.14:
Scriet i comenzile cu care at i rezolvat exercit iul 9, ntr-un sier numit mytest.m, din
directorul

/AlgoritmiNumerici/Tema1 si apoi executat i-l e cu comanda:
>> mytest
e apasand butonul Run din editor. Observat i ce se ntampla daca la sfarsitul ecarei
instruct iuni adaugat i terminatorul ;.
IMPORTANT: Comenzile necesare rezolvarii temelor ce vor urma vor scrise n siere.
1.5.2 Operat ii de intrare/iesire
Introducerea datelor.
Cea mai simpla metoda consta n utilizarea instruct iunii de atribuire, ca n exemplul:
G.Ciuprina, Draft din 23 noiembrie 2009
1.5. Programare n Matlab 11
a = 5

In cazul unui program scris ntr-un sier, este mai convenabil sa se foloseasca funct ia
input. Funct ia input se utilizeaza n atribuiri de forma:
variabila = input(text)
n care variabila este numele variabilei a carei valoare va citita de la consola,
iar text este un sir de caractere ce va asat, ajutand utilizatorul la identicarea
informat iei ce trebuie introdusa. De exemplu:
a = input(Introduceti valoarea variabilei a. a = );
Inspectarea si asarea rezultatelor
Pentru inspectarea valorilor variabilelor este sucient sa e invocat numele lor:
>> a
pentru ca interpretorul sa aseze valoarea lor.
Daca se doreste eliminarea asarii numelui variabilelor din fat a valorii sale, atunci se
foloseste funct ia disp:
>> disp(a)
Aceasta funct ie poate folosita si pentru asarea textelor, de exemplu:
disp(Acest program calculeaza ceva );
Formatul n care sunt asate valorile numerice poate modicat de utilizator cu aju-
torul instruct iunii:
format
Operat ia de iesire se poate realiza si prin apelul funct iei sprintf n instruct iuni de
forma:
sprintf(format,variabile)
n care variabile sunt variabilele care vor scrisen formatul corespunzator instruct iunii,
iar format este un sir de caractere ce descrie formatul de asare. Sunt recunoscute
urmatoarele construct ii, similare celor din limbajul C:
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
12 Capitolul 1. Familiarizarea cu mediul de lucru: Matlab
%f scrierea numarului n format cu virgula xa;
%e scrierea numarului n format cu exponent;
%g scrierea numarului n formatul cel mai potrivit (%f sau %e).
Celelalte caractere ntalnite n sirul format sunt asate ca atare, de exemplu:
sprintf( Rezultatul este a = %g, a);
Asarea rezultatelor se poate face si grac (vezi paragraful 1.4).
Exercit iul 1.15:
Scriet i, ntr-un sier, un program prietenos care va permite introducerea de la consola
Matlab a doua numere reale, va calcula suma lor, si va asa rezultatul n formatul cu
exponent.
1.5.3 Structuri de control
Decizii
Decizia simpla:
Pseudolimbaj Matlab Observat ii
daca condit ie atunci if condit ie condit ie este o expresie care
instruct iuni instruct iuni este evaluata, iar daca rezultatul
end este adevarat (T), atunci se
executa instruct iuni, altfel
se executa prima instruct iune
ce urmeaza dupa end.
Decizia cu alternativa:
Pseudolimbaj Matlab Observat ii
daca condit ie atunci if condit ie condit ie este o expresie care
instruct iuni1 instruct iuni1 este evaluata, iar daca rezultatul
altfel else este adevarat (1), atunci se
instruct iuni2 instruct iuni2 executa instruct iuni1, iar daca
end rezultatul este fals (0), se
executa instruct iuni2.
Decizia de tip select ie:
G.Ciuprina, Draft din 23 noiembrie 2009
1.5. Programare n Matlab 13
Pseudolimbaj Matlab Observat ii
daca condit ie1 atunci if condit ie1 Pot exista oricate
instruct iuni1 instruct iuni1 alternative de select ie.
altfel daca condit ie2 elseif condit ie2
instruct iuni2 instruct iuni2
altfel else
instruct iuni3 instruct iuni3
end
switch expresie, Pot exista oricate
case expresie1 instruct iuni1, cazuri.
case expresie2 instruct iuni2, instruct iuni1 sunt
otherwise instruct iuni, executate daca
end expresie == expresie1,
etc.
Cicluri
Ciclul cu test init ial:
Pseudolimbaj Matlab Observat ii
cat timp condit ie while condit ie Se repeta corpul ciclului, adica instruct iuni,
instruct iuni instruct iuni cat timp condit ie este adevarata.
end S-ar putea ca instruct iuni sa nu e executate
niciodata n timpul rularii programului.
Ciclul cu contor:
Ciclul cu contor are doua forme, din care a doua este cea generala. Daca expresie
este o matrice, atunci variabila ia succesiv valorile coloanelor matricei. instruct iuni
nu sunt executate niciodata daca vectorul valin:pas:valn este incorect denit (vid) sau
daca expresie este matricea vida.
Pseudolimbaj Matlab Observat ii
pentru contor = valin, valn, pas for contor = valin : pas : valn, Forma a
instruct iuni instruct iuni doua este
end cea generala.
for variabila = expresie,
instruct iuni
end
Iesirile fort ate din cicluri se pot face cu instruct iunea break.
Exercit iul 1.16:
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
14 Capitolul 1. Familiarizarea cu mediul de lucru: Matlab
Scriet i un program care sa determine cel mai mare numar ntreg n pentru care 10
n
poate
reprezentat n Matlab. Indicat ie: folosit i un ciclu cu test, n care condit ia de intrare
n ciclu testeaza egalitatea dintre 10
n
si constanta Inf.
1.5.4 Funct ii
Funct iile sunt rutine Matlab care accepta parametri de intrare si ntorc parametri de
iesire.
Este bine ca ecare funct ie sa e denita ntr-un sier separat, care are acelasi nume
ca numele funct iei si extensia *.m. Un sier cont inand o funct ie trebuie sa nceapa astfel:
function[ y
1
, . . . , y
n
] = nume functie ( x
1
, . . . , x
m
)
unde y
i
sunt variabilele de iesire, calculate n funct ie de variabilele de intrare x
j
si, even-
tual, de alte variabile existente n Matlab n momentul execut iei funct iei. Se recomanda
ca acest sier sa se numeasca nume_functie.m.
Exercit iul 1.17:
Editat i un sier numit combin.m cu urmatorul cont inut:
function [x,y] = combin(a,b)
x = a + b;
y = a - b;
si un sier numit main combin.m cu urmatorul cont inut:
clear all;
a = input(Introduceti a. a = );
b = input(Introduceti b. b = );
[c,d] = combin(a,b);
disp(sprintf( Suma numerelor a = %g si b = %g este a + b = %g,a,b,c));
disp(sprintf( Diferenta numerelor a = %g si b = %g este a - b = %g,a,b,d));
Executat i n Matlab comenzile din main combin.m:
>> main_combin;
a) Explicat i comanda disp(sprintf(....));
b) Comentat i necesitatea instruct iunii clear all.
G.Ciuprina, Draft din 23 noiembrie 2009
1.6. Implement ari eciente ale operat iilor cu matrici 15
c) Rulat i programul pas cu pas si urmarit i fereastra Workspace
d) Adaugat i dupa citirea valorii b, instruct iunea inutila z = 7. Rulat i programul pas cu
pas si urmarit i fereastra Workspace. Comentat i.
e) Pe exemplul de la punctul c), dat i n consola Matlab comanda
>> mlint main_combin
Comentat i rezultatul ei, dupa ce va informat i asupra comenzii mlint.
IMPORTANT: Folosirea comenzii mlint trebuie sa e o practica obisnuita n cazul
folosirii limbajului Matlab.
1.6 Implementari eciente ale operat iilor cu matrici
Unul din avantajele lucrului n Matlab este acela ca el permite implementarea operat iilor
cu matrice. Aceasta nu numai ca simplica scrierea programelor, dar conduce la imple-
mentari mai eciente deoarece intern, Matlab, are proceduri optimizate pentru aceste
operat ii. Urmatoarele exercit ii ilustreaza acest lucru.
Exercit iul 1.18:
Scriet i o funct ie ps_v1 care sa calculeze produsul scalar a doi vectori a si b de dimensiune
n 1 prin implementarea formulei

n
i=1
si o alta funct ie ps_v2 care sa implementeze
calculul produsului scalar folosind operat iile cu matrice a b

. Vericat i corectitudinea
funct iile scrise cu ajutorul unui script n care sa comparat i rezultatele.
Exercit iul 1.19:
Comentat i cont inutul scriptului de mai jos. Executat i-l si comparat i rezultatul cu cel din
gura 1.2.
clear all;
nn = linspace(1e6,1e7,10);
N = length(nn);
t1 = zeros(1,N);
t2 = zeros(1,N);
for i = 1:length(nn);
n = floor(nn(i));
a = rand(1,n);
b = rand(1,n);
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
16 Capitolul 1. Familiarizarea cu mediul de lucru: Matlab
tic;
rez1 = ps_v1(n,a,b);
t1(i) = toc;
tic;
rez2 = ps_v2(a,b);
t2(i) = toc;
end
plot(nn,t1,bo-);
hold on;
plot(nn,t2,r*-);
leg{1} = implementare cu for;
leg{2} = implementare a*b^\prime;
legend(leg);
xlabel(n);
ylabel(t [s]);
title(Timp de calcul al produsului scalar);
1 2 3 4 5 6 7 8 9 10
x 10
6
0
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
0.18
0.2
n
t

[
s
]
Timp de calcul al produsului scalar
implementare cu for
implementare a*b

Figura 1.2: Timpul de calcul al produsului vectorial n funct ie de dimensiunea vectorilor.


Comparat ie ntre cele doua implementari propuse la exercit iul 19.

In concluzie, pentru a scrie programe eciente, n Matlab trebuie folosit calculul ma-
triceal ori de cate ori este posibil.
Exercit iul 1.20:
Scriet i o funct ie pmv_v1 care sa calculeze produsul dintre o matrice patrata a de di-
mensiune nsi un vector coloana b prin implementarea formulei c
i
=

n
j=1
a
ij
b
j
si o alta
funct ie pmv_v2 care sa implementeze calculul aceluiasi produs folosind operat iile cu ma-
trice c = a b. Comparat i ecient a celor doua implementari. Comparat i rezultatele
G.Ciuprina, Draft din 23 noiembrie 2009
1.7. Facilit at i de post-procesare 17
obt inute cu gracele din gura 1.3.
Exercit iul 1.21:
Scriet i o funct ie pmm_v1 care sa calculeze produsul dintre doua matrice patrate a si b
de dimensiune nrin implementarea formulei c
i,j
=

n
k=1
a
i,k
b
k,j
si o alta funct ie pmm_v2
care sa implementeze calculul aceluiasi produs folosind operat iile cu matrice c = a b.
Comparat i ecient a celor doua implementari. Comparat i rezultatele obt inute cu gracele
din gura 1.4.
1000 1200 1400 1600 1800 2000
0
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
n
t

[
s
]
Timp de calcul al produsului matrice vector
implementare cu for
implementare a*b
Figura 1.3: Timpul de calcul al pro-
dusului dintre o matrice patrata si un
vector n funct ie de dimensiunea prob-
lemei. Comparat ie ntre cele doua im-
plementari propuse la exercit iul 20.
100 150 200 250 300 350 400 450 500
0
0.5
1
1.5
2
2.5
3
3.5
4
4.5
5
n
t

[
s
]
Timp de calcul al produsului a doua matrice
implementare cu for
implementare a*b
Figura 1.4: Timpul de calcul al pro-
dusului dintre doua matrice patrate
n funct ie de dimensiunea problemei.
Comparat ie ntre cele doua imple-
mentari propuse la exercit iul 21.
1.7 Facilitat i de post-procesare
Acest exercit iu urmareste exersarea facilitat ilor de postprocesare ale programului, nece-
sare temelor viitoare. Exercit iul propus se refera la reprezentarea graca a campului
electric produs de o sarcina punctiforma plasata n vid.
Exercit iul 1.22:
Fie o sarcina punctiforma q = 10
10
C, situata n vid (
0
= 8.8 10
12
F/m), n punctul
de coordonate (x
0
, y
0
, z
0
) = (0, 0, 0).
a) Sa se reprezinte grac liniile echipotent iale n planul z = 0;
b) Sa se reprezinte grac potent ialul V (x, y, 0);
c) Sa se reprezinte grac potent ialul V (x, 0, 0);
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
18 Capitolul 1. Familiarizarea cu mediul de lucru: Matlab
c) Sa se reprezinte grac vectorul camp electric n planul z = 0;
d) Sa se reprezinte grac componenta dupa x a campului electric E
x
(x, 0, 0).
Reamintim ca o sarcina q plasata n punctul avand vectorul de pozit ie
r
0
= x
0
i + y
0
j + z
0
k,
ntr-un mediu omogen de permitivitate produce un camp electric
E(r) =
q
4
R
R
3
,
unde r = xi +yj +zk este vectorul de pozit ie n punctul in care se calculeaza c ampul iar
R = r r
0
= (x x
0
)i + (y y
0
)j + (z z
0
)k este un vector ce uneste punctul n care se
aa sarcina cu punctul n care se aa campul. Modulul acestui vector este
R = R =
_
(x x
0
)
2
+ (y y
0
)
2
+ (z z
0
)
2
.
Acest camp poate descris si cu ajutorul potent ialului electric V , unde E = gradV .

In
acest caz simplu, V este dat de expresia
V (r) =
q
4R
.
Linii echipotent iale si vectorii se pot trasa cu ajutorul comenzilor contour si quiver.
Pentru aceasta, se vor determina valorilor potent ialului si ale componentelor campului
ntr-o mult ime discreta de puncte din spat iu, plasate n nodurile unui grid generat de un
vector de abscise si un vector de ordonate.
Pentru rezolvarea problemei se va scrie o funct ie care calculeaza, ntr-un punct oarecare,
potent ialul si campul unei sarcini punctuale situata ntr-un punct oarecare din spat iu, de
exemplu de urmatoarea forma.
function [V,E] = camp_sarcina(q,epsilon,x0,y0,z0,x,y,z)
% Calculeaza campul unei sarcini in vid
% Date de intrare
% q - valoarea sarcinii
% epsilon - permitivitatea absoluta a mediului
% x0, y0, z0 - coordonatele punctului unde se afla sarcina
% x, y, z - coordonatele punctului unde se calculeaza campul
% Date de iesire
% V - potentialul
% E - vectorul camp electric (vector cu 3 componente)
......
G.Ciuprina, Draft din 23 noiembrie 2009
1.7. Facilit at i de post-procesare 19
Se va scrie un program principal care sa apeleze funct ia denita mai sus. Un exemplu
este urmatorul.
clear all;
q = 1e10;
epsilon = 8.8e-12;
x0 = 0;
y0 = 0;
z0 = 0;
xmin = -0.5;
xmax = 0.5;
ymin = -0.5;
ymax = 0.5;
nx = 4;
ny = 4;
x = linspace(xmin,xmax,nx);
y = linspace(ymin,ymax,ny);
for i = 1:nx
for j = 1:ny
xi = x(i);
yj = y(j);
[v,e] = camp_sarcina(q,epsilon,x0,y0,z0,xi,yj,0);
V(i,j) = v;
Ex(i,j) = e(1);
Ey(i,j) = e(2);
end
end
[X,Y] = meshgrid(x,y);
X = X; Y = Y;
figure(1);
contour(X,Y,V);
hold on;
quiver(X,Y,Ex,Ey);
Exercit iul 1.23:
a) Observat i si comentat i alura echipotent ialelor pentru diferite grade de net e ale grilei
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
20 Capitolul 1. Familiarizarea cu mediul de lucru: Matlab
0.5 0 0.5
0.5
0.4
0.3
0.2
0.1
0
0.1
0.2
0.3
0.4
0.5
Figura 1.5: Efectul comenzilor contour si quiver. Curbele au aceasta forma datorita
gridului extrem de rar folosit.
folosite.
b) Cum tratat i cazul n care unul din punctele gridului coincide cu punctul n care se
aa sarcina?
c) Propunet i un algoritm care sa genereze un grid adaptat problemei, astfel ncat liniile
echipotent iale sa aiba racordari cat mai dulci.
1.8 Referint e utile
Documentat ia Matlab - disponibila online la
http://www.mathworks.com/access/helpdesk/help/helpdesk.html
Clever Moler - Numerical Computing with Matlab, SIAM, 2004, disponibila online
la http://www.mathworks.com/moler/
Pascal Getreuer - Writing fast Matlab code, 2009
http://www.math.ucla.edu/
~
getreuer/matopt.pdf
G.Ciuprina, Draft din 23 noiembrie 2009
Capitolul 2
Evaluarea algoritmilor

In general, o problema admite mai multe metode de rezolvare, si n consecint a, vor


exista mai mult i algoritmi diferit i pentru rezolvarea ei cu ajutorul calculatorului. De
aceea, este absolut necesar sa se faca o evaluare a algoritmilor pentru a stabili care dintre
ei este cel mai bun pentru o problema data.
Nu exista un singur criteriu de evaluare a algoritmilor. Algoritmul ideal trebuie sa e
simplu, sa dea o solut ie corectantr-un timp scurt si sa ocupe o zona mica de memorie. Nu
exista nsa nici un algoritm care sa rezolve perfect o problema, fara nici un fel de eroare
si atunci vom urmari sa avem erori rezonabile pentru o anumita aplicat ie. O analiza a
erorilor posibile dintr-un algoritm este prezentata n paragraful urmator. De asemenea,
criteriul referitor la timpul de calcul intra de multe ori n contradict ie cu criteriul referitor
la memoria necesara algoritmului.

In consecint a, la alegerea unui algoritm potrivit pentru o aplicat ie data, trebuie facut
un compromis ntre trei criterii: timpul de calcul necesar obt inerii solut iei, necesarul de
memorie si acuratet ea solut iei. Exercit iile propuse n aceasta tema ilustreaza aceste trei
criterii.
2.1 Timpul de calcul
Timpul de calcul al unui algoritm depinde de complexitatea problemei de rezolvat, de
performant ele intrinseci ale calculatorului si limbajului de programare folosit si evident, de
algoritm. Este util nsa sa poata apreciata doar calitatea algoritmului si nu a problemei
sau a mediului n care se lucreaza. De aceea s-a inventat conceptul de complexitate a
unui algoritm din punct de vedere al timpului de calcul.
21
22 Capitolul 2. Evaluarea algoritmilor
Complexitatea unui algoritm din punct de vedere al timpului de calcul este relat ia din-
tre timpul de calcul exprimat n numar de operat ii elementare si dimensiunea problemei.
Dimensiunea problemei depinde de problema studiata. De exemplu, pentru calculul pro-
dusului scalar a doi vectori, dimensiunea problemei este dimensiunea vectorilor. Pentru
rezolvarea unui sistem de ecuat ii algebrice liniare, dimensiunea problemei este dimensi-
unea sistemului. Uneori, este potrivit sa exprimam dimensiunea problemei n funct ie de
doua numere n loc de unul. De exemplu, daca datele de intrare reprezinta graful unui
circuit, dimensiunea problemei este reprezentata de perechea alcatuita din numarul de
noduri si numarul de laturi.
Timpul de calcul este de fapt suma timpilor necesari pentru executarea tuturor instruc-
t iunilor algoritmului. Nu toate instruct iunile dureaza la fel de mult, de aceea, estimarea
complexitatii nu se poate face foarte precis, dar nici nu este necesar acest lucru. Se alege o
operat ie elementara, considerata a cea care dureaza cel mai mult (de exemplu evaluarea
unei anumite funct ii) si se numara cate astfel de operat ii elementare sunt executate.
Sa consideram urmatorul fragment de pseudocod, corespunz ator calculului unui produs
scalar p =

n
i=1
a
i
b
i
.
p = 0
pentru i = 1, n
p = p + a
i
b
i

Considerand ca operat ie elementara orice operat ie algebrica (adunare, scadere, nmult ire,
mpart ire) si neglijand timpul de calcul petrecut n declarat ii si atribuiri, rezulta ca n
algoritmul de mai sus se fac 2n operat ii elementare, cate doua (o adunare si o nmult ire)
pentru ecare valoare a contorului i. Timpul de calcul este proport ional cu dimensiunea
problemei, n acest caz n. Un astfel de algoritm se spune ca este un algoritm liniar, sau de
ordinul 1 si se noteaza T = O(n).

In cazul produsului scalar a doi vectori de dimensiune
n, putem scrie T = O(2n) O(n). Constanta 2 nu este atat de relevanta, ceea ce este
important este dependent a de dimensiunea problemei.
Fie acum cazul nmult irii unei matrice patrate a de dimensiune n cu un vector coloana
x. Rezultatul este un vector coloana ale carui componente se calculeaza ca b
i
=

n
j=1
a
ij
x
j
.
pentru i = 1, n
b
i
= 0
pentru j = 1, n
b
i
= b
i
+ a
ij
x
j

G.Ciuprina, Draft din 23 noiembrie 2009


2.1. Timpul de calcul 23

In acest caz, pentru ecare i se fac 2n operat ii (judecand exact ca la produsul scalar),
deci pentru toate cele n valori ale lui i se vor face 2n
2
operat ii elementare. Un algoritm
pentru care timpul de calcul T este proport ional cu patratul dimensiunii problemei n se
spune ca este un algoritm patratic, sau de ordinul 2 si se noteaza T = O(n
2
).

Inmult irea
dintre o matrice si un vector are deci complexitatea T = O(2n
2
) O(n
2
).
Exercit iul 2.1:
Scriet i pseudocodul pentru nmult irea a doua matrice p atrate de dimensiune n si evaluat i
ordinul de complexitate din punct de vedere a timpului de calcul.
Exercit iul 2.2:
Fie pseudocodul
procedura gaxpy(m, n, a, x, y, b)
; calculeaza b = ax + y
; date de intrare
^ntreg m, n ; dimensiunile problemei
tablou real a[m][n] ; matrice dreptunghiulara cu m linii si n coloane
tablou real x[n]
tablou real y[m]
; rezultat
tablou real b[m]
; alte declarat ii

pentru i = 1, m
b
i
= y
i
pentru j = 1, n
b
i
= b
i
+ a
ij
x
j

retur
a) Estimat i ordinul de complexitate din punct de vedere al timpului de calcul. Particularizat i
rezultatul pentru cazul m = n.
b) Implementat i procedura gaxpy n Matlab.
c) Cum vet i apela aceasta funct ie n Matlab pentru ca rezultatul sa se scrie tot n vari-
abila y? d) Scriet i un script care sa contorizeze timpul de calcul necesar acestei proceduri,
pentru cazul n = m. Observat i ca rulari distincte ale acestuia nu conduc la exact ace-
leasi valori numerice pentru timpul de calcul. Comparat i timpul obt inut cu cel necesar
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
24 Capitolul 2. Evaluarea algoritmilor
instruct iunii Matlab scrise cu vectori. Pentru aceasta, realizat i un grac de tipul celui din
gura 2.1. Comentat i rezultatele obt inute.
1000 1200 1400 1600 1800 2000
0
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
0.18
n
t

[
s
]
Timp de calcul ax + y
gaxpy, prima rulare
gaxpy, a doua rulare
instructiunea b = ax + y
Figura 2.1: Un grac de acest tip trebuie obt inut la exercit iul 2.

In mod riguros, notat ia T =O( ) folosita mai sus, deneste o margine asimptotica
superioara pentru dependent a timpului de calcul de dimensiunea problemei.

In general, se
spune ca un algoritm are ordinul de complexitate O(g(n)) din punct de vedere al timpului
de calcul daca si numai daca exista o constanta pozitiva C > 0 si un numar n
0
astfel ncat
T Cg(n) pentru orice n n
0
. Se poate deni si o margine inferioara pentru aceasta
dependent a. Un algoritm are ordinul de complexitate (g(n)) din punct de vedere al
timpului de calcul daca si numai daca exista o constanta pozitiva C > 0 si un numar n
0
astfel ncat Cg(n) T pentru orice n n
0
.

In exemplul urmator, se va analiza complexitatea unui algoritm care va cauta o valoare


reala xcrt n interiorul unui sir de n valori x ordonate crescator. Daca valoarea xcrt se
aa n afara intervalului [x
1
, x
n
] atunci funct ia va ntoarce valoarea -1, alftel ea va ntoarce
indexul din stanga al sub-intervalului n care se aa valoarea. Fie pseudocodul urmator:
functie cauta v1(n, x, xcrt)
; cauta valoarea xcrt n sirul ordonat x cu n valori
^ntreg n
tablou real x[n] ; sirul este presupus ordonat
real xcrt
logic flag

daca (xcrt < x
1
) sau (xcrt > x
n
)
rez = 1
G.Ciuprina, Draft din 23 noiembrie 2009
2.1. Timpul de calcul 25
altfel
flag = 0
k = 1
c^at timp ((k <= n 1) si (flag = 0))
daca xcrt x
k+1
rez = k
flag = 1
altfel
k = k + 1

^ntoarce rez
Exercit iul 2.3:
a) Explicat i cum se face cautarea n funct ia cauta v1.
b) Aratat i ca ordinul de complexitate n cazul cel mai defavorabil este T =O(n) si n cazul
cel mai favorabil T = (1). Se va considera ca operat ie de referint a compararea a doua
numere reale (instruct iunea k n 1 este o comparat ie ntre doua numere ntregi, iar
flag = 0 este o comparat ie ntre doua variabile logice, timpul necesar acestor instruct iuni
se va neglija).
c) Implementat i funct ia n Matlab si scriet i un script pentru testarea corectitudinii ei.
Cautarea se face mai ecient daca se adopta o strategie bazata pe njumatat irea
numarului de subintervale n care are loc cautarea, ca n pseudocodul de mai jos.
functie cauta v2(n, x, xcrt)

daca (xcrt < x
1
) sau (xcrt > x
n
)
rez = 1
altfel
k1 = 1
k2 = n
c^at timp k2 k1 = 1
km = [(k1 + k2)/2] ; [ ] este partea ntreaga
daca xcrt < x
km
k2 = km
altfel
k1 = km
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
26 Capitolul 2. Evaluarea algoritmilor

rez = k1

^ntoarce rez
Exercit iul 2.4:
a) Explicat i cum se face cautarea n funct ia cauta v2.
b) Aratat i ca ordinul de complexitate este T =O(log(n)), unde log este logaritmul n baza
2.
c) Implementat i funct ia n Matlab si completat i script-ul scris la exercit iul anterior pentru
testarea corectitudinii ei.
O alta posibilitate de a implementa cautarea binara este prin folosirea unei algoritm
recursiv. Un algoritm recursiv este un algorim care se apeleaza pe el nsusi. Ideea princi-
pala este aceea de a mpart i problema n subprobleme de acelasi tip. Pseudocodul cautarii
binare pentru problema de mai sus este urmatorul.
functie cauta v3(n, x, xcrt)

daca (xcrt < x
1
) sau (xcrt > x
n
)
rez = 1
altfel
rez = binary search(x, xcrt, 1, n);

^ntoarce rez
functie binary search(x, xcrt, idx start, idx stop)
; presupuneri:
; x - ordonate, idx start < idx stop
; xcrt se aa in interiorul vectorului x

mijloc = [(idx start + idx stop)/2]
daca idx stop = idx start + 1
rez = mijloc
altfel daca x
mijloc
> xcrt
rez = binary search(x, xcrt, idx start, mijloc)
altfel
rez = binary search(x, xcrt, mijloc, idx stop)
G.Ciuprina, Draft din 23 noiembrie 2009
2.2. Necesarul de memorie 27

^ntoarce rez
Evaluarea complexitat ii algoritmilor recursivi se face prin scrierea unei relat ii de recurent a.
De exemplu, pentru algoritmul recursiv de mai sus, la ecare iterat ie dimensiunea proble-
mei se reduce la jumatate, iar timpul necesar pentru a decide care jumatate sa e eliminata
este constant, nu depinde de dimensiunea problemei. De aceea putem scrie
T(n) = T(n/2) + O(1).
Pentru a simplica rat ionamentul, vom presupune ca n este o putere a lui 2: n = 2
k
.
Urmeaza ca
T(n) T(n/2) +C T(n/4) +2C T(n/2
k
) +kC = T(1) +C log(n) = O(log(n)).
Se poate arata ca acest algoritm are aceasta complexitate pentru orice valoare a lui n,
nu numai pentru valori de tipul n = 2
k
.
Exercit iul 2.5:
Implementat i funct ia cauta v3n Matlab si completat i script-ul scris la exercit iul anterior
pentru testarea corectitudinii ei.
2.2 Necesarul de memorie
Complexitatea unui algoritm din punct de vedere al necesarului de memorie este depen-
dent a dintre necesarul de memorie exprimat n numar de locat ii elementare de memorie
si dimensiunea problemei. De obicei, o locat ie elementara de memorie este cea core-
spunzatoare unui numar real.
Exercit iul 2.6:
Executat i urmatoarele comenzi n consola Matlab:
>> clear all;
>> a = 2.3;
>> whos
Cat i bytes ocupa un numar real?
Exercit iul 2.7:
Executat i urmatoarele comenzi n consola Matlab:
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
28 Capitolul 2. Evaluarea algoritmilor
>> clear all;
>> i = 7; % Numar intreg?
>> j = int8(7);
>> whos
Comentat i rezultatul. Pentru nt elegerea detaliilor, cautat i n documentat ia Matlab cu-
vintele cheie Integer data types.

In cazul codului ce calculeaza produsul scalar a doi vectori, descris la pagina 22, este
necesara memorarea a doi vectori de dimensiune n si a unui scalar real pentru rezultat.
Ordinul de complexitate este deci M =O(2n + 1) =O(2n) O(n).
Exercit iul 2.8:
Care este ordinul de complexitate din punct de vedere al necesarului de memorie pentru
algoritmul implementat la exercit iul 2.1? Dar la exercit iul 2.2?
Exercit iul 2.9:
Ce spat iu de memorie este necesar pentru stocarea unei matrice patrate de dimensiune
100000?

In rezolvarea numerica a problemelor reale din inginerie, un sistem de ecuat ii cu 100000


ecuat ii cu tot atatea necunoscute poate reprezenta un model mediu sau chiar grosier al
problemei de analizat. Din fericire nsa, n majoritatea cazurilor, matrice de astfel de
dimensiuni au foarte multe elemente nule. Astfel de matrice nu se memoreaza n forma
lor totala, ca tablouri bidimensionale, ci se memoreaza doar elementele lor nenule. Mai
mult, algoritmii de calcul se vor adapta acestei scheme de memorare, rezultand atat
avantaje din punct de vedere al necesarului de memorie dar si al timpului de calcul. O
matrice care cont ine un numar foarte mare de elemente nenule se numeste matrice rara.
Despre o matrice care nu este rara se spune ca este matrice densa sau plin a.
Se deneste densitatea unei matrice ca ind raportul dintre numarul de elemente nenule
si numarul total de elemente al matricei. De obicei, algoritmii care exploateaza raritatea
matricelor devin avantajosi pentru valori mai mici ale densitat ii. Nu se poate preciza o
valoare exacta a densitat ii care sa demarcheze matricile rare de matricile pline. Daca,
pentru o anumita matrice care are si elemente nule, se poate elabora un algoritm care
exploateaza aceasta structura si care, este mai ecient decat algoritmul gandit pentru
matricea plina, atunci aceasta este o matrice rara.
Exista mai multe metode de a memora matricele rare. Cele mai generale nu fac nici o
presupunere asupra structurii matricei, respectiv asupra pozit iilor n care se aa elemente
nenule.
G.Ciuprina, Draft din 23 noiembrie 2009
2.2. Necesarul de memorie 29
Cea mai naturala metoda ar cea n care se memoreza doar valorile nenule si coordo-
natele lor n matrice. Astfel, pentru un tablou bidimensional de dimensiune mn, n loc
sa se memoreze toate cele mn valori (inclusiv zerouri) ntr-un spat iu de M
plin
= 8mn B,
sunt necesare doar n
nz
locat ii de memorie pentru numere reale si 2n
nz
locat ii de memorie
pentru numere ntregi, deci n total M
rar,coord
= 8 n
nz
+ 4 2n
nz
= 16n
nz
B.
De exemplu, matricea M de dimensiune 34, avand 6 elemente nenule, va memorata
ntr-un vector val de dimensiune 6, si doi vectori de numerentregi, de dimensiune 6, astfel:
M =
_

_
4 0 0 0
0 0 5 1
2 3 0 7
_

_
val = [ 4 2 3 5 1 7 ]
r idx = [ 1 3 3 2 2 3 ]
c idx = [ 1 1 2 3 4 4 ]

In acest exemplu, valorile nenule au fost citite pe coloana, de sus n jos si de la stanga la
dreapta, dar ele pot memorate n orice ordine, evident cu permutarea corespunzatoare
a coordonatelor.
Memorarea poate si mai ecienta decat atat. Informat ia din vectorul c idx poate
comprimata, indicandu-se doar locul unde se schimba valoarea lui c idx. Acesta este
formatul cunoscut sub numele de CCS - Compressed Column Storage. O matrice M, de
dimensiuni mn si avand un numar nnz de elemente nenule, va stocata cu ajutorul a
trei tablouri unidimensionale astfel:
un tablou unidimensional val, de dimensiune nnz, care cont ine toate valorile nenule,
de sus n jos si de la stanga la dreapta;
un talou unidimensional c ptr, de dimensiune n +1 (cate un element pentru ecare
coloana, plus un element adit ional care marcheaza sfarsitul tabloului), care cont ine
indecsii ce indica n tabloul val locurile n care ncep coloanele. Mai precis, coloana
j a matricei init iale are valorile n val de la pozit ia c ptr(j) la pozit ia c ptr(j +1)1;
un talou unidimensional r idx, de dimensiune nnz, care cont ine, pentru ecare
element nenul din val, indexul liniei pe care se aa.
Ordinul de complexitate din punct de vedere al necesarului de memorie este deci M
rar,CCS
=
8n
nz
+ 4(n + 1) + 4n
nz
= 12n
nz
+ 4(n + 1) B.
Acelasi exemplu, memorat n format CCS este:
M =
_

_
4 0 0 0
0 0 5 1
2 3 0 7
_

_
val = [ 4 2 3 5 1 7 ]
c ptr = [ 1 3 4 5 7 ]
r idx = [ 1 3 3 2 2 3 ]
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
30 Capitolul 2. Evaluarea algoritmilor
Formatul CCS este si modul de stocare a matricilor rare n Matlab. Putet i ncerca n
Matlab urmat orul exercit iu demonstrativ (matricea folosita este aceeasi ca n exemplele
de mai sus):
>> M = [4 0 0 0; 0 0 5 1; 2 3 0 7];
>> Ms = sparse(M);
>> whos
Raspunsul ultimei comenzi va
Name Size Bytes Class
M 3x4 96 double array
Ms 3x4 92 double array (sparse)

Intr-adevar, M este o matrice plina cu 12 elemente, deci are nevoie de 8*12 = 96 B, Ms este
o matrice rara de dimensiune 3 4, cu 6 elemente nenule, n format CCS, deci are nevoie
de 8 6 + 4 (4 + 1) + 4 6 = 92B. Castigul nu este aici foarte mare pentru ca matricea
aceasta are o densitate d = 6/(3 4) = 50%, ea neind n realitate o matrice rara.
Important:

In Matlab, comanda sparse aseaza matricile n triplete de tip coordonate
- valoare, dar memorarea interna este n format CCS.
Exercit iul 2.10:
Executat i n Matlab urmatoarele comenzi si comentat i rezultatul.
a) Efectul comenzii sparse fara argumente de iesire:
>> clear all;
>> M = [4 0 0 0; 0 0 5 1; 2 3 0 7];
>> sparse(M)
b) Efectul comenzii find cu trei argumente de iesire:
>> clear all;
>> M = [4 0 0 0; 0 0 5 1; 2 3 0 7];
>> [r_idx,c_idx,val] = find(M);
c) Ce se ntampla n cazul n care, ntr-o memorare pe coordonate, exista intrari multiple,
cu linii si coloane identice? Pentru a raspunde, analizat i urmatorul cod Matlab.
G.Ciuprina, Draft din 23 noiembrie 2009
2.2. Necesarul de memorie 31
>> clear all;
>> M = [4 0 0 0; 0 0 5 1; 2 3 0 7];
>> [r_idx,c_idx,val] = find(M);
>> Ms = sparse(r_idx,c_idx,val);
>> r_idx(7) = 1;
>> c_idx(7) = 1;
>> val(7) = 10;
>> Ps = sparse(r_idx,c_idx,val)
Exercit iul 2.11:
Executat i n Matlab urmatoarele comenzi:
>> clear all;
>> M = [4 0 0 0; 0 0 5 1; 2 3 0 7];
>> Ms = sparse(M);
>> A = [0 0 0 0; 0 0 5 1; 2 3 0 7];
>> As = sparse(A);
>> As2 = Ms;
>> As2(1,1) = As2(1,1) - 4;
>> whos
Ce se ntampla n Matlab daca ntr-o matrice rara, un element care era nenul devine nul
n urma unor calcule?
Exercit iul 2.12:
a) Ce spat iu de memorie este necesar pentru stocarea n format CCS a unei matrice
patrate de dimensiune 100000, stiind ca pe ecare coloana sunt exact patru elemente
nenule? Comparat i rezultatul cu cel obt inut la exercit iul 2.8
b) Calculat i densitatea acestei matrice.
c) Scriet i un script matlab care sa rezolve punctele a) si b).
De altfel, si matricile pline sunt memorate n Matlab pe coloane. Aceasta se da-
toreaza faptului ca Matlab a fost scris init ial n Fortran si acesta este modul de stocare
al tablourilor bidimensionale n aceste limbaj. De aceea, n scrierea funct iilor n Matlab,
acesarea elementelor unei matrice pe coloane este mai rapida decat accesarea elementelor
pe linii.
Exercit iul 2.13:
a) Scriet i n Matlab o funct ie care sa adune elementele unei matrice patrate de dimensiune
n, parcurgand elementele pe coloane:
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
32 Capitolul 2. Evaluarea algoritmilor
functie suma acces coloane(n, a)
^ntreg n
tablou real a[n, n]
real s

s = 0
pentru j = 1, n
pentru i = 1, n
s = s + a
i,j

^ntoarce s
b) Scriet i n Matlab o funct ie care sa adune elementele unei matrice patrate de dimensiune
n, parcurgand elementele pe linii:
functie suma acces linii(n, a)
; completat i acest pseudocod
c) Apelat i urmatorul script si comentat i rezultatul (g. 2.2).
clear all;
nn = 1000:100:3000;
N = length(nn);
for i = 1:N
n = nn(i);
a = rand(n,n);
tic;
s = suma_acces_coloane(n,a);
t2 = toc;
t_col(i) = t2;
tic;
s = suma_acces_linii(n,a);
t1 = toc;
t_lin(i) = t1;
end
figure(1);
G.Ciuprina, Draft din 23 noiembrie 2009
2.2. Necesarul de memorie 33
plot(nn,t_col,r*-);
hold on;
plot(nn,t_lin,bo-);
leg{1} = acces pe coloane;
leg{2} = acces pe linii;
legend(leg);
xlabel(n);
ylabel(t [s]);
1000 1500 2000 2500 3000
0
0.05
0.1
0.15
0.2
0.25
n
t

[
s
]
acces pe coloane
acces pe linii
Figura 2.2: Timpul de calcul depinde si de modul n care se acceseaza elementele unei
matrice. Un astfel de grac trebuie obt inut la exercit iul 13.

In cazul n care matricile sunt memorate ca structuri rare, algoritmii ce opereaza cu


ele sunt adaptat i acestor structuri. De exemplu, algoritmul pentru procedura gaxpy n
care matricea A este rara, memorata n format CCS val, c ptr, r idx este
procedura sparse gaxpy(m, n, val, col ptr, row idx, x, y, b)
; calculeaza b = ax + y
; a este matrice rara, de dimensiune mn memorata n format CCS
; declarat ii

pentru i = 1, n
b
i
= y
i
pentru p = col ptr(i), col ptr(i + 1) 1
b
row idx(p)
= b
row idx(p)
+ val
p
x
i

retur
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
34 Capitolul 2. Evaluarea algoritmilor
Exercit iul 2.14:
a) Aratat i ca ordinul de complexitate al procedurii sparse gaxpy este O(2*nnz).
b)
1
Implementat i procedura n Matlab si testat i corectitudinea ei.
2.3 Erori n calculele numerice
Unul din criteriile de evaluare a unui algoritm l reprezinta eroarea cu care se obt ine
rezultatul. Erorile nu pot nlaturate total dintr-un calcul deoarece, de exemplu, chiar
numerele reale nu pot reprezentate n calculator cu o precizie innita. Numarul real
are o innitate de cifre semnicative, iar orice sistem de calcul lucreaza cu un numar nit
de cifre semnicative. Pe de alta parte, erorile se propaga n calcule, astfel ncat, chiar
daca datele de intrare ale unui program sunt foarte precise, rezultatul poate avea doar
cateva cifre semnicative corecte. De aceea este foarte important ca pentru orice algoritm
sa se estimeze eroarea rezultatului.
Pentru analiza cantitativa a acestor erori, este utila denirea urmatoarelor marimi.
Eroarea absoluta e
x
a unei marimi este diferent a dintre valoarea aproximativ a x si
valoarea exacta x a marimii
e
x
= x x. (2.1)
Este evident ca o astfel de marime nu se poate calcula deoarece valoarea exacta nu este
cunoscuta. De aceea, este mai utila aarea unei margini a erorii absolute a
x
, adica a unei
marimi care satisface
e
x
a
x
. (2.2)
Daca presupunem ca marimea este scalara, atunci din (2.1) si (2.2) rezulta ca
x a
x
x x + a
x
. (2.3)
Altfel spus, cunoasterea marginii erorii absolute permite denirea intervalului n care este
plasata solut ia exacta. Relat ia (2.3) se mai scrie si sub forma
x = x a
x
. (2.4)
Dezavantajul folosirii erorii absolute este acela ca valoarea numerica depinde de sis-
temul de unitat i de masura folosit, facand dicila aprecierea gradului de acuratet e a
solut iei. De aceea, se prefera folosirea unei marimi relative, invarianta la sistemul de
unitat i de masura.
1
Facultativ
G.Ciuprina, Draft din 23 noiembrie 2009
2.3. Erori n calculele numerice 35
Eroarea relativa
x
a unei marimi se deneste ca ind raportul dintre eroarea absoluta
si norma marimii

x
=
e
x
x
. (2.5)
Nici aceasta marime nu se poate calcula deoarece nici eroarea absoluta, nici marimea
exacta nu sunt cunoscute. De aceea se prefera folosirea unei margini a erorii relative r
x
,
marime care satisface

x
r
x
. (2.6)
Cel mai adesea, marginea erorii relative se exprima n procente, iar relat ia (2.6) se scrie
si sub forma
x = x r
x
%. (2.7)
Erorile dintr-un algoritm se pot clasica n funct ie de tipul cauzelor care le genereaza
n: erori inerente, erori de rotunjire si erori de trunchiere.
Erorile inerente sunt erorile datorate reprezentarii imprecise a datelor de intrare. Datele
de intrare ale unui algoritm pot proveni de exemplu din masuratori, si de aceea ele sunt
afectate de erori. Aceste erori nu pot eliminate si de aceea este important sa putem
evalua modul n care se propaga ele n calculele numerice, astfel ncat sa poata facuta
o estimare a erorii rezultatului n funct ie de erorile datelor de intrare.
Erorile de rotunjire se datoreaza reprezentarii nite a numerelor reale n calculator.
Sistemele de calcul nu pot lucra decat cu aproximari rat ionale ale numerelor reale. Nu-
merele reale sunt reprezentate cu un numar nit de cifre semnicative. Nici aceste erori
nu pot eliminate si, ca si n cazul erorilor inerente, este importanta evaluarea modului
n care ele afecteaza rezultatul nal.
Erorile de trunchiere provin din reprezentarea nita a algoritmilor. Exista metode
matematice a caror solut ie exacta ar necesita efectuarea unui numar innit de calcule.
Un astfel de exemplu este sumarea unei serii. Deoarece implement arile nu pot facute
decat pentru algoritmi care fac un numar nit de calcule, nu are sens sa permitem n
pseudocod cicluri cu contor cu un numar innit de pasi.

In acest caz este importanta
evaluarea erorii care se face datorita trunchierii procesului innit.
Exercit iile care urmeaza ilustreaza aceste tipuri de erori.
2.3.1 Erori de rotunjire
Erorile de rotunjire se datoreaza reprezentarii nite a numerelor reale n calculator.
Sistemele de calcul nu pot lucra cu numere reale exacte, ci doar cu aproximari rat ionale
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
36 Capitolul 2. Evaluarea algoritmilor
ale acestora.

In consecint a, numerele reale nu pot reprezentate n calculator decat cu
un numar nit de cifre semnicative.

In cele ce urmeaza, este util sa reprezentam numerele reale n baza 10, cu ajutorul unei
part i fract ionare f si a unui exponent n.
x = f 10
n
. (2.8)
Mai mult, pentru orice numar n afara lui 0, prin alegerea convenabila a lui n, partea
fract ionara satisface 0.1 |f| < 1. De exemplu 3.14 = 0.314 10
1
, 0.007856 = 0.7856
10
2
. Cifrele part ii fract ionare se numesc cifre semnicative.
Exercit iul 2.15:
Cate cifre semnicative are numarul 3.14? Dar numarul 0.007856?

In calculator se pot memora un numar nit k de cifre semnicative. Se poate demonstra


ca eroarea relativa datorata acestui proces de rotunjire este majorata de |
x
| 10
k+1
.
Evident ca daca cifrele pierdute sunt toate zero, atunci numarul poate reprezentat
exact. Calculele n care intervin numere reale, chiar dac a ele sunt reprezentate exact, pot
afectatensa la randul lor de procesul de rotunjire. De exemplu, adunarea a doua numere
reale se face adunand part ile fract ionare dupa ce, n prealabil, numarul mai mic a fost
rescris astfel ncat sa aiba exponentul numarului mai mare. La rescrierea numarului mai
mic se pot pierde cifre semnicative. Pentrunt elegerea acestei armat ii sa ne imaginam ca
lucram pe un calculator ipoteticn care numarul de cifre semnicative este 3.

Intr-un astfel
de calculator vrem sa adunam x
1
= 3.73 = 0.37310 cu x
2
= 0.004 = 410
3
. Numarul x
2
,
de modul mai mic, se rescrie astfel ncat sa aiba exponentul 1, ca al numarului mai mare.
x
2
= 4 10
4
10 = 0.0004 10. Deoarece calculatorul permite memorarea doar a 3 cifre
dupa virgula, iar cifra 4 ar a patra, nsemna ca de fapt cifra 4 este pierduta. La adunare
x
2
este vazut a zero si rezultatul adunarii este de fapt x
1
. Evident ca un astfel de
calculator nu exista, n mod uzual se lucreaza cu mai mult de 12 cifre semnicative, acest
lucru depinzand de congurat ia hard, de limbajul de programare folosit si de declarat ia
facuta pentru variabile, dar ideea este exact cea descrisa de acest exemplu simplu.
Se deneste zeroul (acuratet ea, precizia, epsilon-ul) masinii ca ind cel mai mic
numar real care adunat la unitate i modica valoarea. Am putea spune ca zeroul masinii
eps este cel mai mic numar pentru care 1 + eps > 1. Pentru orice numar a mai mic
decat zeroul masinii 1 + a = 1, unde aceasta din urma relat ie o consideram efectuata n
calculator si nu n matematica exacta.

Intr-un mediu n care zeroul masinii nu este cunoscut, el poate calculat cu usurint a
cu ajutorul unui program ce implementeaza urmatorul pseudocod:
G.Ciuprina, Draft din 23 noiembrie 2009
2.3. Erori n calculele numerice 37
functie zeroul masinii ()
real epsilon
epsilon = 1
c^at timp (1 + epsilon > 1)
epsilon = epsilon/2

epsilon = epsilon 2
^ntoarce epsilon
Ca o consecint a a celor discutate mai sus, rezulta ca, spre deosebire de matematica
exacta, n calculator adunarea numerelor reale nu este asociativa. Daca trebuie adunate
mai multe numere reale, pentru a obt ine un rezultat afectat cat mai put in de erori de
rotunjire, trebuie ca numerele sa e adunate n ordinea crescatoare a valorii lor.
Exercit iul 2.16:
a) Implementat i n Matlab funct ia zeroul masinii.
b) Comparat i rezultatul obt inut cu cel al funct iei Matlab eps.
2.3.2 Erori inerente
Se poate demonstra ca, n cazul operat iilor algebrice elementare, propagarea erorilor
inerente se face conform formulelor din tabelele de mai jos.
Erori Adunare Scadere
y = x
1
+ x
2
y = x
1
x
2
Eroare absoluta: e
y
= e
x
1
+ e
x
2
e
x
1
e
x
2
majorata de: a
y
= a
x
1
+ a
x
2
a
x
1
+ a
x
2
Eroare relativa:
y
=
x
1
x
1
+x
2

x
1
+
x
2
x
1
+x
2

x
2
x
1
x
1
x
2

x
1

x
2
x
1
+x
2

x
2
majorata de r
y
=

x
1
x
1
+x
2

r
x
1
+

x
2
x
1
+x
2

r
x
2

x
1
x
1
x
2

r
x
1
+

x
2
x
1
x
2

r
x
2
Tabelul 2.1: Erorile rezultatului adunarii si scaderii a doua numere reale n funct ie de
erorile datelor de intrare.
Precizam ca operat ia x
1
+x
2
este considerata adunare daca ambii operanzi au acelasi
semn.

In caz contrar, operat ia este de fapt o scadere. Similar, x
1
x
2
este o scadere daca
ambii operanzi au acelasi semn, n caz contrar ind de fapt efectuata o adunare.
Daca analizam marginea erorii relative de la adunare, se observa ca erorile relative ale
datelor de intrare sunt ponderate cu |x
1
/(x
1
+x
2
)| si |x
2
/(x
1
+x
2
)|, ambele ponderi ind
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
38 Capitolul 2. Evaluarea algoritmilor
Erori

Inmult ire

Impart ire
y = x
1
x
2
y =
x
1
x
2
Eroare absoluta: e
y
= x
2
e
x
1
+ x
1
e
x
2
1
x
2
e
x
1

x
1
x
2
2
e
x
2
majorata de: a
y
= |x
2
|a
x
1
+|x
1
|a
x
2
1
|x
2
|
a
x
1
+
|x
1
|
x
2
2
a
x
2
Eroare relativa:
y
=
x
1
+
x
2

x
1

x
2
majorata de r
y
= r
x
1
+ r
x
2
r
x
1
+ r
x
2
Tabelul 2.2: Erorile rezultatului nmult irii si mpart irii a doua numere reale n funct ie de
erorile datelor de intrare.
subunitare. Aceasta nseamna ca eroarea rezultatului adun arii a doua numere reale nu
este amplicata, ea ramane de acelasi ordin de marime cu erorile datelor de intrare. Se
spune ca adunarea este o operat ie stabil a numeric. Nu acelasi lucru se poate spune despre
scadere. Ponderile n acest caz sunt |x
1
/(x
1
x
2
)| si |x
2
/(x
1
x
2
)|, care pot oricat
de mari pentru ca diferent a x
1
x
2
poate oricat de mica.

In consecint a, rezultatul
unei scaderi poate afectat de erori mult mai mari decat erorile datelor de intrare. Se
spune ca sc aderea este o operat ie instabil a numeric. Instabilitatea la scadere apare mai
ales atunci cand numerele sunt foarte apropiate, efect cunoscut si sub numele de efect de
anulare prin sc adere.
Efectuarea unor calcule de acest tip, n care se urmareste nu numai valoarea rezultatului
ci si modul n care acesta este afectat de erorile datelor de intrare se numeste calcul cu
intervale. Este acum mai evident faptul ca adunarea numerelor reale n calculator nu este
o operat ie asociativa, armat ie facuta cu ocazia discut iei referitoare la erorile de rotunjire.
Un ultim exemplu interesant este cel al funct iei y =

x pentru care rezulta o eroare
absoluta e
y
= 1/(2

x)e
x
si o eroare relativa egala cu jumatate din eroarea relativa a datei

y
=
x
/2. Am putea deduce de aici, n mod eronat, can acest caz, daca aplicam radicalul
n mod repetat rezultatului, eroarea tinde catre zero. Toate calculele prezentate n acest
paragraf (inclusiv acesta din urma) au presupus un calcul exact, adica un calcul fara erori
de rotunjire. Rotunjirea nu poate nsa ignorata. Nu putem separa proprietat ile erorilor
inerente de efectul rotunjirii. De aceea, vom accepta un fel de superpozit ie a erorilor n
sensul ca eroarea relativantr-un calcul aproximativ este egala cu eroarea relativa produsa
de calculul aproximativ cu numere exacte (adica eroarea de rotunjire) plus eroarea relativa
produsa de calculul exact cu numere aproximative (afectate deci de erori inerente). Cu
aceasta precizare, formulelor deduse trebuie sa li se adauge o eroare de rotunjire, de
exemplu

x
=

x
2
+ eps. (2.9)
G.Ciuprina, Draft din 23 noiembrie 2009
2.3. Erori n calculele numerice 39
Exercit iul 2.17:
Scriet i un program Matlab care sa calculeze solut iile ecuat iei ax
2
+ bx + c = 0, unde
a = 1 0.1%, b = 100.01 0.1%, c = 1 0.1%.
2.3.3 Erori de trunchiere
Erorile de trunchiere provin din reprezentarea nita a algoritmilor. Exista metode
matematice a caror solut ie exacta ar necesita efectuarea unui numar innit de calcule.
Estimarea erorilor de trunchiere se poate face de multe ori apriori, folosind rezultatele
teoretice ale matematicii.
Ca exemplu, sa consideram dezvoltarea n serie Taylor a unei funct ii:
f(x) = f(x
0
) +
x x
0
1!
f

(x
0
) +
(x x
0
)
2
2!
f

(x
0
) + (2.10)
Exercit iul 2.18:
Scriet i seria alternanta obt inuta din dezvoltarea n serie Taylor a funct iei sin(x) n jurul
punctului x
0
= 0.
Conform teoriei seriilor alternante, se stie ca eroarea absoluta facuta prin aceasta
trunchiere este mai mica decat ultimul termen considerat. Cunoasterea acestui rezultat
teoretic ne permite sa elaboram un algoritm de evaluare a funct iei sinus care sa stabileasca
singur cand se va opri. Algoritmul va aduna termeni la suma part iala pana cand termenul
curent sumat este mai mic decat o anumita valoare. Aceasta valoare nu trebuie sa e prea
mare caci atunci solut ia va nesatisfacatoare. De asemenea, o valoare mai mica decat
zeroul masinii este lipsita de sens deoarece un termen curent cu o astfel de valoare, adunat
la suma part iala acumulata panan acel moment, practic nu mai are nici o inuent a asupra
valorii sumei part iale.

Intr-un astfel de moment, continuarea sumarii seriei este inutila,
ea nu mai mbunatat este rezultatul, fenomen total diferit de teoria matematica n care
rezultatul este cu atat mai precis cu cat suma cont ine mai mult i termeni. Pseudocodul
urmator implementeaza calculul funtiei sinus ntr-un punct x, cu o eroare impusa err.
functie sinus(x, err)
; ntoarce valoarea funct iei sinus in punctul x
; prin trunchierea seriei Taylor dezvoltata in 0
real x
real err
real t, s
^ntreg k
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
40 Capitolul 2. Evaluarea algoritmilor
t = x
s = t
k = 0
c^at timp (|t| > err)
k = k + 1
t = (1) t
x
2
(2k)(2k+1)
s = s + t

intoarce s
Exercit iul 2.19:
a) Implementat i n Matlab pseudocodul de mai sus.
b) Scriet i un program care sa reprezinte grac variat ia modulului termenului curent (ca n
gura 2.3) si modulul diferent ei dintre sumele part iale consecutive (gura 2.4) n funct ie
de iterat ie. Comentat i rezultatul.
0 5 10 15 20 25 30
10
100
10
80
10
60
10
40
10
20
10
0
|
t
|
k
Figura 2.3: Modulul termenului curent
al dezvoltarii n serie Taylor a funct iei
sinus. Un astfel de grac trebuie obt inut
la exercit iul 18.
0 5 10 15 20 25 30
10
16
10
14
10
12
10
10
10
8
10
6
10
4
10
2
10
0
Iteratia k
|
s
(
k
)


s
(
k

1
)
|
Figura 2.4: Modulul diferent ei dintre
sume part iale consecutive la dezvoltarea
n serie Taylor a funct iei sinus. Un astfel
de grac trebuie obt inut la exercit iul 18.
G.Ciuprina, Draft din 23 noiembrie 2009
Capitolul 3
Analiza circuitelor electrice rezistive
liniare
Aceasta tema reprezinta cel mai simplu exemplu de aplicat ie din ingineria electrica,
care conduce la rezolvarea unui sistem de ecuat ii algebrice liniare.
Un circuit rezistiv liniar este un circuit ce cont ine rezistoare, surse ideale de tensiune
si curent si surse comandate liniar. Problema fundamentala a analizei acestor circuite
are ca date: topologia circuitului, valorile parametrilor (rezistent ele, valorile surselor) si
urmareste calculul curent ilor si tensiunilor din ecare latura.
Exista mai multe metode de rezolvare a unor astfel de circuite: metoda ecuat iilor Kirch-
ho, metoda potent ialelor nodurilor, metoda curent ilor ciclici. Atat metoda potent ialelor
nodurilor cat si metoda curent ilor ciclici genereaza un sistem de ecuat ii mai mic decat
metoda Kirchho, avand o matrice a coecient ilor cu proprietat i mai bune (de exemplu
simetrie, diagonal dominant a). Metoda curent ilor ciclici necesita si alegerea unui sistem
convenabil de bucle independente, ind mai dicil de transpus ntr-un algoritm decat
metoda potent ialelor nodurilor (numita mai scurt metoda sau tehnica nodal a).
Exercit iile din acest capitol va vor ajuta sa nt eleget i modul n care se concepe si
se testeaza un algoritm folosind tehnica nodala pentru asamblarea sistemului de ecuat ii,
metode directe de rezolvare a sistemului rezultat si tehnici de matrice rare pentru a obt ine
un algoritm cu o complexitate cat mai buna.
41
42 Capitolul 3. Analiza circuitelor electrice rezistive liniare
3.1 Metoda potent ialelor nodurilor
Primul pas catre elaborarea unui algoritm l constituie nt elegerea teoriei metodei de
rezolvare si pregatirea unui exemplu de dimensiuni mici pentru primele teste care vor
facute viitorului program.
Vom considera un circuit electric alcatuit numai din laturi standard de tip sursa reala
de tensiune (g.3.1).

In particular, aceste laturi pot rezistoare ideale, dar nu surse ideale
de tensiune.
R
k
i
k
e
k
u
k
(ni )
k
(nf )
k
Figura 3.1: Latura standard.
Datele problemei sunt
topologia: numarul de noduri N, numarul de laturi L si modul n care sunt conectate
laturile adica graful circuitului,
toate rezistent ele laturilor R
k
, k = 1, . . . , L,
toate tensiunile electromotoare e
k
, k = 1, . . . , L
Se cere sa se calculeze
toate tensiunile u
k
la bornele laturilor,
tot i curent ii i
k
ce strabat laturile,
puterea consumata si puterea generata n circuit.
Desi alegerea sensurilor de referint a poate arbitrara, n vederea transformarii metodei
nodale ntr-un algoritm, este mult mai usor daca se aleg sensuri de referint a n mod
sistematic, ca de exemplu: sensul de referint a al curentului este dat de sensul saget ii
interioare al sursei de tensiune si sensul de referint a al tensiunii se alege astfel ncat sa
se respecte convent ia de la receptoare (asa cum sunt reprezentate n g. 3.1). Sensul de
referint a al curentului ce strabate o latura k stabileste si o relat ie de ordonare ntre cele
doua noduri ale laturii respective, el ind sensul de la nodul init ial notat (ni
k
) la nodul
nal notat (nf
k
).
G.Ciuprina, Draft din 23 noiembrie 2009
3.1. Metoda potent ialelor nodurilor 43
Conform teoriei circuitelor, fenomenele sunt complet descrise de un numar de N 1
ecuat ii Kirchho I

k(n)
A
i
k
= 0, n = 1, . . . , N, (3.1)
un numar de L N + 1 ecuat ii Kircho II scrie pe un sistem de bucle independente

k[b]
A
u
k
= 0, b = 1, . . . , L N + 1, (3.2)
si L relat ii Joubert, scrise pentru toate laturile
u
k
= R
k
i
k
e
k
, k = 1, . . . , L, (3.3)
n total un numar de 2L ecuat ii cu 2L necunoscute (tot i curent ii si toate tensiunile).

In tehnica nodala necunoscutele principale ale problemei sunt potent ialele nodurilor
v
k
, k = 1, . . . , N, unde unul din noduri are, n mod convent ional, potent ialul nul. Vom
presupune ca numerotarea nodurilor este facuta astfel ncat nodul de indice maxim este
cel de referint a v
N
= 0. Prin exprimarea tensiunilor ca diferent e de potent ial, teorema
Kirchho II este identic satisfacuta. Altfel spus, relat ia (3.2) este satisfacuta daca se scriu
toate relat iile
u
k
= v
ni
k
v
nf
k
, k = 1, . . . , L. (3.4)
Pentru a face scrierea mai compacta este util sa folosim urmatoarele notat ii:
u = [ u
1
u
2
. . . u
L
]
T
IR
L1
vectorul tensiunilor laturilor,
i = [ i
1
i
2
. . . i
L
]
T
IR
L1
vectorul curent ilor prin laturi,
v = [ v
1
v
2
. . . v
N
]
T
IR
N1
vectorul potent ialelor nodurilor,
e = [ e
1
e
2
. . . e
L
]
T
IR
L1
vectorul tensiunilor electromotoare,
R = diag([ R
1
R
2
. . . R
L
]) IR
LL
matricea diagonala a rezistent elor laturilor.
Cu aceste notat ii, relat iile Kirchho I (3.1) se scriu n mod compact
Ai = 0, (3.5)
unde A = (a
ij
)
i=1,N1;j=1,L
este matricea incident elor laturi-noduri, o matrice topologica
de dimensiune (N 1) L, un element al ei ind denit astfel
a
ij
=
_

_
0 daca nodul i nu apart ine laturii j;
+1 daca nodul i este nod init ial pentru latura j;
1 daca nodul i este nod nal pentru latura j.
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
44 Capitolul 3. Analiza circuitelor electrice rezistive liniare
Exercit iul 3.1:
Fie circuitul din g.3.2.
a) Orientat i laturile n conformitate cu convent ia descrisa mai sus;
b) Numerotat i laturile;
c) Numerotat i nodurile;
d) Scriet i matricea incident elor laturi noduri A ZZ
49
.
R
R
R R
R
R
1
2
3
4 5
6
R
R
9
7
R
8
e
e
e
6
e
3
5 4
Figura 3.2: Circuit simplu de test.
Relat ia Kirchho II n forma (3.4) se scrie
u = A
T
v, (3.6)
iar relat iile lui Joubert (3.3) se scriu compact
u = Ri e. (3.7)
Exercit iul 3.2:
Vericat i relat iile (3.6) si (3.7) pentru circuitul de test din g. 3.2.
Daca matricea R este inversabila (lucru adevarat daca toate rezistent ele sunt pozitive)
atunci din (3.7) rezulta ca
i = R
1
(u +e). (3.8)

Inlocuind (3.8) si (3.6)n (3.5), rezulta ecuat ia matriceala satisfacuta de vectorul potent ialelor
AR
1
A
T
v = AR
1
e. (3.9)
Matricea coecient ilor sistemului algebric liniar de rezolvat
G = AR
1
A
T
IR
(N1)(N1)
(3.10)
este numita matricea conductant elor nodale.
Exercit iul 3.3:
Calculat i matricea G data de relat ia (3.10) pentru circuitul simplu de test.
G.Ciuprina, Draft din 23 noiembrie 2009
3.1. Metoda potent ialelor nodurilor 45
ni
k
nf
k

ni
k
+1/R
k
1/R
k



nf
k
1/R
k
+1/R
k



Figura 3.3: Contribut ia unei laturi k la
matricea conductant elor nodale.

ni
k
e
k
/R
k

nf
k
+e
k
/R
k

Figura 3.4: Contribut ia unei laturi k la


vectorul inject iilor de curent.
Este usor de observat ca termenii ei au urmatoarea semnicat ie: orice termen diagonal
G
ii
reprezinta suma conductant elor laturilor care concura la nodul i, iar orice termen
nediagonal G
ij
cu i = j reprezinta suma conductant elor laturilor care unesc direct nodul
i cu nodul j, luata cu semnul minus. Altfel scris,
G
ii
=

k(i)
1
R
k
, (3.11)
G
ij
=

k(i);k(j)
1
R
k
pentru i = j. (3.12)
Termenul liber al sistemului de ecuat ii
t = AR
1
e IR
(N1)1
(3.13)
este numit vectorul inject iilor de curent.
Exercit iul 3.4:
Calculat i vectorul t dat de relat ia (3.13) pentru circuitul simplu de test.
Un termen al acestui vector t
k
reprezinta suma algebrica a unor termeni de tipul e
m
/R
m
pentru toate laturile m care concura la nodul k, cu plus daca sageata interna a sursei de
tensiune electromotoare de pe latura m intran nodul k, si cu semnul minus n caz contrar.
Este important sa remarcam ca matricea G este simetrica si pozitiv denita.

In relat ia
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
46 Capitolul 3. Analiza circuitelor electrice rezistive liniare
(3.10) R este o matrice diagonala, avand pe diagonala valorile rezistent elor laturilor
R =
_

_
R
1
0 0
0 R
2
0

0 0 R
L
_

_
. (3.14)
Matricea R
1
este tot o matrice diagonala, avand pe diagonala valorile conductant elor
laturilor
R
1
=
_

_
1/R
1
0 0
0 1/R
2
0

0 0 1/R
L
_

_
. (3.15)
Atunci
G
T
=
_
AR
1
A
T
_
T
=
_
A
T
_
T
_
R
1
_
T
(A)
T
= AR
1
A
T
= G, (3.16)
deci matricea conductant elor nodale este simetrica. Mai mult, ea este diagonal dominanta.
Pentru demonstrarea proprietat ii de pozitiv denire, sa consideram un vector coloana
x arbitrar, nenul. Atunci
x
T
Gx = x
T
AR
1
A
T
x = y
T
R
1
y =
L

k=1
y
2
k
R
k
> 0, (3.17)
unde am notat y = A
T
x un vector coloana de componente y
k
, k = 1, L. Inegali-
tatea demonstrata n (3.17) este stricta, ea ar putea zero doar daca vectorul y, si
n consecint a vectorul x este nul, ceea ce contrazice ipoteza facuta.

In concluzie, matricea
conductant elor nodale este pozitiv denita.
Exista mai multe variante posibile de concepere a algoritmului acestei metode. Toate
au trei etape principale: etapa de preprocesare n care se descrie problema si se asambleaza
sistemul de ecuat ii de rezolvat, etapa de rezolvare n care se apeleaza o procedura propriu-
zisa de rezolvare a sistemului de ecuat ii rezultat (procedura numita foarte adesea solver)
si etapa de postprocesare n care se calculeaza alte marimi de interes.
3.2 Structuri de date

In conceperea unui algoritm, stabilirea structurilor de date ce vor folosite este de


asemenea o etapa foarte importanta.
Numele datelor ce le vom folosi n algoritm vor alese n concordant a cu teoria prezen-
tata n paragraful anterior. Reamintim ca trebuie sa stim informat iile legate de topologie:
G.Ciuprina, Draft din 23 noiembrie 2009
3.2. Structuri de date 47
numarul de noduri N, numarul de laturi L si, pentru ecare latura, care este nodul init ial
ni
k
si care este nodul nal nf
k
. De asemenea, trebuie sa stim parametrii ecarei laturi:
rezistent a R
k
si tensiunea electromotoare e
k
.
Declarat ii posibile pentru aceste date ar putea
; declaratii date - varianta A
^ntreg N ; numar de noduri
^ntreg L ; numar de laturi
tablou ^ntreg ni[L] ; noduri init iale ale laturilor
tablou ^ntreg nf[L] ; noduri nale ale laturilor
tablou real R[L] ; rezistent e
tablou real e[L] ; tensiuni electromotoare
Exercit iul 3.5:
Pentru circuitul simplu de test, considerat i urmatoarele valori numerice: R
1
= 1, R
2
=
1/2, R
3
= 1/3, e
3
= 30 V, R
4
= 1/4, e
4
= 40 V, R
5
= 1/5, e
5
= 50 V, R
6
= 1/6,
e
6
= 60 V, R
7
= 1/7, R
8
= 1/8, R
9
= 1/9, e
9
= 90 V. Reamintim ca acest exemplu
nu are important a practica, el va folosit exclusiv pentru prima validare a programului
ce va implementat. Completat i apoi un tabel de tipul:
k ni
k
nf
k
R
k
e
k
1

9
Pentru a evita nsa transmiterea unui numar mare de parametri ca argumente de
funct ii, recomandam nsa agregarea datelor, ca de exemplu
; declarat ii date - varianta B
^nregistrare circuit
^ntreg N ; numar de noduri
^ntreg L ; numar de laturi
tablou ^ntreg ni[L] ; noduri init iale ale laturilor
tablou ^ntreg nf[L] ; noduri nale ale laturilor
tablou real R[L] ; rezistent e
tablou real e[L] ; tensiuni electromotoare
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
48 Capitolul 3. Analiza circuitelor electrice rezistive liniare
De asemenea, un alt aspect important este acela ca matricea conductant elor nodale si
vectorul inject iilor de curent sunt rare. Totusi, pentru a pastra simpla descrierea algorit-
mului, n cele ce urmeaza vom pastra acelasi tip de declarat ii si pentru matricile rare si
vectorii rari, urmand a discuta exploatarea raritat ii ulterior.

In consecint a, variabile mai
importante care vor aparea n algoritm sunt:
; declarat ii variabile utile
tablou real G[N, N] ; matricea conductant elor nodale (n nal va stocata rar)
tablou real t[N] ; vectorul inject iilor de curent (n nal va stocat rar)
tablou real v[N] ; vectorul potent ialelor
3.3 Etapa de preprocesare
Etapa de preprocesare consta n citirea datelor (de exemplu de la tastatura sau din
siere) si n asamblarea sistemului de ecuat ii de rezolvat.

In cazul variantei A de declarat ii, procedura de citire a datelor poate


procedura citire date A (N, L, ni, nf, R, e)
; declarat ii
...
citeste N, L
pentru k = 1, L
citeste ni
k
, nf
k
, R
k
, e
k

retur

In cazul variantei B de declarat ii, rutina de citire a datelor poate o funct ie, de tipul
functie citire date B ()
; declarat ii
...
citeste circuit.N, circuit.L
pentru k = 1,circuit.L
citeste circuit.ni
k
, circuit.nf
k
, circuit.R
k
, circuit.e
k

^ntoarce circuit
G.Ciuprina, Draft din 23 noiembrie 2009
3.3. Etapa de preprocesare 49
Exercit iul 3.6:
Pentru primele teste vom prefera chiar o procedura de citire rapida a circuitului sim-
plu de test. Pentru aceasta, scriet i un sier citire circuitRE simplu.m ca mai jos.
Completat i datele circuitului n conformitate cu tabelul de la exercit iul 3.5.
function [circuit] = citire_circuitRE_simplu()
circuit.N = 5;
circuit.L = 9;
circuit.ni = [?; ?; ?; ?; ?; ?; ?; ?; ?]; % completati
circuit.nf = ......... % completati
circuit.R = [1/1; 1/2; 1/3; 1/4; 1/5; 1/6; 1/7; 1/8; 1/9];
circuit.e = .......... % completati
Exista mai multe variante si de a asambla sistemul de ecuat ii. O varianta ar cea
n care se parcurg nodurile si se scriu ecuat iile una cate una. Asa ar face si o persoana
care ar aplica aceasta metoda, cu creionul pe hartie, pentru a rezolva o problema de
dimensiuni extrem de mici.

In aceasta abordare trebuie identicate care sunt laturile ce
ating un nod. Numarul lor variaza de la nod la nod, iar algoritmul corespunzator este
destul de costisitor necesitand analiza grafului circuitului. O alta abordare se bazeaza pe
parcurgerea laturilor si adunarea contribut iilor acestora la sistem. Aceasta varianta este
mult mai simplu de conceput deoarece ecare latura are exact doua noduri. Din acelasi
motiv si descrierea circuitului a fost orientata pe laturi si nu pe noduri.
Algoritmul metodei nodale este urmatorul
procedura nodalRE v1 (circuit, G, t)
; asambleaza sistemul de ecuat ii pentru un circuit cu laturi de tip
; sursa reala de tensiune, folosind tehnica nodala
; parametri de intrare:
; circuit - structura de date ce descrie circuitul
; parametri de iesire:
; G - matricea conductant elor nodale si
; t - vectorul inject iilor de curent
; declarat ii
....
L =circuit.L ; pentru simplicarea scrierii algoritmului
N =circuit.N
ni = circuit.ni
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
50 Capitolul 3. Analiza circuitelor electrice rezistive liniare
nf = circuit.nf
R = circuit.R
e = circuit.e
; anuleaza componentele matricei G si a vectorului termenilor liberi t
G = 0
t = 0
; asambleaza sistem
pentru k = 1, L ; parcurge laturi
i =ni
k
; nodul init ial al laturii k
j =nf
k
; nodul nal al laturii k
G
ii
= G
ii
+ 1/R
k
G
jj
= G
jj
+ 1/R
k
G
ij
= G
ij
1/R
k
G
ji
= G
ji
1/R
k
t
i
= t
i
e
k
/R
k
t
j
= t
j
+ e
k
/R
k

Exercit iul 3.7:


a) Implementat i procedura nodalRE v1 ca o funct ie Matlab.
b) Scriet i un script main nodal cu urmatorul cont inut:
clear all;
[circuit] = citire_circuitRE_simplu();
[G,t] = nodalRE_v1(circuit)
Vericat i ca rezultatul este cel asteptat.
c) Aratat i ca aceasta procedura de asamblare are complexitatea T = O(12L).
Procedura de mai sus poate mbunatat ita.

In primul rand, calcule identice nu trebuie
sa se repete. O varianta mbunatat ita este
procedura nodalRE v2 (circuit, G, t)
....
pentru k = 1, L ; parcurge laturi
i =ni
k
; nodul init ial al laturii k
j =nf
k
; nodul nal al laturii k
Glat = 1/R
k
Isc = e
k
Glat
G.Ciuprina, Draft din 23 noiembrie 2009
3.3. Etapa de preprocesare 51
G
ii
= G
ii
+Glat
G
jj
= G
jj
+Glat
G
ij
= G
ij
Glat
G
ji
= G
ji
Glat
t
i
= t
i
Isc
t
j
= t
j
+Isc

Exercit iul 3.8:


a) Implementat i procedura nodalRE v2 ca o funct ie Matlab.
b) Adaugat i scriptului main nodal apelul acestei proceduri. Vericat i corectitudinea
rezultatului.
c) Care este complexitatea procedurii nodalRE v2?
d) Contorizat i timpul de calcul pentru cele doua proceduri si comparat i.
O alta idee dembunatat ire este cea care se bazeaza pe faptul ca matricea este simetrica
si putem asambla doar jumatate din ea. Procedura urmatoare asambleaza triunghiul
inferior.
procedura L nodalRE v3 (circuit, G, t)
....
pentru k = 1, L ; parcurge laturi
i =ni
k
; nodul init ial al laturii k
j =nf
k
; nodul nal al laturii k
Glat = 1/R
k
Isc = e
k
Glat
G
ii
= G
ii
+Glat
G
jj
= G
jj
+Glat
daca i > j
G
ij
= G
ij
Glat
altfel ; acesta este cazul i < j,
G
ji
= G
ji
Glat ; cazul i = j nu este posibil pentru date de intrare corecte

t
i
= t
i
Isc
t
j
= t
j
+Isc

Exercit iul 3.9:


a) Implementat i procedura L nodalRE v3 ca o funct ie Matlab.
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
52 Capitolul 3. Analiza circuitelor electrice rezistive liniare
b) Adaugat i scriptului main nodal apelul acestei proceduri. Vericat i corectitudinea
rezultatului.
c) Care este complexitatea procedurii L nodalRE v3? Care ar putea avantajul folosirii
ei?
3.4 Etapa de rezolvare

In etapa de preprocesare asamblarea sistemului nu a fost facuta la dimensiunea (N


1) (N 1) ci la dimensiunea N N, nodul de referinta neind tratat special. Acest
lucru a facut extrem de usoara scrierea pseudocodului pentru asamblarea matricei. Pentru
rezolvare nsa, sistemul trebuie sa e de dimensiune N 1. Presupunand ca nodul N este
nodul de referint a (v
N
= 0), atunci matricea coecient ilor se obt ine eliminand ultima
linie si ultima coloana din matricea asamblata, iar vectorul termenilor liberi se obt ine
eliminand ultima componenta.
Exercit iul 3.10:
Adaugat i scriptului main nodal urmatoarele comenzi matlab.
% rezolvare
N = circuit.N;
G(N,:) = [];
G(:,N) = [];
t(N) = [];
v = G\t;
v(N) = 0;
Comentat i aceste comenzi.
Operatorul backslash n Matlab implementeaza ntr-un mod ecient metoda Gauss
pentru rezolvarea sistemelor de ecuat ii algebrice liniare.

Intr-o tema viitoare vom analiza
si alte posibilitat i de rezolvare a sistemului de ecuat ii provenind din analiza circuitelor.
Vectorul solut ie ntors reprezinta potent ialele a N 1 noduri. Potent ialul ultimului
nod a fost considerat zero si de aceea, pentru completitudine, este adaugata atribuirea
v
N
= 0 imediat dupa apelul procedurii de rezolvare.
G.Ciuprina, Draft din 23 noiembrie 2009
3.5. Etapa de postprocesare 53
3.5 Etapa de postprocesare
Dupa rezolvarea sistemului putem calcula orice alte marimi de interes: tensiuni, curent i
prin laturi, puteri. Urmatorul pseudocod ilustreaza acest calcul
procedura postprocesare crl (circuit, v)
; declarat ii
...
L =circuit.L
ni = circuit.ni
nf = circuit.nf
R =circuit.R
e = circuit.e
Pc = 0 ; puterea consumata
Pg = 0 ; puterea generata
pentru k = 1, L ; parcurge laturi
u = v
ni
k
v
nf
k
; tensiunea laturii
c = (u + e
k
)/R
k
; curentul prin latura
scrie Latura k are tensiunea u si curentul c
Pc = Pc + R
k
c
2
; adauga contribut ia laturii la puterea consumata
Pg = Pg + e
k
c ; adauga contribut ia laturii la puterea generata

scrie Pc, Pg
retur
Este posibil ca, datorita erorilor de rotunjire, valorile Pc, Pg asate sa nu e identice.
Acest lucru sentampla mai ales daca matricea sistemului este prost condit ionata numeric,
caz ce poate aparea daca valorile rezistent elor sunt foarte diferite.
Exercit iul 3.11:
a) Implementat i n Matlab procedura de postprocesare;
b) Completat i scriptul principal cu apelul ei;
c) Rulat i programul si vericat i ca bilant ul de puteri este vericat.
3.6 Analiza complexitat ii. Optimizarea algorimului.
Pana acum, ne-am concentrat asupra nt elegerii teoriei si testarii programului imple-
mentat pe un exemplu foarte simplu.
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
54 Capitolul 3. Analiza circuitelor electrice rezistive liniare
Ne propunem acum sa analizam complexitatea algoritmului si sa vedem cembunatat iri
i putem aduce.
Pentru aceasta, este util sa avem o problema de test scalabila, adica dependenta de
un parametru care sa reprezinte dimensiunea ei. Vom considera circuitul din g. 3.5 si
ne propunem sa determinam conductant a echivalenta ntre nodul marcat cu A si masa.
Dat ind modul de asamblare al matricei conductant elor nodale, am preferat sa marcam
pe rezistoare valorile conductant elor. Se poate verica cu usurint a faptul ca valoarea
conductant ei echivalente ntre nodul A si masa este G
ech
= 2G.
G
G
G G G
G
G
G
A
G
G
G
G
G
A
2 2 2
2
Figura 3.5: Circuit de test pentru analiza complexitat ii. Pe rezistoare sunt marcate
valorile conductant elor.
Se observa ca circuitul este pasiv, nu exista surse. Pentru a determina conductant a
echivalentantre nodul Asi masa, trebuie sa impunem o excitat ien nodul A. De exemplu,
daca consideram o sursa de curent J conectata ntre nodul A si masa (g. 3.6), atunci
J = G
ech
U, (3.18)
unde U este tensiunea ntre nodul A si masa, adica potent ialul nodului A: U = v
A
. Daca
se alege J = 1A, atunci
G
ech
= 1/v
A
. (3.19)
G
2G
G 2
G G G
A
J
G 2 G 2
U
Figura 3.6: Excitarea nodului A n vederea determinarii conductant ei echivalente.
Algoritmul ce va implementat poate descris pe scurt astfel:
1. Preprocesare:
Asambleaza matricea conductant elor nodale;
Asambleaza vectorul inject iilor de curent. Acesta va avea toate componentele
0, cu except ia pozit iei corespunzatoare nodului A, unde valoarea va 1.
G.Ciuprina, Draft din 23 noiembrie 2009
3.6. Analiza complexit at ii. Optimizarea algorimului. 55
2. Rezolvare: se va rezolva sistemul de ecuat ii.
3. Postprocesare: conductant a echivalenta va inversul potent ialului nodului A.

In vederea implementarii etapei de preprocesare, trebuie s a pregatim circuitul, nu-


merotandu-i nodurile si laturile. Pentru un circuit cu o structura regulata, este util daca
numerotarea se face ordonat, de exemplu asa cum este aratat n g. 3.7: nodurile sunt
numerotate de la stanga la dreapta, de la 1 la n, nodul de masa este numerotat ultimul, ca
ind nodul numarul n+1. Nodul A este deci nodul n. Laturile orizontale sunt numerotate
cu numere pare, avand drept index dublul nodului din stanga, iar laturile verticale sunt
numerotate cu numere impare, avand drept index dublul nodului de sus minus 1.
(n+1) (n+1)(n+1)
(n+1)
(k+1) (k)
(n+1) (n+1) (n+1)
(n-1) (n) (1) (2) (3)
2(n-1) 2k
1
2
3
4
5
2k-1 2n-1
Figura 3.7: Numerotarea nodurilor si laturilor.
Structura de date ce descrie acum circuitul o vom adapta acestei probleme. Nu vom
mai deni tensiuni electromotoare pentru laturi deoarece toate sunt zero. De asemenea, n
loc de rezistent e vom lucra cu conductant e. Astfel, structura de date ce descrie circuitul
poate asamblata astfel:
functie citire circuit 1d (n,valG)
; declarat ii
...
L = 2n 1 ; numarul total de laturi
ground = n + 1 ; indexul nodului de masa
doivalG = 2*valG
pentru k = 1, n 1
; latura impara, de index 2k 1
idx = 2k 1
ni
idx
= k
nf
idx
= ground
G
idx
= valG
; latura para, de index 2k
idx = 2k
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
56 Capitolul 3. Analiza circuitelor electrice rezistive liniare
ni
idx
= k
nf
idx
= k + 1
G
idx
= doivalG

; corect ie conductant a latura 1


G
1
= doivalG
; ultima latura
ni
L
= n
nf
L
=ground
G
L
=valG
; asamblare structura circuit
circuit.N = n + 1
circuit.L = L
circuit.ni = ni
circuit.nf = nf
circuit.G = G
^ntoarce circuit
Exercit iul 3.12:
a) Implementat i n Matlab funct ia citire circuit 1d;
b) Vericat i funct ia scrisa cu comanda mlint;
c) Observat i necesarul de memorie pentru stocarea circuitului, executand urmatoarele
comenzi n Matlab:
>> clear all;
>> circuit_10 = citire_circuit_1d(10,2.1);
>> circuit_100 = citire_circuit_1d(100,2.1);
>> circuit_1000 = citire_circuit_1d(1000,2.1);
>> circuit_10000 = citire_circuit_1d(10000,2.1);
>> circuit_100000 = citire_circuit_1d(100000,2.1);
>> whos
Considerand dimensiunea problemei ca ind data de numarul de noduri din circuit, dat
de variabila n, cat este ordinul de complexitate din punct de vedere al necesarului de
memorie pentru memorarea circuitului M
circuit
= O(?). Comparat i estimarea teoretica cu
cea experimentala.
Vom implementa acum asamblarea matricei conductant elor nodale, modicand extrem
de put in funct ia nodalRE v2 implementata pentru exemplul simplu discutat anterior.
G.Ciuprina, Draft din 23 noiembrie 2009
3.6. Analiza complexit at ii. Optimizarea algorimului. 57
procedura nodal circuit 1d v1 (circuit,G,t)
; parametri de intrare - circuit
; parametri de iesire - G, t
N = circuit.N
L = circuit.L
ni = circuit.ni
nf = circuit.nf
Glat = circuit.G
G = zeros(N,N) ; anuleaza componentele matricei G si
t = zeros(N,1) ; a vectorului termenilor liberi t
pentru k = 1,L
i = ni(k)
j = nf(k)
Gk = Glat(k)
G(i,i) = G(i,i) + Gk
G(j,j) = G(j,j) + Gk
G(i,j) = G(i,j) - Gk
G(j,i) = G(j,i) - Gk

t(N-1) = 1
retur
Exercit iul 3.13:
a) Implementat i procedura de mai sus ca o funct ie Matlab
[G,t] = function nodal circuit 1d v1 (circuit). Vericat i-o cu mlint.
b) Scriet i urmatorul script Matlab pentru a testa corectitudinea programului.
clear all;
n = 10;
valG = 2.1;
% preprocesare
[circuit] = citire_circuit_1d(n,valG);
[G,t] = nodal_circuit_1d_v1(circuit);
% rezolvare
G(n+1,:) = [];
G(:,n+1) = [];
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
58 Capitolul 3. Analiza circuitelor electrice rezistive liniare
t(n+1) = [];
v = G\t;
% postprocesare
disp(sprintf(n = %d, G ech = %e,n,1/v(n)));
Vericat i ca rezultatul este cel asteptat, pentru diferite dimensiuni ale problemei (de
exemplu n = 10, 20, 100).
Exercit iul 3.14:
Observat i structura matricei conductant elor nodale dupa asamblare si nainte de re-
zolvarea propriu-zisa. Pentru aceasta adaugat i
figure(1);
spy(G);
imediat dupa asamblare si
figure(2);
spy(G);
chiar nainte de rezolvarea propriu-zisa. Observat i ca matricea sistemului de rezolvat
pentru acesta problema este tridiagonala.
Exercit iul 3.15:
a) Estimat i ordinul de complexitate din punct de vedere al necesarului de memorie. Putet i
experimenta numeric si cu ajutorul urmatoarelor comenzi executate n consola Matlab:
>> clear all;
>> [circuit_10] = citire_circuit_1d(10,2.1);
>> [G10,t10] = nodal_circuit_1d_v1(circuit_10);
>> [circuit_100] = citire_circuit_1d(100,2.1);
>> [G100,t100] = nodal_circuit_1d_v1(circuit_100);
>> whos
c) Estimat i teoretic (nu ncercat i experimental!) necesarul de memorie pentru stocarea
matricei conductant elor nodale n cazul n = 10000.
Matricea conductant elor nodale este o matrice care are foarte multe elemente nule.

In cazul problemei studiate, densitatea matricei, denita ca numarul de elemente nenule


raportat la numarul total de elemente este aproximativ
d
G
=
n
nz
n
2

3n
n
2
=
3
n
. (3.20)
G.Ciuprina, Draft din 23 noiembrie 2009
3.6. Analiza complexit at ii. Optimizarea algorimului. 59
Exercit iul 3.16:
a) Cat este densitatea matricei coecient ilor sistemului n cazul n = 10? Estimat i teoretic
cu formula de mai sus si numeric folosind funct ia Matlab nnz. Explicat i diferent a.
b) Estimat i teoretic densitatea matricei pentru n = 10000.
Implementarea facuta pana acum a folosit numai matrice pline. Funct ia Matlab zeros
creaza matrice pline.
Exercit iul 3.17:
Observat i diferent a dintre funct iile zeros si sparse executand urmatoarele comenzi:
>> clear all;
>> a = zeros(10,10)
>> b = sparse(10,10)
>> whos
Vom rescrie acum procedura de asamblare avand grija ca matricile sa e denite rar.
Exercit iul 3.18:
a) Copiat i sierul nodal circuit 1d v1.m n nodal circuit 1d v2.m. Pentru aceasta,
putet i da comanda Matlab:
>> !copy nodal_circuit_1d_v1.m nodal_circuit_1d_v2.m
b) Editat i sierul nodal circuit 1d v2.m.
>> edit nodal_circuit_1d_v2.m
Corectat i numele funct iei si nlocuit i funct ia zeros cu sparse.
Exercit iul 3.19:
a) Comparat i necesarul de memorie pentru stocarea matricei conductant elor nodale n
cele doua implementari.
>> circuit_100 = citire_circuit_1d(100,2.1);
>> [G_plin,t_plin] = nodal_circuit_1d_v1(circuit_100);
>> [G_rar,t_rar] = nodal_circuit_1d_v2(circuit_100);
>> whos
Exercit iul 3.20:
Estimat i necesarul de memorie pentru stocarea matricei conductant elor nodale n cazul
folosirii structurilor rare. Putet i experimenta cu urmatoarele comenzi.
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
60 Capitolul 3. Analiza circuitelor electrice rezistive liniare
>> clear all;
>> circuit_100 = citire_circuit_1d(100,2.1);
>> circuit_1000 = citire_circuit_1d(1000,2.1);
>> circuit_10000 = citire_circuit_1d(10000,2.1);
>> [G_100,t_100] = nodal_circuit_1d_v2(circuit_100);
>> [G_1000,t_1000] = nodal_circuit_1d_v2(circuit_1000);
>> [G_10000,t_10000] = nodal_circuit_1d_v2(circuit_10000);
>> whos
Avand n vedere structura regulata a circuitului, putem evita memorarea explicita a
circuitului si dizolva informat iile legate de topologia circuitului n procedura nodal.
procedura nodal circuit 1d v3(n,valG,G, t)
; parametri de intrare - n, valG
; parametri de iesire - G, t
N = n + 1 ; numarul total de noduri
ground = N ; indexul nodului de masa
G = sparse(N, N) ; se aloca memorie pentru o matrice rara de dimensiune N
t = sparse(N, 1)
doivalG = 2*valG
pentru k = 1 : n 1
; latura impara, de index 2k 1
i = k
j =ground
G
ii
= G
ii
+valG
G
jj
= G
jj
+valG
G
ij
= G
ij
valG
G
ji
= G
ji
valG
; latura para, de index 2k
i = k
j = k + 1
G
ii
= G
ii
+doivalG
G
jj
= G
jj
+doivalG
G
ij
= G
ij
doivalG
G
ji
= G
ji
doivalG

; corect ie conductant a latura 1


G
11
= G
11
+valG
G.Ciuprina, Draft din 23 noiembrie 2009
3.6. Analiza complexit at ii. Optimizarea algorimului. 61
; ultima latura
i = n
j =ground
G
ii
= G
ii
+valG
G
jj
= G
jj
+valG
G
ij
= G
ij
valG
G
ji
= G
ji
valG
t
N1
= 1
retur
Exercit iul 3.21:
a) Observat i diferent a ntre modul de asamblare al sistemului n cele doua variante.
b) Implementat i aceasta varianta n Matlab si testat i-i corectitudinea.
c) Comparat i necesarul de memorie si timpul de calcul necesar etapei de preprocesare n
variantele 2 si 3 pentru n = 10000. Pentru aceasta putet i folosi urmatorul script:
clear all;
n = 10000;
valG = 2.1;
% preprocesare v2
tic;
[circuit] = citire_circuit_1d(n,valG);
[G2,t2] = nodal_circuit_1d_v2(circuit);
t = toc;
disp(sprintf(timp preproc v2 = %e,t));
whos
clear G2 t2 circuit;
% preprocesare v3
tic
[G3,t3] = nodal_circuit_1d_v3(n,valG);
t = toc;
disp(sprintf(timp preproc v3 = %e,t));
whos
O alta varianta de implementare a procedurii nodal poate folosi asamblarea matricei
incident elor laturi-noduri si calculul matricei conductant elor nodale n acord cu formula
(3.10). Pseudocodul acestei proceduri este urmatorul.
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
62 Capitolul 3. Analiza circuitelor electrice rezistive liniare
procedura nodal circuit 1d v4(n,valG,G, t)
; parametri de intrare - n, valG
; parametri de iesire - G, t
N = n + 1 ; numarul total de noduri
L = 2n 1 ; numarul total de laturi
ground = N ; indexul nodului de masa
; alocare spat ie de memorie pentru:
A = sparse(N, L) ; - matricea incident elor laturi-noduri,
Glat = sparse(L, 1) ; - vectorul conductant elor laturilor,
t = sparse(N, 1) ; - vectorul inject iilor de curent.
doivalG = 2*valG;
pentru k = 1, n 1
; latura impara, de index 2k 1
idx = 2k 1
i = k ; nodul init ial al laturii
j =ground ; nodul nal al laturii
A
i,idx
= 1
A
j,idx
= 1
Glat
idx
=valG
; latura para, de index 2k
idx = 2k
i = k
j = k + 1
A
i,idx
= 1
A
j,idx
= 1
Glat
idx
=doivalG

; corect ie conductant a latura 1


Glat
1
= doivalG
; ultima latura
i = n
j =ground
A
iL
= 1
A
jL
= 1
Glat
L
= valG
G.Ciuprina, Draft din 23 noiembrie 2009
3.6. Analiza complexit at ii. Optimizarea algorimului. 63
G = Adiag(Glat)A
T
; G calculat ca produs de matrice rare
t
N1
= 1
retur
Important: n algoritmul de mai sus instruct iunea n care se calculeaza matricea con-
ductanlor nodale foloseste operat ii cu matrice rare.
Exercit iul 3.22:
a) Observat i rezultatul comenzii diag n Matlab. Comentat i urmatoarele instruct iuni
>> v = [1 2 3];
>> M = diag(v)
>> Ms = diag(sparse(v))
Ce efect (intern) n Matlab ar avea comanda sparse(diag(v)) ?
b) Implementat i varianta v4 a procedurii nodal n Matlab si testat i-i corectitudinea.
c) Comparat i necesarul de memorie necesar etapei de preprocesare n variantele 3 si 4
pentru diferite valori ale lui n. Pentru aceasta putet i folosi urmatorul script:
clear all;
nn = linspace(10000,20000,10);
valG = 2.1;
for i = 1:length(nn)
n = floor(nn(i));
% preprocesare v3
tic;
[G3,t3] = nodal_circuit_1d_v3(n,valG);
t = toc;
disp(sprintf(n = %d, timp preproc v3 = %e,n,t));
% preprocesare v4
tic
[G4,t4] = nodal_circuit_1d_v4(n,valG);
t = toc;
disp(sprintf(n = %d, timp preproc v4 = %e,n,t));
end
Document disponibil la http://www.lmn.pub.ro/
~
gabriela
64 Capitolul 3. Analiza circuitelor electrice rezistive liniare
c) Modicat i acest script pentru a obt ine grac aceasta dependent a (g.3.8).

In Matlab, comanda sparse data doar cu doua argumente care reprezinta dimensi-
unea matricei face o alocare aproximativa a spat iului de memorie necesar.

In cazul n
care se cunoaste exact cate elemente nenule are matricea rara, este mult mai ecient sa
se construiasca matricea pe coordonate si apoi sa se foloseasca comanda sparse cu 5
argumente.
Exercit iul 3.23:
a) Copiat i funct ia nodal circuit 1d v4 n nodal circuit 1d v5 si deschidet i sierul n
editorul Matlab. Corectat i numele funct iei;
b)

Inlocuit i alocarea de memorie pentru matricea de incident e cu alocarile de memorie
necesare memorarii ei pe coordonate:
%A = sparse(N,L); % matricea incidentelor laturi-noduri
no_nnz = 2*L;
r_idx = zeros(no_nnz,1);
c_idx = zeros(no_nnz,1);
val = zeros(no_nnz,1);
m = 0;
c)

Inlocuit i toate atribuirile pentru componentele matricei incident elor cu atribuiri pentru
cei trei vectori n care se memoreaza matricea, ca de exemplu:
%A(i,idx) = 1;
m = m + 1;
r_idx(m) = i;
c_idx(m) = idx;
val(m) = 1;
Trebuie sa face sase astfel de modicari.
d) Asamblat i matricea astfel
A = sparse(r_idx,c_idx,val,N,L);
e) Testat i corectitudinea noii funct ii.
f) Comparat i timpul necesar preprocesarii, completand scripturile pe care deja le-at i
folosit n exercit iile anterioare. Trebuie sa obt inet i un grac de tipul celui din g.3.9.

In concluzie, aceasta tema ilustreaza urmatoarele:


G.Ciuprina, Draft din 23 noiembrie 2009
3.6. Analiza complexit at ii. Optimizarea algorimului. 65
1 1.2 1.4 1.6 1.8 2
x 10
4
1
2
3
4
5
6
7
Numar de noduri
T
i
m
p

[
s
]
preprocesare v3
preprocesare v4
Figura 3.8: Comparat ie ntre doua imple-
mentari ale etapei de preprocesare. Un astfel
de grac trebuie sa obt inet i la exercit iul 3.22.
1 1.2 1.4 1.6 1.8 2
x 10
4
0
1
2
3
4
5
6
7
Numar de noduri
T
i
m
p

[
s
]
preprocesare v3
preprocesare v4
preprocesare v5
Figura 3.9: Comparat ie ntre trei imple-
mentari ale etapei de preprocesare. Un astfel
de grac trebuie sa obt inet i la exercit iul 3.23.
1. Etapele conceperii unui algoritm dedicat rezolvarii unei probleme sunt:
nt elegerea perfecta a bazei teoretice a algoritmului;
alegerea structurilor de date pentru datele de intrare si de iesire;
implementarea algoritmului ntr-un program;
testarea si depanarea programului pentru o problema simpla, cu rezultat cunos-
cut;
rularea programului pe probleme de dimensiuni crescute, n vederea stabilirii
complexitat ii sale si masurarea performant ei;
optimizarea codului.
2. Daca implementat i algoritmi n Matlab, este mai bine sa protat i, acolo unde este
posibil, de funct iile Matlab care folosesc operat ii cu vectori si matrice. Chiar si n
cazul structurilor pline, funct iile sunt optimizate (asa cum at i vazut ntr-un capitol
anterior).

In cazul n care structurile sunt rare, folosirea unor proceduri adaptate
acestor structuri este foarte usoara. Practic, nu este nevoie s a scriet i cod care sa
lucreze cu formatul CCS. Acest lucru este deja implementat n Matlab.
Document disponibil la http://www.lmn.pub.ro/
~
gabriela

You might also like