Sunteți pe pagina 1din 38

1

Capitolul 1

INTROD UCER E Î N C ALCU LUL AP ROXIM AT IV

Algoritmii prezentaţi în aceastǎ lucrare sunt destinaţi implementǎrii pe calculatoare


numerice cu precizie finitǎ şi domeniu de reprezentare finit. De aici rezultǎ cǎ numerele
reale, având în cazul general o infinitate de zecimale, trebuie reprezentate în interiorul unui
calculator prin aproximǎri raţionale ale lor, cu un numǎr finit de zecimale; formatul larg
rǎspândit de reprezentare a numerelor reale este formatul în virgulǎ mobilǎ. Acest capitol
este dedicat prezentǎrii noţiunilor şi problematicii de bazǎ ale calculului cu numere în virgulǎ
mobilǎ.

1.1 Reprezentarea şi aritmetica numerelor în virgulǎ mobilǎ

1.1.1 Formatul în virgulǎ mobilǎ. Erori de reprezentare


D e f i n i ţ i a 1 . 1 : Fie x ∈ şi x$ ∈ o aproximare (raţionalǎ) a acestuia. Mǎrimile:

x − x$
(1.1) ε a = x − x$ , ε r =
x

se numesc eroarea absolutǎ, respectiv eroarea relativǎ de reprezentare ale lui x.


Notând cu a(≥2) baza de reprezentare a numǎrului x şi cu tzec numǎrul de zecimale exacte
(reţinute în aproximarea x$ alui x), eroarea absolutǎ de reprezentare verificǎ relaţia:

(1.2) ε a = x − x$ ≤ a −t zec ,

ceea ce înseamnǎ cǎ numerele x şi x$ nu mai sunt distinctibile înǎuntrul preciziei a −t zec .

Exempl ul 1.1: Pentru numǎrul x=14.1247... în baza a=10 aproximarea cu tzec=2 zecimale
exacte este x$ = 14.12 . Rezultǎ, deci, cǎ ε = x − x$ = 0.0047 ≤ 0.01 = 10−2 .
a

Reprezentarea numerelor reale pe calculatoare numerice implicǎ, deci, o operaţie de


aproximare care are loc astfel:
 x, dacă x - x$ < 1 2 ⋅ a −t zec (aproximare prin lipsă)

$x =  x + a −t zec , dacă x - x$ ≥ 1 2 ⋅ a −t zec (aproximare prin adaos)


 x sau x + a −t zec , dacă x - x$ = 1 2 ⋅ a −t zec

Proprietǎţile unei aproximǎri „bune” a numerelor reale prin numere zecimale cu un
numǎr fixat de zecimale sunt:
• un domeniu de reprezentare suficient de mare;
2 Metode numerice utilizate în analiza sistemelor – aplicaţii

• eroare relativǎ suficient de micǎ;


• distribuţie uniformǎ a erorii relative de-a lungul domeniului de reprezentare.
Aceste proprietǎţi sunt asigurate de formatul în virgulǎ mobilǎ (referit mai jos ca FVM),
cunoscut şi sub numele de formatul cu mantisǎ şi exponent, pentru motive ce sunt detaliate
mai jos. Cu notaţiile de mai sus, FVM se poate defini ca un triplet:
(1.3) FVM = (a, t, p),
unde t este numǎrul de cifre ale mantisei şi p este numǎrul de cifre ale exponentului.
D e f i n i ţ i a 1 . 2 : Un numǎr în FVM dat de (1.3) este o pereche (m, e) a cǎrei valoare este
m ⋅ a e , unde m se numeşte mantisǎ şi e se numeşte exponent.
De exemplu, scrierea 0.1523E-02 desemneazǎ numǎrul 0.1523⋅10-2, adicǎ 0.001523. De
obicei mantisa este normalizatǎ, îndeplinind condiţia 1/ a ≤ m < 1 . De aici rezultǎ cǎ numǎrul
0 nu poate fi reprezentat exact, deoarece nu poate avea o mantisǎ normalizatǎ. Mantisa şi
exponentul admit respectiv urmǎtoarele scrieri generale:
(1.4) m = ±0.m1m2 ...mt , e = ±e1e2 ...e p ,

unde m1 ≠ 0 , mi ∈ {0,1,...a − 1} , i = 2,3,...t , e j ∈ {0,1,...a − 1} , j = 1, 2,... p .


