Documente Academic
Documente Profesional
Documente Cultură
Capitolul 1
x − x$
(1.1) ε a = x − x$ , ε r =
x
(1.2) ε a = x − x$ ≤ 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
şi în continuare:
(1.5) ( )
M = aU ⋅ at − 1 , m = a L
(
m = a L ≤ x ≤ aU ⋅ at − 1 = M )
Exempl ul 1.2: FVM = (2,24,8) este sugestiv reprezentat în figura 1.1.
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
(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 ) ,
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:
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
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).
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.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
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
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.
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.
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.
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
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.
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.
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.
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
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
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
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.
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.
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
-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)
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,
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
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
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
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.
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