Dacǎ notǎm cu M cel mai mare numǎr reprezentabil într-un FVM dat, atunci domeniul
de reprezentare este [ − M ; M ] . Atât M, cât şi cel mai mic numǎr pozitiv reprezentabil, m, sunt
parametri dependenţi de maşina de calcul şi se pot exprima în funcţie de parametrii FVM
dupǎ cum urmeazǎ.
Se noteazǎ cu L şi U valorile minimǎ, respectiv maximǎ, ale exponentului. Notând cu
b = a − 1 şi folosind notaţia (1.3), se scrie:
U = bb
{ ...b , L = −U = − bb
{ ...b
p ori p ori

şi în continuare:

(1.5) ( )
M = aU ⋅ at − 1 , m = a L

În concluzie, pentru orice numǎr x ∈ are loc relaţia:

(
m = a L ≤ x ≤ aU ⋅ at − 1 = M )
Exempl ul 1.2: FVM = (2,24,8) este sugestiv reprezentat în figura 1.1.

exponent mantisǎ (23 de biţi)

0/1 bit de semn 0/1 bit de semn


exponent cu semn mantisǎ cu semn (24 de biţi)
(8 biţi)

Fig. 1.1 Exemplu de format binar în virgulǎ mobilǎ

Se observǎ cǎ, pentru reprezentarea numerelor negative, atât la mantisǎ, cât şi la


1. Introducere în calculul aproximativ 3

exponent, primii biţi se rezervǎ pentru a codifica semnul. Astfel încât, de fapt, t=23 şi p=7, de
unde rezultǎ U = 27 − 1 = 127 şi L = −U = 1 − 27 = −127 . Conform relaţiei (1.5) rezultǎ în
continuare cel mai mic numǎr pozitiv reprezentabil m = 2−127 şi cel mai mare numǎr
(
reprezentabil M = 2127 ⋅ 223 − 1 . )
Numǎrul de cifre al unui FVM, t, este precizia respectivei reprezentǎri în virgulǎ mobilǎ.
D e f i n i ţ i a 1 . 3 : Se numeşte precizie relativǎ (sau epsilon maşinǎ) a unui FVM şi se noteazǎ
cu ε M distanţa dintre numǎrul 1 şi urmǎtorul numǎr reprezentabil exact în
acel FVM.
Rezultǎ cǎ are loc relaţia:

(1.6) ε M = a −t +1

Precizia relativǎ este şi ea un parametru dependent de maşinǎ. O implementare robustǎ


trebuie sǎ permitǎ lucrul la precizia maşinii de calcul, cu evitarea pe cât posibil a depǎşirilor
aritmetice (în ambele sensuri) cauzate de obţinerea unor rezultate intermediare aflate înafara
domeniului de reprezentare a numerelor. Pentru realizarea compromisului între eficienţǎ şi
portabilitate (posibilitatea de a transporta programul sursǎ, cu modificǎri minime, de pe
maşina pentru care a fost scris pe o altǎ maşinǎ), o soluţie des utilizatǎ este de a obţine aceşti
parametri prin intermediul unor rutine speciale (ca, de pildǎ, în [VARG 97]).
Eroarea relativǎ de reprezentare (definitǎ în (1.1)) se referǎ simplu ca eroare de
reprezentare şi verificǎ relaţia:

(1.7) ε ≡ ε r ≤ µ ⋅ a −t ,
unde µ este un parametru de ordinul unitǎţii. Eroarea maximǎ de reprezentare este
ε max = a −t şi serveşte pentru calcularea numǎrului de zecimale semnificative (exacte), tzec,
ale unui numǎr în baza 10 reprezentat în respectivul FVM, conform cu urmǎtoarea relaţie:
(1.8) t zec =  log10 (ε max )  =  −t ⋅ log10 (a )  ,

unde [⋅] semnificǎ partea întreagǎ.


Dublarea preciziei semnificǎ generic creşterea (în particular dublarea) numǎrului de cifre
ale mantisei (2t în loc de t). De exemplu, în standardul IEEE de reprezentare binarǎ (a=2)
cele douǎ forme sunt caracterizate de:
• simpla precizie: t=24 de cifre, ceea ce înseamnǎ ε max = 2−24 , adicǎ o reprezentare

cu t zec =  log10 2−24  =  −24 ⋅ log10 (2)  =  −7.22...  = 7 zecimale exacte;


( )
 
• dubla precizie: t=53 de cifre, ceea ce înseamnǎ ε max = 2−53 , adicǎ o reprezentare cu
t zec =  log10 2−53  =  −15.95...  = 15 zecimale exacte.
( )
 

1.1.2 Operaţii cu numere în virgulǎ mobilǎ. Propagarea erorilor


Operaţiile aritmetice de bazǎ – adunarea, scǎderea, înmulţirea şi împǎrţirea – sunt
4 Metode numerice utilizate în analiza sistemelor – aplicaţii

influenţate în mod diferit de aproximarea introdusǎ prin reprezentarea în FVM.


La o operaţie de adunare sau de scǎdere în virgulǎ mobilǎ se obţine un numǎr de
zecimale nenule dupǎ virgulǎ dependent de mǎrimea operanzilor, şi anume de mǎrimea
exponenţilor; aceasta înseamnǎ cǎ eroarea de reprezentare a rezultatului depinde de mǎrimea
exponenţilor. La operaţiile de înmulţire şi de împǎrţire eroarea de reprezentare este datǎ de
mǎrimea mantisei, respectiv de parametrul t al FVM.
Într-o aritmeticǎ cu t cifre în virgulǎ mobilǎ operaţiile aritmetice de bazǎ îşi pierd
proprietǎţile obişnuite de asociativitate, comutativitate şi distributivitate. Rezolvarea unei
probleme într-o astfel de aritmeticǎ determinǎ, în principiu, un ansamblu de algoritmi
neechivalenţi (care nu furnizeazǎ acelaşi rezultat).

1.1.3 Calculul aproximativ (cu toleranţǎ)


Se pune problema care este limita maximǎ de încredere pentru rezultatele obţinute în
cazul propagǎrii erorilor. S-a arǎtat cǎ aritmetica cu t cifre introduce o eroare relativǎ de
reprezentare de forma (1.7); în general, pentru orice nivel de eroare impus ca maxim se poate
defini o aritmeticǎ aproximativǎ.
D e f i n i ţ i a 1 . 4 : Se numeşte aritmeticǎ aproximativǎ (cu toleranţa ε ) acea aritmeticǎ în care
eroarea relativǎ de reprezentare este cel mult ε .
Într-o aritmeticǎ aproximativǎ numǎrul de operaţii al unei metode numerice de rezolvare
nu poate constitui un indicator adecvat în a estima eroarea generalǎ; acest lucru este ilustrat
de exemplul urmǎtor.

Exempl ul 1.3: Fie funcţia f :  − a 2 ; +∞  → , f ( x) = a 2 + x − a − x .


 
În vederea reprezentǎrii ei grafice, se calculeazǎ în trei moduri diferite valorile acestei
funcţii în puncte echidistanţate cu pasul 10−7 din intervalul  2 ⋅10−14 ;7 ⋅10−5  (rezultǎ astfel
 
700 de puncte). Celor trei şiruri de rezultate, fiecare de câte 700 de valori, li se calculeazǎ
dispersia cu relaţia:.
n 2
∑ ( f k ( xi ) − mk )
d k = i =1 , k = 1, 2,3 ,
n −1
unde n=700 şi mk sunt mediile aritmetice ale respectivelor şiruri. Se comparǎ apoi cele trei
dispersii. Astfel, într-o aritmeticǎ cu 15 zecimale exacte (deci de tip dublǎ precizie):

• pentru f1 ( x) =  a 2 + x − a  − x se obţine dispersia 1.815644080932704 ⋅10-10 ;


 

• pentru f 2 ( x) =  a 2 + x − x  − a dispersia este 1.815644080932753 ⋅10-10 ;


 
2
a2 + x − ( a + x ) x − x 2 − 2ax x ⋅ (1 − 2a − x )
• pentru f3 ( x ) = = = rezultǎ
2 2 2
a +x +a+x a +x +a+x a + x +a+x
dispersia 1.815644080932650 ⋅10-10 .
Diferenţele în valoare absolutǎ între oricare douǎ dintre dispersiile de mai sus sunt de
1. Introducere în calculul aproximativ 5

ordinul 10−24 , ceea ce se poate considera suficient pentru marea majoritate a aplicaţiilor.
Totuşi, exemplul de mai sus aratǎ cǎ simplitatea metodei de calcul (numǎrul mic de operaţii)
nu este o garanţie a unui rezultat bun în sensul acurateţii (în cazul de faţǎ, dispersia minimǎ se
obţine prin metoda de calcul cea mai complicatǎ).
D e f i n i ţ i a 1 . 5 : [DEMI 89] Se spune cǎ o aproximaţie pozitivǎ a unui numǎr x are p
zecimale exacte:
• în sens restrâns, dacǎ eroarea sa relativǎ este mai micǎ decât jumǎtate din unitatea
aferentǎ ultimei zecimale:
1
(1.9) ε rx ≤ ⋅10− p ;
2
• în sens larg, dacǎ eroarea sa absolutǎ este mai micǎ decât unitatea aferentǎ ultimei
zecimale:

(1.10) εax ≤ 10− p

În mod obişnuit, când se evalueazǎ o expresie cu numere aproximative (de exemplu,


rezultate în urma unor mǎsurǎri afectate de o eroare maximǎ datǎ) se considerǎ implicit cǎ
toate zecimalele acestora sunt corecte în sens restrâns (dacǎ nu se precizeazǎ altfel).
Tabelul de mai jos rezumǎ relaţiile respectate de erorile rezultatelor la principalele
operaţii aritmetice cu numere aproximative.
Operaţii cu numere aproximative Eroarea
sumarea algebricǎ
n adunarea
absolutǎ:
n i =1, n i
{ }
relativǎ: min ε rx ≤ ε r ≤ max ε rx
i =1, n i
{ }
( ∑ xi ) εa = ∑ εax
i =1 scǎderea i=1 i relativǎ: nu respectǎ o regulǎ
n n
înmulţirea ( ∏ xi ) relativǎ: εr = ∑ εrx
i
i =1 i=1
împǎrţirea (x/y) relativǎ: ε r = ε rx + ε ry

ridicarea la putere (xm) relativǎ: εr = m ⋅ εrx


1
extragerea rǎdǎcinilor ( m x ) relativǎ: ε r = ⋅ ε rx
m
Tabel 1.1 Erorile principalelor operaţii aritmetice cu numere aproximative
Într-o operaţie de adunare cu numere rotunjite (astfel încât toate zecimalele lor sunt
exacte), pentru a obţine în rezultat numai zecimale corecte, este necesar ca toţi termenii sǎ fie
scrişi cu atâtea zecimale câte are termenul cu cele mai puţine zecimale. Apoi calculul se face
reţinând pentru fiecare termen câte o zecimalǎ de rezervǎ. Rezultatul se rotunjeşte cu o
zecimalǎ.

Exempl ul 1.4: 12.31+401.23+5.4=12.3(1)+401.2(3)+5.4=418.9.


Eroarea relativǎ la scǎdere nu se încadreazǎ în anumite limite dependente de erorile
termenilor; acest lucru este în mod special defavorabil când se scad numere aproximative
apropiate (eroarea relativǎ a rezultatului poate deveni importantǎ). Se recomandǎ în acest caz
transformarea expresiei respective pentru a evita scǎderea lor directǎ.
6 Metode numerice utilizate în analiza sistemelor – aplicaţii

Exempl ul 1.5: Operaţia 2.127-2.122 dǎ rezultatul 0.005; eroarea absolutǎ a termenilor


este 0.001 , deci eroarea relativǎ a rezultatului se poate calcula ca:
0.001 + 0.001
εr = = 0.4 ,
0.005
ceea ce aratǎ cǎ nici mǎcar prima zecimalǎ nu este corectǎ în sens restrâns (definiţia 1.5).
În cazul înmulţirii, în rezultat se reţine acel numǎr de zecimale corecte indicat de calculul
erorii relative.

Exempl ul 1.6: 3.45⋅21.3=73.485


Presupunând cǎ toate zecimalele termenilor sunt exacte, atunci eroarea relativǎ a
produsului lor este:
εr = 1 2 ⋅ 0.001 + 1 2 ⋅ 0.01 ≈ 0.005 ,
ceea ce aratǎ cǎ rezultatul va avea douǎ zecimale exacte: 73.48.

C a l c u l u l e r or i l o r ex p r e s i i l o r d e n um er e a p r o xi m at i ve
Dacǎ ε ax sunt respectiv erorile absolute ale numerelor aproximative xi , i=1,2,...n,
i
atunci eroarea absolutǎ a expresiei S = f ( x1, x2 ,...xn ) poate fi evaluatǎ conform expresiei:
n ∂f
(1.11) ε aS = ∑ ⋅ ε ax
i =1 ∂xi i

ε aS n ∂f ε ax
Pentru eroarea relativǎ rezultǎ succesiv ε rS = =∑ ⋅ i
, ceea ce se rescrie ca:
S i =1 ∂xi f

n ∂ ln( f )
(1.12) ε rS = ∑ ⋅ ε ax
i =1 ∂xi i

Exempl ul 1.7: Sǎ se evalueze expresia S = ln(sin(0.4) + 10.5) , ştiind cǎ numerele


aproximative 0.4 şi 10.5 au prima zecimalǎ corectǎ.
Se calculeazǎ întâi eroarea absolutǎ a expresiei în forma generalǎ S = ln(sin( x) + y ) ,
folosind formula (1.11). Rezultǎ:
1
ε aS =
sin( x) + y
(
⋅ ε ax ⋅ cos( x) + ε a y )
În expresia de mai sus x=0.4, y=10.5, ε ax = ε a y = 0.01 , sin(x)=0.389… se poate lua 0.4,
iar cos(x)=0.92… se poate lua 0.9 (deoarece erorile absolute la aplicarea funcţiilor sinus şi
cosinus sunt mai mici decât cele ale argumentului lor, în virtutea relaţiei (1.11) şi a faptului
cǎ iau valori de modul subunitar). Deci:
1 0.019 19
ε aS = ⋅ ( 0.01 ⋅ 0.9 + 0.01) = = ≈ 0.002
0.4 + 10.5 10.9 10900
Ca atare, în calculul lui S se poate conta pe douǎ zecimale exacte. Calculul cu o zecimalǎ
de rezervǎ conduce, deci, la:
S = ln(0.4 + 10.5) = 2.388... ≈ 2.39
1. Introducere în calculul aproximativ 7

C a l c u l u l e r or i l o r a d m i si b i l e al e n um e r e l or a pr o x i m a t i ve când se
d o r e ş t e o a n u m e er o a r e m a x i m ǎ a u ne i e x p r e si i a l o r
Formulele (1.11) şi (1.12) pot servi la demersul invers, şi anume: dându-se cǎ eroarea
absolutǎ sau cea relativǎ a unei expresii de numere aproximative trebuie sǎ fie sub un anumit
∂f ∂f ε axi
nivel şi considerându-se cantitǎţile ⋅ ε a x sau, respectiv, ⋅ ca fiind egale
∂xi i ∂xi f
(principiul efectelor egale), atunci se pot calcula erorile absolute admisibile, ε ax , ale
i
numerelor aproximative xi , i=1,2,...n. Uneori, aplicarea acestui principiu poate conduce la
cerinţe care nu pot fi practic îndeplinite; de aceea se recomandǎ o redistribuire rezonabilǎ a
erorilor (dacǎ este posibil), pǎstrând eroarea totalǎ sub limita impusǎ.
În cele ce urmeazǎ, termenul de „acurateţe” va fi utilizat pentru a desemna eroarea
absolutǎ sau pe cea relativǎ, în funcţie de context (în alte contexte se utilizeazǎ, oarecum
abuziv, şi termenul de „precizie” cu acelaşi înţeles).

Exempl ul 1.8: [DEMI 89] Fie un cilindru circular drept de razǎ R.


Volumul unui segment cilindric – obţinut prin secţionarea cilindrului cu un plan care
trece prin diametrul bazei şi este înclinat la unghiul α faţǎ de planul bazei – se calculeazǎ cu
2
formula V = ⋅ R3 ⋅ tg(α) . Cu ce acurateţe trebuie mǎsuratǎ raza R ≈ 60 cm şi unghiul α
3
astfel încât volumul segmentului cilindric sǎ rezulte cu o eroare relativǎ de maxim 1%?
Se noteazǎ cu ∆V, ∆R şi ∆α erorile absolute ale cantitǎţilor V, R şi α. Pentru eroarea
relativǎ de calcul al volumului V se foloseşte relaţia (1.12) care, dupǎ calculul derivatelor
∂V ∂V
parţiale şi , conduce succesiv la:
∂R ∂α

∆V 2 R 2 tg(α) ⋅ ∆R 2 R3 ⋅ ∆α 3∆R 2∆α


ε rV = = + = +
V V 3V cos 2 (α) R sin(2α)

Se doreşte ca ε rV ≤ 0.01 . Aplicând principiul efectelor egale, rezultǎ cǎ se doreşte ca


3∆R 2∆α R 60 cm
≤ 0.005 şi ca ≤ 0.005 . De unde rezultǎ respectiv cǎ ∆R ≤ ≈ = 1 mm
R sin(2α) 600 600
sin(2α) 1
şi cǎ ∆α ≤ ≤ radiani ≈ 9' .
400 400
Deci, pentru a obţine o eroare relativǎ în calculul volumului segmentului cilindric de
maxim 1% este suficient sǎ se mǎsoare raza acestuia cu o acurateţe de 1 mm şi unghiul de
înclinare cu o acurateţe de 9’.

1.1.4 Exerciţii propuse


1. Sǎ se calculeze erorile absolute şi relative ale urmǎtoarelor numere aproximative, ale
cǎror zecimale sunt exacte în sens restrâns: a) 3.45; b) 12.6; c) 3.14.
2. Sǎ se determine numǎrul de zecimale corecte (în sens restrâns) şi sǎ se scrie numerele
aproximative: a) 154.23 pentru o acurateţe de 1%; b) 2.5618 pentru o acurateţe de 1%; c)
15.7 pentru o acurateţe de 3%.
8 Metode numerice utilizate în analiza sistemelor – aplicaţii

3. Catetele unui triunghi dreptunghic sunt 5.10 cm şi 16.28 cm (mǎsurate cu o acurateţe


de 0.1 mm). Sǎ se calculeze tangenta unghiului opus primei catete.
4. Ipotenuza unui triunghi dreptunghic este 12.3 cm ± 1 mm, iar una dintre catete este
5.7 cm ± 1 mm. Cu ce acurateţe se pot determina cea de a doua catetǎ şi unghiul alǎturat ei?
Sǎ se calculeze aceste valori.
5. Sǎ se calculeze densitatea aluminiului dacǎ un cilindru de aluminiu de diametru 3 cm
şi înǎlţime 7 cm cântǎreşte 133.7 g. Eroarea relativǎ de mǎsurare a lungimilor este 0.01, iar
cea de cântǎrire este 0.001.

l
6. Perioada de oscilaţie a unui pendul de lungime l este T = 2π ⋅ , unde g este
g
acceleraţia gravitaţionalǎ. Cu ce acurateţe trebuie mǎsuratǎ lungimea pendulului, a cǎrui
perioadǎ este apropiatǎ de 2 secunde, pentru a obţine o eroare relativǎ de 0.5% în mǎsurarea
perioadei? Cât de exact trebuie luate numerele π şi g?

1.2 Condiţionare şi stabilitate numericǎ

1.2.1 Justificare
Rǎspunsul la întrebarea câtǎ încredere trebuie acordatǎ rezultatului unei metode
numerice presupune definirea a douǎ noţiuni fundamentale ale calculului aproximativ, şi
anume condiţionarea – care se referǎ la problema de rezolvat – şi stabilitatea numericǎ,
referitoare la algoritmul elaborat sǎ o rezolve. Urmǎtorul exemplu sugereazǎ necesitatea
introducerii acestor douǎ noţiuni.

 −49 24
Exempl ul 1.9: Fie matricea A =  .
 −64 31
Se efectueazǎ calculul exponenţialei matriciale, e A , într-o aritmeticǎ cu 15 zecimale
exacte prin douǎ metode: una bazatǎ pe aproximarea exponenţialei prin dezvoltare în serie
Ak30
Taylor cu 30 de termeni, e A ≅ ∑ , cealaltǎ bazatǎ pe un rezultat fundamental al
k =0 k !
calculului matricial, şi anume descompunerea în valori singulare (pentru o tratare pe larg a
acestei probleme se poate consulta [JORA 96]). Cele douǎ rezultate diferǎ catastrofal de mult;
ele sunt respectiv:
 3.30615125695573 ⋅104 -1.65305723450579 ⋅104 
eA =  
 4.40815262534833 ⋅104 -2.20403952473011 ⋅104 
 -0.73575875814467 0.55181909965803
eA =  
 -1.47151759908809 1.10363824071544 
Se observǎ cǎ termenii Ak devin foarte mari înainte ca factorialul sǎ devinǎ dominant,
iar acest fenomen nu poate fi corect tratat într-o aritmeticǎ aproximativǎ, deoarece se pot
depǎşi limitele domeniului de reprezentare. Rezultatul corect este cel de-al doilea.
1. Introducere în calculul aproximativ 9

1.2.2 Condiţionarea problemelor de calcul


Analiza condiţionǎrii unei probleme este un proces matematic complex, legat de teoria
perturbaţiilor. În mod informal, se spune cǎ o problemǎ este bine condiţionatǎ (bine
formulatǎ) dacǎ, oricare ar fi datele problemei, mici variaţii ale acestora induc doar mici
variaţii în soluţie. În caz contrar, se spune cǎ problema este rǎu (prost) condiţionatǎ.
Fie X ⊆ n şi Y ⊆ m douǎ spaţii vectoriale, f : X → Y o problemǎ, x ∈ X şi x$ ∈ X
o aproximaţie a lui x. Problema este bine condiţionatǎ în x dacǎ f ( x$ ) este „aproape” de
f ( x) ; o reprezentare sugestivǎ este datǎ în figura 1.2.
O exprimare mai formalǎ a noţiunii de „aproape” necesitǎ folosirea notaţiei ⋅ X pentru
norma euclidianǎ în spaţiul vectorial X. Se poate astfel introduce noţiunea de „numǎr de
condiţionare”.
f
$x
f ( $x )

x f(x)
f
X Y

Fig. 1.2 Imaginea unui numǎr şi a unei aproximaţii a lui prin problema f
D e f i n i ţ i a 1 . 6 : Se numeşte numǎr de condiţionare al unei probleme f:

 f ( x$ ) − f ( x) 
(1.13) cond( f ) sup  Y 
 $ 
 x−x 
 X 
D e f i n i ţ i a 1 . 7 : Se spune cǎ problema f este bine condiţionatǎ dacǎ numǎrul ei de
condiţionare este mic (comparabil cu cel mai mic numǎr reprezentabil pe t
cifre semnificative) şi prost condiţionatǎ în caz contrar (mult mai mare
decât cel mai mic numǎr reprezentabil cu t cifre semnificative).
Condiţionarea unei probleme caracterizeazǎ sensibilitatea soluţiei în raport cu
perturbaţiile datelor de intrare; definiţia condiţionǎrii se poate da şi în raport cu noţiunea de
„amplificare a erorii relative”, prin care se exprimǎ sensibilitatea localǎ a problemei într-un
punct fixat al domeniului de definiţie.
D e f i n i ţ i a 1 . 8 : Se numeşte amplificare a erorii relative introduse de soluţia unei probleme
f în punctul x:

f ( x) − f ( x$ ) x X
(1.14) K ( x) Y ⋅
f ( x) Y x − x$
X

D e f i n i ţ i a 1 . 9 : Se spune cǎ problema f este bine condiţionatǎ dacǎ, pentru orice x ∈ X ,


amplificarea erorii relative în punctul x, K(x), este un numǎr mic (de ordinul
unitǎţii) şi prost condiţionatǎ în caz contrar.
O largǎ varietate de probleme numerice a fost studiatǎ sub aspectul condiţionǎrii,
obţinându-se numere de condiţionare calculabile sau estimabile. Ca exemple din algebra
10 Metode numerice utilizate în analiza sistemelor – aplicaţii

liniarǎ, problema determinǎrii rangului unei matrice este prost condiţionatǎ, în timp ce
problema rezolvǎrii unui sistem liniar este bine condiţionatǎ. Din pǎcate, nu este cazul şi
pentru majoritatea problemelor de bazǎ ale teoriei sistemelor, astfel încât, chiar dacǎ existǎ
algoritmi eficienţi de rezolvare, acurateţea soluţiilor calculate nu se poate evalua.

Exempl ul 1.10: Fie o matrice cu elemente reale, A ∈ m×n .


Numǎrul ei de condiţionare se defineşte cu referire la descompunerea dupǎ valorile
singulare, conform cǎreia existǎ şi sunt unice matricele ortogonale U ∈ m×m şi V ∈ n× n
astfel încât:
σ1 
 σ2 
 
 ... 0 
  T
A =U ⋅ σr  ⋅V ,
 0 
 
 0 ... 
 0 
1444442444443
Σ∈ m×n
unde σi > 0, i = 1, 2,...r = rang( A) ≤ min(m, n) se numesc valorile singulare ale matricei A. Se
noteazǎ σmin şi σmax cea mai micǎ, respectiv cea mai mare dintre acestea. Raportul:
σmax
(1.15) cond( A)
σmin
se numeşte numǎrul de condiţionare al matricei A şi reprezintǎ un „indicator de performanţǎ”
pentru operaţiile cu matrice (de exemplu, cu cât numerele de condiţionare a douǎ matrice sunt
mai mari, cu atât rezultatul înmulţirii lor va fi mai afectat de erori).
Revenind la matricea consideratǎ în exemplul 1.9, aceasta are setul de valori singulare
{89.63238269576702, 0.18966359577545}, deci numǎrul ei de condiţionare este
4.725861192776684 ⋅102 , ceea ce aratǎ cǎ matricea este prost condiţionatǎ şi explicǎ
rezultatul obţinut la calculul exponenţialei ei.

1.2.3 Stabilitatea numericǎ a algoritmilor


În mod informal se considerǎ cǎ un algoritm este numeric stabil dacǎ el nu mǎreşte
sensibilitatea inerentǎ a problemei în raport cu datele, adicǎ nu înrǎutǎţeşte condiţionarea
problemei; în caz contrar, algoritmul este numeric instabil. Aceasta înseamnǎ cǎ un algoritm
numeric stabil oferǎ un rezultat care este (apropiat de) soluţia exactǎ a unei mici perturbaţii a
problemei iniţiale. Soluţia unei probleme bine condiţionate printr-un algoritm numeric stabil
este apropiatǎ de soluţia exactǎ. Pentru mulţi algoritmi de interes, stabilitatea numericǎ poate
fi demonstratǎ matematic, dar acest demers este, în general, destul de dificil.
Fie f : X → Y o problemǎ, f : X → Y un algoritm de rezolvare a ei într-o aritmeticǎ
aproximativǎ şi x ∈ X . Algoritmul f este numeric stabil dacǎ existǎ o aproximaţie a lui x,
x$ ∈ X , aşa încât f ( x) sǎ fie „aproape” de f ( x$ ) ; o reprezentare intutivǎ se aflǎ în figura 1.3.
1. Introducere în calculul aproximativ 11

f
$x
f ( $x )
x $f ( x )
$f
X Y

Fig. 1.3 Imaginea unui numǎr prin problema f şi a unei aproximaţii a lui prin algoritmul de
rezolvare, f

Definiţia 1.10: f este un algoritm numeric stabil de rezolvare a problemei f dacǎ pentru
orice x ∈ X şi orice ε > 0 (oricât de mic), cu δ( x) > 0 mic, existǎ x$ ∈ X
o aproximaţie a lui x, astfel încât dacǎ x − x$ ≤ δ( x) sǎ rezulte
X
f ( x) − f ( x$ ) ≤ ε.
Y
De remarcat este deosebirea dintre noţiunile de „precizie” – proprietate intrinsecǎ a FVM
utilizat – şi de „acurateţe”, care mǎsoarǎ eroarea dintre rezultatul numeric şi cel exact.
Sunt utile câteva observaţii asupra diferitelor cuplaje dintre probleme bine/prost
condiţionate şi algoritmi numeric stabili/instabili. Evident, situaţia de dorit este ca un
algoritm numeric stabil sǎ rezolve o problemǎ bine condiţionatǎ. Erorile de reprezentare pot
face ca un algoritm numeric instabil sǎ furnizeze rezultate dezastruoase, chiar pentru
probleme bine condiţionate. De asemeni, dacǎ problema este prost condiţionatǎ, chiar cu un
algoritm numeric stabil rezultatele pot fi foarte diferite de cele exacte.
Pe lângǎ stabilitatea numericǎ, alte criterii prin care se apreciazǎ calitatea algoritmilor
numerici sunt: numǎrul de operaţii, memoria ocupatǎ şi siguranţa în funcţionare.
Se numeşte flop (engl. floating point operation) o operaţie aritmeticǎ elementarǎ
(adunare/scǎdere/înmulţire/împǎrţire). Este de dorit ca numǎrul de astfel de operaţii cerut de
execuţia unui algoritm în cel mai nefavorabil caz sǎ fie cât mai mic. Acest numǎr se poate de
regulǎ majora cu o funcţie de dimensiunea problemei (a datelor de intrare). Un algoritm este
acceptabil numai dacǎ se gǎseşte o funcţie polinomialǎ în dimensiunea problemei drept
majorant al numǎrului de operaţii, ceea ce se scrie nrop ≤ O(nk ) .
De asemeni, se doreşte ca algoritmii sǎ fie economici şi din punctul de vedere al
memoriei ocupate. De aceea, o tendinţǎ este de a dezvolta algoritmi in situ (pe loc), care sǎ
furnizeze rezultatele pe cât posibil în aceleaşi locaţii de memorie ca şi datele de intrare.
Calculul matricial abundǎ în exemple în acest sens: triangularizǎri matriciale, calculul de
inverse matriciale, etc.
Siguranţa în funcţionare a unui algoritm este capacitatea acestuia de a semnala situaţiile
în care rezultatul poate fi afectat de erori importante datoritǎ relei condiţionǎri a problemei.

1.3 Mediul integrat Matlab & Simulink ca instrument de programare a


metodelor numerice

Ca mediu de implementare a aplicaţiilor prezentate în această lucrare s-a ales mediul


12 Metode numerice utilizate în analiza sistemelor – aplicaţii

integrat Matlab & Simulink, care permite rularea de programe scrise de utilizator. Acesta
oferă şi posibilitatea comparării rezultatelor implementării de către utilizator a diferitelor
metode numerice cu cele ale algoritmilor performanţi implementaţi în biblioteca mediului.

1.3.1 Descriere generalǎ


Diferitele versiuni de medii integrate de tip Matlab & Simulink furnizează facilităţi de
utilizare a unei biblioteci de programe (funcţii) prin intermediul unui interpretor de
instrucţiuni (comenzi). Biblioteca de programe este destinată rezolvării problemelor din teoria
sistemelor cu aplicabilitate în ştiinţele inginereşti, în special în cele din ingineria electrică
(automatică, electronică, electrotehnică, maşini şi acţionări electrice, etc.) Această bibliotecă
include şi o parte destinată aplicaţiilor grafice.
Codul sursă al programelor Matlab – secvenţe de instrucţiuni – este interpretat şi
transformat în cod executabil. În versiunile recente, mediul dispune de un editor care permite
modificarea programelor deja existente şi scrierea de programe noi. Acestea trebuie salvate
sub formă de fişiere cu extensia *.m (“m-file”), putând fi editate cu ajutorul oricărui editor.
Programele Matlab sunt de două categorii: funcţii – care primesc un set de „argumente” de
intrare şi returnează un set de argumente de ieşire – şi aşa numitele programe „script”.
Lansarea mediului integrat Matlab are ca efect intrarea în mod comandă (deschiderea
unei ferestre grafice de comandă la versiunile sub Windows), semnalată prin afişarea
prompterului „>>”, care permite executarea unei comenzi Matlab sau a unui bloc de comenzi
(terminate cu „Enter”). Un program Matlab – conţinut într-un m-file – se pune în execuţie
prin tastarea numelui lui în fereastra de comandă.
Mediul dispune de un limbaj de programare structurată, foarte asemănător cu limbajele
larg utilizate de acest fel, ce implementează structurile de comandă cunoscute (structura de
decizie, structurile de ciclare, etc.). Acest limbaj este orientat cu predilecţie spre manipularea
masivelor de date – vectori şi matrice – fiind astfel foarte bine adaptat aplicaţiilor de calcul
matricial.

1.3.2 Structura bibliotecii de programe


Instalarea versiunilor MATLAB sub Windows are ca efect crearea structurii de
directoare din figura 1.4.
Dintre aceste directoare s-a detaliat structura celui numit „matlab”, care conţine funcţii
cu destinaţie generală, şi anume:
• color – funcţii de control al culorilor;
• datafun – funcţii de analiză a datelor şi de transformată Fourier;
• demos – programe demonstrative şi exemple;
• elfun – funcţii matematice elementare;
• elmat – funcţii de manipulare a matricilor şi de generare a matricilor elementare;
• funfun – funcţii cu referire la programe MATLAB de tip funcţie ce
implementează metode numerice neliniare;
• general – comenzi de ordin general;
• graphics – funcţii grafice de ordin general;
• iofun – funcţii de accesare a fişierelor la nivelul de bază;
1. Introducere în calculul aproximativ 13

• lang – funcţii de implementare şi de depanare a structurilor de control ale


limbajului MATLAB;
• matfun – funcţii cu argument matrice din algebra liniară;
• ops – operatori şi caractere speciale;
• plotxy – funcţii pentru trasarea de grafice bidimensionale;
• plotxyz – funcţii pentru trasarea de grafice tridimensionale;
• polyfun – funcţii polinomiale şi de interpolare;
• sounds – funcţii de procesare a sunetului;
• sparfun – funcţii dedicate matricilor rare;
• specfun – funcţii matematice specializate;
• specmat – matrice specializate;
• strfun – funcţii de manipulare a şirurilor de caractere.
c:\matlab
― bin - color
― extern - datafun
― include - demos
― lib - elfun
― src - elmat
― ghostscr - funfun
― bin - general
― fonts - graphics
― ps_files - iofun
― toolbox - lang
― control - matfun
― fuzzy - ops
― ident - plotxy
― matlab - plotxyz
― ncd - polyfun
― neural - sounds
― robust - sparfun
― sefuzzy - specfun
― signal - specmat
― simulink - strfun
― blocks
― simdemos
― simulink
Fig. 1.4 Structura de directoare Matlab (în versiunile 4.x)

Fiecare din subdirectoarele de sub directorul „toolbox” grupează funcţii dedicate unui
anume tip de aplicaţii (de exemplu, „control” conţine funcţii uzuale în teoria controlului
automat, „ident” este compus din implementări ale celor mai uzuale metode folosite în
identificarea sistemelor dinamice, „signal” grupează funcţii folosite în analiza şi prelucrarea
semnalelor etc.).
O atenţie aparte o merită directorul „simulink”. Simulink este o parte a mediului Matlab,
ce oferă posibilitatea construirii în mod vizual de diagrame (scheme bloc) funcţionale, prin
interconectarea de blocuri funcţionale conţinute în biblioteca aferentă. Aceste blocuri
reprezintă modele de sisteme dinamice simple, iar schemele funcţionale obţinute prin
conectarea lor servesc la studii de simulare, efectiv realizate prin apeluri de funcţii Matlab,
transparente pentru utilizator.
14 Metode numerice utilizate în analiza sistemelor – aplicaţii

1.3.3 Operarea în mediul integrat Matlab. Limbajul de programare Matlab


Acest paragraf este dedicat detalierii specificităţii lucrului sub mediul Matlab &
Simulink, în particular scrierii de programe şi de funcţii utilizator. O observaţie generală este
că în Matlab identificatorii sunt sensibili la capitalizarea literelor (engl. case sensitive).

1.3.3.1 Variabile Matlab. Spaţiul de lucru (”workspace”). Fişiere de date Matlab


(“mat-files”)
În Matlab nu este nevoie de secţiuni declarative de variabile sau de tipuri; de aceea
pentru o variabilă spaţiul necesar se alocă în momentul iniţializării ei, iar aceasta se poate
face oriunde într-un program Matlab, înainte ca variabila să fie folosită pentru prima oară.
Sunt suportate următoarele tipuri de date simple: întreg, real şi caracter, iar dintre tipurile de
date structurate, cele indexate (masivele): vectori (tablouri cu o singură dimensiune),
matrice (tablouri cu două dimensiuni), tablouri multidimensionale (de la versiunile 5.x
inclusiv în sus) şi şiruri de caractere. De fapt, orice variabilă Matlab este tratată ca fiind de
tip indexat (scalarii sunt consideraţi ca fiind vectori de un element).
Un tip aparte îl constituie tipul complex, care există ca predefinit în Matlab, urmare a
predefinirii unităţii imaginare i ca fiind radicalul lui -1. Acest tip poate fi considerat ca fiind
structurat (şi anume având două câmpuri de tip real: partea reală şi partea imaginară), în
acelaşi timp poate fi tip de bază al unui tip indexat.
Mai jos sunt comentate câteva exemple de comenzi de iniţializare a variabilelor Matlab
(comentariile se anunţă prin scrierea caracterului „%” la fiecare început de rând). Operaţiile
aritmetice de bază sunt simbolizate în modul cunoscut (+, -, *, /).
x=1;%variabilei x îi este dată valoarea întreagă 1
y=2.34;%variabilei y îi este dată valoarea reală 2.34
z1=[-3.45 8 1.3892];%variabila z1 este un vector linie de 3 elemente reale
z2=[-45; 0.4; 1; -1];%variabila z2 este un vector coloană de 4 elemente reale
t=’o’;%variabila t conţine caracterul ’o’
u=’afj’;%variabila u conţine şirul de caractere ’afj’
cp=2.5+3*i;%variabila cp este numărul complex cu partea reală 2.5 şi partea imaginară 3
matc=[cp 2-9.23678*i; 13 9*i];%matc este o matrice cu 2 linii şi 2 coloane
%cu elemente complexe
Se observă uşurinţa cu care se iniţializează variabilele de tip vector şi matrice: şirul de
valori se scrie între paranteze pătrate, folosind spaţiul (sau virgula) ca separatori în interiorul
unei linii şi „;” între linii. Interpretarea unei comenzi de iniţializare a unei matrice implică şi
deducerea dimensiunii matricei.
Un scurt comentariu priveşte utilizarea opţională a caracterului „;” după o comandă.
Omiterea lui are un efect vizibil doar în cazul aşa-ziselor comenzi „cu ecou la ecran”, când în
acest fel se autorizează apariţia acestuia. În cazul comenzilor de atribuire de valori
variabilelor, ecoul îl constituie afişarea identificatorului (numelui) variabilei şi a valorii ei, ca
în exemplul de mai jos. Comanda:
w=10.67
are drept ecou la ecran (forma acestuia depinde de formatul de afişare, detaliat mai târziu):
w =
10.6700
în timp ce aceleiaşi comenzi, urmate de „;”, i se suprimă ecoul. Acest mecanism era util în
1. Introducere în calculul aproximativ 15

versiunile mai vechi, care nu dispuneau de debugger, pentru depanarea programelor: urmat de
comanda pause (de suspendare a execuţiei unui program până la apăsarea unei taste),
permitea vizualizarea conţinutului variabilelor de interes în fereastra de comandă în timpul
rulării programului.
În Matlab există posibilitatea de a executa comenzi de evaluare a unor expresii
aritmetico-logice fără a atribui în mod explicit rezultatul unei variabile. Aceste comenzi sunt
interpretate, totuşi, drept comenzi de atribuire, iar rezultatul evaluării se stochează într-o
variabilă predefinită (permanentă), numită ans (de la engl. answer, răspuns), care se
suprascrie ori de câte ori se execută comenzi de genul de mai sus. De exemplu, comanda:
6*(-5.89+2*45.1563-7*i)/(5*i-3.8)
(de observat că are ecou la ecran) va produce răspunsul:
ans =
-54.1287-60.1693i
Variabilele iniţializate în mod comandă sau într-un program de tip script se stochează în
spaţiul de lucru (engl. workspace), de unde pot fi accesate ulterior atât de sub fereastra de
comandă, cât şi de orice alt program script pus în execuţie. Variabilele de acest fel au, deci, în
mod implicit, statutul de variabile globale. Acest lucru nu este, însă, valabil pentru
variabilele iniţializate în interiorul unei funcţii; acestea sunt variabile locale ale funcţiei şi nu
pot fi accesate din exteriorul ei. În mod simetric, variabilele din spaţiul de lucru sau din orice
script sunt în mod implicit inaccesibile în interiorul funcţiei. O modalitate de a face ca un
script (sau spaţiul de lucru) şi o funcţie să aibă acces la o aceeaşi variabilă este folosirea
comenzii global, în ambele locuri. De exemplu, comanda:
global var1 var2 var3;
dată în mod comandă (sau scrisă într-un script) şi scrisă şi într-o funcţie anunţă că variabilele
var1, var2 şi var3 se „văd” din ambele locuri. Se observă că variabilele din listă trebuie
separate prin spaţiu (şi nu prin virgulă, care este separatorul uzual la enumerări în Matlab).
Comanda global asupra unei variabile încă neiniţializate are ca efect secundar iniţializarea
variabilei la matricea vidă (engl. empty matrix), simbolizată prin [].
Toate calculele în Matlab se fac în dublă precizie, inclusiv cele privind numerele întregi
(standardul folosit este cel IEEE, cu mantisa reprezentată pe 53 de biţi, descris în §1.1.1). Dar
afişarea rezultatelor sau, în general, vizualizarea conţinutului unei variabile numerice, se
poate face sub mai multe formate. Cel mai simplu mod de a vizualiza valoarea unei variabile
este tastarea numelui ei în fereastra de comandă, urmată de „Enter”. Funcţia format permite
setarea formatului de afişare; forma ei de apel este:
format fff
unde fff este un şir de caractere (dat fără apostrofuri) prin care se descrie formatul dorit:
short (formatul implicit), long, short e, long e, hex, +, bank, compact, loose, rat.
Următoarele exemple ajută la detalierea primelor patru astfel de formate.
Secvenţa de comenzi:
f=356825.37788;
format short;
f
are drept rezultat:
f =
3.5683e+005
16 Metode numerice utilizate în analiza sistemelor – aplicaţii

iar secvenţa:
format long;
f
produce:
f =
3.568253778800000e+005
Formatul short afişează numerele în formatul normalizat în virgulă fixă cu mantisa cu 4
zecimale, după cum se observă, iar cel long în acelaşi tip de format, dar cu 15 zecimale.
Numărul afişat înainte de caracterul „e” reprezintă mantisa, cel de după „e” este exponentul.
Se observă că afişarea cu mai puţine zecimale decât are numărul implică o rotunjire la afişare
(dar care nu există, de fapt, în memorie, dacă reprezentarea tuturor zecimalelor nu implică
depăşirea domeniului de reprezentare).
Secvenţa de comenzi:
g=8732443467873687638768736837672368.7648764387638476842784367;
format short e
g
produce:
g =
8.7324e+042
iar comenzile:
format long e
g
au ca rezultat:
g =
8.732443467873682e+042
Formatul short e afişează numerele în FVM cu 4 zecimale, iar cel long e în acelaşi
tip de format, dar cu 15 zecimale. Rotunjirea la afişare are loc şi în acest caz, pentru ambele
formate, dar de data aceasta rotunjirea are loc şi în memorie, pentru că numărul de zecimale
ale numărului este mai mare decât 15, cel al FVM în dublă precizie.
În Matlab, valoarea lui epsilon maşină (eroarea relativă la calculele în virgulă mobilă)
este stocată în variabila predefinită (permanentă) eps: 2.220446049250313 ⋅10-16 . O altă
variabilă permanentă, inf, desemnează noţiunea de „plus infinit” în standardul IEEE folosit
în Matlab; inf poate fi rezultatul unei împărţiri la 0 sau al unei depăşiri de capacitate de
reprezentare (engl. overflow).
Mediul integrat Matlab oferă posibilitatea salvării variabilelor existente în spaţiul de
lucru pe suport extern, sub formă de fişiere de date Matlab, care au extensia .mat. Pentru
aceasta se foloseşte comanda save, cu mai multe forme de apel. Prin comanda simetrică,
load, având, de asemeni, mai multe forme de apel, datele pot fi reîncărcate în spaţiul de
lucru într-o sesiune de lucru ulterioară. Cele două comenzi sunt detaliate în paragraful
următor. Formatul fişierelor .mat este disponibil, astfel încât variabilele iniţializate sub
Matlab pot fi exportate către alte aplicaţii.

1.3.3.2 Câteva comenzi uzuale


Lansarea mediului Matlab setează directorul curent la „c\matlab\bin”. Comenzile de
listare a conţinutului directorului curent, dir, şi de schimbare a directorului curent, cd, au
1. Introducere în calculul aproximativ 17

semntici identice acelora din MS-DOS. La fel pentru comanda type fis, de listare a
conţinutului fişierului cu numele fis.
Prin comanda help se obţin informaţii ajutătoare asupra organizării şi destinaţiei
generale a directoarelor, asupra comenzilor Matlab şi asupra programelor şi funcţiilor din
bibliotecă. Această comandă are forma generală help cuv_rez, unde cuv_rez este un
cuvânt rezervat în Matlab (numele unei comenzi, a unei funcţii, a unei structuri de control
etc.) Comanda se utilizează, deci, sub formele:
• help – afişează informaţii despre fiecare subdirector din structura listată în §1.3.2;
• help cmd – descrie formele şi efectul execuţiei comenzii Matlab cmd;
• help fct – descrie formele de apel ale funcţiei Matlab fct, semnificaţia
argumentelor de intrare şi de ieşire.
Formele principale de utilizare a comenzilor save şi load sunt (a se vedea textul afişat
de comenzile help save şi help load):
• save – are ca efect salvarea tuturor variabilelor din spaţiul de lucru în fişierul
denumit implicit matlab.mat, creat sub directorul curent;
• load – execută încărcarea datelor din fişierul matlab.mat (presupunând că acesta
se află în directorul curent) în spaţiul de lucru;
• save fis – produce salvarea întregului spaţiu de lucru în fişierul fis.mat, creat
sub directorul curent (dacă acesta exista deja, atunci conţinutul lui se suprascrie);
• load fis – are ca efect încărcarea fişierului fis.mat (presupunând că acesta se
află în directorul curent) în spaţiul de lucru;
• save fis var1 var2 – generează o salvare selectivă, anume salvarea numai a
variabilelor var1 şi var2 (presupunând că acestea existau anterior în spaţiul de lucru) în
fişierul cu numele fis.mat, creat sub directorul curent (dacă acesta exista deja, atunci
conţinutul lui se suprascrie).
Alte comenzi care privesc variabilele din spaţiul de lucru sunt who şi clear. Comanda
who „interoghează” spaţiul de lucru, furnizând drept „răspuns” lista variabilelor existente în
acesta (fără valorile aferente). Comanda clear are două forme:
• clear (sau clear all) – şterge toate variabilele din spaţiul de lucru (lista
generată ulterior de comanda who va fi vidă);
• clear a b c – produce o ştergere selectivă, anume ştegerea numai a variabilelor
a, b şi c din spaţiul de lucru (presupunând că acestea existau anterior în spaţiul de lucru).
Comanda clc are ca efect „curăţarea” ferestrei de comandă (avansarea prompterului
„>>” în capul paginii). Părăsirea mediului Matlab se poate face cu comenzile quit sau exit.

1.3.3.3 Operatori logici şi relaţionali


În Matlab, valorile de 1 şi 0 pot fi interpretate diferit în funcţie de context. Astfel, ele
sunt văzute ca variabile binare (cu valorile adevărat, respectiv fals) în expresiile logice (care
conţin operatori sau/şi funcţii logice) şi ca numere reale în expresiile aritmetice. Există trei
operatori logici, respectând regulile de prioritate cunoscute:
• operatorul unar de negare (NOT): ~;
• operatorul binar de conjuncţie logică (AND): &;
• operatorul binar de disjuncţie logică (OR): |.
18 Metode numerice utilizate în analiza sistemelor – aplicaţii

De exemplu, cu iniţializările:
p=0;q=1;r=0;
comanda:
~p & (q | r)
va avea următorul ecou la ecran:
ans =
1
O observaţie foarte importantă este că valoarea 0 a unui operand este interpretată ca 0
logic, de unde rezultă prin negare că valoarea de 1 logic este atribuită oricărei valori (reale
sau complexe) al cărei modul este diferit de 0.
Dacă operanzii sunt masive (vectori sau matrici), atunci trebuie să aibă aceleaşi
dimensiuni pentru a putea fi legaţi prin operatori logici. În cazul acesta, operatorii se aplică
între elementele de pe aceeaşi poziţie, rezultând un masiv cu aceleaşi dimensiuni. De
exemplu, pentru:
vect1=[1 0 0.7];
vect2=[0 1.4 0.4];
vect1 & vect2
rezultă:
ans =
0 0 1
Operaţia logică de disjuncţie exclusivă (diferenţă simetrică) (XOR) se poate realiza cu
funcţia Matlab xor de două argumente.
Cât priveşte operatorii relaţionali, majoritatea acestora sunt aceiaşi ca în limbajele de
programare structurată (mai precis, ca în limbajul C, excepţie făcând operatorul de
necoincidenţă, care este în Matlab „~=”). Operatorii relaţionali se comportă la fel ca şi cei
logici dacă sunt aplicaţi variabilelor indexate. Mai jos se exemplifică folosirea acestor
operatori.
car1=’a’;car2=’g’;sir=’123’;
p1=( ( (car1==’c’) & (car2<=’z’) ) | (str2num(sir)~=100) );
În secvenţa de mai sus variabilei p1 i se atribuie rezultatul evaluării unei expresii logice
conţinând operatori relaţionali (funcţia Matlab str2num realizează conversia unui şir de
caractere într-un număr, generând eroare dacă aceasta nu este posibilă). Expresia respectivă
semnifică testarea unei condiţii; rezultatul, 1 sau 0, exprimă îndeplinirea sau neîndeplinirea
respectivei condiţii. În cazul nostru, p1 este 1.
Operatorii relaţionali suportă şi operanzi de tip complex, caz în care se pun în relaţie
părţile lor reale.

1.3.3.4 Funcţii matematice elementare


Aproape toate funcţiile matematice elementare implementate în Matlab suportă ca
argumente variabile de tip complex (excepţie fac funcţiile de tip „parte întreagă”, de
conversie a numerelor reale în numere întregi). Mai jos sunt listate aceste funcţii şi câteva
exemple:
• valoarea absolută (modulul): abs (cu semnificaţia cunoscută pentru numere
complexe);
• radicalul: sqrt;
1. Introducere în calculul aproximativ 19

• funcţiile exponenţială şi logaritmice: exp, log (logaritmul natural), log10


(logaritmul zecimal);
• funcţiile trigonometrice directe (argumentul se evaluează în radiani): sin, cos, tan;
• funcţiile trigonometrice inverse: asin, acos, atan;
• funcţia semn: sign; pentru numere complexe, această funcţie returnează rezultatul
împărţirii numărului complex la modulul lui;
• funcţiile hiperbolice: sinh, cosh, tanh;
• funcţiile de conversie a numerelor reale în numere întregi; pentru exemplificarea
comparativă a acestor funcţii se consideră o secvenţă de iniţializări:
a=2.45;b=-3.8;c=1.5;d=-5.5;
iar rezultatele aplicării celor patru funcţii de conversie asupra fiecăreia dintre cele patru
variabile de mai sus sunt date în tabelul 1.2.
• funcţii dedicate numerelor complexe (cu rezultate de tip real): real, imag, conj.
Ridicarea la putere este implementată în Matlab prin operatorul binar „^”; de exemplu,
prin comanda:
s=2.4^pi
se atribuie variabilei s valoarea 2.4π , unde numărul π este predefinit în Matlab ca pi.
Funcţia Descriere a=2.45 b=-3.8 c=1.5 d=-5.5
fix rotunjirea către 0 2 -3 1 -5
round rotunjirea la cel mai apropiat întreg 2 -4 2 -6
ceil rotunjirea către +∞ 3 -3 2 -5
floor rotunjirea către −∞ 2 -4 1 -6
Tabel 1.2 Exemplificarea comparativă a funcţiilor Matlab de tip „parte întreagă”

Toate funcţiile elementare pot primi argument de intrare de tip vector sau matrice, iar
rezultatul returnat este o matrice de aceeaşi dimensiune, conţinând rezultatele aplicării
respectivei funcţii elementelor matricei iniţiale. De exemplu, comanda:
matr=sin([pi pi/6; 0 3*pi/4])
are drept rezultat:
matr =
0.0000 0.5000
0 0.7071

1.3.3.5 Operaţii cu masive de date


Termenul de „masive” (sinonim în acest context cu acela de „tablouri”) denotă
variabilele de tip vector (cu o singură dimensiune) şi pe cele de tip matrice (cu două
dimensiuni). În continuare, masivele vor fi referite ca matrice, întrucât vectorii sunt matrice
particulare, având fie numărul de linii, fie numărul de coloane egal cu 1.
Mediul integrat Matlab oferă mult mai multă flexibilitate în calculul matricial decât
majoritatea mediilor de programare bazate pe limbaje de nivel înalt. Astfel, sintaxa
operatorilor aritmetici +, - şi * a fost extinsă pentru a suporta operanzi de tip masiv
(efectuarea operaţiei de înmulţire furnizează un mesaj de eroare dacă dimensiunile nu se
potrivesc); pe lângă operaţiile definite în matematică, au fost introduşi operatori pentru
20 Metode numerice utilizate în analiza sistemelor – aplicaţii

înmulţirea, împărţirea şi ridicarea la putere element cu element (engl. element-wise). De


asemeni, au fost concepute funcţii de generare a matricilor particulare (de exemplu, matricea
unitate de o anume dimensiune) şi au fost definite mecanisme de lucru cu blocuri matriciale
(extrageri, aglutinări etc.) care sunt utile în aplicaţii din teoria sistemelor.
În continuare se exemplifică câteva din operaţiile cu matrice. Fie iniţializările:
m1=[2 4 5; -1 -0.56 0.7];m2=[6 7.8; 0.4 -2.4; 1.7 10];
prin care se dispune în spaţiul de lucru de două matrice: m1 având 2 linii şi 3 coloane şi m2
având 3 linii şi 2 coloane. Transpunerea unei matrice se realizează cu operatorul unar
apostrof, „’”, prioritar în faţa oricărui alt operator matricial; pentru matrice cu elemente
complexe, acest operator semnifică transpunere şi conjugare. Comenzile:
m3=2*m1+m2’;%m1 are 2 linii şi 3 coloane
m4=(m1*m2)^4;%m4 are 2 linii şi 2 coloane
ilustrează înmulţirea unei matrice cu un scalar şi adunarea rezultatului cu transpusa unei alte
matrice, respectiv înmulţirea a două matrice şi ridicarea rezultatului la puterea a patra
(operaţia de ridicare la putere matricială furnizează eroare dacă matricea nu este pătratică).
Următoarele comenzi introduc:
• înmulţirea element cu element:
m5=m1.*m2’;%m5 are 2 linii şi 3 coloane
• împărţirea element cu element:
m6=m2./m1’;%m6 are 3 linii şi 2 coloane
• ridicarea la putere element cu element:
m7=(m1-m2’).^3;%m7 are 2 linii şi 3 coloane
Uneori, este util să se adreseze o anumită zonă contiguă a unei matrice (în particular, un
element, o linie, o coloană sau un bloc matricial). Presupunând existenţa în spaţiul de lucru a
variabilelor anterior introduse şi calculate, atunci execuţia comenzilor:
a=m5(1,3);b=m6(:,2);c=m6(1,:);d=m7(1:2,2:3);
are respectiv următoarele efecte (reprezentate în figura 1.5):
a
b

12.0000 1.6000 8.5000 3.0000 -7.8000


m5 =   
m6 = 0.1000 4.2857

 -7.8000 1.3440 7.0000  
0.3400 14.2857 
c
d
3.0000 -7.8000

m6 = 0.1000 4.2857
  -64.000 46.6560 35.9370 
  m7 =  
0.3400 14.2857  -681.4720 6.2295 -804.3570 

Fig. 1.5 Exemplu de extragere de blocuri matriciale

• iniţializarea variabilei a cu elementul de pe linia 1 şi coloana 3 al matricei m5;


• variabila b este iniţializată cu coloana 2 a matricei m6 (deci b este un vector coloană);
• variabilei c i se atribuie prima linie a matricei m6 (deci c este un vector linie);
• iniţializarea variabilei d cu blocul matricial cuprinzând elementele din liniile 1 şi 2 şi
1. Introducere în calculul aproximativ 21

coloanele 2 şi 3 ale matricei m7 (deci d este o matrice cu 2 linii şi 2 coloane).


O adresare de forma:
e=m7(:,:);
este echivalentă cu adresarea întregii matrice (adică variabilele e şi m7 au aceleaşi valori).
Fie acum iniţializările a două matrice:
M1=[3 8 0 0.67; -2 -7 1 0; 1.23 4 6 11; -9 -2 -0.78 3];
M2=[-1 5.5 6 8; 0.23 -5 -1 0];
Presupunând că se doreşte realizarea construcţiei matriciale reprezentate în figura 1.6,
aceasta se face în Matlab prin:
M3=[M1(2:3,2:3) M2(:,4);M1(4,2:4);M2(1,1:3)];
În cazul în care construcţia matricială dorită este nefezabilă din cauza nepotrivirii
dimensiunilor matriciale, atunci se generează un mesaj de eroare (de exemplu, dacă ultima
linie adăugată ar fi avut 4 elemente). Se observă că operaţiile de aglutinare a blocurilor
matriciale respectă aceeaşi semnificaţie a separatorilor: spaţiul se foloseşte pentru aglutinarea
„în linie” (unele lângă altele), iar „;” pentru aglutinarea „în coloană” (unele sub altele).
 3.0000 8.0000 0 0.6700
-2.0000 -7.0000 1.0000 0 -1.0000 5.5000 6.0000 8.0000
M1 =  M2 = 
 1.2300 4.0000 6.0000 11.0000  0.2300 −5.0000 −1.0000 0
 
-9.0000 -2.0000 -0.7800 3.0000

 −7.0000 1.0000 | 8.0000 


 4.0000 6.0000 | 0 

 — — —
M3 =  
 -2.0000 -0.7800 3.0000 
 — — —
 
 -1.0000 5.5000 6.0000 
Fig. 1.6 Exemplu de construire a unei noi matrice, folosind blocuri matriciale ale unor
matrice date

Pentru ştergerea unui bloc matricial dintr-o matrice, se selectează acesta şi i se atribuie
matricea vidă. Zona ştearsă nu trebuie să fie neapărat contiguă, dar operaţia are succes numai
dacă dimensiunile concordă pentru obţinerea unei noi matrice. De exemplu:
M1(:,[2 4])=[];
conduce la dispariţia coloanelor 2 şi 4 din matricea M1 (zona astfel definită nu este contiguă),
dar comanda:
M1(1,[2 4])=[];
nu se poate executa, deoarece ar însemna ştergerea a două elemente din prima linie a matricei,
iar rezultatul nu ar avea structura unei matrice.
În continuare sunt prezentate câteva dintre funcţiile Matlab de argument vector sau
matrice sau care generează masive cu forme particulare.
Aflarea dimensiunii unui masiv se poate face în Matlab cu ajutorul a două funcţii: size
şi length. Funcţia size poate primi ca argument fie marice, fie vector, în timp ce funcţia
length este dedicată vectorilor; ele sunt ilustrate în exemplele de mai jos.
22 Metode numerice utilizate în analiza sistemelor – aplicaţii

mat1=[2.3 1 8; -9 1.5 2];


[m n]=size(a);
[p q]=size(a(1,:));
r=length(a(1,:));
Indiferent dacă este aplicată unei matrice sau unui vector, funcţia size returnează un
vector linie de două elemente, şi anume numărul de linii, respectiv numărul de coloane al
tabloului dat ca argument de intrare. Rezultă că variabila m din exemplul de mai sus are
valoarea 2, n are valoarea 3, p este 1, iar q este 3. Funcţia length returnează numărul de
elemente al vectorului dat ca argument. În exemplul de mai sus, argumentul funcţiei este
prima linie a matricei a, deci variabila r conţine valoarea 3.
În Matlab sunt implementate funcţii de extragere a elementului minim (min) şi maxim
(max) dintr-un şir, precum şi de ordonare (sort). De exemplu, în urma executării comenzilor:
m=min([2;3;-1.6]);M=max([1 8 2 19]);
variabila m va fi -1.6 şi M va fi 19. Dacă interesează şi valoarea indicelui elementului extrem
dintr-un şir, atunci se poate folosi următoarea formă de apel:
[m,ind]=min([1 0 -8]);
în urma căreia m va conţine -8, iar ind va fi 3. În mod asemănător, comanda:
[y,vi]=sort([2 -1 6 0.7 9])
va genera în variabila y vectorul ordonat crescător, iar în vi indecşii elementelor din vectorul
iniţial:
y =
-1.0000 0.7000 2.0000 6.0000 9.0000

vi =
2 4 1 3 5
Funcţia sort acţionează şi pe şiruri de caractere, ordonarea având loc după codurile
ASCII ale acestora. De exemplu:
p=sort('wertybghj')
va produce rezultatul:
p =
beghjrtwy
Funcţiile min şi max acţionează şi pe matrice, caz în care returnează câte un vector
conţinând elementele minime, respectiv maxime de pe coloanele matricei. Deci printr-o
comandă de forma:
M=max(max(a));
se poate afla elementul maxim al matricei. Alte funcţii din aceeaşi categorie sunt sum şi mean,
de calcul al sumei elementelor unui masiv, respectiv al valorii medii.
Generarea unui şir de numere reale echidistanţate cu un anume pas într-un interval dat,
fie acesta [a; b], se poate face astfel:
a=1;b=3;pas=0.5;
sir=a:pas:b
ceea ce generează:
sir =
1.0000 1.5000 2.0000 2.5000 3.0000
Pasul poate fi şi negativ, caz în care capetele intervalului trebuie inversate. Dacă pasul
1. Introducere în calculul aproximativ 23

este unitar, atunci prezenţa lui poate fi omisă. Astfel, comanda:


alt_sir=0:5
va avea ecoul:
alt_sir =
0 1 2 3 4 5
Matricea unitate de o anumită dimensiune se poate genera prin funcţia eye; comanda:
mat2=eye(3)
produce următorul ecou la ecran:
mat2 =
1 0 0
0 1 0
0 0 1
Funcţiile zeros şi ones servesc la generarea masivelor de dimensiuni dorite, având
toate elementele nule, respectiv egale cu 1. De exemplu:
mat2=zeros(2,4)
produce răspunsul:
mat2 =
0 0 0 0
0 0 0 0
iar comanda:
mat3=ones(3,2)
are ca rezultat:
mat3 =
1 1
1 1
1 1
Funcţia diag furnizează ca rezultat un vector dacă are ca argument de intrare o matrice,
şi invers. În primul caz, rezultatul este un vector coloană care conţine elementele de pe
diagonala principală a matricei (care nu trebuie să fie neapărat pătratică). În cel de-al doilea
caz, funcţia generează o matrice pătratică având pe diagonala principală elementele
vectorului de intrare. Drept exemplificare pentru primul caz, comenzile:
mat4=[3 2; -4.5 6.7; 0.11 -1];diag(mat4)
furnizează rezultatul:
ans =
3.0000
6.7000
Pentru cel de-al doilea caz, fie, de exemplu:
v=[2 -6.7 12 14.8];diag(v)
care produce răspunsul:
ans =
2.0000 0 0 0
0 -6.7000 0 0
0 0 12.0000 0
0 0 0 14.8000
Generarea unei matrice cu elemente aleatoare este posibilă cu ajutorul a două funcţii ce
24 Metode numerice utilizate în analiza sistemelor – aplicaţii

utilizează generatoare de numere aleatoare: rand şi randn. Dacă se doreşte obţinerea unei
matrice cu 2 linii şi 3 coloane, având elementele alese dintr-o distribuţie uniformă în
intervalul [0; 1], se va executa comanda:
mat5=rand(2,3)
cu rezultatul:
mat5 =
0.2190 0.6789 0.9347
0.0470 0.6793 0.3835
Funcţia randn se foloseşte pentru generarea de numere normal distribuite cu media nulă
şi abaterea medie standard egală cu unitatea. Iată ce se obţine prin comanda:
mat6=randn(4,3)
mat6 =
1.1650 -0.6965 0.2641
0.6268 1.6961 0.8717
0.0751 0.0591 -1.4462
0.3516 1.7971 -0.7012
Pentru generarea matricelor pătratice, funcţiilor care returnează la cazul general matrice
dreptunghiulare – dintre care am listat mai sus zeros, ones, rand şi randn – le este
suficient un singur argument, şi anume dimensiunea matricei.
Exponenţiala matricială se poate calcula în Matlab cu funcţia expm (trebuie făcută
distincţia între rezultatul acestei funcţii şi cel al funcţiei exp, care, în cazul unui argument de
tip matrice sau vector, semnifică aplicarea exponenţialei element cu element). Cu ajutorul
funcţiei det se efectuează calculul determinantului unei matrice pătratice. Funcţia trace
returnează urma unei matrice (suma elementelor de pe diagonala principală). Funcţiile inv şi
rank, de calcul al inversei matriciale şi de calcul al rangului, implementează metode
numerice mai complicate, care fac obiectul unei tratări amănunţite mai târziu în această
lucrare.

1.3.3.6 Structuri de control în Matlab. Funcţii utilizator


În Matlab se dispune de un limbaj de programare foarte asemănător cu limbajul C.
Structurile de control sunt:
• structura de decizie (if);
• structurile de ciclare: cu contor (for) şi cu test iniţial (while).
Blocul de comenzi aferent unei structuri de control în Matlab se încheie cu end. La nivel
de sintaxă există mici deosebiri faţă de limbajul C (a se vedea rezultatul comenzii help), care
se pot observa pe exemplele de mai jos.
Pentru exemplificarea utilizării structurii de decizie, fie următoarea secvenţă în
metalimbaj:
dacă a < b atunci d ← b-a
altfel dacă a = b atunci d←a
altfel d ← a-b
sfârşit dacă
sfârşit dacă
Această secvenţă se poate implementa în Matlab în două moduri: fie folosind două
structuri de decizie (adică traducând exact metalimbajul), fie folosind o singură structură de
1. Introducere în calculul aproximativ 25

decizie. Prima variantă este:


if a<b d=b-a;
else if a==b d=a;
else d=a-b;
end;
end;
În blocul de mai sus, pe ramura else a primei structuri de decizie urmează o a doua
structură de decizie. În a doua variantă implementarea este mai compactă:
if a<b d=b-a;
elseif a==b d=a;
else d=a-b;
end;
În interiorul unei structuri precum cea de mai sus pot apărea oricât de multe ramuri de tip
elseif, semnificând testarea de condiţii suplimentare, dar ultima dintre ele trebuie să fie de
tip else.
Pentru exemplificarea utilizării structurilor de ciclare, fie problema calculului valorilor
unei funcţii scalare, f, într-un număr dat de puncte echidistante ale unui interval [x; y]. Fie n
numărul de puncte de calcul, inclusiv capetele intervalului. Presupunând că expresia funcţiei f
este deja implementată în Matlab, o rezolvare posibilă face uz în mod explicit de structura de
ciclare cu contor:
h=(y-x)/(n-1);%pasul de calcul
xc=x;
for i=1:n,
rez(i)=f(xc);
xc=xc+h;
end;
Calculul punctului de calcul şi al valorii funcţiei în acest punct se efectuează în acelaşi
timp. Valorile funcţiei sunt depuse în vectorul rez, care are n elemente. Facilităţile oferite de
Matlab permit şi o altă rezolvare, mai elegantă. Aceasta constă în a genera mai întâi variabila
indexată conţinând vectorul de puncte echidistante şi în a calcula apoi valorile lui f în
elementele acestei variabile:
p=x:(y-x)/(n-1):y;%vectorul de puncte echidistante
for i=1:length(p),
rez(i)=f(p(i));
end;
Pentru aceeaşi problemă se poate folosi ciclarea cu test iniţial:
p=x:(y-x)/(n-1):y;
i=1;
while i<=length(p),
rez(i)=f(p(i));
end;
Deoarece structura de ciclare cu test final este reductibilă la cea cu test iniţial, s-a
renunţat la implementarea ei în Matlab.
În continuare se prezintă aspectele de bază ale scrierii de funcţii utilizator în Matlab.
26 Metode numerice utilizate în analiza sistemelor – aplicaţii

După cum se preciza şi mai devreme, funcţiile reprezintă subprograme Matlab; ele se pot
edita cu orice editor (de la versiunile 5.x inclusiv în sus mediul dispune de editor propriu,
precum şi de un depanator – engl. debugger) şi trebuie salvate în fişiere cu extensia .m (ca şi
programele script). Dar în cazul funcţiilor este necesar ca numele fişierului să coincidă cu
numele funcţiei, care trebuie să apară în prima linie a acesteia (header-ul funcţiei). Orice
funcţie Matlab începe cu cuvântul rezervat function. Un header de forma:
function [var_e1,var_e2,var_e3]=funct(var_i1,var_i2)
aparţine unei funcţii Matlab cu numele funct, care primeşte două argumente de intrare –
var_i1, var_i2 – şi returnează rezultatele în trei variabile – var_e1, var_e2, var_e3.
Din header nu rezultă tipul argumentelor; aceasta rezultă din implementarea efectivă (corpul)
funcţiei. Dintre variabilele folosite de funcţie, doar variabilele de ieşire există în spaţiul de
lucru după execuţia apelului acesteia (restul variabilelor sunt locale). Lista argumentelor de
intrare se închide între paranteze rotunde, cea a argumentelor de ieşire între paranteze pătrate
(acestea sunt opţionale dacă există un singur argument de ieşire); înăuntrul ambelor liste se
foloseşte ca separator virgula. Această funcţie trebuie salvată în fişierul funct.m.
După header urmează corpul funcţiei, format din comenzi Matlab care trebuie să respecte
regulile sintactice obişnuite. Întrucât în Matlab nu se dispune de compilator, ci de interpretor,
erorile de sintaxă se pun în evidenţă în momentul apelului funcţiei (valabil şi pentru script-
uri), când execuţia este oprită şi un mesaj de eroare se afişează în fereastra de comandă. În
versiunile mai recente de Matlab funcţia de depanare inclusă în editor avertizează prin
marcare cu roşu prezenţa erorilor sintactice.
Forma de apel a unei funcţii Matlab este în principiu identică header-ului său fără
cuvântul function. Parametrii de intrare se pot transmite prin referinţă sau prin valoare. De
exemplu, un apel de forma:
[x1,x2,x3]=funct(v1,v2)
corespunde transmiterii prin referinţă. Înaintea unui astfel de apel trebuie ca fişierul
funct.m să se afle în directorul curent şi variabilele v1 şi v2 să se afle în spaţiul de lucru. În
aceste condiţii, dacă funcţia este sintactic corect scrisă, atunci execuţia apelului de mai sus va
avea ca ecou la ecran (deoarece s-a omis „;”) afişarea conţinutului variabilelor x1, x2 şi x3.
Un apel de forma:
funct(2,4)
corespunde transmiterii prin valoare a parametrilor de intrare; ecoul de la ecran constă în
acest caz în afişarea numai a valorii primului argument de ieşire, atribuite variabilei ans.

1.3.3.7 Facilitǎţi grafice


În Matlab se pot realiza grafice bi şi tridimensionale. În această lucrare interesul se
rezumă la graficele bidimensionale, a căror realizare se bazează pe funcţiile plot şi polar
(grafica 3D se bazează pe funcţiile mesh şi surface), dedicate reprezentării în plan a unei
mulţimi de puncte în coordonate rectangulare (carteziene), respectiv polare. Ca majoritatea
funcţiilor Matlab, şi aceste funcţii suportă un număr variabil de argumente de intrare (de unde
rezultă mai multe forme de apel); în mod tipic, câte două argumente de intrare (doi vectori)
sunt necesare (în această ordine):
• pentru plot vectorul absciselor şi vectorul ordonatelor punctelor respective;
• pentru polar vectorul unghiurilor şi cel al razelor punctelor.
Când plot sau polar sunt apelate cu un singur vector de intrare, pe ordonată sunt
1. Introducere în calculul aproximativ 27

trecute elementele vectorului şi pe abscisă indecşii acestora.


Funcţiile cart2pol şi pol2cart fac conversiile din coordonate carteziene în
coordonate polare şi respectiv invers. Un al treilea argument, de tip şir de caractere, este
necesar dacă se vrea impunerea unui anume tip de linie pentru grafic.
Mai jos se exemplifică trasarea graficului funcţiei sinus în intervalul [ −π; π] , în ambele
variante. Se generează întâi o diviziune a respectivului interval cu un pas ales arbitrar
(evident, acurateţea graficului este cu atât mai bună cu cât pasul este mai mic).
x=-pi:pi/50:pi;%vectorul de puncte de calcul în intervalul dat, distanţate cu pasul pi/50
y=sin(x);%vectorul de valori ale funcţiei
plot(x,y,'b--');%trasarea graficului în coordonate carteziene,
%cu impunerea tipului de linie
grid;%suprapunerea unei grile peste grafic
[xx,yy]=cart2pol(x,y);%conversia din coordonate carteziene în coordonate polare
polar(xx,yy,’b-’);
Apelarea funcţiei plot va avea ca efect deschiderea unei ferestre grafice care va găzdui
graficul cerut (axele sunt scalate automat, figura 1.7). Fereastra grafică este un obiect cu
anumite atribute. Orice nou apel al funcţiei plot sau polar va suprascrie în mod implicit
cea mai recentă fereastră deja deschisă. Deci funcţia polar va afişa noul grafic în aceeaşi
fereastră, cu numele Figure No. 1 (figura 1.8).

Fig. 1.7 Fereastră grafică deschisă ca rezultat al unei comenzi plot

Uneori se doreşte schimbarea setărilor implicite; astfel:


• Dacă se doreşte afişarea de grafice în ferestre separate, atunci înainte de fiecare
plot/polar trebuie folosită funcţia figure, care primeşte ca argument de intrare un număr
întreg (acesta va determina numele ferestrei) şi care crează un nou obiect de tip fereastră
grafică (iniţial vidă). De exemplu, cele două grafice din exemplul de mai sus ar putea fi
afişate în ferestre separate prin secvenţa:
28 Metode numerice utilizate în analiza sistemelor – aplicaţii

figure(1);plot(x,y,’b--');grid;
figure(2);polar(xx,yy,’k-');grid;

Fig. 1.8 Fereastra grafică din figura 1.7, actualizată printr-o comandă polar
• Dacă, dimpotrivă, se vrea afişarea de grafice suprapuse, aceasta se poate face numai
pentru mai multe grafice de acelaşi tip: fie în coordonate rectangulare (plot), fie în
coordonate polare (polar). În acest caz, prin comanda hold on se schimbă starea unei
variabile Matlab binare (setate implicit pe off) aferente celei mai recente ferestre grafice
deschise, efectul fiind păstrarea (şi nu ştergerea) celui mai recent grafic. În figura 1.9 s-a
reprezentat conţinutul ferestrei grafice rezultat în urma execuţiei comenzilor:
z=cos(x);%valorile unei alte funcţii, pentru un nou grafic
plot(x,y);grid;
%iniţial variabila hold are valoarea off
hold on;
plot(x,z);
1

0.8

0.6

0.4

0.2

-0.2

-0.4

-0.6

-0.8

-1
-4 -3 -2 -1 0 1 2 3 4

Fig. 1.9 Două grafice suprapuse în aceeaşi fereastră prin comanda hold on
În versiunile până la 4.x inclusiv, culoarea fundalului unei ferestre grafice se setează
implicit la negru, iar în versiunile superioare la alb. Bascularea între cele două culori de
1. Introducere în calculul aproximativ 29

fundal se poate face prin comanda whitebg: pentru prima categorie de versiuni aceasta
înseamnă setarea la alb, pentru a doua categorie înseamnă setarea la negru.
Al treilea argument al funcţiilor plot sau polar este un şir de caractere prin care se
impun caracteristicile liniei cu care se va trasa graficul, şi anume culoarea (prin primul
caracter) şi tipul liniei (prin următorul sau următoarele două caractere). Funcţia plot a fost
apelată iniţial ca având al treilea argument ’b—-': ’b' stabileşte culoarea (albastru,
engl. blue), iar ’—-', adică şirul format din două caractere ’-', stabileşte că linia este
întreruptă. Comanda help plot oferă detalii despre combinaţiile corecte de caractere ce pot
apărea în al treilea argument al funcţiilor plot sau polar. Când acesta lipseşte, culoarea
implicită de trasare a graficului este roşu (’r') pentru versiunile 4.x şi, respectiv, albastru
(’b') în versiunile 5.x şi superioare, iar tipul de linie este implicit cel continuu (’-').
În fine, cea mai generală formă de apel a funcţiilor de grafică bidimensională este aceea
prin care se trasează mai multe grafice simultan în aceeaşi fereastră grafică. În acest caz,
argumentele de intrare pot fi formate din oricâte perechi (vector, vector) şi/sau triplete (vector,
vector, şir de caractere) necesare pentru trasarea unui singur grafic. Nu este obligatoriu ca
domeniile de reprezentare pe axa absciselor să coincidă. Rezultatul obţinut este identic ca în
cazul folosirii comenzii hold on.
În exemplul de mai jos sunt calculate valorile a două funcţii în două seturi diferite de
puncte, primul din intervalul [-5; 5] şi al doilea din intervalul [-3; 3]. Cele două grafice sunt
reprezentate printr-un singur apel al funcţiei plot. Se observă că primul grafic este descris
printr-un dublet de argumente (este trasat cu valorile implicite ale caracteristicilor liniei: linie
continuă roşie), în timp ce cel de-al doilea grafic este descris printr-un triplet de argumente
(s-a impus culoarea albastră – ’b’ – şi tipul de linie – ’o’, cerculeţ; figura 1.10).
t1=-5:0.05:5;t2=-3:0.01:3;
f1=sin(t1)+2*sin(5*t1);
f2=sin(5*t2).*sin(t2);
plot(t,f1,t,f2,’bo’);grid;
3

-1

-2

-3
-5 -4 -3 -2 -1 0 1 2 3 4 5

Fig. 1.10 Două grafice reprezentate printr-un singur apel al funcţiei plot

Funcţiile title, xlabel şi ylabel se apelează în asociere cu plot. Ele primesc ca


argument un şir de caractere pe care îl plasează ca titlu, etichetă a abscisei sau, respectiv,
etichetă a ordonatei graficului (graficelor) desenat(e) de cel mai recent apel al lui plot.
30 Metode numerice utilizate în analiza sistemelor – aplicaţii

Funcţia title produce acelaşi efect şi în asociere cu polar.


În Matlab există posibilitatea de a reprezenta mai multe sisteme de axe (fie carteziene, fie
polare) în aceeaşi fereastră grafică. Aceasta se face cu funcţia subplot care trebuie să
primească trei argumente de intrare de tip număr întreg. De exemplu, o comandă de forma:
subplot(221);%sau subplot(2,2,1)
va determina apariţia în cea mai recentă fereastră grafică deschisă (sau deschiderea unei
ferestre grafice dacă niciuna nu era deschisă) a unei matrice de 2 linii şi 2 coloane – aceasta
este semnificaţia primelor două argumente – de sisteme de axe (care implicit sunt
rectangulare). Aceste sisteme de axe sunt numerotate de la stânga la dreapta şi de sus în jos.
Al treilea argument anunţă numărul sistemului în care se va executa următorul apel de
plot/polar (în cazul de faţă, este vorba de primul, adică cel din stânga sus). Evident, al
treilea argument trebuie să se situeze între 1 şi produsul celorlalte două.
Presupunând că variabilele t1, t2, f1 şi f2 au fost generate prin secvenţa de comenzi de
mai sus, atunci secvenţa de comenzi de mai jos va produce rezultatul din figura 1.11.
[p1,p2]=cart2pol(t2,f2);
subplot(211);
plot(t1,f1,'g--');grid;
title('Un grafic in coordonate carteziene');
xlabel('unitati de masura pe abscisa');
subplot(212);
polar(p1,p2,'r-');
title('Un grafic in coordonate polare');
Un grafic in coordonate carteziene
4

-2

-4
-5 -4 -3 -2 -1 0 1 2 3 4 5
unitati de masura pe abscisa
Un grafic in coordonate polare
904
120 3 60
150 2 30
1
180 0

210 330

240 300
270

Fig. 1.11 Două grafice în sisteme diferite de axe, dar în aceeaşi fereastră grafică (subplot)

1.3.3.8 Exerciţii rezolvate. Exerciţii propuse


În acest paragraf se exemplifică rezolvarea unei probleme de calcul matricial prin
scrierea unui program script în Matlab, care, la rândul său, apelează funcţii utilizator. Apoi se
propun spre rezolvare câteva exerciţii care necesită aplicarea noţiunilor de bază de lucru în
Matlab, anterior expuse.
1. Introducere în calculul aproximativ 31

Exempl ul 1.11:
Fie x ∈ un număr complex situat în interiorul cercului unitate, exclusiv centrul
acestuia (originea axelor): 0 < x ≤ 1 . Se cere să se scrie un script Matlab care:
a) să calculeze matricea cu elemente complexe, de dimensiune n, A ∈ n× n , ale cărei
elemente se obţin conform cu:
 π 
aij = xi + j ⋅ cos   , i=1,2,...n, j=1,2,...n;
 i + j +1
b) să calculeze matricea B ∈ n× n , cu elementele calculate pe baza matricei A astfel:
  j
( )
aij ⋅ ln aij ⋅  i  deasupra diagonalei principale (i < j )
 

 aij
bij =  pe diagonala principală (i = j ) ,
 max { }
 i =1, n, i ≠ j
{ }
aij + min
j =1, n, j ≠ i
aij

 aij
e sub diagonala principală (i > j )
unde ⋅ reprezintă conjugatul şi [⋅] semnifică partea întreagă;
c) să reprezinte grafic cum variază modulul şi argumentul (unghiul) sumei elementelor
de pe diagonala matricei B în funcţie de argumentul lui x, când acesta se mişcă pe cercul
unitate ( x =1);
d) să construiască matricea:
 AT ⋅ B | I 
 n
C =  − − − | − −  ∈ 2 n× 2 n ,
 
 0n | e B 
unde I n este matricea unitate de dimensiune n şi 0n este matricea pătratică de dimensiune n
cu toate elementele nule.
Pentru rezolvarea fiecăruia dintre punctele problemei enunţate se va scrie câte o funcţie;
cele patru funcţii vor fi apelate de către un program script.
♦Funcţia care rezolvă punctul a) trebuie să primească două argumente de intrare, x şi n,
unde x este variabila complexă de modul subunitar şi n este dimensiunea matricei A, care
trebuie furnizată ca rezultat. Această funcţie va fi numită calc_A.
function [A]=calc_A(x,n)
for i=1:n,%virgula este opţională
for j=1:n,
A(i,j)=x^(i+j)*cos(pi/(i+j+1));
end;
end;
Se observă că:
• x este de modul nenul, deci orice putere a lui x este de modul nenul;
 π   π π
• cos   poate avea argumente în intervalulul maxim  ; (ale cărui
 i + j + 1  2n + 1 3 
32 Metode numerice utilizate în analiza sistemelor – aplicaţii

capete se obţin pentru i=j=n, respectiv pentru i=j=1), deci este nenul oricare ar fi dimensiunea
matricei, n>0).
Rezultă, deci, că matricea A va avea elemente de modul nenul. Legat de aceasta, trebuie
reţinută necesitatea introducerii în programul script a unui test de încadrare în domeniul de
definiţie a variabilei x.
♦Pentru punctul b), funcţia aferentă va avea ca argument de intrare pe A, cu semnificaţia
de matrice pe baza căreia se calculează B, matricea rezultat. Cele două matrice sunt pătratice
de aceeaşi dimensiune; nu este necesar ca dimensiunea să apară ca argument de intrare,
întrucât ea se poate afla înăuntrul funcţiei, prin apelarea funcţiei size cu argumentul A. Se
observă că:
• max
i =1, n, i ≠ j
{ aij } este maximul modulelor elementelor de pe coloana j a matricei A,
excluzând elementul de la intersecţia cu diagonala principală, şi
• min
j =1, n, j ≠ i
{ aij } este minimul modulelor elementelor de pe linia i a matricei A,

excluzând, de asemeni, elementul de la intersecţia cu diagonala principală.


Elementele de pe diagonala principală a matricei B sunt bine definite (numitorul
expresiei este întotdeauna nenul), ţinând cont că elementele matricei A sunt de modul nenul.
Funcţia corespunzătoare punctului b) va fi numită calc_B.
function [B]=calc_B(A)
[m n]=size(A);%matricea fiind pătratică, m şi n au aceeaşi valoare
for i=1:n,
for j=1:n,
if i<j,
B(i,j)=conj(A(i,j))*log(abs(A(i,j)))*fix(j/i);
elseif i==j,
v1=A(i,:);%în vectorul v1 se reţine linia i din A
v1([i])=[];%se şterge elementul care era pe diagonala principală
v2=A(:,j);%în vectorul v2 se reţine coloana j din A
v2([j])=[];%se şterge elementul care era pe diagonala principală
B(i,j)=A(i,j)/(max(abs(v2))+min(abs(v1)));
else B(i,j)=exp(A(i,j));
end;%sfârşitul structurii de decizie
end;%sfârşitul ciclului de contor j
end;%sfârşitul ciclului de contor i
♦Pentru punctul c) se va construi o funcţie cu rol de procedură, întrucât scopul ei nu
este să întoarcă neapărat un rezultat într-o variabilă, ci să efectueze o acţiune, şi anume să
traseze două grafice. Totuşi, pentru aceasta, indiferent de funcţia folosită (plot sau polar),
după cum s-a văzut în paragraful anterior, este necesară generarea câte unei perechi de
vectori pentru fiecare grafic trasat; aceşti vectori vor fi argumentele de ieşire ale funcţiei.
Drept argument de intrare se va considera n, dimensiunea matricei B.
În cazul de faţă, variabila independentă este argumentul (unghiul) variabilei x, care ia
valori în intervalul [ 0; 2π ) când x se mişcă pe cercul unitate:
1. Introducere în calculul aproximativ 33

x = cos(θ) + i ⋅ sin(θ), θ ∈ [ 0;2π )


Pentru aproximaţia variaţiei continue a unghiului lui x se generează o diviziune a
intervalului [ 0; 2π ) cu un pas arbitrar de mic şi se reţine într-un vector argx. Pentru fiecare
element al vectorului argx se apelează funcţia calc_A, pentru a se putea apela apoi funcţia
calc_B, care va genera câte o matrice B. Fiecărei astfel de matrice i se calculează suma
elementelor de pe diagonala principală (adică urma), rezultând astfel un şir de numere
complexe. Se calculează modulele şi argumentele (unghiurile) acestor numere şi se reţin
respectiv în doi vectori: modul şi argum. Aceşti doi vectori desemnează variabilele
dependente a căror variaţie trebuie reprezentată grafic.
În acest moment se constată că scrierea funcţiei de la acest punct necesită apelul încă a
unei funcţii, de calcul al argumentului unui număr complex, în funcţie de părţile reală şi
imaginară ale acestuia, ceea ce nu este tocmai evident. Acest calcul se bazează pe relaţia:
 Im( z ) 
arg( z ) = k π + arctg  , z∈ , k∈ ,
 Re( z ) 
unde valorile lui k sunt restrânse la 1 şi 2, deoarece arctangenta ia valori în intervalul
( − π 2; π 2 ) , iar argumentul unui număr complex se situează în [ 0; 2π] . În figura 1.12 sunt
date relaţiile de calcul ale argumentului unui număr complex în funcţie de situarea acestuia în
cele patru cadrane ale planului complex.
Im
II: Re(z)<0, Im(z)≥0 I: Re(z)>0, Im(z)≥0
zII  Im( z ) 
 Im( z )  θ = arctg  
θ = π+arctg    Re( z ) 
 Re( z )  zI
θII Re
θI
θIII
θIV zIV
 Im( z ) 
θ = π+arctg  
 Re( z )  zIII  Im( z ) 
θ = 2π+arctg  
 Re( z ) 
III: Re(z)<0, Im(z)≤0 IV: Re(z)>0, Im(z)≤0
Fig. 1.12 Calculul argumentului unui număr complex în funcţie de părţile reală şi imaginară

Privind figura 1.12, se observă că o atenţie aparte trebuie dată situaţiilor când partea reală
este nulă (numărul complex se află pe axa imaginară). În acest caz, riguros vorbind,
arctangenta nu este definită, însă se poate considera prin abuz că returnează ca rezultat fie
π 2 dacă este vorba de semiaxa imaginară pozitivă, fie −π 2 dacă este vorba de cea negativă.
Formulele de mai sus rămân valabile la limită.
Funcţia care implementează calculul argumentului unui număr complex folosind părţile
reală şi imaginară va fi numită calc_arg; ea este listată mai jos.
function [teta]=calc_arg(z)
if real(z)==0,
if imag(z)==0,
34 Metode numerice utilizate în analiza sistemelor – aplicaţii

teta=0;%argumentul numărului complex 0 este 0


elseif imag(z)>0,
teta=pi/2;%numărul este pe axa imaginară pozitivă
else teta=3*pi/2;%numărul este pe axa imaginară negativă
end;
elseif real(z)<0,
teta=pi+atan(imag(z)/real(z));%numărul este în cadranul II sau III
elseif imag(z)>=0,
teta=atan(imag(z)/real(z));%numărul este în cadranul I
else teta=2*pi+atan(imag(z)/real(z));%numărul este în cadranul IV
end;
Funcţia aferentă punctului c) va fi numită grafic.
function [argx,modul,argum]=grafic(n)
argx=0:pi/50:(2*pi-eps);
%s-a folosit variabila permanentă eps, care îl conţine pe epsilon maşină
%(2.220446049250313e-016), pentru a exprima că intervalul este deschis spre 2π
%(valoarea 2π nu este atinsă)
modul=[];argum=[];%iniţializarea vectorilor de module şi unghiuri la vectori vizi
for j=1:length(argx),
x=cos(argx(j))+i*sin(argx(j));
[A]=calc_A(x,n);
[B]=calc_B(A);
u=trace(B);%urma matricei B se calculează cu funcţia trace din bilioteca Matlab
modul=[modul abs(u)]; %la fiecare pas se adaugă noi elemente
argum=[argum calc_arg(u)];% în vectorii modul şi argum
end;
%aşezarea celor două grafice unele sub altele în aceeaşi fereastră grafică
subplot(211);
plot(argx,modul,’b-’);grid;
xlabel(’radiani’);
title(’Modulul urmei lui B vs. arg(x)’);
subplot(212);
plot(argx,argum,’b:’);grid;
xlabel(’radiani’);ylabel(’radiani’);
title(’Argumentul urmei lui B vs. arg(x)’);
♦Funcţia de rezolvare a punctului d) – ce va fi numită calc_C – este cel mai simplu de
implementat în Matlab, fiindcă face uz de facilităţile de operare cu masive ale mediului.
function [C]=calc_C(A,B)
[m n]=size(A);
C=[A’*B eye(n);zeros(n) expm(B)];
Ea necesită ca argumente de intrare matricele A şi B, furnizând ca rezultat matricea C
(funcţia expm, de calcul al exponenţialei matriciale, există deja în biblioteca Matlab).
♦În fine, programul script care apelează funcţiile descrise mai sus va fi numit pp1 şi
1. Introducere în calculul aproximativ 35

este listat mai jos. Se utilizează o variabilă binară stop care este setată la 1 logic dacă nu
sunt îndeplinite restricţiile asupra variabilelor x şi n.
%numărul complex x şi numărul întreg n se consideră cunoscute
stop=0;
if (abs(x)==0) | (abs(x)>1),
disp(’Variabila x trebuie sa aiba modul subunitar si nenul.’);
stop=1;
end;
if (n<1),
disp(’Dimensiunea matricelor trebuie sa fie pozitiva.’);
stop=1;
end;
if (~stop),
[A]=calc_A(x,n)
[B]=calc_B(A)
pause;%stoparea programului până la apăsarea unei taste,
%pentru a vizualiza ecourile apelurilor de funcţii de mai sus
[teta_x,md,argmnt]=grafic(n);
pause;%se vizualizează afişările grafice; această comandă poate lipsi,
%deoarece următoarea afişare se face în fereastra de comandă
[C]=calc_C(A,B)
end;
De amintit că toate cele şase fişiere listate mai sus trebuie să aibă extensia .m şi să se afle
în acelaşi director.
Modulul urmei lui B vs. arg(x)
1

0.8

0.6

0.4

0.2
0 1 2 3 4 5 6 7
radiani
Argumentul urmei lui B vs. arg(x)
8

6
radiani

0
0 1 2 3 4 5 6 7
radiani

Fig. 1.13 Grafic produs de programul Matlab din exemplul 1.11

Mai jos este exemplificat rezultatul rulării programului de mai sus pentru x=0.3+0.75i şi
n=2. Secvenţa de comenzi de iniţializare şi de punere în execuţie este:
x=0.3+0.75*i;n=2;
pp1
36 Metode numerice utilizate în analiza sistemelor – aplicaţii

iar rezultatele sunt listate mai jos.


A =
-0.2362 + 0.2250i -0.3389 - 0.1551i
-0.3389 - 0.1551i 0.0168 - 0.3440i

B =
-0.3169 + 0.3019i 0.6689 - 0.3062i
0.7040 - 0.1101i 0.0225 - 0.4615i

C =
-0.0787+0.1465i -0.1630+0.0817i 1.0000 0
0.1103+0.0889i -0.0200+0.2075i 0 1.0000
0 0 0.8786+0.0972i 0.5614-0.3658i
0 0 0.6194-0.1938i 1.0818-0.6361i
Ordinea reală a apariţiei lor este: matricile A şi B în fereastra de comandă, graficele în
fereastra grafică redată în figura 1.13 şi, în fine, matricea C din nou în fereastra de comandă.

Exerciţii propuse
În cele ce urmează, prin termenul de „program Matlab” se poate înţelege fie „script
Matlab”, fie „funcţie Matlab”, la alegere.

1. Se efectuează de k ori generarea a două matrice, A ∈ n× n şi B ∈ n× n , cu elemente


aleatoare uniform distribuite în intervalul [0;1].
a) Să se scrie o funcţie Matlab care să calculeze matricea:
p
D = ( α ⋅ A + (1 − α ) ⋅ B ) ,

unde 0 ≤ α ≤ 1 şi p ∈ * .
b) Să se scrie un script care să reprezinte grafic coordonatele (indicele de linie şi indicele
de coloană) elementelor maxim şi minim ale matricei D în funcţie de k, numărul de paşi de
generare a matricelor A şi B (se va considera un număr relativ mare de paşi, de ordinul
sutelor).
c) Acelaşi lucru ca la punctul b) pentru raportul dintre numărul de elemente mai mari
decât α şi cele strict mai mici decât α ale matricei D.
2. a) Să se implementeze în Matlab funcţiile de argument real:
 sin( x)
 , dacă x ≠ 0
f1 : → , f1 ( x) = sinc( x)  x (sinus cardinal);
 1, dacă x = 0
b − a
 π ⋅ x + (2k + 1)a − 2kb, x ∈ [ 2k π;(2k + 1)π )
f 2 : → , f 2 ( x) =  ,
 b − a b + a
⋅ cos ( x − (2k + 1)π ) + , x ∈ [ (2k + 1)π; 2(k + 1)π )
 2 2
unde 1<a<b, k ∈ ;
f3 : → , f3 = x ⋅ ( sin (10 ⋅ x ) + cos (10 ⋅ x ) )
1. Introducere în calculul aproximativ 37

b) Să se scrie un program Matlab pentru trasarea graficelor următoarelor funcţii:


g1 : → , g1 = f1 o f 2 ; g 2 : → , g 2 = f 2 o f3 ; g3 : → , g3 = f3 o f 2 o f1 , atunci
când argumentul lor variază în intervalul [-10;10].
3. Se presupune că funcţiile f1, f2 şi f3 din exerciţiul 2 sunt deja implementate. Fie o
matrice A ∈ m×n . Se cere să se scrie un program Matlab care:
a) să calculeze matricea B ∈ m×n , ale cărei elemente depind de cele ale matricei A
astfel:
 f1 (aij ), dacă (i + j ) mod 4 = 1

 f 2 (aij ), dacă (i + j ) mod 4 = 2
bij =  ,
 f3 (aij ), dacă (i + j ) mod 4 = 3
a , în rest
 ij
unde „x mod y”, cu x şi y numere întregi, semnifică restul împărţirii lui x la y (împărţirea
modulo);
b) presupunând că elementele matricei A sunt de forma:
   i+ j  π
 tg  α ⋅   ⋅ , i ≠ j
aij =    i − j  4  ,

 0, i= j
să reprezinte grafic variaţia mediei elementelor matricei B în funcţie de α, când acesta variază
în intervalul [-5;5].
P( s)
4. Fie H ( s ) = , unde P şi Q sunt polinoame în variabila complexă s prime între ele
Q( s)
cu grad(P)≤grad(Q) (se spune că funcţia H(s) este o funcţie raţională în s). Să se scrie o
funcţie Matlab care să primească vectorii coeficienţilor polinoamelor P şi Q şi să traseze în
coordonate polare locul geometric al punctului H (i ⋅ ω) în planul complex (i fiind unitatea
imaginară), când variabila reală ω variază într-un interval centrat în origine (de forma
[ −ωmax ; ωmax ] , cu ωmax > 0 ).
Indicaţie: Pentru calculul valorii unui polinom într-o valoare dată a variabilei
independente se poate folosi funcţia polyval din biblioteca Matlab. Pentru calculul
argumentului numărului complex H (i ⋅ ω) se poate apela funcţia calc_arg, scrisă la
exemplul 1.11 din acest paragraf.
38 Metode numerice utilizate în analiza sistemelor – aplicaţii

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

  • Strategie
    Strategie
    Document369 pagini
    Strategie
    Hilohe Adrian
    Încă nu există evaluări
  • Curs 10-11
    Curs 10-11
    Document29 pagini
    Curs 10-11
    Hilohe Adrian
    Încă nu există evaluări
  • Curs 2-4
    Curs 2-4
    Document39 pagini
    Curs 2-4
    Hilohe Adrian
    Încă nu există evaluări
  • MN Cap4
    MN Cap4
    Document40 pagini
    MN Cap4
    Hilohe Adrian
    Încă nu există evaluări
  • MN Cap3
    MN Cap3
    Document16 pagini
    MN Cap3
    Hilohe Adrian
    Încă nu există evaluări
  • MN Cap2
    MN Cap2
    Document44 pagini
    MN Cap2
    Hilohe Adrian
    Încă nu există evaluări