Sunteți pe pagina 1din 218

Curs de Analiză numerică

Radu Trîmbiţaş

26 iunie 2023
Rezumat

Tentativa de note de curs de Analiză numerică. Inspirat dupa [5].


Cuprins

Cuprins 1

1 Aritmetică cu precizie finită 8


1.1 Un exemplu introductiv . . . . . . . . . . . . . . . . . . . . . 9
1.2 Numere reale şi numere maşină . . . . . . . . . . . . . . . . . 12
1.3 Standardul IEEE . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3.1 Simpla precizie . . . . . . . . . . . . . . . . . . . . . . 14
1.3.2 Dubla precizie . . . . . . . . . . . . . . . . . . . . . . 16
1.4 Erori de rotunjire . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.4.1 Modelul standard al aritmeticii . . . . . . . . . . . . . 19
1.4.2 Anularea . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.5 Condiţionarea unei probleme . . . . . . . . . . . . . . . . . . 25
1.5.1 Norme . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.5.2 Notaţii asimptotice . . . . . . . . . . . . . . . . . . . . 27
1.5.3 Numărul de condiţionare . . . . . . . . . . . . . . . . 30
1.6 Algoritmi stabili şi instabili . . . . . . . . . . . . . . . . . . . 35
1.6.1 Stabilitatea progresivă . . . . . . . . . . . . . . . . . . 35
1.6.2 Stabilitatea regresivă . . . . . . . . . . . . . . . . . . . 39
1.7 Calculul cu numere-maşină: ponturi şi trucuri . . . . . . . . . 40
1.7.1 Asociativitatea şi distributivitatea . . . . . . . . . . . 40
1.7.2 Algoritmul de sumare al lui W. Kahan . . . . . . . . . 44
1.7.3 Numere mici . . . . . . . . . . . . . . . . . . . . . . . 44
1.7.4 Monotonia . . . . . . . . . . . . . . . . . . . . . . . . 45
1.7.5 Evitarea depăşirii superioare . . . . . . . . . . . . . . 47
1.7.6 Testarea depăşirii superioare . . . . . . . . . . . . . . 47
1.7.7 Evitarea anulării . . . . . . . . . . . . . . . . . . . . . 48
1.7.8 Calculul mediei şi deviaţiei standard . . . . . . . . . . 50
1.8 Criterii de oprire . . . . . . . . . . . . . . . . . . . . . . . . . 54
1.8.1 Algoritmi independenţi de maşină . . . . . . . . . . . 55

1
1.8.2 Testarea aproximaţiilor succesive . . . . . . . . . . . . 57
1.8.3 Verificarea reziduului . . . . . . . . . . . . . . . . . . . 58

2 Sisteme de ecuaţii liniare 60


2.1 Metoda eliminării a lui Gauss . . . . . . . . . . . . . . . . . . 61
2.1.1 Factorizarea LU . . . . . . . . . . . . . . . . . . . . . 68
2.1.2 Stabilitatea regresivă . . . . . . . . . . . . . . . . . . . 71
2.1.3 Pivotare şi scalare . . . . . . . . . . . . . . . . . . . . 74
2.1.4 Sumă de matrice de rang unu . . . . . . . . . . . . . . 79
2.2 Condiţionarea unui sistem de ecuaţii liniare . . . . . . . . . . 80
2.3 Descompunere Cholesky . . . . . . . . . . . . . . . . . . . . . 86
2.3.1 Matrice simetrice pozitiv definite . . . . . . . . . . . . 86
2.3.2 Stabilitate şi pivotare . . . . . . . . . . . . . . . . . . 90
2.4 Eliminare cu rotaţii Givens . . . . . . . . . . . . . . . . . . . 94
2.5 Matrice bandă . . . . . . . . . . . . . . . . . . . . . . . . . . 96
2.5.1 Memorarea matricelor bandă . . . . . . . . . . . . . . 96
2.5.2 Sisteme tridiagonale . . . . . . . . . . . . . . . . . . . 98
2.5.3 Rezolvarea sistemelor bandă cu pivotare . . . . . . . . 100
2.5.4 Utilizarea rotaţiilor Givens . . . . . . . . . . . . . . . 101

3 Interpolare 106
3.1 Exemple introductive . . . . . . . . . . . . . . . . . . . . . . . 106
3.2 Interpolare polinomială . . . . . . . . . . . . . . . . . . . . . 110
3.2.1 Polinoamele Lagrange . . . . . . . . . . . . . . . . . . 111
3.2.2 Eroarea în interpolarea polinomială . . . . . . . . . . . 114
3.2.3 Formula baricentrică . . . . . . . . . . . . . . . . . . . 117
3.2.4 Formula de interpolare a lui Newton . . . . . . . . . . 118
3.2.5 Interpolare cu polinoame ortogonale . . . . . . . . . . 124
3.2.6 Schimbarea bazei. Relaţia cu LU şi QR . . . . . . . . 126
3.2.7 Interpolare Aitken-Neville . . . . . . . . . . . . . . . . 134
3.2.8 Extrapolare . . . . . . . . . . . . . . . . . . . . . . . . 137
3.3 Interpolare polinomială pe porţiuni . . . . . . . . . . . . . . . 140
3.3.1 Spline cubice clasice . . . . . . . . . . . . . . . . . . . 141
3.3.2 Derivatele funcţiei spline . . . . . . . . . . . . . . . . . 146
3.3.3 Formula Sherman–Morrison–Woodbury . . . . . . . . 154
3.3.4 Curbe spline . . . . . . . . . . . . . . . . . . . . . . . 156
3.4 Interpolare trigonometrică . . . . . . . . . . . . . . . . . . . . 157
3.4.1 Polinoame trigonometrice . . . . . . . . . . . . . . . . 159
3.4.2 Transformata Fourier rapidă (FFT) . . . . . . . . . . 161
3.4.3 Eroarea în interpolarea trigonometrică . . . . . . . . 163

2
3.4.4 Convoluţie cu FFT . . . . . . . . . . . . . . . . . . . . 168

4 Aproximare în sensul celor mai mici pătrate 171


4.1 Exemple introductive . . . . . . . . . . . . . . . . . . . . . . . 172
4.2 Problema liniară de ASCMMP şi ecuaţiile normale . . . . . . 177

5 Rezolvarea numerică a ecuaţiilor diferenţiale ordinare 182


5.1 Introductory Examples . . . . . . . . . . . . . . . . . . . . . . 183
5.2 Basic Notation and Solution Techniques . . . . . . . . . . . . 186
5.2.1 Notation, Existence of Solutions . . . . . . . . . . . . 186
5.2.2 Analytical and Numerical Solutions . . . . . . . . . . 189
5.2.3 Solution by Taylor Expansions . . . . . . . . . . . . . 191
5.2.4 Computing with Power Series . . . . . . . . . . . . . . 194
5.2.5 Euler’s Method . . . . . . . . . . . . . . . . . . . . . 198
5.2.6 Autonomous ODE, Reduction to First Order System . 205
5.3 Runge-Kutta Methods . . . . . . . . . . . . . . . . . . . . . . 206
5.3.1 Explicit Runge-Kutta Methods . . . . . . . . . . . . . 207
5.3.2 Local Truncation Error . . . . . . . . . . . . . . . . . 209
5.3.3 Order Conditions . . . . . . . . . . . . . . . . . . . . . 210

A Anexa 213

Bibliografie 214

Index 215

3
Lista surselor MATLAB

1.1 Calculul lui π, versiunea naivă . . . . . . . . . . . . . . . . . . 10


1.2 Calculul lui π, versiune stabilă . . . . . . . . . . . . . . . . . 21
1.3 Kahan’s Summation . . . . . . . . . . . . . . . . . . . . . . . 44
1.4 Computation of ex , Naive Version function . . . . . . . . . . 48
1.5 Media şi deviaţia standard – calcul clasic instabil . . . . . . . 52
1.6 Media şi deviaţia standard – calcul stabil . . . . . . . . . . . 54
1.7 Calculul stabil al lui ex . . . . . . . . . . . . . . . . . . . . . . 55

1.8 Calculul lui a independent de maşină . . . . . . . . . . . . . 57
2.1 Substituţie inversă . . . . . . . . . . . . . . . . . . . . . . . . 62
2.2 Substituţie inversă, varianta SAXPY . . . . . . . . . . . . . 62
2.3 Eliminare gaussiană cu pivotare parţială . . . . . . . . . . . . 67
2.4 Eliminare gaussiană cu pivotare completă . . . . . . . . . . . 78
2.5 Descompunere LUP cu modificări de rang I (produs exterior) 80
2.6 Descompunere Cholesky . . . . . . . . . . . . . . . . . . . . . 90
2.7 Rezolvarea unui sistem liniar cu rotaţii Givens . . . . . . . . 95
2.8 Transformarea într-o matrice bandă . . . . . . . . . . . . . . 98
2.9 Eliminare gaussiană pentru sisteme tridiagonale — algoritmul
lui Thomas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
2.10 Eliminare gaussiană cu pivotare parţială pentru matrice bandă102
2.11 Eliminare gaussiană cu pivotare parţială pentru matrice bandă
– continuare . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
2.12 Rezolvarea unui sistem tridiagonal cu rotaţii Givens . . . . . 105
3.1 Interpolare Lagrange . . . . . . . . . . . . . . . . . . . . . . . 113
3.2 Polinomul Lagrange fundamental ℓk . . . . . . . . . . . . . . 113
3.3 Ponderi Lagrange baricentrice . . . . . . . . . . . . . . . . . . 118
3.4 Interpolare Lagrange baricentrică . . . . . . . . . . . . . . . . 119
3.5 Coeficienţii polinomului de interpolare Newton (diferenţe di-
vizate) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
3.6 Interpolare Newton . . . . . . . . . . . . . . . . . . . . . . . . 123
3.7 Schema Aitken-Neville . . . . . . . . . . . . . . . . . . . . . . 136

4
3.8 Extrapolare Aitken-Neville . . . . . . . . . . . . . . . . . . . 139
3.9 Spline cubic generic . . . . . . . . . . . . . . . . . . . . . . . 144
3.10 Cautare binară . . . . . . . . . . . . . . . . . . . . . . . . . . 145
5.1 Metoda lui Euler pentru EDO . . . . . . . . . . . . . . . . . . 201
5.2 Metoda lui Runge pentru EDO . . . . . . . . . . . . . . . . . 210

5
Lista surselor MuPAD

6
Prefaţă

Aceasta este o prefaţă. It is an unnumbered chapter, and since it appears


before the first numbered chapter the page numbers are typeset in lower case
Roman. The markboth TeX field at the beginning of this paragraph sets the
correct running page heading for the Preface portion of the document. The
preface does not appear in the table of contents, but it can be added to the
table of contents by inserting a TeX field containing \addcontentsline{toc}{chapter}{Preface}
at the beginning of this paragraph.
The following sections have been used to build the first year numerical
analysis course at the University of Geneva in 2011–12 (54 hours of lectures).
1. Finite precision arithmetic (2.1–2.6)
2. Linear systems (3.2–3.4)
3. Interpolation and FFT (4.2.1–4.2.4, 4.3.1, 4.4)
4. Nonlinear equations (5.2.1–5.2.3, 5.4)
5. Linear and nonlinear least squares (6.1–6.8, 6.8.2, 6.8.3, 6.5.1, 6.5.2)
6. Iterative methods (11.1–11.2.5, 11.3.2–11.3.4, 11.7.1)
7. Eigenvalue problems (7.1, 7.2, 7.4, 7.5.2, 7.6)
8. Singular value decomposition (6.3)
9. Numerical integration (9.1, 9.2, 9.3, 9.4.1–9.4.2)
10. Ordinary differential equations (10.1, 10.3)

7
Capitolul 1

Aritmetică cu precizie finită

Aritmetica cu precizie finită apare în toate calculele numerice, e.g. în


MATLAB; dor calculelele simbolice, cum sunt cele din Maple sau MuPAD,
sunt independente în mare măsură de aritmetica cu precizie finită. Din punct
de vedere istoric, când inventarea computerelor care au permis efectuarea
unui număr mare de operaţii în succesiune rapidă, nimeni nu ştia ce in-
fluenţă va avea aritmetica cu precizie finită asupra acestor multe operaţii:
aceste erori de rotunjire se vor însuma rapid şi vor distruge rezultatele? Se
vor anula statistic? Prima perioadă a Analizei numerice a fost dominată de
studiul erorilor de rotunjire şi acest domeniu în dezvotare a făcut analiza
numerică mai puţin atractivă. Din fericire, această viziune asupra Analizei
numerice s-a schimbat de atunci, iar centrul atenţiei s-a mutat pe studiul
algoritmilor de rezolvare a problemelor din matematica continuă1 . Sunt to-
tuşi câteva capcane pe care fiecare persoană implicată în calculul ştiinţific
trebuie să le cunoască şi asta motivează prezentul capitol. După un exemplu
introductiv din secţiunea 1.1, vom prezenta diferenţa dintre numerele reale
şi numerele maşină (numerele reprezentate în calculator) în secţiunea 1.2,
la un nivel generic, abstracton a generic, abstract şi vom da expunerii un
aspect mai practic, legat de standardul aritmeticii IEEE în secţiunea 1.3.
Vom discuta efectul erorilor de rotunjire asupra operaţiilor în secţiunea 1.4
şi apoi vom explica anularea catastrofală care apare la calculul diferenţelor
cantităţilor apropiate. În secţiunea 1.5, vom explica în termeni foarte ge-
nerali ce este condiţionarea unei probleme şi vom arăta apoi în secţiunea
1.6 două proprietăţi ale algoritmilor pentru rezolvarea unei probleme date,
şi anume stabilitatea progresivă şi cea regresivă. Înţelegerea numărului de
condiţionare şi a stabilităţii sunt elementele care au permis specialiştilor în
1
Nick Trefethen, The definition of numerical analysis, SIAM News, November 1992

8
Analiza numerică să se îndepărteze de studiul erorilor de rotunjire şi să se
focalizeze pe dezvoltarea algoritmilor. Secţiunile 1.7 şi 1.8 reprezintă un te-
zaur de trucuri şi şmecherii aplicabile la calculele în aritmetica de precizie
finită.

1.1 Un exemplu introductiv


Exemplul este din [5]. O problemă celebră a antichităţii este să se con-
struiască un pătrat care are aria egală cu cea a cercului unitate. Problema
determinării unei metode de transformare a cercului în acest mod (cua-
dratura cercului) a rămas nerezolvată până în secolul al 19-lea, când s-a
demonstrat cu ajutorul teoriei Galois că nu poate fi rezolvată cu rigla şi
compasul.
Ştim că aria cercului este A = πr2 , unde r este raza cercului. O apro-
ximare se obţine înscriind poligoane regulate în cerc şi calculând ariile lor.
Aproximarea se înjumătăţeşte crescând numărul de laturi. Arhimede  a reuşit 
să producă un poligon cu 96 de laturi şi a încadrat π în intervalul 3 71
10
, 3 17
. Lungimea intervalului este 1/497 = 0.00201207243 — o aproximare bună
pentru aplicaţiile din acel timp.

Figura 1.1: Aproximarea lui π

Pentru a calcula o astfel de aproximaţie poligonală a lui π, să considerăm


figura 1.1. Fără a restrânge generalitaea, putem presupune că r = 1. Atuni

9
aria Fn a triunghiului isocel ABC cu unghiul la centru αn := 2π
n este
αn αn
Fn = cos sin ,
2 2
aiar aria poligonului regulat corespunzător cu n laturi devine
n αn αn n n 2π
 
An = nFn = 2 cos sin = sin αn = sin .
2 2 2 2 2 n
Evident, calculul aproximantei An utilizând π poate părea vicioasă. Din
fericire, A2n poate fi dedusă din An printr-o formulă simplă, exprimând
sin(αn /2) în funcţie de sin αn cu formula trigonometrică:
s
1 − cos αn 1− 1 − sin2 αn
r p
αn
sin = = . (1.1)
2 2 2
Am obţinut astfel o relaţie de recurenţă pentru sin(αn /2) din sin αn .
Pentru a iniţializa recurenţa vom calcula aria A6 a hexagonului regulat.
Lungimea laturii fiecăruia din cele şase triunghiuri
√ echilaterale este 1 iar
unghiul la centru este α6 = 3 , de unde sin α6 = 2 . Deci, aria triunghiului
π 3
√ √
este F6 = 43 sin αn sin αn , iar A6 = 23 . Am obţinut un program pentru
calculul şirului de aproximaţii An (vezi algoritmul 1.1).

Sursa MATLAB 1.1 Calculul lui π, versiunea naivă


s=sqrt(3)/2; A=3*s; n=6; % initialization
z=[A-pi n A s]; % store the results
while s>1e-10 % termination if s=sin(alpha) small
s=sqrt((1-sqrt(1-s*s))/2); % new sin(alpha/2) value
n=2*n; A=n/2*s; % A=new polygon area
z=[z; A-pi n A s];
end
m=length(z);
for i=1:m
fprintf('%10d %20.15f %20.15f %20.15f\n',...
z(i,2),z(i,3),z(i,1),z(i,4))
end

Rezultatele, afişate în tabela 1.1, nu sunt cele aşteptate: iniţial, observăm


că An se apropie de π, dar pentru n > 49152, eroarea începe să crească şi
la final se obţine An = 0 ?! Deşi teoria şi programul sunt ambele corecte,
rezultatele sunt incorecte. Vom explica în acest capitol de ce se tâmplă aşa.

10
n An An − π sin αn
6 2.598076211353316 -0.543516442236477 0.866025403784439
12 3.000000000000000 -0.141592653589794 0.500000000000000
24 3.105828541230250 -0.035764112359543 0.258819045102521
48 3.132628613281237 -0.008964040308556 0.130526192220052
96 3.139350203046872 -0.002242450542921 0.065403129230143
192 3.141031950890530 -0.000560702699263 0.032719082821776
384 3.141452472285344 -0.000140181304449 0.016361731626486
768 3.141557607911622 -0.000035045678171 0.008181139603937
1536 3.141583892148936 -0.000008761440857 0.004090604026236
3072 3.141590463236762 -0.000002190353031 0.002045306291170
6144 3.141592106043048 -0.000000547546745 0.001022653680353
12288 3.141592516588155 -0.000000137001638 0.000511326906997
24576 3.141592618640789 -0.000000034949004 0.000255663461803
49152 3.141592645321216 -0.000000008268577 0.000127831731987
98304 3.141592645321216 -0.000000008268577 0.000063915865994
196608 3.141592645321216 -0.000000008268577 0.000031957932997
393216 3.141592645321216 -0.000000008268577 0.000015978966498
786432 3.141593669849427 0.000001016259634 0.000007989485855
1572864 3.141592303811738 -0.000000349778055 0.000003994741190
3145728 3.141608696224804 0.000016042635011 0.000001997381017
6291456 3.141586839655041 -0.000005813934752 0.000000998683561
12582912 3.141674265021758 0.000081611431964 0.000000499355676
25165824 3.141674265021758 0.000081611431964 0.000000249677838
50331648 3.143072740170040 0.001480086580246 0.000000124894489
100663296 3.159806164941135 0.018213511351342 0.000000062779708
201326592 3.181980515339464 0.040387861749671 0.000000031610136
402653184 3.354101966249685 0.212509312659892 0.000000016660005
805306368 4.242640687119286 1.101048033529493 0.000000010536712
1610612736 6.000000000000000 2.858407346410207 0.000000007450581
3221225472 0.000000000000000 -3.141592653589793 0.000000000000000

Tabela 1.1: Calcul instabil al lui π

11
1.2 Numere reale şi numere maşină
OFiecare calculator este un automat finit. Aceasta implică că putem me-
mora doar un număr finit de numere, cu lungime finită şi să efectuăm doar un
număr finit de operaţii. În matematică, obişnuim să lucråm cu numere reale
R ce acoperă intervalul (−∞, ∞), dar în calculator, trebuie să ne mulţumim
cu o mulţime discretă, finită de numere maşină M= {−a emax }.
emin , . . . , a
Deci, orice număr real a trebuie transformat într-un număr maşină a e pentru
a fi utilizat în calculator. De fapt, un întreg interval din mulţimea numere-
lor reale este transformat într-un singur număr maşină, aşa cum se arată în
figura 1.2.

Figura 1.2: Mapping of real numbers R onto machine numbers M

în zilele noastre, numerele maşină se reprezintă cel mai frecvent în sis-


temul binar. În general, putem utiliza orice bază B pentru a reprezenta
numerele. Un număr maşină real sau număr în virgulă flotantă este format
din două părţi, o mantisă (sau semnificant) m şi un exponent e
e=
a ±m × B e
m= D.D · · · D semnificant
e= D···D exponent
unde D ∈ {0, 1, . . . , B − 1} desemnează o cifră (digit). Pentru a face repre-
zentarea numărului maşină unică (de nota că, de exemplu 1.2345 × 103 =
0.0012345 × 106 ), vom impune pentru un număr maşină a e ̸= 0 condiţia ca
prima cifră din semnificant înainte de marca zecimală să fie nenulă; ast-
fel de numere se numesc normalizate. O caracteristică definitorie a oricărei
aritmetici de precizie finită este numărul de cifre utilizate pentru mantisă
şi exponent: numărul de cifre din exponent defineşte domeniul de variaţie
al numerelor maşină, în timp ce numărul de cifre din semnificant defineşte
precizia.
Mai concret, [6] [9], o aritmetică de precizie finită este definită prin patru
parametrii întregi: B, baza, p, numărul de cifre din semnificant, şi l şi u ce
definesc domeniul de variaţie al exponentului: l ≤ e ≤ u.

12
Precizia maşinii este descrisă de numărul real eps. Istoric, eps este definit
ca cel mai mic număr pozitiv a e ∈ M astfel încât ae +1 ̸= 1 când adunarea
se realizează pe calculator. Deoarece această definiţie implică detalii despre
comportarea aritmeticii în virgulă flotantă, care nu sunt uşor aceesibile, o
definiţie mai nouă a lui eps este distanţa dintre două numere în virgulă
floantă dintre 1 şi B (de obicei B = 2). Definiţia curentă se bazează doar
pe modul de reprezentare al numerelor.
Calculatoarele simple şi cele de buzunar utilizează sistemul zecimal (B =
10). De obicei sunt p = 10 cifre zecimale pentru mantisă şi 2 pentru exponent
(l = −99 şi u = 99). În această aritmetică de precizie finită avem

• eps = 0.000000001 = 1.000000000 × 10−9 ,

• cel mai mare număr maşină

emax = 9.999999999 × 10+99 ,


a

• cel mai mic număr maşină

emin = −9.999999999 × 10+99 ,


a

• cel mai mic număr maşină pozitiv (normalizat)

e+ = 1.000000000 × 10−99 .
a

Calculatoarele timpurii, de exemplu MARK 1 proiectat de Howard Aiken


şi Grace Hopper la Harvard şi construit în 1944, erau maşini zecimale.
În contrast, primul calculator programabil, Z3, construit de inginerul
civil german Konrad Zuse şi prezentat în 1941 doar unui grup de experţi,
utiliza sistemul binar. Z3 lucra cu un exponent de 7 biţi şi o mantisă de 14
biţi (de fapt 15, deoarece numerele erau normalizate). Domeniul numere-
lor maşină pozitive era intervalul [2−63 , 1.11111111111111 × 262 ] ≈ [1.08 ×
10−19 , 9.22 × 1018 ].
În Maple (un sistem de calcul simbolic), calculele numerice se reali-
zează în baza 10. Numărul de cifre ale semnificantului sunt definite de
variabila Digits, care paote fi aleasă liber de utilizator. Numărul de ci-
fre ale exponentului este dependent de lungimea cuvântului calculatoru-
lui — pentru maşini pe 64 de biţi, avem un exponent maxim uriaş de
u = 263 = 9223372036854775806.

13
1.3 Standardul IEEE
Standardul ANSI/IEEE 754 pentru numere în virgulă flotantă a fost
adoptat în 1985 şi revizuit în 2008 şi 2019. Baza este B = 2.

1.3.1 Simpla precizie


Reprezentarea standard IEEE în format simplă precizie utilizează un
cuvânt de 32 de biţi numerotaţi de la 0 la 31 de la stânga la dreapta. Primul
bit S este bitul de semn, următorii 8 biţi E sunt biţii exponentului, e =
EEEEEEEE, iar ultimii 23 de biţi F sunt biţii semnificantului m:
e m
z }| { z }| {
S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
0 1 8 9 31

Valoarea a
e reprezentată de cuvântul de 32 de biţi se defineşte după cum
urmează:

numere normale: Dacă 0 < e < 255, atunci a e = (−1)S × 2e−127 × 1.m,
unde 1.m este numărul binar obţinut prin prefixarea lui m cu bitul
implicit (bit ascuns) 1 şi un punct binar (marcă binară).

numere subnormale: Dacă e = 0 şi m ̸= 0, atunci ae = (−1)S × 2−126 ×


0.m. Aceste numere sunt cunoscute sub numele de numere denorma-
lizate (sau subnormale) .

• Dacă e = 0 şi m = 0 şi S = 1, atunci a
e = −0.
• Dacă e = 0 şi m = 0 şi S = 0, atunci a
e = +0.

excepţii: • Dacă e = 255 şi m ̸= 0, atunci a


e =NaN (Not a number )
• Dacă e = 255 şi m = 0 şi S = 1, atunci a
e = −Inf.
e = Inf.
• Dacă e = 255 şi m = 0 şi S = 0, atunci a

Exemple
0 10000000 00000000000000000000000 = +1 x 2^(128-127) x 1.0 = 2
0 10000001 10100000000000000000000 = +1 x 2^(129-127) x 1.101 = 6.5
1 10000001 10100000000000000000000 = -1 x 2^(129-127) x 1.101 = -6.5
0 00000000 00000000000000000000000 = 0
1 00000000 00000000000000000000000 = -0
0 11111111 00000000000000000000000 = Inf

14
1 11111111 00000000000000000000000 = -Inf
0 11111111 00000100000000000000000 = NaN
1 11111111 00100010001001010101010 = NaN
0 00000001 00000000000000000000000 = +1 x 2^(1-127) x 1.0 = 2^(-126)
0 00000000 10000000000000000000000 = +1 x 2^(-126) x 0.1 = 2^(-127)
0 00000000 00000000000000000000001
= +1 x 2^(-126) x 0.00000000000000000000001 = 2^(-149)
= smallest positive denormalized machine number
În MATLAB, numerele reale se reprezintă de obicei în dublă precizie.
Funcţia single se poate utiliza pentru conversia numerelor în simplă pre-
cizie. MATLAB poate tipări numere reale în format hexazecimal, care este
convenabil pentru examinarea reprezentării lor interne:
>> format hex
>> x=single(2)
x =
40000000
>> 2
ans =
4000000000000000
>> s=realmin('single')*eps('single')
s =
00000001
>> format long
>> s
s =
1.4012985e-45
>> s/2
ans =
0
% Exceptions
>> z=sin(0)/sqrt(0)
Warning: Divide by zero.
z =
NaN
>> y=log(0)
Warning: Log of zero.
y =
-Inf
>> t=cot(0)

15
Warning: Divide by zero.
> In cot at 13
t =
Inf

Se poate vedea că x reprezintă numărul 2 în simplă precizie. Funcţiile


realmin şi eps cu parametrul ’single’ calculează constantele maşinii în
simplă precizie. Aceasta înseamnă că s este cel mai mic număr denormalizat
în simplă precizie. Împărţind s la 2 se obţine zero din cauza depăşirii infe-
rioare. Calculul lui z ne dă o expresie nedefinită (NaN) chiar dacă limita
este definită. Ultimele două calcule pentru y şi t ilustrează excepţiile Inf şi
-Inf.

1.3.2 Dubla precizie


Reprezentarea standard IEEE în dublă precizie în virgulă flotantă utili-
zează un cuvânt de 64 de biţi numerotaţi de la 0 la 63 de la stânga la dreapta.
Primul bit S este bitul de semn, următorii biţi E sunt biţii de exponent ai
lui e iar ultimii 52 de biţi F reprezintă mantisa m:
e m
z }| { z }| {
S EEEEEEEEEEE FFFFFFFF ···FFFFFF
0 1 11 12 63

Valoarea a
e reprezentată de cuvântul de 64 de biţi se defineşte după cum
urmează:

numere normale: Dacă 0 < e < 2047, atunci a e = (−1)S × 2e−1023 × 1.m,
unde 1.m este numărul binar obţinut prefixând m cu bitul ascuns 1 şi
punctul binar.

numere subnormale : Dacă e = 0 şi m ̸= 0, atunci ae = (−1)S × 2−1022 ×


0.m, care sunt din nou numere denormalizate (ori subnormale) .

• Dacă e = 0 şi m = 0 şi S = 1, atunci a
e = −0.
• Dacă e = 0 şi m = 0 şi S = 0, atunci a
e = +0.

excepţii: • Dacă e = 2047 şi m ̸= 0, atunci a


e =NaN (Not a number )
• Dacă e = 2047 şi m = 0 şi S = 1, atunci a
e = −Inf.
• Dacă e = 2047 şi m = 0 şi S = 0, atunci a
e = Inf.

16
În MATLAB, calculele reale se realizează implicit în IEEE dublă preci-
zie. Utilizând din nou formatul hexazecimal din MATLAB pentru a vedea
reprezentarea internă, se obţine
>> format hex
>> 2
ans = 4000000000000000
Dacă expandăm fiecare cifră hexazecimală în patru cifre binare, obţinem
pentru numărul 2:
0 10000000000 0000000000000000000000000000000000000000000000000000
Interpretarea este: +1 × 21024−1023 × 1.0 = 2.
>> 6.5
ans =
401a000000000000
%binary
0 10000000001 1010000000000000000000000000000000000000000000000000
Numărul rezultat este +1 × 21025−1023 × (1 + 12 + 18) = 6.5.
Din acest moment, discuţia noastră se va focaliza pe aritmetica în dublă
precizie, deoarece acesta este modul uzual de calcul cu numere reale în stan-
dardul IEEE. Mai mult, vom insita pe modul în care standardul IEEE este
utilizat în MATLAB. În alte limbaje, de nivel mai coborât, comportarea arit-
meticii IEEE poate fi adaptatå, e.g. tratarea excepţiilor poate fi specificată
explicit.

• Precizia maşinii este eps = 2−52 .


• Cel mai mare număr maşină a
emax este desemnat prin realmax. De
notat că

>> realmax
ans =
1.7977e+308
>> log2(ans)
ans =
1024
>> 2^1024
ans =
Inf

17
Aceasta pare o contradicţie la prima vedere, deoarece cel mai mare ex-
ponent este 22046−1023 = 21023 conform convenţiilor IEEE. Dar realmax
este numărul cu cel mai mare exponent posibil şi cu mantisa F for-
mată numai din cifre unu:

>> format hex


>> realmax
ans =
7fefffffffffffff
>> num2bin(realmax,1)
ans =
'0 11111111110 1111111111111111111111111111111111111111111111111111'

Valoarea este

v = +1 × 22046−1023 × 1. 1| .{z
. . 1}
52bits
1 1 1
 2  52 !
=2 1023
1+ + + ···
2 2 2
 53
1− 1
2
= 21023 = 21023 (2 − eps)
1− 1
2

Chiar dacă MATLAB raportează log2(realmax)=1024, realmax nu


este egal cu 21024 , ci cu (2 − eps) × 21023 ; luând logaritmul lui realmax
ne dă 1024 doar datorită rotunjirilor. Efecte similare de rotunjire apar
de asemenea şi pentru numere maşină care sunt un pic mai mici decât
realmax.

• Domeniul de calcul este intervalul [−realmax, realmax]. Dacă o ope-


raţie produce un rezultat înafara acestui interval, spunem că apare
depăşire superioară (overflow). Înainte de standardul IEEE, calculul
se oprea în acest caz cu un mesaj de eroare. Acum rezultatului unei
depăşiri i se atribuie numărul ±Inf.

• Cel mai mic număr pozitiv normalizat este realmin = 2−1022 .

• IEEE permite calcule cu numere denormalizate. Numerele pozitive de-


normalizate sunt în intervalul [realmin ∗ eps, realmin]. Dacă o ope-
raţie produce un număr pozitiv mai mic decât realmin ∗ eps, atunci

18
spunem că a apărut depăşire inferioară (underflow). Deoarece un astfel
de rezultat nu poate fi reprezentat, i se atribuie valoarea zero.

• Când se fac calcule cu numere denormalizate, se poate produce o pier-


dere a preciziei. Considerăm următorul program MATLAB:

>> res=pi*realmin/123456789101112
res =
5.681754927174335e-322
>> res2=res*123456789101112/realmin
res2 =
3.152485105545972
>> pi
ans =
3.141592653589793

Primul rezultat res este un număr denormalizat, care nu mai poate


fi reprezentat cu precizie completă. Dacă inversăm operaţia şi calcu-
lăm res2, obţinem un rezultat care conţine doar două cifre zecimale
corecte. Se recomandă evitarea utilizării numerelor denormalizate ori
de câte ori este posibil.

1.4 Erori de rotunjire


1.4.1 Modelul standard al aritmeticii
Fie a
e şi e
b două numere maşină. Atunci c = a × b nu va mai fi în general
un număr maşină, deoarece produsul a două numere va avea de două ori
mai multe cifre. Rezultatul calculat se va rotunji la numărul maşină ce cel
mai apropiat de c.
Ca exemplu, să considerăm numerele zecimale de 8 cifre

e = 1.2345678 şi e
a b = 1.1111111,

al căror produs este

c = 1.37174198628258 şi ce = 1.3717420.

Eroare de rotunjire absolută este diferenţa ra = ce −c = 1.371742e − 8, iar


ra
r= = 1e − 8
c

19
se numeşte eroare de rotunjire relativă.
Pe calculatoarele actuale, operaţiile aritmetice de bază respectă modelul
standard al aritmeticii: pentru a, b ∈ M, avem

a ⊚ b = (a ◦ b) (1 + r) (1.2)

unde r este eroarea relativă de rotunjire şi |r| < eps, epsilon-ul maşinii.
Vom nota cu ◦ ∈ {+, −, ×, /} operaţia aritmetică de bază şi cu ⊚ ope-
raţia echivalentă din calculator.
O altă interpretare a modelului standard al aritmeticii este datorată lui
Wilkinson. În cele ce urmează nu vom mai utiliza simbolul de înmulţire ×
pentru operaţia exactă; este o practică comună în algebră să nu se noteze
înmulţirea cu nici un simbol: ab ⇐⇒ a × b. Considerăm operaţiile

Adunare: a ⊕ b = (a + b)(1 + r) = (a + ar) + (b + br) = a


e+e
b

Scădere: a ⊖ b = (a − b)(1 + r) = (a + ar) − (b + br) = a


e−e
b

Înmulţire: a ⊗ b = ab(1 + r) = a(b + br) = aeb

Împărţire: a ⊘ b = (a/b)(1 + r) = (a + ar)/b = a


e/b

Toate operaţiile de mai sus satisfac principiul lui Wilkinson

Rezultatul unui calcul numeric pe computer este rezultatul


unui calcul exact cu date iniţiale uşor perturbate.

De exemplu, rezultatul înmulţirii a ⊗ b este rezultatul exact aeb al înmul-


ţirii cu operandul uşor perturbat eb = b + br. Ca o consecinţă a principiului
lui Wilkinson, trebuie să studiem efectul pe care micile perturbaţii în da-
tele iniţiale îl au asupra rezultatului unui calcul. Acest lucru se realizează în
secţiunea 1.6.

1.4.2 Anularea
Un tip special de eroare de rotunjire este anularea (cancellation). Dacă
scădem două numere aproape egale, cifrele mai semnificative se vor anula.
Considerăm următoarele numere cu 5 cifre zecimale:
1.2345e0
1.2344e0
0.0001e0 = 1.0000e − 4
Dacă cele două numere ar fi fost exacte, rezultatul dat de calculator ar
fi fost exact. Dar dacă primele două numere ar fi fost obţinute din calcule

20
precedente şi ar fi fost afectate de calcule de rotunjire, rezultatul ar fi fost în
cel mai bun caz 1.XXXXe−4, unde cifrele notate prin X sunt necunoscute.
Exact acest lucru s-a întâmplat şi în exemplul de la începutul capitolului.
Pentru a calcula sin(α/2) din sin α, am folosit recurenţa (1.1):
s
1− 1 − sin2 αn
p
αn
sin = .
2 2

Deoarece sin αn → 0, numărătorul din membrul drept este 1 − 1 − ε2 , cu
ε = sin αn mic şi suferă de anulare severă. Acesta este motivul pentru care
algoritmul lucrează aşa de prost, chiar dacă teoria şi programul sunt ambele
corecte.
Este posibil să rearanjăm în acest caz calculele şi să evităm anularea:
s v
1− 1− sin2 α u 1 − 1 − sin2 αn 1 + 1 − sin2 αn
p u p p
αn n
sin = = t
2 2 2 1+ 1 − sin2 αn
p
v
u 1 − 1 − sin2 αn sin αn
u 
=t   = r  .
2 1+ 1 − sin αn
p
2
2 1+ 1− sin2 αn
p

Ultima expresie nu mai suferă de anulare şi obţinem un nou program (vezi


susa MATLAB 1.2)

Sursa MATLAB 1.2 Calculul lui π, versiune stabilă


oldA=0;s=sqrt(3)/2; newA=3*s; n=6; % initialization
z=[newA-pi n newA s]; % store the results
%The stopping criterion
while newA>oldA % quit if area does not increase
oldA=newA;
s=s/sqrt(2*(1+sqrt((1+s)*(1-s)))); % new sine value
n=2*n; newA=n/2*s;
z=[z; newA-pi n newA s];
end
m=length(z);
for i=1:m
fprintf('%10d %20.15f %20.15f\n',z(i,2),z(i,3),z(i,1))
end

De data aceasta convege către valoarea corectă a lui π (vezi tabela 1.2).

21
De remarcat criterul de oprire elegant: deoarece suprafaţa următorului po-
ligon creşte, teoretic avem

A6 < · · · < An < A2n < π.


Totuşi, în aritmetica cu precizie finită, acest lucru nu poate avea loc la
nesfârşit, deoarece avem o mulţime finită de numere maşină. Astfel, la un
moment dat, trebuie să apară situaţia An ≥ A2n şi aceasta va fi condiţia
de oprire a iteraţiilor. De notat că această condiţie este independentă de
maşină, în sensul că iteraţia se va termina întotdeauna, atât timp cât vom
avea aritmetică de precizie finită şi atunci când se termină, ne va da cea mai
bună aproximaţie pentru prezizia maşinii. Mai multe exemple de algoritmi
independenţi de maşină se vor da în secţiunea 1.8.1.
Un al doilea exemplu în care apare anularea este problema derivării
numerice (vezi capitolul ??). Dându-se o funcţie de două ori derivabilă
f : R → R, sse cere să se calculeze derivata ei f ′ (x0 ) într-un punct x0
utilizând aproximarea

f (x0 + h) − f (x0 )
f ′ (x0 ) ≈ Dx0 ,h (f ) = .
h
Această aproximare este utilă dacă, de exemplu, f (x) este rezultatul unei si-
mulări complexe, pentru care nu este disponibilă o formulă analitică directă.
Dacă dezvoltăm f (x) în serie Taylor în jurul lui x = x0 , observăm că

h2 ′′
f (x0 + h) = f (x0 ) + hf ′ (x0 ) + f (ξ)
2
unde |ξ − x0 | ≤ h, aşa că

f (x0 + h) − f (x0 ) h
= f ′ (x0 ) + f ′′ (ξ) (1.3)
h 2
Astfel ne aşteptăm ca eroarea să descreascăliniar cu h când h → 0. Ca
exemplu, să considerăm problema evaluării lui f ′ (x0 ) pentru f (x) = ex
cu x0 = 1. Utilizăm codul următor pentru a genera un grafic al erorii de
aproximare:

h=10.^(-15:0);
f=@(x) exp(x);
x0=1;
fp=(f(x0+h)-f(x0))./h;
loglog(h,abs(fp-exp(x0)));

22
n An An − π
6 2.598076211353316 −0.543516442236477
12 3.000000000000000 −0.141592653589793
24 3.105828541230249 −0.035764112359544
48 3.132628613281238 −0.008964040308555
96 3.139350203046867 −0.002242450542926
192 3.141031950890509 −0.000560702699284
384 3.141452472285462 −0.000140181304332
768 3.141557607911858 −0.000035045677936
1536 3.141583892148318 −0.000008761441475
3072 3.141590463228050 −0.000002190361744
6144 3.141592105999271 −0.000000547590522
12288 3.141592516692156 −0.000000136897637
24576 3.141592619365383 −0.000000034224410
49152 3.141592645033690 −0.000000008556103
98304 3.141592651450766 −0.000000002139027
196608 3.141592653055036 −0.000000000534757
393216 3.141592653456104 −0.000000000133690
786432 3.141592653556371 −0.000000000033422
1572864 3.141592653581438 −0.000000000008355
3145728 3.141592653587705 −0.000000000002089
6291456 3.141592653589271 −0.000000000000522
12582912 3.141592653589663 −0.000000000000130
25165824 3.141592653589761 −0.000000000000032
50331648 3.141592653589786 −0.000000000000008
100663296 3.141592653589791 −0.000000000000002
201326592 3.141592653589794 0.000000000000000
402653184 3.141592653589794 0.000000000000001
805306368 3.141592653589794 0.000000000000001

Tabela 1.2: Calcul stabil al lui π

23
FS='FontSize';
xlabel('h',FS,14)
ylabel('Finite difference error',FS,14)

Figura 1.3 ne arată graficul obţinut. Pentru h relativ mare, i.e., pentru
h > 1e − 8, eroarea este proporţională cu h, aşa cum ne sugerează (1.3).
Totuşi, graficul ne arată că eroarea este minimă pentru h ≈ 1e − 8 şi că
ea creşte pe măsură ce h descreşte dincolo de această valoare. Motivul este
din nou anularea malignă: când h este mic, avem f (x0 + h) ≈ f (x0 ). În
particular, deoarece f (x0 ) = f ′ (x0 ) = 2.71828 . . . este de mărime mode-
rată, ne aşteptăm pentru h = 10−t ca f (x0 + h) să difere de f (x0 ) cu doar
| log10 (eps)|−t cifre, i.e., t cifre se pierd datorită aritmeticii de precizie finită.
Astfel, când h < 10−8 , pierdem mai multe cifre datorită erorilor de rotunjire
decât precizia câştigată printr-o aproximare Taylor mai bună. În general, ne
aşteptăm ca cea mai bună precizie prin această aproximaţie să fie în jur de

aproximativ eps, care este îndepărtată de precizia eps a maşinii.
102

100
Finite difference error

10-2

10-4

10-6

10-8
10-15 10-10 10-5 100
h

Figura 1.3: Results of numerical differentiation for f (x) = ex , x0 = 1

Observăm că în primul exemplu, obţinem rezultate proaste datorită unei


formule instabile, dar se poate concepe o implementare mai bună, care să
înlăture instabilitatea şi să dea rezultate mai bune. În al doilea exemplu,
totuşi este neclar cum să aranjăm calculele fără a sti formula exactă pentru
f (x); ne gândim că problema este inerent mai dificilă. Pentru a cuantifica
ce se înţelege prin problemă uşoară sau dificilă, avem nevoie de noţiune de
condiţionare.

24
1.5 Condiţionarea unei probleme
Intuitiv, condiţionarea unei probleme măsoară cât de sensibilă este pro-
blema la schimbări mici în date; dacă problema este foarte sensibilă, atunci
este inerent mai dificil să o rezolvăm utilizând aritmetica de precizie finită.
Pentru a defini corect ce înseamnă schimbări (perturbaţii) mici, avem nevoie
de noţiunea de distanţă în Rn .

1.5.1 Norme
Un mod natural de a măsura distanţa în mai multe dimensiuni este
norma euclideană, care reprezintă distanţa dintre două puncte utilizată în
viaţa de zi cu zi. Există multe alte moduri de a măsura distanţele, inclusiv
între matrice şi aceste caracterizări se numesc norme.

Definit, ia 1.1. A normă vectorială este o funcţie ∥ · ∥ : Rn → R cu propri-


etăţile

1. ∥x∥ ≥ 0 ori de câte ori x ̸= 0.

2. ∥αx∥ = |α| ∥x∥ pentru orice α ∈ R şi x ∈ Rn .

3. ∥x + y∥ ≤ ∥x∥ + ∥y∥ pentru orice x, y ∈ Rn (inegalitatea triunghiului).

De notat că normele vectoriale pot fi definite şi pentru vectori din Cn .


normele frecvent utilizate sunt
Norma spectrală sau norma euclideană sau 2-normă: ea masoară
lungimea euclidiană a unui vector şi este definită prin
v
u n
∥x∥2 := t |xi|2 .
uX

i=1

norma infinit sau norma maximului sau norma Cebîşev: măsoară


cel mai mare element în modul şi este definită prin

∥x∥∞ := max |xi |.


1≤i≤n

1-normă sau norma Minkowski: măsoară suma modulelor tuturor


elementelor şi este definită prin
n
∥x∥1 :=
X
|xi |.
i=1

25
Definit, ia 1.2. O normă matricială este o funcţie A : Rm×n → R astfel
încât

1. ∥A∥ > 0 ori de câte ori A ̸= 0.

2. ∥αA∥ = |α| ∥A∥ pentru orice α ∈ R şi A ∈ Rm×n .

3. ∥A + B∥ ≤ ∥A∥ + ∥B∥ pentru orice A, B ∈ Rm×n (inegalitatea triun-


ghiului).

Când A ∈ Rm×n reprezintă o aplicaţie liniară între spaţiile liniare nor-


mate Rn şi Rm , se obişnuieşte să se definească norma matricială indusă prin

∥A∥ = sup ∥Ax∥ , (1.4)


∥x∥=1

unde normele ∥x∥ şi ∥Ax∥ corespund normelor utilizate în Rn şi respectiv


Rm . Norma matricială indusă satisface proprietatea submultiplicativă,

∥AB∥ ≤ ∥A∥ ∥B∥ . (1.5)

Totuşi, există aplicaţii în care A nu reprezintă o aplicaţie liniară, de exemplu


în analiza datelor, unde o matrice este pur şi simplu un tablou de valori de
date. În astfel de cazuri, putem alege o normă care nu este normă matricială
indusă, cum este norma

∥A∥∆ = max |aij |,


i,j

sau norma Frobenius (vezi mai jos). Astfel de norme pot să fie submulti-
plicativa sau nu: de exemplu, norma Frobenius este submultiplicativă, dar
∥·∥∆ nu este.
Pentru normele vectoriale introduse anterior, normele matriceale induse
sunt
Norma spectrală sau norma euclideană sau 2-normă::

∥A∥2 := sup ∥Ax∥2 .


∥x∥2 =1

Se poate arăta că ∥A∥22 este egal cu cea mai mare valaore proprie a lui
AT A (sau, echivalent, cu pătratul celei mai mari valori singulare a lui A).
Rezultă că 2-norma este invariantă la transformările ortogonale, adică dacă
QT Q = I, avem ∥QA∥2 = ∥AQ∥2 = ∥A∥2 .

26
norma infinit sau norma maximului sumelor liniilor sau norma
Cebîşev:
n
∥A∥∞ := sup ∥Ax∥∞ ≡ max
X
|aij |.
∥x∥∞ =1 1≤i≤n
j=1

Ultima identitate provine de la observaţia că vectorul x care maximizează


supremumul este x = (±1, ±1, . . . , ±1) cu semnele alese conform semnelor
elementelor liniei lui A cu cea mai mare sumă pe linie.
1-normă sau norma Minkowski sau norma maximului sumelor
coloanelor: n
∥A∥1 := sup ∥Ax∥1 ≡ max
X
|aij |.
∥x∥1 =1 1≤j≤n
i=1

Ultima identitate are loc deoarece supremumul este atins pentru x = (0, 0, . . . , 0, 1, 0, . . . , 0)
cu 1 în poziţia coloanei cu cea mai mare sumă.
De notat că toate normele induse, inclusiv cele de mai sus, satisfac ∥I∥ =
1, unde I este matricea unitate. Mai există o normă frecvent utilizată, norma
Frobenius, care nu este indusă de nici o normă vectorială; este definită prin
v
u n
uX
∥A∥F := t |aij |2 . (1.6)
i,j=1

Pătratul normei Frobenius este egal cu suma pătratelor valorilor singulare


ale lui A.
În cazul finit dimensional considerat aici, toate normele sunt echivalente,
ceea ce înseamnă că pentru orice pereche de norme ∥·∥a şi ∥·∥b , există con-
stantele C1 şi C2 astfel încât

C1 ∥x∥a ≤ ∥x∥b ≤ C2 ∥x∥a ∀x ∈ Rn . (1.7)

Suntem liberi să alegem ce normă dorim pentru a măsura distanţe; o ale-


gere bună simplifică raţionamentele la demonstrarea rezultatelor, chiar dacă
rezultatul are loc în orice normă (exceptând eventual o constantă diferită).
De notat, totuşi că constantele pot depinde de dimensiunea n a spaţiului
vectorial, care poate fi mare.

1.5.2 Notaţii asimptotice


La analiza erorilor de rotunjire, ne interesează să urmărim termeni foarte
mici, de exemplu termeni proporţionali cu eps2 , fără a-i calcula explicit.
Notaţiile următoare, datorate lui Landau, ne permit acest lucru.

27
Definit, ia 1.3 (O (omicron) mare, o mic). Fie f (x) şi g(x) două funcţii.
Pentru L ∈ R ∪ {±∞}, fixat, scriem

1. f (x) = Ox→L (g(x)) dacă există o constantă C astfel încât |f (x)| ≤


C|g(x)| pentru orice x situat într-o vecinătate a lui L. Acest lucru este
echivalent cu
f (x)

lim sup < ∞.
x→L g(x)

2. f (x) = ox→L (g(x)) dacă

|f (x)|
lim = 0.
x→L |g(x)|

Atunci când punctul limită L este clar din context, omitem indicele x →
L şi scriem O(g(x)) sau o(g(x)).

Proprietăţile următoare ale lui O(·) and o(·) sunt consecinţe imediate ale
definiţiei, şi sunt utilizate frecvent în calcule.

Lema 1.1. Pentru un punct limită dat L ∈ R ∪ {±∞}, avem

1. O(g1 ) ± O(g2 ) = O(|g1| + |g2|).

2. O(g1 ) · O(g2 ) = O(g1 g2 ).

3. Pentru orice constantă C, C · O(g) = O(g).

4. Pentru o funcţie fixată f , O(g)/f = O(g/f ).

Aceleaşi proprietăţi au loc dacă O(·) se înlocuieşte cu o(·).

De notat că nu avem o estimare pentru O(g1 )/O(g2 ): dacă f1 = O(g1 )


şi f2 = O(g2 ), este posibil ca f2 să fie mult mai mic decât g2 , deci nu este
posibil să mărginim câtul f1 /f2 prin g1 şi g2 .

Exemplul 1.1. Fie p(x) = cd (x − a)d + cd+1 (x − a)d+1 + · · · + cD (x − a)D


un polinom cu d < D. Dacă cd şi cD sunt ambii nenuli, avem
   
p(x) = O xD , as x → ±∞, p(x) = O (x − a)d , as x → a.

În acest caz este esenţial să ştim ce punct limită L este implicat în notaţia
O-mare.

28
Exemplul 1.2. Fie f : U ⊂ R → R de n ori continuu diferenţiabilă pe un
interval deschis U . Atunci pentru orice a ∈ U şi k ≤ n, teorema lui Taylor
cu rest ne spune că

f (k−1) (a) f (k) (ξ)


f (x) = f (a) + f ′ (a)(x − a) + · · · + (x − a)k−1 + ,
(k − 1)! k!

cu |ξ − a| ≤ |x − a|. Deoarece f (k) este continuă (şi deci mărginită), putem


scrie
f (k−1) (a)  
f (x) = f (a) + f ′ (a)(x − a) + · · · + (x − a)k−1 + O (x − a)k
(k − 1)!

unde punctul limită este L = a. Pentru |h| ≪ 1, putem scrie

h2
f (a + h) = f (a) + f ′ (a)h + f ′′ (a) + O(h3 )
2
h2
f (a − h) = f (a) − f ′ (a)h + f ′′ (a) + O(h3 )
2
Din lema 1.1 rezultă că
f (a + h) − f (a − h)
= f ′ (a) + O(h2 )
2h
dacă f este de cel puţin trei ori continuu diferenţiabilă.

În MuPAD, se pot obţine dezvoltări în serie Taylor cu comanda taylor,


atât pentru funcţii generice f cât şi pentru funcţii predefinite cum ar fi sin.

reset();
p1:=taylor(f(x),x=a,3);

f ′′ (a) (a − x)2  
f (a) − f ′ (a) (a − x) + + O −(a − x)3
2

p2:=taylor(sin(x),x=0,8);

x3 x5 x7  
x− + − + O x9
6 120 5040

p3:=taylor((f(x+h)-f(x-h))/(2*h), h=0, 4);

29
h2 f ′′′ (x)  
f ′ (x) + + O h4
6

subs(p3,[f=sin,x=0]);

h2  
1− + O h4
6

1.5.3 Numărul de condiţionare


Definit, ia 1.4 (număr de condiţionare). Numărul de condiţionare κ al pro-
blemei P : Rn → Rm este cel mai mic număr care verifică
|x̂i − xi | ∥P(x̂) − P(x)∥
≤ ε pentru 1 ≤ i ≤ n =⇒ ≤ κε + o(ε), (1.8)
|xi | ∥P(x)∥

unde o(ε) reprezintă termeni care sunt asimptotic mai mici decât ε.

O problemă este bine condiţionată (well conditioned) dacă κ nu este prea


mare; altfel problema se numeşte prost condiţionată (ill conditioned). Buna
condiţionare înseamnă că soluţia problemei cu datele uşor perturbate nu va
diferi prea mult de soluţia problemei cu datele originale. Problemele prost
condiţionate sunt probleme a căror soluţie este foarte sensibilă la schimbări
mici în date.

Exemplul 1.3. Considerăm problema înmulţirii a două numere reale, P(x1 , x2 ) :=


x1 x2 . Dacă perturbăm uşor datele, de exemplu

x̂1 := x1 (1 + ε1 ) , x̂2 := x2 (1 + ε2 ) , |εi | < ε, i = 1, 2,

obţinem
x̂1 x̂2 − x1 x2

= (1 + ε1 ) (1 + ε2 ) − 1 = ε1 ε2 + ε1 + ε2 ,
x x
1 2

şi deoarece am presupus că perturbaţiile sunt mici, εi ≪ 1, putem neglija


produsul ε1 ε2 , care este mic în comparaţie cu suma ε1 + ε2 , obţinând
x̂1 x̂2 − x1 x2

≤ 2ε.
x x
1 2

Deci, numărul de condiţionare al înmulţirii este κ = 2 şi problema înmulţirii


a două numere reale este bine condiţionată.

30
Exemplul 1.4. Fie A o matrice nesingulară fixată n × n. Considerăm pro-
blema evaluării produsului matrice-vector P(x) = Ax pentru x = (x1 , . . . , xn )T .
Presupunem că vectorul perturbat x̂ satisfiese x̂i = xi (1 + εi ), |εi | < ε. Con-
siderând norma ∥·∥∞ , avem ∥x̂ − x∥∞ ≤ ε ∥x∥∞ , de unde

∥Ax̂ − Ax∥∞ ∥A∥∞ ∥x̂ − x∥∞ ε ∥A∥∞ ∥x∥∞


≤ ≤ .
∥Ax∥∞ ∥Ax∥∞ ∥Ax∥∞

Deoarece ∥x∥ = A−1 Ax ≤ A−1 ∥Ax∥, avem de fapt


∥Ax̂ − Ax∥∞
≤ ε ∥A∥∞ A−1 ,

∥Ax∥∞ ∞

şi deci numărul de condiţionare este κ∞ = ∥A∥∞ A−1 ∞ . Vom vedea că


κ∞ joacă un rol important la rezolvarea sistemelor de ecuaţii liniare.

Exemplul 1.5. Să examinăm numărul de condiţionare al scăderii a două


numere reale, P(x1 , x2 ) := x1 − x2 . Perturbând uşor datele, ca în exemplul
precedent, obţinem
|(x̂1 − x̂2 ) − (x1 − x2 )| |x1 ε1 − x2 ε2 | |x1 | + |x2 |
= ≤ ε.
|x1 − x2 | |x1 − x2 | |x1 − x2 |

Observăm că dacă sign(x1 ) = −sign(x2 ), ceea ce însemnă că operaţia este


o adunare, numărul de condiţionare este κ = 1, însemnând că adunarea a
două numere este bine condiţionată. Dacă, totuşi, numerele au acelaşi semn
şi x1 ≈ x2 , atunci κ = |x|x11|+|x 2|
−x2 | devine foarte mare şi scăderea este prost
condiţionată.
Dacă luăm x1 = 1/51 şi x2 = 1/52, vom obţine numărul de condiţionare
1 1
+ 52
κ= 51
1
− 1 = 103, şi dacă calculăm cu trei cifre semnificative obţinem x̂1 =
51 52
0.196e − 1, x̂2 = 0.192e − 1 şi x̂1 − x̂2 = 0.400e − 3, care este îndepărtat de
rezultatul exact x1 − x2 = 0.377e − 3; astfel, un număr mare de condiţionare
reflectă faptul că soluţia este generatoare de erori mari datorită anulării. În
exemplul de mai sus, pierderea de precizie este uşor de observat, deoarece
cifrele pierdute apar ca zerouri. Din nefericire, pe calculatoare moderne cu
aritmetică binară, efectele de anulare sunt mult mai dificil de detectat.

Considerăm următorul exemplu în Symbolic Math Toolbox:

clear all
digits(30)
a = sym('1/500000000000001')

31
1
a =
500000000000001

b = sym('1/500000000000002')
1
b =
500000000000002

ce = a - b
1
ce =
250000000000001500000000000002

c = vpa(a - b)

c = 0.00000000000000000000000000000399999999999997600000000000011

Aceasta este diferenţa exactă, rotunjită la 30 de cifre. Rotunjim operanzii


la numere maşină de 16 cifre

bm = vpa(b, 16)

bm = 0.000000000000001999999999999992

am = vpa(a, 16)

am = 0.000000000000001999999999999996

Calculăm diferenţa cu 30 de cifre şi apoi cu 16 cifre pentru a emula


operaţiile flotante

c16 = am - bm

c16 = 0.00000000000000000000000000000400000000092936389566133030885

cf16 = vpa(am - bm, 16)

cf16 = 4.000000000929364e − 30

32
care este în concordanţă cu modelul standard.

Realizând aceleaşi operaţii în MATLAB, obţinem:

format long
a=1/500000000000001

a = 1.999999999999996e-15

b=1/500000000000002

b = 1.999999999999992e-15

c=a-b

c = 3.944304526105059e-30

Comparând cu diferenţa exactă se constată o pierdere mare de precizie. Să


examinăm aceleaşi calcule cu rezultatul afişat în hexazecimal

format hex
a=1/500000000000001

a = 3ce203af9ee7560b

b=1/500000000000002

b = 3ce203af9ee75601

c=a-b

c = 39d4000000000000

Se observă că MATLAB completează rezultatul cu zerouri (în binar).

Exemplul 1.6. Considerăm din nou problema evaluării numerice a derivatei


lui f prin formula
f (x0 + h) − f (x0 )
f ′ (x0 ) ≈ Dx0 ,h (f ) = .
h
Aici, funcţia f este dată de intrare a problemei. Considerăm funcţia pertur-
bată de forma

fˆ(x) = f (x) (1 + εg(x)) , |g(x)| ≪ 1

33
care modelează efectul erorii de rotunjire pe o maşină cu precizia ε. Numărul
de condiţionarea devine

x0 ,h (fˆ) − Dx0 ,h (f ) f (x0 + h) (1 + εg(x0 + h)) − f (x0 ) (1 + εg(x0 ))



D
= − 1

Dx0 ,h (f ) f (x0 + h) − f (x0 )


ε (|f (x0 + h)| + |f (x0 )|) 2ε |f (x0 )|
≤ ≈ .
|f (x0 + h) − f (x0 )| |hf ′ (x0 )|
2|f (x0 )|
Astfel, κ ≈ |hf ′ (x )| , însemnând că problema devine din ce în ce mai prost
0
condiţionată pe măsură ce h → 0. Cu alte cuvinte, dacă h este prea mic
relativ la perturbaţia ε, este imposibil să evaluăm Dx0 ,h (f ) cu precizie, in-
diferent cum este implementată diferenţa finită.

O noţiune înrudită în matematică este aceea de problemă bine pusă şi


problemă incorect pusă, introdusă de Hadamard [?]. Fie A : X → Y o
aplicaţie de la spaţiul X la Y .
Problema Ax = y este bine pusă (well posed) dacă

1. Pentru orice y ∈ Y există o soluţie x ∈ X.

2. Soluţia x este unică.

3. Soluţia x este o funcţie continuă de data y.

Dacă una dintre condiţii nu este îndeplinită, problema se numeşte inco-


rect pusă(ill posed). De exemplu, problema căculării derivatei f ′ bazându-ne
doar pe valorile lui f este incorect pusă într-un cadru continuu, aşa cum se
poate vedea din faptul că κ → ∞ atunci când h → 0 în exemplul 1.6. Un
mod sensibil de alegere a lui h pentru a obţine precizia maximă este discutat
în capitolul ??.
Dacă o problemă este incorect pusă din cauză că se încalcă condiţia 3,
atunci ea este şi prost condiţionată. Dar putem vorbi de probleme prost
condiţionate şi dacă problema este bine pusă, dar soluţia este forte sensi-
bilă în raport cu mici perturbaţii în date. Un exemplu bun de problemă
prost condiţionată este determinarea rădăcinilor polinomului lui Wilkinson,
vezi capitolul ??. Este imposibil să „vindecăm” o problemă prost condiţio-
nată printr-un algoritm bun, dar putem evita transformarea unei probleme
bine-condiţionate într-una prost condiţionată utilizând un algoritm prost,
de exemplu unul care conţine scăderi prost condiţionate care nu sunt strict
necesare.

34
1.6 Algoritmi stabili şi instabili
Un algoritm pentru rezolvarea unei probleme date P : Rn → R este o
secvenţă de operaţii elementare
P(x) = fn (fn−1 (. . . f2 (f1 (x)) . . . )).
În general, există mai mulţi algoritmi pentru o problemă dată.

1.6.1 Stabilitatea progresivă


Dacă factorul de amplificare al erorii pentru operaţia fi este dat de nu-
mărul de condiţionare corespunzător κ(fi ), obţinem în mod natural
κ(P) ≤ κ(f1 ) · κ(f2 ) · · · · · κ(fn ).
Definit, ia 1.5 (Stabilitate progresivă). Un algoritm numeric pentru o pro-
blemă dată P este progresiv stabil (forward stable) dacă
κ(f1 ) · κ(f2 ) · · · · · κ(fn ) ≤ Cκ(P), (1.9)
unde C este o constantă nu prea mare, de exemplu C = O(n).
Exemplul 1.7. Considerăm următorii doi algoritmi pentru problema P(x) =
x(x+1) :
1

1.
x

1
x x(1 + x)
x(1 + x)

1+x
2.
1
x

1 1 1
x −
x x+1 x(1 + x)

1
1+x
1+x

35
În primul algoritm, toate operaţiile sunt bine condiţionate şi deci algo-
ritmul este progresiv stabil. În al doilea algoritm, ultima operaţie este o
scădere potenţial foarte prost condiţionată şi din acest motiv algoritmul nu
este progresiv stabil.
Grosso modo, un algoritm executat în aritmetică de precizie finită este
stabil dacă efectul erorilor de rotunjire este mărginit; dacă, pe de altă parte
un algoritm creşte numărul de condiţionare al unei probleme cu un factor
mare, atunci el este clasificat ca instabil.
Exemplul 1.8. Considerăm problema calculării valorilor
1 1
cos 1, cos , cos , . . . , cos 2−12 ,
2 4
sau mai general,
zk = cos(2−k ), k = 0, 1, ..., n.
Vom considera doi algoritmi pentru calculul recursiv al lui zk :

1. dublarea unghiului: utilizăm relaţia cos 2α = 2 cos2 α − 1 pentru a


calcula

yn = cos 2−n , yk−1 = 2yk2 − 1, k = n, n − 1, . . . , 1.




q
2. înjumătăţirea unghiului: utilizăm cos α2 = 1+cos α
2 şi calculăm

1 + xk
r
x0 = cos 1, xk+1 = , k = 0, 1, . . . , n − 1.
2

Rezultatele se dau în tabela 1.3. Observăm că valorile yk calculate de


algoritmul 1 sunt afectate în mod semnificativ de erorile de rotunjire în timp
ce calculul valorilor xk cu algoritmul 2 nu pare să fie afectat. Să analizăm
condiţionarea unui pas a algoritmului 1 şi respectiv a algoritmului 2. Pentru
algoritmul 1, un pas este f1 (y) = 2y 2 − 1, şi pentru condiţionarea unui pas,
obţinem din

f1 (y(1 + ε)) − f1 (y) f1 (y) + f1′ (y)yε + O(ε2 ) − f1 (y) 4y 2 ε + O ε2



= =
f1 (y) f1 (y) 2y 2 − 1
(1.10)
şi din faptul că ε este mic, că numărul de condiţionare pentru un pas este
2
κ1 = |2y4y2 −1| . Deoarece toţi yk în această iteraţie sunt apropiaţi de unu, avem
κ1 ≈ 4. Pentru a obţine yk , trebuie să realizăm n − k iteraţii, deci numărul

36
de condiţionare este aproximativ 4n−k . Astfel, constanta C din relaţia (1.9)
a definiţiei stabilităţii progresive poate fi estimată prin

4n−k 4n−k
C≈ ≈ −k = 4n .
κ (P) 4

Această constantă nu e mică, deci algoritmul nu


q este progresiv stabil.
Pentru algoritmul 2, un pas este f2 (x) = 1+x2 . Vom calcula numărul
de condiţionare pentru un pas:

f2 (y + ε) − f2 (y) 1  
= ε + O ε2 .
f2 (y) 2(1 + x)

Astfel, pentru ε mic, numărul de condiţionare al unui pas este κ2 = 2|1+x|1


;
deoarece toţi xk din această iteraţie sunt apropiaţi de 1, obţinem κ2 ≈ 4 . 1

Pentru a calcula xk ,avem nevoie de k iteraţii, deci numărul de condiţionare


final este 4−k . Deci, constanta de stabilitate C din (1.9) este aproximativ

4−4
C≈ ≈ 1,
κ (P)

ceea ce înseamnă că algoritmul 2 este stabil.


De notat că în timp ce algoritmul 1 îşi execută iteraţiile în mod nestabil,
algoritmul 2 realizează aceeaşi iteraţie, dar în ordine inversă. Astfel, dacă
abordarea din algorimul 1 este instabilă, inversarea iteraţiei ne conduce la
algoritmul stabil 2. Acest lucru este reflectat şi de estimarea numărului de
condiţionare pentru un pas (4 şi respectiv 41 ), care sunt inversul unul altuia.
În fine, utilizând pentru n = 12 o perturbaţie de mărimea epsilon-ului
maşinii ε = 2.2204e − 16, vom obţine pentru algoritmul 1 că 412 ε = 3.7e − 9,
care este o bună estimare a erorii 5e − 10 a lui y0 măsurată în experimentul
numeric.

Exemplul 1.9. Un exemplu important de algoritm instabil, care motivează


studiul atent al condiţionării şi stabilităţii, este eliminarea gaussiană fără pi-
votare (vezi exemplul 2.4 din capitolul 2). nd rezolvăm sisteme liniare cu me-
toda eliminării a lui Gauss, se poate întâmpla ca să eliminăm o necunoscută
utilizând un pivot foarte mic pe diagonală. Împărţind celelate elemente ale
matricei la pivotul mic, putem introduce artificial coeficienţi mari în matri-
cea transformată, crescând în felul acesta numărul de condiţionare şi trans-
formând o problemă posibil bine-condiţionată într-una prost-condiţionată.
Astfel, alegând pivoţi mici, putem face eliminarea gaussiană instabilă —

37
2−k yk − zk xk − z k
1.00000e+00 0.4596976941318602 0.0000000000000000
5.00000e-01 0.1224174381096272 0.0000000000000000
2.50000e-01 0.0310875782893553 0.0000000000000001
1.25000e-01 0.0078023327706710 0.0000000000000001
6.25000e-02 0.0019524892999009 0.0000000000000000
3.12500e-02 0.0004882415148636 0.0000000000000000
1.56250e-02 0.0001220678289934 0.0000000000000001
7.81250e-03 0.0000305174229049 0.0000000000000001
3.90625e-03 0.0000076293848300 0.0000000000000001
1.95313e-03 0.0000019073480265 0.0000000000000001
9.76563e-04 -1.9999995231628795 0.0000000000000001
4.88281e-04 -0.9999998807907128 0.0000000000000001
2.44141e-04 0.0000000000000000 0.0000000000000001

Tabela 1.3: Recurenţa stabilă şi instabilă

avem nevoie să aplicăm o strategie de pivotare pentru a obţine un algoritm


satisfăcător din punct de vedere numeric(cf. secţiunii 2.1).
De notat că, totuşi, dacă rezolvăm un sistem de ecuaţii liniare utilizând
transformări ortogonale (rotaţii Givens rotations sau reflexii Householder,
vezi secţiunea 2.4), atunci numărul de condiţionare al matricelor transfor-
mate rămâne constant. Pentru a verifica aceasta, considerăm transformarea

Ax = b =⇒ QAx = Qb

unde QT Q = I. Atunci numărul de condiţionare a lui QA în norma eucli-


diană (aşa cum este definit în teorema 2.4) satisface

κ(QA) = (QA)−1 ∥QA∥2 = A−1 QT ∥QA∥2 = A−1 ∥A∥2 = κ(A),

2 2 2

deci 2-norma este invariantă la înmulţirea cu matrice ortogonale.

Din nefericire, aşa cum se poate vedea din exemplul 1.8, în general este
dificil şi laborios să verificăm dacă un algoritm este progresiv stabil, deoarece
numerele de condiţionare necesare în (1.9) sunt dificil de obţinut pentru o
problemă dată şi un algoritm dat. O noţiune diferită de stabilitate, bazată
mai degrabă pe perturbaţii în datele iniţiale decât pe rezultate ale algorit-
mului, va fi mai convenabil de utilizat în practică.

38
1.6.2 Stabilitatea regresivă
Datorită dificultăţilor de verificare a stabilităţii progresive, Wilkinson a
introdus o noţiune diferită de stabilitate, care se bazează pe principiul lui
Wilkinson, pe care l-am văzut deja în secţiunea 1.4:
Rezultatul unui calcul numeric pe computer este rezultatul uni
calcul exact cu date iniţiale uşor perturbate.
Definit, ia 1.6. Un algoritm numeric pentru o problemă dată P este regresiv
stabil dacă rezultatul ŷ obţinut de algoritm cu datele x poate fi interpretat
ca rezultatul exact pentru date uşor perturbate x̂, ŷ = P (x̂), cu
|x̂i − xi |
≤ Ceps, (1.11)
|xi |
unde C este o constantă nu prea mare, iar eps este precizia maşinii.
De notat că, pentru a studia stabilitatea regresivă a unui algoritm, nu
este nevoie să se calculeze numărul de condiţionare al problemei. De aseme-
nea, trebuie observat că un algoritm regresiv stabil nu garantează că eroarea
∥ŷ − y∥ este mică. Totuşi, dacă numărul de condiţionare κ al problemei este
cunoscut, atunci eroarea relativă progresivă este mărginită de
∥ŷ − y∥ ∥P(x̂) − P(x)∥ |x̂i − xi |
≤ ≤ κ (P) max ≤ κ (P) Ceps.
∥y∥ ∥P(x)∥ i |xi |
Astfel, un algoritm regresiv stabil este şi progresiv stabil, dar nu şi reciproc.
Exemplul 1.10. Dorim să investigăm stabilitatea regresivă a unui algo-
ritm pentru produsul scalar xT y := x1 y1 + x2 y2 . Propunem pentru algoritm
secvenţa de operaţii

x 1 y1

(x1 , y1 , x2 , y2 ) x1 y1 + x2 y2

x 2 y2
Utilizând faptul că în calculator în locul numărulul real x se memorează
cantitatea rotunjită x(1 + ε), |ε| < eps,şi că fiecare înmulţire şi adunare con-
duce la o eroare de rotunjire de aproximativ eps, obţinem pentru rezultatul
numeric al acestui algoritm
(x1 (1 + ε1 )y1 (1 + ε2 )(1 + η1 ) + x2 (1 + ε3 )y2 (1 + ε4 )(1 + η2 )) (1+η3 ) = x̂1 ŷ1 +x̂2 ŷ2 ,

39
unde |εi |, |ηi | ≤ eps, şi

x̂1 = x1 (1 + ε1 )(1 + η1 ), ŷ1 = y1 (1 + ε2 )(1 + η3 )


x̂2 = x2 (1 + ε3 )(1 + η2 ), ŷ2 = y2 (1 + ε4 )(1 + η3 )

Deci, condiţia de stabilitate regresivă (1.11) este satisfăcută cu constanta


C = 2 şi astfel algoritmul este regresiv stabil.

Exemplul 1.11. Să considerăm produsul a două matrice triunghiulare su-


perior A şi B,
! !
a11 a12 b11 b12
A= , B= .
0 a22 0 b22

Dacă pentru simplitatea prezentării neglijăm erorile datorate memorării ele-


mentelor matricei în aritmetica de precizie finită, folosind algoritmul stan-
dard de înmulţire a matricelor, se obţine în calculator
!
a11 b11 (1 + ε1 ) (a11 b12 (1 + ε2 ) + a12 b22 (1 + ε3 )) (1 + ε4 )
,
0 a22 b22 (1 + ε5 )

unde |εj | ≤ eps pentru j = 1, . . . , 5. Dacă definim matricele uşor modificate


!
a11 a12 (1 + ε3 ) (1 + ε4 )
Ab = ,
0 a22 (1 + ε5 )
!
b= b11 (1 + ε1 ) b12 (1 + ε2 ) (1 + ε4 )
B ,
0 b22

tprodusul lor este exact matricea pe care o obţinem calculând AB numeric.


Deci produsul calculat este produsul exact al matricelor uşor perturbate A
şi B; algoritmul este regresiv stabil.

Noţiunea de stabilitate regresivă se va dovedi extrem de utilă în capitolul


2, unde se va arăta, utilizând acelaşi tip de analiză, că eliminarea gaussiană
cu pivotare parţială sau totală este stabilă.

1.7 Calculul cu numere-maşină: ponturi şi trucuri


1.7.1 Asociativitatea şi distributivitatea
Considerăm asociativitatea din aritmetica exactă:

40
(a + b) + c = a + (b + c).
Această proprietate nu are loc în aritmetica de precizie finită. Ca exem-
plu, să considerăm următoarele trei numere

a = 1.23456e − 3, b = 1.00000e0, c = −b.

Este uşor de văzut că, în aritmetica zecimală, obţinem (a + b) + c =


1.23000e − 3, dar a + (b + c) = a = 1.23456e − 3. Este deci important să
utilizăm parantezele inteligent şi să fim atenţi la ordinea operaţiilor.
Presupunem că dorim să calculăm o sumă de forma N i=1 ai , unde ter-
P

menii ai > 0 sunt monoton descrescători, i.e., a1 > a2 > · · · > an . Concret,
considerăm seria armonică
N
1
S=
X
.
i=1
i

Pentru N = 106 , calculăm valoare de referinţă “exactă” în MuPAD cu o


precizie suficientă (DIGITS:=20):

reset();
DIGITS:=20:
s:=0:
for i from 1 to 1000000 do
s:=s+1.0/i:
end_for:
s;
14.392726722865723631

Utilzând MATLAB cu aritmetică IEEE, obţinem:

N=1e6;
format long e
s1=0;
for i=1:N
s1=s1+1/i;
end
s1
s1 =
1.439272672286499e+01

41
Observăm că ultimele trei cifre sunt diferite de rezultatul din MuPAD.
Dacă însumăm din nou în MATLAB, dar în ordine inversă, obţinem

s2=0;
for i=N:-1:1
s2=s2+1/i;
end
s2
s2 =
1.439272672286577e+01

un rezultat mult mai bun, deoarece diferă de cel din MuPAD doar la
ultima cifră! Să calculăm eroarea relativă pentru ambele strategii:

hs=mupad('harmsum.mn');
evaluateMuPADNotebook(hs);
smupad=double(getVar(hs,'s'));
abs(smupad-s1)/smupad
ans =
5.109606717838637e-14

abs(smupad-s2)/smupad
ans =
3.332352207286067e-15

În aritmetica de precizie finită nu are loc nici distributivitatea adunării


faţă de înmulţire
a(x + y) = ax + ay.
Codul MATLAB următor dă nişte contraexemple pentru asociativitate şi
distributivitate în virgulă flotantă
Asociativitate

a=1e-3;
b=33;
c=-b;
r1=a+b+c
r2=a+(b+c)

r1 =
9.999999999976694e-04

42
r2 =
1.000000000000000e-03

format hex
r1
r2

r1 =
3f50624dd2f18000
r2 =
3f50624dd2f1a9fc

Distributivitate

format compact
format long
x=1e8;
y=-(x+eps(x));
z=1e8;
r1=x*z+y*z
r2=(x+y)*z

r1 =
-2
r2 =
-1.490116119384766

format hex
r1
r2
format long

r1 =
c000000000000000
r2 =
bff7d78400000000

43
1.7.2 Algoritmul de sumare al lui W. Kahan
W. Kahan a dat un algoritm precis, care nu necesită sortare. Ideea este
de a pătra ca report (carry) partea mai puţin semnificativă a termenilor
mici, care s-ar putea pierde când sunt adunaţi la sumele parţiale. Reportul
este apoi adăugat la termenul următor, care este suficient de mic încât s-ar
putea pierde.

Sursa MATLAB 1.3 Kahan’s Summation


function s = KahanSummation(x)
s=x(1); % partial sum
c=0; % carry
N=length(x);
for j=2:N
y=x(j)-c;
t=s+y; %next partial sum, with roundoff
c=(t-s)-y; %recapture the error and store as carry
s=t;
end
end

Dacă aplicăm algoritmul sumei parţiale a seriei armonice, rezultatul este


foarte bun.

N=1e6;
x=1./(1:N);
sKahan=KahanSummation(x)

sKahan =
1.439272672286572e+01

1.7.3 Numere mici


Dacă a + x = a are loc în aritmetica exactă, atunci x = 0. Acest lucru
nu mai este valabil în aritmetica de precizie finită. În aritmetica IEEE, de
exemplu, are loc 1 + 1e − 20 = 1; de fapt, avem 1 + w = 1 nu doar pentru
w = 1e − 20, ci pentru orice număr maşină pozitiv w cu w < eps, unde eps
este precizia maşinii.

44
1.7.4 Monotonia
Presupunem că se dă o funcţie f strict monoton crescătoare pe [a, b].
Atunci, pentru x1 < x2 , xi ∈ [a, b], avem f (x1 ) < f (x2 ). Luăm ca exemplu
f (x) = sin(x) şi 0 < x1 < x2 < π2 . Putem fi siguri că în aritmetica de
precizie finită are loc sin(x1 ) < sin(x2 )? În general, răspunsul este negativ.
Totuşi, pentru funcţii standard, în aritmetica IEEE, s-au luat măsuri ca
măcar monotonia nestrictă (nu şi cea strictă) să fie păstrată. În exemplul
nostru, aritmetica IEEE ne garantează că sin(x1 ) ≤ sin(x2 ) are loc.
Să mai considerăm un exemplu, polinomul

f (x) = x3 − 3.000001x2 + 3x − 0.999999.

Această funcţie este foarte apropiată de (x − 1)3 ; ea are trei rădăcini izolate
în
0.998586, 1.00000, 1.001414.
Să reprezentăm grafic f :

close all
figure(1)
sp='$x^3-3.000001x^2+3x-0.999999$';
FS='FontSize';
a=-1; b=3; h=0.1;
x=a:h:b; y=x.^3-3.000001*x.^2+3*x-0.999999;
plot(x,y)
line([a,b],[0,0])
title(sp,'Interpreter','LaTeX',FS,12)

figure(2)
a=0.998; b=1.002; h=0.0001;
x=a:h:b; y=x.^3-3.000001*x.^2+3*x-0.999999;
plot(x,y)
line([a,b],[0,0])
title(sp,'Interpreter','LaTeX',FS,12)

figure(3)
a=0.999999993; b=1.000000007; h=0.000000000005;
x=a:h:b; y=x.^3-3.000001*x.^2+3*x-0.999999;
axis([a b -1e-13 1e-13])
plot(x,y)
line([a,b],[0,0])

45
title(sp,'Interpreter','LaTeX',FS,12)

figure(4) % using Horner's rule


a=0.999999993; b=1.000000007; h=0.000000000005;
x=a:h:b; y=((x-3.000001).*x+3).*x-0.999999;
axis([a b -1e-13 1e-13])
plot(x,y)
line([a,b],[0,0])
title('$((x-3.000001)x+3)x-0.999999$','Interpreter','Latex',FS,12)

8 10-9
4

6 3

4 2

1
2

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

-6 -4

-8 -5
-1 -0.5 0 0.5 1 1.5 2 2.5 3 0.998 0.9985 0.999 0.9995 1 1.0005 1.001 1.0015 1.002 1.0025

10-14 10-14
1.5 1.5

1 1

0.5 0.5

0 0

-0.5 -0.5

-1 -1

-1.5 -1.5
0.999999992 0.999999996 1 1.000000004 1.000000008 0.999999992 0.999999996 1 1.000000004 1.000000008

Figura 1.4: În apropierea rădăcinii din mijloc, în aritmetica de precizie finită,


monotonia se pierde. Utilizân schema lui Horner în ultimul grafic, rezultatul
este puţin mai bun.

Dacă mărim un pic imaginea în vecinătatea lui 1, observăm în figura


1.4 că f se comportă ca o funcţie în scară şi nu putem asigura monotonia.
Salturile sunt mai puţin pronunţate dacă utilizăm pentru evaluare schema
lui Horner.

46
1.7.5 Evitarea depăşirii superioare
Pentru a evita depăşirea superioară, este adesea necesar să modificăm
modul în care cantităţile sunt calculate. Presupunem că vrem să calculăm
norma r a unui vector (x, y) din plan. Abordarea directă este să utilizăm
formula q
r = x2 + y 2 .

Totuşi, dacă |x| ori |y| este mai mare decât realmax, atunci x2 sau y 2 va
da depăşire şi va produce rezultatul Inf şi deci r = Inf. Dacă luăm x =
1.5e200 şi y = 3.6e195, atunci

r2 = 2.25e400 + 12.96e390 = 2.250000001296e400 > realmax,

dar r = 1.500000000432e200 este în domeniul numerelor maşină. Pentru a


calcula r fără depăşire, un remediu este să dăm în factor maximul modulului.
Dăm soluţia pentru un vector n-dimensional

function y = mynorm(x)
%MYNORM - compute Euclidean norm of x
% avoid overflow
m=max(abs(x));
y = m*sqrt(sum((x/m).^2));
end

Această soluţie ne permite să evităm şi posibila depăşire inferioară când


calculăm r.

1.7.6 Testarea depăşirii superioare


Presupunem că vrem să calculăm x2 şi că dorim să ştim dacă dă depăşire.
În standardul IEEE acest lucru se detectează uşor:
if xˆ2==Inf sau if isinf(xˆ2)
Fără aritmetică IEEE, calculul ar putea să se oprească cu un mesaj de eroare.
Un test independent de maşină, care funcţionează în aproape toate cazurile
pentru numere normalizate este
if (1/x)/x==0 % then x^2 will overflow
În cazul când dorim să evităm lucrul cu numere denormalizate, testul va fi
if (eps/x)/x==0 % then x^2 will overflow
Este dificil de garantat că un astfel de test va detecta depăşirea pentru
toate numerele maşină.

47
În standardul IEEE, realmin şi realmax nu sunt chiar simetrice, deoa-
rece relaţia
realmax × realmin = c ≈ 4
are loc cu o constantă c care depinde de procesor şi/sau de versiunea MA-
TLAB. Într-o situaţie ideală, pentru simetrie perfectă ar trebui să avem
c = 1.

1.7.7 Evitarea anulării


Am văzut în secţiunea 1.4.2 cum putem evita anularea la calculul ariei
unui cerc. Considerăm un al doilea exemplu, legat de calculul funcţiei expo-
nenţiale utilizând dezvoltarea Taylor:

xj 1 1 1 1 5
ex = == 1 + x + x2 + x3 + x4 + x + ···
X

j=0
j! 2 6 24 120

Se ştie că seria converge pentru orice x. O abordare naivă este (în pregătirea
unei versiuni ulterioare mai bune, am scris calculele din ciclu într-o formă
particulară):

Sursa MATLAB 1.4 Computation of ex , Naive Version function


function s=ExpUnstable(x,tol)
% EXPUNSTABLE computation of the exponential function
% s=ExpUnstable(x,tol); computes an approximation s of exp(x)
% up to a given tolerance tol.
% WARNING: cancellation for large negative x.

if nargin<2, tol=eps; end


s=1; term=1; k=1;
while abs(term)>tol*abs(s)
so=s; term=term*x/k;
s=so+term; k=k+1;
end

Pentru x pozitiv, dar şi pentru x negativ mic în modul, codul funcţio-


nează bine:
>> ExpUnstable(20,1e-8)
ans =
4.851651930670549e+08

48
>> exp(20)
ans =
4.851651954097903e+08
>> ExpUnstable(1)
ans =
2.718281828459046e+00
>> exp(1)
ans =
2.718281828459046e+00
>> ExpUnstable(-1, 1e-8)
ans =
3.678794413212817e-01
>> exp(-1)
ans =
3.678794411714423e-01
>>
Dar pentru x negativ, mare în modul, e.g. pentru x = −20 şi x = −50,
obţinem
>> ExpUnstable(-20, 1e-8)
ans =
5.621884467407823e-09
>> exp(-20)
ans =
2.061153622438558e-09
>> ExpUnstable(-50)
ans =
1.107293338289197e+04
>> exp(-50)
ans =
1.928749847963918e-22
>>
care sunt complet incorecte. Motivul este că pentru x = −20, termenii seriei
202 203 2020 −2021
e−20 = 1 − 20 + − + ··· + − + ···
2 3! 20! 21!
devin mari şi semnele alternează. Cei mai mari termeni sunt
2019 2020
= ≈ 4. 31e7.
19! 20!

49
Şirul sumelor parţiale converge către e−20 ≈ 2.06e−9. Dar, datorită creşterii
termenilor, sumele parţiale cresc şi oscilează, aşa cum se arată în figura 1.5.
Tabela 1.4 ne arată că cele mai mari sume parţiale au cam aceeaşi mărime
ca cel mai mare termen. Deoarece sumele parţiale mari trebuie diminuate
prin adunare/scădere de termeni, aceasta nu se poate întâmpla fără anulare.

107
2.5

1.5

0.5

-0.5

-1

-1.5

-2

-2.5
0 2 4 6 8 10 12 14 16 18 20

Figura 1.5: Suma parţială a dezvoltării Taylor a lui e−20

Nu ajută nici însumarea separată a termenilor pozitivi şi a celor negativi,


deoarece atunci când sumele sunt scăzute la sfârşit, rezultatul va suferi din
nou de anulare catastrofală. Într-adevăr, deoarece rezultatul

2020
e−20 ≈ 5 · 10−17
20!
este cu aproximativ 17 ordine de mărime mai mic decât cea mai mare sumă
parţială intermediară şi standardul IEEE prevede doar o precizie de 16 cifre
zecimale, nu ne aşteptăm să obţinem nici măcar o cifră corectă!

1.7.8 Calculul mediei şi deviaţiei standard


Al treilea exemplu de anulare este calculul mediei şi deviaţei standard
(abaterii medii pătratice) a unui şir de numere. Dându-se numerele reale x1 ,

50
#termeni suma parţială
20 -2.182259377927747e+07
40 -9.033771892138389e+03
60 -1.042349683933131e-04
80 +5.621883118107117e-09
100 +5.621884472130418e-09
120 +5.621884472130418e-09
valoare exactă 2.061153622438558e-09

Tabela 1.4: Sume parţiale ale lui e−20 calculate numeric

x2 , . . . , xn , media şi varianţa (dispersia) lor sunt date de


n
1X
µn = xi , (1.12)
n i=1
n
1X
var(x) = (xi − µn )2 . (1.13)
n i=1

Radicalul varianţei este deviaţia standard


q
σn = var(x). (1.14)

Calculul varianţei utilizând (1.13) necesită douăparcurgeri ale datelor xi .


Rescriind formula pentru varianţă, obţinem o nouă expresie ce ne permite
să calculăm ambele cantităţi într-o singură parcurgere a datelor. Dezvoltând
parantezele, din (1.13) se obţine
n  n
1X  1X
var(x) = x2i − 2µn xi + µ2n = x2 − µ2n . (1.15)
n i=1 n i=1 i

În testul următor utilizăm valorile

x=100*ones(100,1)+1e-5*(rand(100,1)-0.5)

şi comparăm rezultatele cu cele furnizate de funcţiile MATLAB mean, var


şi std, care realizează două treceri asupra datelor:

format long
x=100*ones(100,1)+1e-5*(rand(100,1)-0.5);
[mu,sigma2] = meanvarUnstable(x);
means=[mu mean(x)]

51
Sursa MATLAB 1.5 Media şi deviaţia standard – calcul clasic instabil
function [mu,sigma2] = meanvarUnstable(x)
%MEANVARUNSTABLE - Unstable computation of mean and variance
% one run through the data
s=0; sq=0; n=0;
while n<length(x)
n=n+1;
s=s+x(n);
sq=sq+x(n)^2;
mu=s/n;
end
sigma2=sq/n-mu^2;
end

variances=[sigma2 var(x,1)]
sigma=sqrt(sigma2);
standarddev=[sigma std(x,1)]

Fiecare execuţie a acestor instrucţiuni va da rezultate diferite, deoarece


am utilizat funcţia rand pentru a genera xi . Totuşi, vom obţine rezultate de
genul

means =
99.999999783073690 99.999999783073690
variances =
1.0e-11 *
0.909494701772928 0.837713116055967
standarddev =
1.0e-05 *
0.301578298584784 0.289432741073979

ceea ce arată că formulele clasice sunt instabile numeric. Se poate chiar


întâmpla ca deviaţia standard să devină complexă deoarece varianţa devine
negativă! Desigur, acesta este un efect numeric, datorat anulării severe, care
apare când se utilizează (1.15).
O formulă mai bună, care evită anularea, se poate obţine după cum

52
urmează:
n
nσn2 = (xi − µn )2
X

i=1
n−1
= (xi − µn )2 + (xn − µn )2
X

i=1
n−1
= [(xi − µn−1 ) − (µn − µn−1 )]2 + (xn − µn )2
X

i=1
n−1 n−1
= (xi − µn−1 ) − 2 (µn − µn−1 ) (xi − µn−1 )
X X

i=1 i=1
+ (n − 1) (µn − µn−1 )2 + (xn − µn ) 2

= (n − 1) σn−1
2
+ 0 + + (n − 1) (µn − µn−1 )2 + (xn − µn )2

Pentru medie avem relaţia

nµn = (n − 1) µn−1 + xn ,

care implică
n 1
µn−1 = µn − xn ,
n−1 n−1
şi deci

(xn − µn )2
2
n xn

(n − 1) (µn − µn−1 )2 = (n − 1) µn − µn + = .
n−1 n−1 n−1

Utilizând această în recurenţa pentru σn2 , obţinem


n
nσn2 = (n − 1) σn−1
2
+ (xn − µn )2 ,
n−1
şi în final
n 1
σn2 =
2
σn−1 + (xn − µn )2 . (1.16)
n−1 n−1
Aceasta ne conduce la un nou algoritm:
Cu acest algoritm obţinem rezultate semnificativ mai bune. O rulare
tipică ne dă

format long
x=100*ones(100,1)+1e-5*(rand(100,1)-0.5);
[mu,sigma2] = meanvarStable(x);

53
Sursa MATLAB 1.6 Media şi deviaţia standard – calcul stabil
function [mu,sigma2] = meanvarStable(x)
%MEANVARSTABLE - Stable computation of mean and variance
% one run through the data
s=x(1); mu=s; sigma2=0; n=1;
while n<length(x),
n=n+1;
s=s+x(n);
mu=s/n;
sigma2=(n-1)*sigma2/n+(x(n)-mu)^2/(n-1);
end

means=[mu mean(x)]
variances=[sigma2 var(x,1)]
sigma=sqrt(sigma2);
standarddev=[sigma std(x,1)]

means =
1.0e+02 *
1.000000000103561 1.000000000103561
variances =
1.0e-11 *
0.711699422912348 0.711699424000821
standarddev =
1.0e-05 *
0.266776952323912 0.266776952527916

1.8 Criterii de oprire


O problemă importantă la calculul soluţiilor aproximative pe calculator
este de a decide când aproximaţia este suficient de precisă. Când calculăm în
aritmetica de precizie finită, proprietăţile discutate în secţiunile precedente
pot fi exploatate pentru a proiecta algoritmi eleganţi, care lucrează datorită
(şi nu în ciuda) erorilor de rotunjire şi finitudinii mulţimii numerelor maşină.

54
1.8.1 Algoritmi independenţi de maşină
Considerăm din nou exemplul cu calculul funcţiei exponenţiale utilizând
serii Taylor. Am văzut că√obţinem rezultate bune pentru x > 0. Utilizând
n n
formula lui Stirling n! ∼ 2πn e , observăm că pentru un x dat, al n-lea


termen satisface
1
n
xn xe

tn = ∼√ → 0, n → ∞.
n! 2πn n
Cel mai mare termen al dezvoltării este deci în jurul lui n ≈ x, aşa cum se
poate vedea prin derivare. Pentru n mai mare, termenii descresc şi converg
către zero. Numeric, termenul tn devine atât de mic în aritmetica de precizie
finită, încât
n
xi
sn + tn = sn , unde sn =
X

i=1
i!
Acesta este un criteriu elegant de terminare, care nu depinde de detaliile
aritmeticii în virgulă flotantă, dar face uz de numărul finit de cifre din sem-
nificant. În acest sens înţelegem independenţa de maşină a algoritmului; el
nu funcţionează în aritmetica exactă, deoarece nu s-ar termina niciodată.
Pentru a evita anularea când x < 0, utilizăm o proprietate a funcţiei
exponenţiale şi anume ex = 1/e−x : calculăm întâi e|x| şi apoi ex = 1/e|x| .
Obţinem în acest mod un algoritm stabil pentru calculul funcţiei exponen-
ţiale pentru orice x:

Sursa MATLAB 1.7 Calculul stabil al lui ex


function s=ExpStable(x)
% EXPSTABLE stable computation of the exponential function
% s=Exp(x); computes an approximation s of exp(x) up to machine
% precision.
if x<0, v=-1; x=abs(x); else v=1; end
so=0; s=1; term=1; k=1;
while s~=so
so=s; term=term*x/k;
s=so+term; k=k+1;
end
if v<0, s=1/s; end;
end

Acum obţinem rezultate foarte bune şi pentru valori negative mari în


modul ale lui x:

55
>> format long
[ExpStable(-20), exp(-20)]
ans =
1.0e-08 *
0.206115362243856 0.206115362243856
>> [ExpStable(-50), exp(-50)]
ans =
1.0e-21 *
0.192874984796392 0.192874984796392
>> [ExpStable(-100), exp(-100)]
ans =
1.0e-43 *
0.372007597602084 0.372007597602084
>>
De notat că am calculat termenii recursiv tk = tk−1 xk şi nu explicit
k
tk = xk! pentru a evita posibilele depăşiri la numărător sau la numitor şi a
reduce numărul de flops.
Un al doilea exemplu este legat de proiectarea unui algoritm pentru
calculul rădăcinii pătrate. Fiid dat a > 0, dorim să calculăm

x = a ⇐⇒ f (x) = x2 − a = 0.
Aplicând iteraţia Newton, obţinem
f (x) x2 − a 1 a
 
x− ′ =x− = x+
f (x) 2x 2 x
şi iteraţia convergentă pătratic (cunoscută şi sub numele de formula lui
Heron.)
1 a
 
xk+1 = xk + . (1.17)
2 xk
Când se termină iteraţia? Putem desigur să testăm dacă două iteraţii diferă
până la o anumită toleranţă relativă. Dar, în acest caz putem concepe un
criteriu de oprire mai elegant. Interpretarea geometrică a metodei lui Newton

ne arată că dacă a < xk , atunci a < xk+1 < xk . Astfel, dacă pornim
√ √
iteraţia cu a < x0 , atunci şirul {xk } este monoton crescător către s = a.
Această monotonie nu poate avea loc la nesfârşit pe o maşină cu aritmetică
de precizie finită. Ea se pierde când atingem precizia maşinii.

Pentru a utiliza acest criteriu, trebuie să ne asigurăm că a < x0 .
Aceasta se realizează uşor, aplicând inegalitatea mediilor
√ √ a+1
a= a·1≤ .
2

56
Deci, alegem x0 = 2 .
a+1
Obţinem algoritmul 1.8.

Sursa MATLAB 1.8 Calculul lui a independent de maşină
function y=Sqrt(a)
% SQRT computes the square-root of a positive number
% a using Newton’s method, up to machine precision.
xo=(1+a)/2; xn=(xo+a/xo)/2;
% stopping criterion breaking the monotony
while xn<xo
xo=xn; xn=(xo+a/xo)/2;
end
y=(xo+xn)/2;

Observaţi eleganţa algoritmului 1.8: nu este nevoie de nici o toleranţă


pentru criteriul de terminare. Algoritmul calculează rădăcina pătrată pe
orice calculator fără a şti precizia maşinii, pur şi simplu utilizând faptul că
există doar un număr finit de numere maşină. Acest algoritm nu va lucra
pe o maşină cu aritmetică exactă — el se bazează pe aritmetica de precizie
finită. Adesea aceştia sunt cei mai buni algoritmi care se pot proiecta.
Un alt algoritm care se justifică prin sine şi este independent de maşină
este algoritmul bisecţiei sau înjumătăţirii pentru determinarea unei rădăcini
simple. El se poate implementa astfel ca să facă uz de finitudinea mulţimii
numerelor maşină. Înjumătăţirea continuă atât timp cât există un număr
maşină în intervalul (a, b). Când intervalul constă numai din capete, iteraţia
se termină într-un mod independent de maşină. Vezi algoritmul ?? pentru
detalii.
Algoritmii independenţi de maşină nu sunt uşor de găsit. Vom ilustra în
secţiunea următoare două criterii de oprire generice care sunt adesea utilizate
în practică când nu sunt disponibile criterii independente de maşină.

1.8.2 Testarea aproximaţiilor succesive


Dacă suntem interesaţi să aproximăm limita s a unui şir convergent {xk },
un criteriu de oprire utilizat în mod obişnuit este de a verifica diferenţa
absolută sau relativă a două aproximaţii succesive

|xk+1 − xk | < tol eroarea absolută sau


|xk+1 − xk | < tol |xk+1 | eroarea elativă

57
Testul utilizează diferenţa absolută (sau relativă) a două iterate succe-
sive, desemnate uneori prin abuz de limbaj ca eroare absolută sau relativă.
Este discutabil dacă erorile corespunzătoare |xk+1 − s| şi |xk+1 − s|/|s| sunt
într-adevăr mici. Aceasta nu se întâmplă dacă convergenţa este foarte lentă
(vezi capitolul ??, ecuaţia (??)), deoarece putem fi departe de soluţia s şi să
facem paşi foarte mici înspre ea. Într-o astfel de situaţie, criteriul de oprire
de mai sus va termina iteraţia prematur.
Ca exemplu, considerăm ecuaţia xe10x = 0.001. Se obţine o iteraţie de
punct fix adăugând x la ambii membri şi împărţind prin 1 + e10x ,
0.001 + xk
xk+1 = .
1 + e10xk
Dacă pornim iteraţia cu x0 = −10, obţinem iteratele
x1 = −9.9990, x2 = −9.9980, x3 = −9.9970.
Ar fi incorect să tragem concluzia că suntem aproape de soluţia s ≈
−9.99, deoarece singura soluţie a ecuaţiei este s = 0.0009901473844.
Vom vedea în capitolul 5 că pentru iteraţia de punct fix teorema de
punct fix a lui Banach ne permite să deducem un criteriu de oprire bazat
pe diferenţa dintre iteratele consecutive, care ne garantează asimptotic că
aproximaţia curentă este depărtată de soluţie în limita unei toleranţe date,
vezi ecuaţia (??).

1.8.3 Verificarea reziduului


O altă posibilitate de a verifica dacă o soluţie aproximativă este suficient
de bună este de a verifica aproximaţia în ecuaţia de rezolvat, astfel ca să se
poată măsura cât de departe este aproximaţia de a satisface ecuaţia. Această
discrepanţă se numeşte reziduu şi se notează cu r. De exemplu, în cazul de
mai sus al rădăcini pătrate, se poate verifica dacă r = x2k − a este mic în
modul.
În cazul unui sistem liniar, Ax = b, putem verifica cât de mic este
reziduul

r = b − Axk
într-o anumită normă, pentru o soluţie aproximativă xk .
Din nefericire, un reziduu mic nu garantează că suntem aproape de solu-
ţie! Să considerăm sistemul liniar
! !
0.4343 0.4340 1
Ax = b, A = , b=
0.4340 0.4337 0

58
Soluţia exactă este

1 −43370000
! !
−4. 818 9 × 106
x= = .
9 43400000 4. 822 2 × 106

Elementele matricei A sunt numere zecimale de 4 cifre. Cea mai bună apro-
ximare cu 4 cifre a soluţie exacte este
!
−4819000
x4 =
4822000

Dacă calculăm acum reziduul constatăm că este mare


! ! ! !
1 0.4343 0.4340 −4. 818 9 × 106 14. 47
r= − · =
0 0.4340 0.4337 4. 822 2 × 106 14. 46

cu norma ∥r∥2 = 20. 457. Putem uşor ghici soluţii cu un reziduu mai mic,
dar care nu sunt mai bune. De exemplu, pentru
! !
−1 1. 000 3
x1 = =⇒ r = b − Ax1 =
1 0.000 3

care are evident un reziduu mai mic. De fapt, reziduul lui x = (0, 0)T este
r = b = (1, 0)T , care este chiar mai mic! Astfel, nu putem avea încredere că
reziduurile mici implică întotdeauna că suntem aproape de soluţie. Totuşi,
numărul de condiţionare al lui A în norma euclidiană este 8.371 4 × 106 .

59
Capitolul 2

Sisteme de ecuaţii liniare

Rezolvarea unui sistem de ecuaţii liniare este una dintre cele mai fecvente
probleme ce apar în calculul numeric. Motivul este dublu: istoric, multe feno-
mene din fizică şi inginerie au foste modelate prin ecuaţii diferenţiale liniare,
deoarece acestea sunt mai uşor de analizat decât cele neliniare. În plus, chiar
dacă modelul este neliniar, problema este rezolvată adesea iterativ printr-o
secvenţă de probleme liniare, e.g., metoda lui Newton (capitolul ??). Astfel,
este important să putem rezolva ecuaţiile liniare eficient şi robust şi să înţe-
legem cum artifactele numerice afectează calitatea soluţiei. Vom începe cu
un exemplu introductiv, unde vom menţiona de asemenea metoda lui Cra-
mer, utilizată de generaţii de matematicieni pentru a scrie explicit soluţiile
unui sistem liniar, dar care nu este deloc potrivită pentru calcule numerice.
Vom prezenta apoi în secţiunea 2.1 tehnica fundamentală a eliminării gaus-
siene cu pivotarea, care este baza descompunerii LU, calul de povară prezent
în toţi rezolvitorii moderni de sisteme liniare dense. Această abordare din
calculul matriceal, bazată pe descompunere şi iniţiată de Householder, re-
prezintă o deplasare reală de paradigmă în rezolvarea sistemelor liniare şi
apare ca unul din cei zece algoritmi de top din secolul trecut [?]. În secţiu-
nea 2.2, vom introduce conceptul important de de număr de condiţionare
al unei matrice, care este o cantitate esenţială pentru înţelegerea condiţiilor
de rezolvare ale unui sistem liniar. Utilizăm apoi principiul lui Wilkinson
pentru a arăta cum numărul de condiţionare influenţează precizia soluţiei
sistemului asociat. Cazul special al unui sistem simetric şi pozitiv definit
este discutat în secţiunea 2.3, unde factorizarea LU poate fi exprimată în
forma foarte specială L = U T datorată simetriei, conducând la aşa-numita
factorizare Cholesky. O alternativă la calculul soluţiei unui sistem liniar care
nu necesită pivotare se prezintă în secţiunea 2.4, unde se introduc rotaţiile

60
Givens. Vom încheia acest capitol cu tehnici speciale de factorizare pentru
matrice bandă în secţiunea 2.5. Capitolul se focalizează pe metodele directe;
metodele iterative pentru sisteme liniare sunt discutate în capitolul ??. Mai
mult, vom considera în acest capitol doar sisteme liniare pătratice (adică sis-
teme care au acelaşi număr de ecuaţii şi necunoscute) ale căror matrice sunt
nesingulare, adică sisteme care au soluţie unică. În capitolul 4, vom discuta
modul de rezolvare a problemelor cu mai multe ecuaţii decât necunoscute.

2.1 Metoda eliminării a lui Gauss


Metoda eliminării gaussiene, încearcă să reducă sistemul liniar dat la
unul echivalent, cu matricea triunghiulară. Aşa cum vom vedea, un astfel de
sistem este foarte uşor de rezolvat.

Exemplul 2.1. Considerăm sistemul

3x1 +5x2 −x3 = 2


2x2 −7x3 = −16 (2.1)
−4x3 = −8

Matricea U din ecuaţia (2.1) se numeşte matrice triunghiulară superior,

3 5 −1
 

U =  2 −7
 
−4

deoarece toate elementele situate sub diagonala principală sunt zero. Solu-
ţia ecuaţiei (2.1) se calculează uşor prin substituţie inversă: calculăm x3 din
ultima ecuaţie, obţinând x3 = 2. Apoi înlocuim valoarea obţinută în penul-
tima ecuaţie şi rezolvând obţinem x2 = −1. În final, înlocuim valorile lui x2
şi x3 în prima ecuaţie şi obţinem x1 = 3.
Dacă U ∈ Rn×n şi rezolvăm a i-a ecuaţie a sistemului U x = b în raport
cu xi , atunci  
n
xi = bi −
X
uij xj  /uii .
j=i+1

Se obţine prima versiune a substituţiei inverse


Cu operaţii vectoriale, se poate formula o a doua variantă a substituţiei
inverse, utilizând produsul scalar. Pentru o a treia variantă, ce utilizează de
asemenea operaţii vectoriale, putem scădea imediat după calculul lui xi a
i-a coloană a lui U înmulţită cu xi din membrul drept. Aceasta simplifică

61
Sursa MATLAB 2.1 Substituţie inversă
function x=BackSubstitution(U,b)
% BACKSUBSTITUTION solves a linear system by backsubstitution
% x=BackSubstitution(U,b) solves Ux=b, U upper triangular by
% backsubstitution
n=length(b);
for k=n:-1:1
s=b(k);
for j=k+1:n
s=s-U(k,j)*x(j);
end
x(k)=s/U(k,k);
end
x=x(:);

procesul către o variantă SAXPY1 a substituţiei inverse (sursa MATLAB


2.2).

Sursa MATLAB 2.2 Substituţie inversă, varianta SAXPY


function x=BackSubstitutionSAXPY(U,b)
% BACKSUBSTITUTIONSAXPY solves linear system by backsubstitution
% x=BackSubstitutionSAXPY(U,b) solves Ux=b by backsubstitution by
% modifying the right hand side (SAXPY variant)
n=length(b);
for i=n:-1:1
x(i)=b(i)/U(i,i);
b(1:i-1)=b(1:i-1)-x(i)*U(1:i-1,i);
end
x=x(:);

n2
Acest algoritm costă n împărţiri şi (n − 1) + (n − 2) + ... + 1 = 2 − n
2
adunări şi înmulţiri, iar complexitatea sa este O(n2 ).
1
SAXPY, which stands for “scalar a · x plus y”, is a basic linear algebra operation
that overwrites a vector y with the result of ax + y, where a is a scalar. This operation
is implemented efficiently in several libraries that can be tuned to the machine on which
the code is executed.

62
Vom reduce sistemul de ecuaţii liniare

a11 x1 + a12 x2 + · · · +a1n xn = b1


.. .. ..
. . .
ak1 x1 + ak2 x2 + · · · +akn xn = bk (2.2)
.. .. ..
. . .
an1 x1 + an2 x2 + · · · +ann xn = bn

la un sistem triunghiular echivalent în n−1 paşi de eliminare. Sistemul liniar


este transformat într-unul echivalent, adunând la o ecuaţie un multiplu al
altei ecuaţii. Un pas de eliminare constă în adunarea unui multiplu potrivit
în aşa fel încât o necunoscută să fie eliminată din ecuaţiile care rămân.
Pentru a elimina necunoscuta x1 din ecuaţiile #2 până la #n, realizăm
operaţiile
for k = 2 : n
ak1
{ec#k} = {ec#k} − {ec#1}
a11
end
Obţinem un sistem redus cu o matrice de tip (n − 1) × (n − 1) care conţine
numai necunoscutele x2 , . . . , xn . TSistemul rămas este redus din nou cu o
necunoscută, îngheţând a doua ecuaţie şi eliminând x2 din ecuaţiile de la
#3 la #n. Continuăm în acest mod până când ne rămâne doar o ecuaţie şi o
singură necunoscută. În acest mod am redus sistemul original la un sistem cu
matrice triunghiulară superior. Întregul proces este descris prin două cicluri
imbricate:
for k = 1 : n − 1
for i := k + 1 : n
aki
{ec#k} = {ec#k} − {ec#i}
aii
end
end

Coeficienţii noi ai ecuaţie k se calculează cu


aki
akj := akj − aij , j = i + 1, . . . , n, (2.3)
aii
iar membrii drepţi se modifică astfel,
aki
bk := bk − bi .
aii

63
De notat că al k-lea pas de eliminare (2.3) este o modificare de rang 1
a matricei rămase. Astfel, dacă adăugăm membrul drept la matricea A cu
operaţia A=[A, b], atunci eliminarea devine
for i=1:n-1
A(i+1:n,i)=A(i+1:n,i)/A(i,i);
A(i+1:n,i+1:n+1)=A(i+1:n,i+1:n+1)-A(i+1:n,i)*A(i,i+1:n+1);
end
unde ciclul interior după k este conţinut în notaţia vectorială din MATLAB.
De notat de asemenea că nu calculăm zerourile în A(i+1:n,i). Mai degrabă
vom utiliza aceste elemente ale matricei pentru a memora factorii (multipli-
catorii) necesari pentru a elimina necunoscuta xi .
Exemplul 2.2. Considerăm sistemul liniar Ax = b cu A = invhilb(4),
16 −120 240 −140
   
−4
 −120 1200 −2700 1680   60 
A= , b= .
   
 240 −2700 6480 −4200   −180 
−140 1680 −4200 2800 140

Membrul drept b a fost ales astfel ca soluţia să fie x = (1, 1, 1, 1)T . Dacă
aplicăm procedura de eliminare matricei extinse [A, b], atunci obţinem
A =
16.0000 -120.0000 240.0000 -140.0000 -4.0000
-7.5000 300.0000 -900.0000 630.0000 30.0000
15.0000 -3.0000 180.0000 -210.0000 -30.0000
-8.7500 2.1000 -1.1667 7.0000 7.0000
>> U=triu(A)
U =
16.0000 -120.0000 240.0000 -140.0000 -4.0000
0 300.0000 -900.0000 630.0000 30.0000
0 0 180.0000 -210.0000 -30.0000
0 0 0 7.0000 7.0000
Astfel sistemul redus echivalent este
16 −120 240 −140
   
−4
 0 300 −900 630   30 
x = 
   
0 0 180 −210 −30
 
   
0 0 0 7 7

şi are aceeaşi soluţie x = (1, 1, 1, 1)T .

64
Din nefericire metoda are un neajuns. Procesul de eliminare poate eşua
dacă, la pasul i, a i-a ecuaţie nu conţine necunoscuta xi , adică, coeficientul
(i, i) este zero. în acest caz nu putem utiliza această ecuaţie pentru a elimina
necunoscuta xi din ecuaţiile rămase.

Exemplul 2.3.

x2 + 3x3 = −6
2x1 − x2 + x3 = 10
−3x1 + 5x2 − 7x3 = 10

Deoarece prima ecuaţie nu conţine x1 , nu putem elimina x1 din a doua şi a


treia ecuaţie.

Evident, soluţia unui sistem liniar nu depinde de ordinea ecuaţiilor. Este


deci foarte natural să reordonăm ecuaţiile astfel ca să obţinem un element
pivot aii ̸= 0. Din punct de vedere al stabilităţii numerice, condiţia aii ̸= 0 nu
este suficientă; de asemenea trebuie să reordonăm ecuaţiile dacă necunoscuta
xi este doar „slab” conţinută (i.e. coeficientul ei este mic). Situaţia este
ilustrată în exemplul următor

Exemplul 2.4. Pentru ε mic, considerăm sistemul liniar

εx1 + x2 = 1,
(2.4)
x1 + x2 = 2.

Dacă interpretăm ecuaţiile ca drepte în plan, atunci graficele lor se inter-


sectează într-un punct apropiat de x1 = x2 = 1, aşa cum se poate vedea,
pentru ε = 10−7 , în figura 2.1. Unghiul dintre cele două drepte este de apro-
ximativ 45◦ . Dacă dorim să rezolvăm simbolic acest sistem, atunci trebuie
să eliminăm prima necunoscută din a doua ecuaţie înlocuid a doua ecuaţie
cu combinaţia liniară
1
{ec#2} − {ec#1}.
ε
Aceasta ne conduce la un nou sistem, matematic echivalent cu primul

εx1 +   x2 = 1,
1− 1
ε x2 = 2 − 1ε .

Dacă interpretăm din nou cele două ecuaţii ca drepte în plan, observăm
că, de această dată, cele două drepte aproape coincid, aşa cum se arată în

65
figura 2.1, unde am utilizat simbolul cerc pentru a face mai vizibilă a doua
dreaptă modificată. Punctul de intersecţie este acum foarte dificil de găsit
— problema a devenit prost condiţionată.
Ce a mers prost? Am eliminat necunoscuta utilizând un pivot foarte mic
pe diagonală. Facând aceasta, am transformat o problemă bine-condiţionată
într-una prost-condiţionată. Alegând pivoţi mici, eliminarea gaussiană de-
vine instabilă. Dacă, totuşi, interschimbăm ecuaţiile sistemului (2.4) şi apoi
facem eliminarea, obţinem

x1 + x2 = 2
(2.5)
(1 − ε)x2 = 2 − ε,

un sistem ale cărui linii sunt liniar independente, iar punctul de intersecţie
este bine definit şi poate fi calculat stabil.

2
first equation
1.8 second equation
second equation after elimination
1.6 solution

1.4

1.2

0.8

0.6

0.4

0.2

0
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2

Figura 2.1: Figura ilustrează cum un pivot mic în eliminarea Gaussiană


poate transforma o problemă bine condiţionată într-una prost condiţionată

Această observaţie motivează introducerea unei strategii de pivotare.


Vom considera pivotarea parţială, care înseamnă că înainte de fiecare pas
al eliminării, vom căuta în coloana curentă elementul cel mai mare în mo-
dul. Acest element va fi ales apoi drept pivot. Dacă nu putem găsi un pivot
nenul, aceasta înseamnă că necunoscuta corespunzătoare este absentă din
ecuaţiile rămase, i.e., sitemul este singular. În aritmetica de precizie finită,
dacă matricea este singulară, nu ne aşteptăm ca toţi pivoţii posibili să fie

66
exact zero, deoarece erorile de rotunjire vor produce elemente mici, dar to-
tuşi nenule; ele vor trebui comparate cu alte elemente ale matricei pentru a
decide dacă vor fi tratate ca zerouri. De aceea, vom considera în programul
de mai jos că un element pivot va fi zero dacă este mai mic decât 10−14 ∥A∥1 ,
o mărime rezonabilă în practică.

Sursa MATLAB 2.3 Eliminare gaussiană cu pivotare parţială


function x=Elimination(A,b)
% ELIMINATION solves a linear system by Gaussian elimination
% x=Elimination(A,b) solves the linear system Ax=b using Gaussian
% Elimination with partial pivoting. Uses the function
% BackSubstitution
n=length(b);
norma=norm(A,1);
A=[A,b]; % augmented matrix
for i=1:n
[maximum,kmax]=max(abs(A(i:n,i))); % look for Pivot A(kmax,i)
kmax=kmax+i-1;
if maximum < 1e-14*norma % only small pivots
error('matrix is singular')
end
if i ~= kmax % interchange rows
h=A(kmax,:); A(kmax,:)=A(i,:); A(i,:)=h;
end
A(i+1:n,i)=A(i+1:n,i)/A(i,i); % elimination step
A(i+1:n,i+1:n+1)=A(i+1:n,i+1:n+1)-A(i+1:n,i)*A(i,i+1:n+1);
end
x=BackSubstitution(A,A(:,n+1));

De notat că deşi trebuie să executăm doar n − 1 paşi de eliminare, ciclul


for din eliminare merge până la n. Acest lucru este necesar pentru a testa
dacă ann devine zero, ceea ce ne spune că matricea este singulară. Instruc-
ţiunile corespunzătoare vor avea o mulţime de indici vidă şi astfel nu vor
avea nici un efect pentru i = n.

Exemplul 2.5. Dacă considerăm A = magic(4) and b = (1, 0, 0, 0)T , ape-


lul x = Elimination(A, b) va returna mesajul matrix is singular. Acest
lucru este corect, deoarece rangul lui A este 3.

În MATLAB, un sistem liniar de forma Ax = b se rezolvă cu instrucţiu-

67
nea x=A\b. Dacă A are rang maxim, operatorul \ rezolvă sistemul utilizând
pivotarea parţială.

2.1.1 Factorizarea LU
Eliminarea gaussiană devine mai transparentă dacă o reformulăm utili-
zând operaţii matriceale. Considerăm matricea

1 0 0 0
 
 −ℓ
 21 1 0 0 
−ℓ 0 1 0 , aj1
L1 =  ℓj1 = , j = 2, . . . , n. (2.6)
 
 31
 .. .. .. . . ..  a11
 . . . . .

−ℓn1 0 0 ··· 1

Înmulţind sitemul liniar Ax = b cu L1 la stânga, obţinem

L1 Ax = L1 b, (2.7)

şi este uşor de văzut că acesta este sistemul la care se ajunge după primul
pas de eliminare: prima ecuaţie rămâne neschimbată, iar celelalte ecuaţii
(1)
nu mai conţin x1 . Notând elementele matriciei A(1) := L1 A cu aik , putem
elimina în acelaşi mod necunoscuta x2 cu matricea

1 0 0 ··· 0
 
0 1 0 · · · 0 (1)
aj2
 
L2 =  0 −ℓ32 1 · · · 0 , ℓj2 = , j = 3, . . . , n, (2.8)
 
 .. .. ... . ..  (1)
a22
 
. . . . .
0 −ℓn2 0 ··· 1

din ecuaţiile de la #3 la #n înmulţind sistemul (2.7) la stânga cu L2 ,

L2 L1 Ax = L2 L1 b, (2.9)

şi obţinem noua matrice A(2) := L2 A(1) = L2 L1 A. Continuând în acest mod,


obţinem matricele Lk şi A(k) pentru k = 1, . . . , n − 1 şi în final sistemul

A(n−1) x = Ln−1 · · · L1 Ax = Ln−1 · · · L1 b, (2.10)

unde acum am obţinut o matrice triunghiulară superior U ,

A(n−1) = Ln−1 · · · L1 A = U. (2.11)

68
Matricele Lj sunt matrice triunghiulare inferior cu 1 pe diagonala principală.
Ele sunt uşor de inversat, de exemplu

1 0 0 0
 
 +ℓ 1 0 0
 21 
L−1 = +ℓ 0 1 0 . (2.12)
 
1  31
 .. .. .. . . .. 
 . . . . .

+ℓn1 0 0 ··· 1

Trebuie să schimbăm doar semnul. Mutând în acest mod Li în membrul


drept, obţinem
A = L−1 −1
1 . . . Ln−1 U. (2.13)
Produsul de matrice triunghiulare inferrior este o matrice triunghiulară in-
ferior şi deci
L := L−1 −1
1 . . . Ln−1 (2.14)
este triunghiulară inferior. Mai exact, avem

1 0 0 ··· 0
 
ℓ
 21 1 0 · · · 0

L= ℓ ℓ32 1 · · · 0 , (2.15)
 
 31
 .. .. .. . . .. 

 . . . . .
ℓn1 ℓn2 ℓn3 ··· 1

unde ℓij sunt multiplicatorii utilizaţi la eliminare. Ecuaţia (2.13) are forma

A = LU, (2.16)

şi astfel am obţinut o descompunere a matricei A într-un produs de două


matrice triunghiulare — aşa numita descompunere LU . Cu pivotare par-
ţială, ecuaţiile (şi deci liniile lui A) se permută, şi astfel am obţnut nu o
descumpunere triungiulară a matricei A, ci una a lui à = P A, unde P este
o matrice de permutare, aşa că Ã are aceiaşi vectori linie ca A, dar în ordine
diferită.
Teorema 2.1 (Descompunere LU). Fie A ∈ Rn×n o matrice nesingulară.
Atunci există o matrice de permutare P astfel încât

P A = LU, (2.17)

unde L şi U sunt matricele triunghiulare inferior şi superior obţinute la


eliminarea gaussiană.

69
Demonstraţie. La primul pas al eliminării, căutăm linia ce conţine cel mai
mare pivot, o interschimbăm cu prima linie şi apoi realizăm eliminarea.
Astfel, avem
A(1) = L1 P1 A,
unde P1 interschimbă liniile #1 şi #k1 cu k1 > 1. În al doilea pas, interschim-
băm liniile #2 şi #k2 cu k2 > 2 înainte de eliminare, i.e.,
A(2) = L2 P2 A(1) = L2 P2 L1 P1 A.
Continuând în acest mod, obţinem
U = A(n−1) = Ln−1 Pn−1 · · · L1 P1 A, (2.18)
unde Pi interschimbă liniile #i şi #ki cu ki > i. Scopul nostru este de a
face permutările să apară împreună, în loc de a fi împrăştiate pe parcursul
factorizării. Pentru aceasta, să observăm că fiecare Li conţine o singură
coloană cu elemente nenule înafara diagonalei. Astfel, o putem scrie ca
Li = I − vi eTi ,
unde ei conţine 1 pe a i-a poziţie şi zero în rest, iar primele i elemente ale
lui vi sunt zero. Prin calcul direct, se observă că
Pn−1 · · · Pi+1 Li = Pn−1 · · · Pi+1 (I − vi eTi )
= Pn−1 · · · Pi+1 − ṽi eTi
h i
= I − ṽi (Pn−1 · · · Pi+1 ) eTi Pn−1 · · · Pi+1

undee ṽi = Pn−1 · · · Pi+1 vi este o versiune permutată a lui vi . Dar permuta-
rea Pn−1 · · · Pi+1 permută doar elementele de la i + 1 la n dintr-un vector;
elementele de la 1 la i rămân neschimbate. Aceasta însemnă că primele i
elemente ale lui ṽi sunt încă zero, iar ei rămâne neschimbat prin permutare,
i.e., Pn−1 · · · Pi+1 ei = ei . De fapt, avem
Pn−1 · · · Pi+1 Li = L̃i Pn−1 · · · Pi+1
cu L̃i = I − ṽi eTi încă triunghiulară inferior. Acum (2.18) implică
U = Ln−1 Pn−1 Ln−2 Pn−2 · · · L2 P2 L1 P1 A
= Ln−1 L̃n−2 Pn−1 Pn−2 · · · L2 P2 L1 P1 A
= · · · = (Ln−1 L̃n−2 · · · L̃2 L̃1 )(Pn−1 · · · P1 )A.

Punând P = Pn−1 · · · P1 şi L = L̃−1 −1 −1


1 · · · L̃n−2 L̃n−1 demonstraţia se încheie.

70
De notat că demonstraţia de mai sus arată că trebuie să interschimbăm
elemente atât în L cât în U când interschimbăm două linii. Aceasta înseamnă
că există o permutare de linii astfel încât toţi pivoţii care apar în timpul
eliminării să fie cei mai mari în modul din respectivele coloane, deci în scopul
analizei putem presupune că A a fost permutată în prealabil în acest mod.
În practică, permutarea este determinată în timpul eliminării, nu cunoscută
în avans.
Un sistem liniar poate fi rezolvat în următorii paşi:
1. Descompunerea triunghiulară a matricei sistemului P A = LU . pri-
mele
2. Se aplică aceleaşi schimbări de linii, b̃ = P b şi rezolvăm Ly = b̃ prin
substituţie directă.
3. Rezolvăm U x = y prin substituţie inversă.
Avantajul acestei abordări este că pentru un membru drept nou b nu
trebuie să recalculăm descompunerea. Este suficient să repetăm paşii 2 şi
3. Aceasta conduce la o economie de calcul substanţială, deoarece cea mai
mare parte a operaţiilor se consumă la factorizare: pentru a elimina prima
coloană, avem nevoie de n − 1 împărţiri şi (n − 1)2 înmulţiri şi adunări.
Pentru a doua coloană este nevoie de n − 2 împărţiri şi (n − 2)2 înmulţiri
şi adunări ş.a.m.d. până la ultima eliminare, care necesită o împărţire şi o
adunare şi o înmulţire. Numărul total de operaţii este deci
n−1
X  1 1
i + i2 = n3 − n,
i=1
3 3
care poate fi obţinut cu comada MuPAD sum(i+i^2,i=0..n-1). Deci calcu-
lul descompunerii LU costă O(n3 ) operaţii şi este mult mai costisitor decât
substituţia directă şi cea inversă, al căror cost este O(n2 ).
Descompunerea poate fi utilizată şi la calculul determinantului, deoarece
det(A) = det(L) det(U ) = det(U ) şi astfel descompunerea este utilă prin ea
însăşi. Lasăm în seama cititorului implementarea descompunerii LU.

2.1.2 Stabilitatea regresivă


Pentru a obţine rezultate cu sens, trebuie să ne asigurăm că fiecare din
cei trei paşi (factorizare LU, substituţie directă şi inversă) este regresiv sta-
bil. Pentru etapa de factorizare, am văzut în secţiunea 2.1 că pivotarea este
esenţială pentru stabilitatea numerică. Ne punem întrebarea dacă este sufi-
cientă pentru a garanta stabilitatea algoritmului.

71
Teorema 2.2 (Wilkinson). Fie A o matrice inversabilă şi L̂ şi Û factorii
numerici din descompunerea LU calculaţi prin eliminare gaussiană cu pivo-
tare parţială |ℓij | ≤ 1 pentru toţi i, j. Atunci pentru elementele lui A := LU ,
are loc
|âij − aij | ≤ 2α min(i − 1, j)eps + O(eps2 ), (2.19)

(k)
unde α := maxijk âij .
(k)
Demonstraţie. La al k-lea pas al EG, calculăm âij pentru i > k, j > k
utilizând formula (de actualizare)
 
(k) (k−1) (k−1)
âij = âij − ℓ̂ik âkj (1 + εijk ) (1 + ηijk )
(2.20)
(k−1) (k−1)
= âij − ℓ̂ik âkj + µijk ,

unde |µijk | poate fi mărginit utilizând |εijk | ≤ eps şi |ηijk | ≤ eps:


 
(k−1) (k−1) (k−1)
|µijk | ≤ âij − ℓ̂ik âkj |ηijk | + ℓ̂ik âkj |εijk | + O eps2
| {z }
(k)
âij +O(eps)
 
≤ 2αeps + O eps2

(j−1)
(j) âij
În plus, pentru i > j, avem âij = 0 şi ℓ̂ij = (j−1) (1 + εijj ), care implică
âjj

(j) (j−1) (j−1) (j−1)
0 = âij = âij − ℓ̂ij âjj + µijj , cu |µijj | = âij εijj ≤ αeps.

Astfel, (2.20) are loc ori de câte ori i > j ≥ k sau j ≥ i > k, cu
 
|µijk | ≤ 2αeps + O eps2 . (2.21)

Din definiţia lui  = L̂Û , avem


min(i,j) min(i,j)
(k−1)
âij = ℓ̂ik ûkj = (2.22)
X X
ℓ̂ik âkj .
k=1 k=1

Pentru cazul i > j, obţinem, utilizând (2.20) cu i > j ≥ k, o sumă telescopică


pentru âij :
j   j
(k−1) (k)
âij = + µijk = aij + (2.23)
X X
âij − âij µijk ,
k=1 k=1

72
(0) (j)
deoarece aij = aij şi aij = 0 pentru i > j. Pe de altă parte, pentru i ≤ j,
utilizăm (2.22) şi (2.20) cu j ≥ i > k pentru a obţine
i−1   i−1
(k−1) (k)
âij = − âij + µijk + ℓ̂ii ûij = aij + (2.24)
X X
âij µijk ,
k=1 k=1

(i−1)
unde am utilizat ℓ̂ii = 1 şi ûij = âij . Combinând (2.21), (2.23) şi (2.24)
se ajunge la rezultatul dorit.

Această teoremă ne arată că eliminarea gaussiană cu pivotare parţială


este regresiv stabilă, dacă factorul de creştere
α
ρ := (2.25)
max |aij |
(k)
nu este prea mare, ceea ce înseamnă că elementele aij întâlnite în timpul
procesului de eliminare nu cresc prea mult.
În continuare, vom arăta că varianta SAXPY a substituţiei inverse (al-
goritmul 2.2) este regresiv stabil. Arătăm mai jos că versiunea în virgulă
flotantă a substituţiei inverse pentru rezolvarea sistemului U x = b, unde
cantităţile εjk şi ηjk sunt toate mai mici în modul decât eps.
b̂kn := bk ;
for k = n, n − 1, . . . , 1 do
x̂kk := ub̂kk
kk
(1 + εkk );
for j = 1, . .. , k − 1 do 
(k−1) (k)
b̂j := b̂j − ujk x̂k (1 + εjk ) (1 + ηjk );
end for
end for

Teorema 2.3 (Stabilitatea substituţiei inverse). Fie x̂ soluţia numerică


obţinută prin rezolvarea sistemului U x = b utilizând varianta SAXPY a
substituţiei inverse. Atunci x̂ satisface Û x̂ = b, unde

|ûjk − ujk | ≤ (n − k + 1)|ujk |eps + O(eps2 ).

Demonstraţie. Definim
(k−1)
(k−1) b̂j
bj =
(1 + ηjk ) (1 + ηj,k+1 ) . . . (1 + ηjn )

73
pentru k > j. Atunci putem împărţi formula din ciclul interior cu cantitatea
(1 + ηjk ) (1 + ηj,k+1 ) . . . (1 + ηjn ) pentru a obţine

(k−1) (k) ujk (1 + εjk )


bj = bj − x̂k · .
(1 + ηj,k+1 ) . . . (1 + ηjn )

Mai mult, formula pentru calculul lui x̂k din ciclul exterior implică
(j)
(j) b̂j ujj x̂j
bj = = .
(1 + ηj,j+1 ) . . . (1 + ηjn ) (1 + εjj ) (1 + ηj,j+1 ) . . . (1 + ηjn )

Astfel, utilizând suma telescopică, obţinem


n  (k) (k−1) (j)

bj = + bj
X
bj − bj
k=j+1
n
ujj x̂j ujk x̂k (1 + εjk )
= +
X
,
(1 + εjj ) (1 + ηj,j+1 ) . . . (1 + ηjn ) k=j+1 (1 + ηj,k+1 ) . . . (1 + ηjn )

ceea ce ne arată că Û x̂ = b cu |ûjk − ujk | ≤ (n − k + 1)|ujk |eps + O(eps2 ),


aşa cum se cerea.

Deoarece |ujk | este mărginit de α = ρ·max(ajk ), observăm că substituţia


inversă este de asemenea regresiv stabilă, atât timp cât factorul de creştere
ρ nu este prea mare. Un argument similar ne arată că substituţia directă
este de asemenea regresiv stabilă.

2.1.3 Pivotare şi scalare


Pentru a asigura stabilitatea regresivă, trebuie aleasă o strategie de pivo-
tare pentru a ne asigura că factorul de creştere ρ rămâne mic. Din nefericire,
există matrice ale căror elemente cresc exponenţial în timpul procesului de
eliminare cu pivotare parţială, cum este de exemplu matricea

1 0 ··· 0 1
 

.. .. .. 
.

 −1
 1 . . 

A=
 .. 
 −1 −1 . 0 1 .

 .. .. . . 
. . . 1 1 
 

−1 −1 · · · −1 1

74
Pentru a începe procesul de eliminare cu pivotare parţială pentru această
matrice, trebuie să adăugăm prima linie la toate celelalte. Aceasta ne con-
duce la valaorea 2 în ultima coloană a matricei A(1) , dar nici una din co-
loanele din mijloc nu se schimbă. Adunând acum a doua linie a lui A(1) la
toate liniile următoare se obţine valoarea 4 în ultima coloană şi continuând
în acest mod, ultimul element al lui A(n−1) va fi egal cu 2n−1 .
Pivotarea parţială este acum aproape universal utilizată la rezolvarea
ecuaţiilor liniare, în ciuda existenţei matricelor care cresc exponenţial în
timpul procesului de eliminare. De fapt, astfel de matrice apar rar2 : un
experiment simplu MATLAB cu matrice aleatoare ne arată că eliminarea
gaussiană cu pivotare parţială este un proces foarte stabil.
N=500;
n=[10 20 30 40 50 60 70 80 90 100];
for j=1:length(n)
m=0;
for i=1:N
A=rand(n(j));
[L,U,P,rho]=lupgf(A);
m=m+rho;
end
g(j)=m/N
end
plot(n,g,'--',n,0.25*n.^(0.71),'-');
legend('average growth factor','0.25*n^{0.71}',...
'Location','NorthWest')
xlabel('matrix size'),ylabel('growth factor \rho')
În figura 2.2, se arată rezultatele obţinute pentru o rulare tipică a acestui
algoritm. De fapt, elementele cresc subliniar pentru matrice aleatoare şi în
acest caz, teorema 2.2 ne arată că eliminarea gaussiană cu pivotare parţială
este regresiv stabilă. Funcţia lupgf este o modificare a descompunerii LUP
care calculează şi factorul de creştere.
Pivotarea parţială poate eşua să aleagă pivotul corect dacă matricea este
prost scalată. Considerăm sistemul liniar Ax = b
10−12 1 17 + 10−12
   
−1
 3 −4 5  x =  −62  . (2.26)
   
40 −60 0 −1160
2
“. . . intolerable pivot-growth is a phenomenon that happens only to numerical analysts
who are looking for that phenomenon”, W. Kahan. Numerical linear algebra. Canad. Math.
Bull., 9:757–801, 1966.

75
7
average growth factor
0.25*n0.71
6

5
growth factor

1
10 20 30 40 50 60 70 80 90 100
matrix size

Figura 2.2: Creştere foarte lentă a elementelor întâlnite la eliminarea gaus-


siană cu pivotare parţială aplicată matricelor aleatoare

Soluţia exactă este x = (1, 20, 3)T . Dacă înmulţim prima ecuaţie cu 1014
obţinem sistemul echivalent By = c,

100 1014 −1014 17 · 1014 + 100


   

 3 −4 5 y =  −62 . (2.27)
   
40 −60 0 −1160

La pivotarea parţială, pentru sistemul (2.26), primul pivot la prima elimi-


nare va fi elementul a31 = 40. Pentru al doilea sistem (2.27), totuşi, datorită
proastei scalări, se va alege elementul a11 = 100. Aceasta are acelaşi efect
nedorit ca şi cum am fi ales elementul a11 = 10−12 ca pivot în sistemul
(2.26). Într-adevăr, în we MATLAB se obţine

1 1.0025
   

x = 20 , y = 20.003
   
3 3.0031

şi cea de-a doua soluţie nu este foarte precisă, aşa cum ne-am aşteptat.
Rezolvarea sistemului (2.27) prin descompunere QR (secţiunea 2.4) nu
ajută prea mult, aşa cum se poate vedea mai jos. Dar cu pivotare completă,
i.e., dacă căutăm elementul cel mai mare în modul din matricea rămasă şi

76
interschimbăm atât liniile (ecuaţiile) cât şi coloanele (reordonarea necunos-
cutelor), obţinem soluţia corectă.
Cu secvenţa MATLAB următoare
A=[1e-12, 1, -1; 3, -4, 5; 40, -60, 0];
b=[17+1e-12; -62; -1160];
xe=[1;20;3];
x1=A\b;
B=A; c=b;
B(1,:)=B(1,:)*1e14;
c(1)=c(1)*1e14;
x2=B\c;
[Q,R]=qr(B);
x3=R\(Q'*c);
x4=Gecp(B,c);
disp([xe,x1,x2,x3,x4]);
[norm(xe-x1) norm(xe-x2) norm(xe-x3) norm(xe-x4)]
se obţine rezultatele
exact A\b B\c QR piv. compl
xe x1 x2 x3 x4
1 1 0.99823 1.0736 1
20 20 20 20.046 20
3 3 3.0005 3.0464 3

∥xe − x1∥ ∥xe − x2∥ ∥xe − x3∥ ∥xe − x4∥


0 0.0018858 0.098583 2.979e-15
care ne arată că în acest caz doar eliminarea gaussiană cu pivotare com-
pletă ne conduce la o soluţie satisfăcătoare.
Dăm şi implemetarea pentru eliminare gaussiană cu pivotare completă
(vezi sursa MATLAB 2.4).
Wilkinson [?] a demonstrat că factorul de creştere ρcn pentru pivotarea
completă este mărginit de
1
 
ρcn ≤ n1/2 2 · 31/2 · · · n1/(n−1) ∼ n1/2 n 4 log n .

S-a conjecturat mai târziu că

ρ(n) = sup ρcn (A) ≤ n.


A∈Rn×n

Conjectura s-a dovedit falsă (vezi [8]). Limita limn→∞ g(n)/n este o pro-
blemă deschisă. Deşi în probleme practice factorul de creştere pentru pivo-

77
Sursa MATLAB 2.4 Eliminare gaussiană cu pivotare completă
function [x,pq]=Gecp(A,b)
%GECP - Gaussian elimination with complete pivoting
%call x=Gecp(A,b)
%A - matrix, b- right hand side vector
%x - solution

%initialization
[l,n]=size(A);
x=zeros(size(b));
norma=norm(A,1); %for pivoting
%s=max(abs(A),[],2);
A=[A,b]; %extended matrix
pq=1:n;
%Elimination
for i=1:n-1
%pivoting
u = max(abs(A(i:n,i:n)),[],'all');
[il,ic]=find(abs(A(i:n,i:n))==u);
il=il(1); ic=ic(1);
il=il+i-1; ic=ic+i-1; %update line and column index
if u<=1e-14*norma %small pivot
error('no unique solution'),
end
if il~=i %row interchange
A([i,il],:)=A([il,i],:);
end
if ic~=i %column interchange
A(:,[i,ic])=A(:,[ic,i]);
pq([i,ic])=pq([ic,i]);
end
%elimination
j=i+1:n;
m=A(j,i)/A(i,i);
A(j,i+1:n+1)=A(j,i+1:n+1)-m*A(i,i+1:n+1);
end
%back substitution
x(n)=A(n,n+1)/A(n,n);
for i=n-1:-1:1
x(i)=(A(i,n+1)-A(i,i+1:n)*x(i+1:n))/A(i,i);
end
[s,ni]=sort(pq); 78
x=x(ni);
tatra totală pare să fie mai mic decât cel pentru pivotarea parţială, ultima
este preferată deoarece este mai puţin costisitoare.

2.1.4 Sumă de matrice de rang unu


Eliminarea gaussiană fără pivot, sau calculul descompunerii LU, poate fi
interpretată ca o secvenţă de schimbări de rangul unu (rank-one changes).
În acest scop considerăm produsul de matrice ca o sumă de matrice de rang
unu: n
A = LU =
X
ℓ:,k uk,: ,
k=1
cu coloanele lui L şi liniile lui U
 
u1:
 u2: 
 
L = [ℓ:1 , ℓ:2 , . . . , ℓ:n ], U =
 ..  .

 . 
un:

Definim matricele n
Aj = A1 = A.
X
ℓ:k uk: ,
k=j

Deoarece L şi U sunt triunghiulare, primele j − 1 linii la lui Aj sunt zero.


Are loc
Aj+1 = Aj − ℓ:j uj: .
Pentru a elimina linia j şi coloana j a lui Aj alegem
(j) (j) (j)
uj: = ( 0, . . . , 0 , aj,j , aj,j+1 , . . . , aj,n )
| {z }
j−1 zeros

şi
0
 
 . 
 .. 
 
 0 
 
 1 
 

ℓ:j = 
 (j) 
 aj+1,j  .

 a(j) 
 j,j 
 . 
 . 
 . 
 (j) 
 an,j 
(j)
aj,j

79
Alegerea lui uj: şi ℓ:j nu este unică – putem de exemplu să împărţim la pivot
elementele lui uj: în loc de ℓ:j . Rezultatul acestor consideraţii s-a materializat
în funcţia MATLAB lup (vezi sursa MATLAB 2.5).

Sursa MATLAB 2.5 Descompunere LUP cu modificări de rang I (produs


exterior)
function [L,U,P]=lup(A)
%LUP find LUP decomposition of matrix A
%call [L,U,P]=lup(A)
%permute effectively lines

[m,~]=size(A);
piv=(1:m)';
for i=1:m-1
%pivoting
[~,kp]=max(abs(A(i:m,i)));
kp=kp+i-1;
%line interchange
if i~=kp
A([i,kp],:)=A([kp,i],:);
piv([i,kp])=piv([kp,i]);
end
%Schur complement
lin=i+1:m;
A(lin,i)=A(lin,i)/A(i,i);
A(lin,lin)=A(lin,lin)-A(lin,i)*A(i,lin);
end
P=eye(m); P=P(piv,:);
U=triu(A);
L=tril(A,-1)+eye(m);

2.2 Condiţionarea unui sistem de ecuaţii liniare


Ce putem spune despre precizia soluţiei când rezolvăm un sistem de ecu-
aţii liniare numeric? O investigare timpurie a acestei chestiuni a fost reali-
zată de John von Neumann şi H. H. Goldstine în 1947 [7]. Ei au concluzionat
analiza lor a erorii (de peste 70 de pagini!) cu observaţii chiar pesimiste refe-
ritoare la mărimea sistemului liniar care poate fi rezolvat pe un calculator cu

80
machine precison 10−8 10−10 10−12
n< 15 50 150
#multiplication 3500 120000 3500000

Tabela 2.1: Analiza pesimistă a erorii datorată lui John von Neumann şi H.
H. Goldstine

aritmetică finită, vezi tabela 2.1. Numărul necesar de înmulţiri pe care l-au
indicat este aproximativ n3 , care este numărul de operaţii necesar pentru
inversarea unei matrice.
A fost meritul lui James Wilkinson care a descoperit întâi prin experi-
ment că marginile au fost prea pesimiste şi a dezvoltat analiza regresivă a
erorilor, care explică mult mai bine ce se întâmplă cu calculele pe computer.
Considerăm sistemul de ecuaţii liniare Ax = b, cu A ∈Rn×n nesingulară.
Un sistem perturbat este de forma Âx̂ = b̂ şi presupunem că âij =
aij (1 + εij ) şi b̂i = bi (1 + εi), cu |εij | ≤ ε̃A şi |εi || ≤ ε̃b . Această perturbaţie
poate proveni din erorile de rotunjire în aritmetica de precizie finită, sau din
măsurători, sau din orice altă sursă; ne interesează cât de mult soluţia x̂ a
sistemului perturbat diferă de soluţia x a sistemului original. Perturbaţia
element cu element implică

 − A ≤ εA ∥A∥ , b̂ − b ≤ εb ∥b∥ , (2.28)

şi dacă noma este 1-norma sau norma infinit, avem εA = ε̃A şi εb = ε̃b , altfel
ele diferă printr-o constantă.

Teorema 2.4 (Condiţionarea rezolvării unui sistem liniar). Considerăm


două sisteme de ecuaţii liniare Ax = b şi Âx̂ = b̂ ce satisfac (2.28) şi pre-
supunem că A este inversabilă. Dacă εA · κ(A) < 1, tatunci avem

∥x̂ − x∥ κ(A)
≤ (εA + εb ) , (2.29)
∥x∥ 1 − εA κ(A)

unde κ(A) := ∥A∥ A−1 este numărul de condiţionare al matricei A.


Demonstraţie. Din
 
b̂ − b = Âx̂ − Ax = Â − A x̂ + A (x̂ − x) ,

obţinem    
x̂ − x = A−1 − Â − A x̂ + b̂ − b ,

81
şi deci, utimizând ipoteza (2.28),

∥x̂ − x∥ ≤ A−1 (εA ∥A∥ ∥x̂∥ + εb ∥b∥) .

Acum putem estima ∥x̂∥ = ∥x̂ − x + x∥ ≤ ∥x̂ − x∥ + ∥x∥ şi ∥b∥ ≤ ∥Ax∥ ≤


∥A∥ ∥x∥, care ne conduce la

∥x̂ − x∥ ≤ A−1 ∥A∥ (εA (∥x∥ + ∥x̂ − x∥) + εb ∥x∥) ,

şi astfel
∥x̂ − x∥ (1 − εA κ(A)) ≤ κ(A) ∥x∥ (εA + εb ) ,
ceea ce încheie demonstraţia.

Această teoremă ne arată că numărul de condiţionare al rezolvării unui


sistem de ecuaţii liniare este strâns legat numărul de condiţionare al matricei
A, indiferent de faptul că perturbaţia afectează matricea sau membrul drept
al sistemului liniar. Un mod alternativ de deducere a soluţiei perturbate când
doar matricea este uşor modificată se dă în secţiunea ??.
Dacă κ(A) este mare, atunci soluţiile x̂ şi x vor diferi semnificativ. Con-
form principiului lui Wilkinson (vezi secţiunea 1.7), rezutatul unui calcul
numeric este rezultatul exact al unei probleme cu datele iniţiale uşor per-
turbate. Astfel x̂ va fi rezultatul uni sistem liniar cu perturbaţii ale datelor
de ordinul eps. Ca o regulă empirică, ne aşteptăm la o eroare relativă de
eps · κ(A) în soluţie.
Calculul numărului de condiţionare este în general mai costisitor de-
cât rezolvarea sistemului liniar. De exemplu, dacă utilizăm norma spectrală
(∥·∥2 ), numărul de condiţionare se poate calcula cu
σmax (A)
κ2 (A) = ∥A∥2 A−1 = = cond(A) in MATLAB.

2 σmin (A)
Exemplul 2.6. Considerăm matricea
A=[21.6257 51.2930 1.5724 93.4650
5.2284 83.4314 37.6507 84.7163
68.3400 3.6422 6.4801 52.5777
67.7589 4.5447 42.3687 9.2995];
alegem soluţia exactă şi calculăm membrul drept
x=(1:4)'; b=A*x;
Rezolvăm sistemul

82
xa=A\b;
şi comparăm soluţia cu cea exactă.
format long e
[xa x]

ans = 4x2
1.000000000028497e+00 1.000000000000000e+00
2.000000000053824e+00 2.000000000000000e+00
2.999999999956422e+00 3.000000000000000e+00
3.999999999964602e+00 4.000000000000000e+00

cond(A)

ans =
6.014285987175801e+05

eps*cond(A)

ans =
1.335439755928603e-10

Observăm că soluţia numerică are aproximativ 5 cifre zecimale incorecte,


ceea ce corespunde foarte bine erorii teoretice datorate numărului de condi-
ţionarea mare de 6.014×105 al matricei A. Factorul eps·κ(A) = 1.33×10−10
evidenţiază bine eroarea de după a zecea cifră zecimală.
Exemple de matrice cu un număr de condiţionare foarte mare sunt ma-
tricea lui Hilbert H cu hij = 1/(i + j − 1), i, j = 1, . . . , n (H = hilb(n) în
MATLAB) şi matricea Vandermonde, care apare în interpolare şi ale cărei
coloane sunt puteri ale unui vector v, adică aij = vin−j (A=vander(v) în Ma-
tlab). Tabela 2.2 ne arată numerele de condiţionare pentru n = 3, . . . , 8,
unde am utilizat v = [1:n] în matricele Vandermonde.
Matrice cu număr mic de condiţionare sunt de exemplu matricele ortogo-
nale, U cu proprietatea U T U = I, care ne dă pentru numărul de condiţionare
spectral κ2 (U ) = ||U ||2 ||U −1 ||2 = ||U ||2 ||U T ||2 = 1, deoarece transformările
ortogonale păstrează distanţa euclidiană.
Numărul de condiţionare κ(A) satisface următoarele proprietăţi:

83
n cond(hilb(n)) cond(vander(1:n))
3 5.240568e+02 7.092313e+01
4 1.551374e+04 1.171013e+03
5 4.766073e+05 2.616969e+04
6 1.495106e+07 7.312009e+05
7 4.753674e+08 2.445910e+07
8 1.525758e+10 9.521117e+08

Tabela 2.2: Matrice cu număr de condiţionare mare

1. κ(A) ≥ 1, cu condiţia ca norma matricială să satisfacă proprietatea


−1 de
submultiplicativitate, deoarece 1 = ∥I∥ = A A ≤ ∥A∥ A .
−1

2. κ (αA) = κ(A).
max∥y∥=1 ∥Ay∥
3. κ(A) = min∥x∥=1 ∥Az∥ , deoarece

∥Az∥ −1
−1
A x ∥z∥
 
−1
A = max = max = min .
x̸=0 ∥x∥ z̸=0 ∥Az∥ z̸=0 ∥z∥

O altă proprietate a numărului de condiţionare este aceea că el măsoară


cât de departe este A de o matrice singulară în sens relativ.
Teorema 2.5. Fie E ∈ Rn×n . Dacă ∥E∥ < 1, atunci I + E este nesingulară
şi avem
1 1
≤ (I + E)−1 ≤ . (2.30)

1 + ∥E∥ 1 − ∥E∥
Demonstraţie. Pentru a arăta că I +E este nesingulară, vom presupune prin
absurd că I + E este singulară. Atunci există vectorul nenul x astfel încât
(I + E)x = 0. Atunci avem

x = −Ex =⇒ ∥x∥ = ∥Ex∥ ≤ ∥E∥ ∥x∥ .

Deoarece x ̸= 0, putem împărţi ambii membri la ∥x∥ şi să deducem că


∥E∥ ≥ 1, ceea ce contrazice ipoteza că ∥E∥ < 1. Deci I + E este nesingulară.
Pentru a arăta prima inegalitate din (2.30), luăm y = (I +E)−1 x. Atunci

x = (I + E)y =⇒ ∥x∥ ≤ (1 + ∥E∥) ∥y∥ ,

ceea ce implică
−1
(I + E) x 1

∥y∥
= ≥ .
∥x∥ ∥x∥ 1 + ∥E∥

84
Deoarece acest lucru este adevărat pentru toţi x ̸= 0, vom lua maximul
membrului stâng dupa toţi x ̸= 0 şi obţinem

−1 1
(I + E) ≥ ,

1 + ∥E∥
aşa cum s-a cerut. Pentru cealată inegalitate, obsevăm că

∥y∥ ≤ ∥x + y − x∥ ≤ ∥x∥ + ∥−Ey∥ ≤ ∥x∥ + ∥E∥ ∥y∥ ,

care implică
(1 − ∥E∥) ∥y∥ ≤ ∥x∥ .
Deoarece 1 − ∥E∥ > 0, putem împărţi ambii membrii prin (1 − ∥E∥) ∥x∥
fără a schimba sensul inegalităţii. Aceasta ne dă

−1
(I + E) x 1

∥y∥
= ≥ .
∥x∥ ∥x∥ 1 − ∥E∥

Luând maximul în membrul stâng după toţi x ̸= 0 obţinem (I + E)−1 ≤


1/(1 − ∥E∥), aşa cum s-a cerut.

Corolarul 2.6. Fie A ∈ Rn×n o matrice nesingulară, E ∈ Rn×n şi r =


∥E∥ / ∥A∥. Dacă rκ(A) < 1, atunci A + E este nesingulară şi

−1
(A + E) 1

≤ .
∥A−1 ∥ 1 − rκ(A)
Demonstraţie. Conform (2.30), avem

(A + E)−1 = (I + A−1 E)−1 A−1

−1 −1
A A
≤ (I + A−1 E)−1 A−1 ≤ ≤ .

1 − ∥A−1 E∥ 1 − ∥A−1 ∥ ∥E∥

Înlocuind ∥E∥ = r ∥A∥ şi împărţind cu A−1 se obţine rezultatul dorit.

De notat că ipoteza implică că A + E va fi nesingulară că perturbaţia E


este suficient de mică, în sens relative, în raport cu numărul de condiţionare
κ(A). Cu alte cuvinte, dacă κ(A) este mic, i.e., dacă A este bine condiţionată,
atunci este nevoie de o perturbaţie mare pentru a atinge singularitatea. Pe
de altă parte, există întotdeauna o perturbaţie E cu ∥E∥2 = ∥A∥2 /κ2 (A)
astfel încât A + E este singulară.
Propunem cititorului să rezolve următoarea problemă.

85
Problema 2.7. Presupunem că A ∈ Rn×n este matrice nesingulară. Fie y
A−1 y
un vector unitar astfel încât A−1 2 = A−1 y 2 şi definim x = ∥A

−1 ∥ . La
2
final, fie E = −AxxT .

1. Arătaţi că (A + E)x = 0. Deduceţi că A + E este singulară.

2. Arătaţi că ∥E∥2 ≤ 1/ A−1 2 . Aceasta implică faptul că perturbaţia


relativă satisface
∥E∥2 1
≤ .
∥A∥2 κ2 (A)

2.3 Descompunere Cholesky


2.3.1 Matrice simetrice pozitiv definite
Definit, ia 2.1 (Matrice simetrică, pozitiv definită). O matrice este sime-
trică, A = AT , şi pozitiv definită dacă

xT Ax > 0 ∀ x ̸= 0. (2.31)

Matricele pozitiv definite apar frecvent în aplicaţii, de exemplu la dis-


cretizarea ecuaţiilor cu derivate parţiale coercitiv, sau în optimizare, unde
hessiana trebuie să fie pozitiv definită într-un minim strict al unei funcţii de
mai multe variabile. Matricele pozitiv definite au câteva proprietăţi speciale,
aşa cum se arată în lema următoare.

Lema 2.8. Fie A = AT ∈ Rn×n pozitiv definită. Atunci

(a) Dacă L ∈ Rm×n cu m ≤ n are rangul m, atunci LALT este pozitiv


definită.

(b) Orice submatrice principală a lui A este pozitiv definită, i.e., pentru
orice submulţime nevidă J ⊂ {1, 2, ..., n} cu |J| = m, maticea m × m
A(J, J) este pozitiv definită.

(c) Elementele diagonale ale lui A sunt pozitive, i.e., aii > 0 pentru orice
i.

(d) Cel mai mare element în modul al lui A trebuie să fie situat pe diago-
nală şi deci pozitiv.

86
Demonstraţie. (a) Fie z ∈ Rm un vector arbitrar nenul. Faptul că L are
rangul m implică y := LT z ̸= 0, pentru că alfel liniile lui L ar fi liniar
dependente şi rangul ar fi mai mic decât m. Pozitiv definirea lui A, la
rândul ei, ne dă
z T LALT z = y T Ay > 0.

(b) Fie J = {j1 , . . . , jm } o submulţime arbitrară a lui {1, . . . , n} şi B =


A(J, J). Definim matricea n × m R cu elementele
(
1, j = jk
rjk =
0, altfel.

Atunci, este uşor de observat că B = RT AR. Rezultă, luând în (a)


L = R, că B este pozitiv definită.

(c) Rezultă din (b), alegând J să fie mulţimea cu un element {i}.

(d) Prin reducere la absurd. Presupunem că elementul cel mai mare în


valoare absolută nu apare pe diagonală. Atunci trebuie să existe o
perche (i, j) cu i ̸= j astfel încât |aij | să fie mai mare decât orice
element de pe diagonală; în particular, avem |aij | > aii şi |aij | > ajj .
Din (b), ştim că submatricea principală
!
aii aij
B=
aji ajj

trebuie să fie pozitiv definită. Luând xT = (1, −sign(aij ))T obţinem

xT Bx = aii + ajj − 2|aij | < 0,

ceea ce contrazice pozitiv definirea lui B. Deci cel mai mare element
în valoare absolută trebuie să apară pe diagonală şi deci să fie pozitiv
conform lui (c).

O altă caracterizare a matricelor simetrice pozitiv definite este:


Lema 2.9. Fie A = AT ∈ Rn×n . Atunci A este pozitiv definită dacă şi
numai dacă toate valorile sale proprii sunt pozitive.
Demonstraţie. Presupunem că A este simetrică şi pozitiv definită şi fie λ o
valoare proprie a lui A cu vectorul propriu v ̸= 0. Atunci

0 < v T Av = v T (λv) = λ ∥v∥22 .

87
Împărţind cu ∥v∥22 > 0 deducem că λ > 0. Reciproc, presupunem că toate
valorile proprii ale lui A sunt pozitive. Atunci conform teoremi spectrale,
putem scrie A = QΛQT , unde Λ este o matrice diagonală ce conţine valorile
proprii ale lui A şi QT Q = I. Dar o matrice diagonală cu elementele pozitive
este pozitiv definită, iar Q este nesingulară (i.e., are rangul maxim n). Deci,
conform lemei 2.8(a), A este de asemenea pozitiv definită.

Teorema 2.10. Fie A = AT ∈ Rn×n simetrică şi pozitiv definită. Atunci,


în aritmetica exactă, eliminarea gaussiană fără pivotare nu eşuează când
se aplică sistemului Ax = b şi mai mult, apar numai pivoţi pozitivi. Mai
mult, avem U = DLT , unde D este matrice diagonală pozitivă, i.e., avem
factorizarea A = LDLT .

Demonstraţie. Demonstraţie prin inducţie. Aşa cum s-a arătat anterior, ele-
mentul diagonal a11 > 0 şi deci poate fi utilizat ca pivot. Vom arăta că după
primul pas de eliminare matricea rămasă este pozitiv definită. pentru primul
pas utilizăm matricea

1 0 0 ··· 0
 
.
1 0 · · · .. 
 a
 − 21
 a11 
L1 = 
 .. 
a
 − a31 0 1 . 0

 11
 .. .. ..

 . . . 0

− aan1
11
0 1

ş îmulţim cu ea la stânga pentru a obţine


!
a11 bT
L1 A = , bT = (a12 , . . . , a1n ) .
0 A1

Datorită simetriei lui A, înmulţind utima ecuaţie la drepata cu LT1 obţinem


!
a11 0T
L1 ALT1 = (2.32)
0 A1

şi matricea A1 rămâne neschimbată deoarece prima coloană a lui L1 A con-


ţine numai zerouri sub diagonală. Aceasta ne arată că A1 este simetrică. Mai
mult, din lema 2.8(a), ştim că L1 ALT1 este pozitiv definită, deoarece L1 are
rangul n. Deoarece A1 este o submatrice principală a lui L1 ALT1 , ea este de
asemenea pozitiv definită. Astfel, se poate realiza al doilea pas al eliminării

88
şi procesul poate continua până când se obţine descompunerea
0
 0 
a11
Ln−1 . . . L1 ALT1 . . . LTn−1 =  ..  =: D,
.
 
 
(n−1)
0 ann
(k−1)
unde elementele diagonale akk sunt toate pozitive. Luând L = L−1 −1
1 · · · Ln−1 ,
se obţine descompunerea A = LDL , aşa cum s-a cerut.
T

Deoarece elementele diagonale ale lui D sunt pozitive, putem defini ră-
dăcina sa pătrată
q q 
(n−1)
D1/2 = diag a011 , . . . , ann .

Punând R = D1/2 LT , obţinem aşa-numita descompunere Cholesky


A = RT R.
Putem calcula R direct, fără a mai trece prin descompunerea LU, după cum
urmează. Înmulţind la stânga cu vectorul unitar eTj , obţinem
j
aj: = ej R R = = (2.33)
X
T T
r:j R rkj rk: .
k=1
Dacă presupunem că deja cunoaştem liniile r1: , . . . , rj−1: , putem rezolva
ecuaţia (2.33) în raport cu rj: şi să obţinem
j−1
rjj rj: = aj: − rkj rk: =: v T .
X

j=1

Membrul drept (vectorul v) este cunoscut. Înmulţind la dreapta cu ej obţi-


nem
√ vT
rjj rj: ej = rjj
2
= vj =⇒ rjj = vj =⇒ rj: = √ .
vj
Am calculat astfel următoarea linie a lui R. Trebuie doar să ciclăm după
toate liniile şi obţinem funcţia Cholesky (sursa MATLAB 2.6).
Pentru calculul descompunerii Cholesky există funcţia MATLAB prede-
finită chol. Utilizând descompunerea Cholesky, putem scrie forma pătratică
definită de matricea A ca o sumă de pătrate:
n X
n n
a2ij xi xj = xT Ax = xT RT Rx = ∥Rx∥2 = y T y =
X X
yi2 ,
i=1 j=1 i=1

cu y = Rx.

89
Sursa MATLAB 2.6 Descompunere Cholesky
function R=Cholesky(A)
% CHOLESKY computes the Cholesky decomposition of a matrix
% R=Cholesky(A) computes the Cholesky decomposition A=R'R
n=length(A);
R=zeros(size(A));
for j=1:n
v=A(j,j:n);
if j>1
v=A(j,j:n)-R(1:j-1,j)'*R(1:j-1,j:n);
end
if v(1)<=0
error('Matrix is not positive definite')
else
h=1/sqrt(v(1));
end
R(j,j:n)=v*h;
end

2.3.2 Stabilitate şi pivotare


Am văzut în secţiunea 2.1.2 că pentru matrice generale nesimetrice, pi-
votarea este esenţială nu numai pentru a asigura că procesul de eliminare nu
eşuează, dar şi pentru a asigura stabilitatea. Totuşi, pentru matrice sime-
trice şi pozitiv definite, am arătat că procesul nu poate eşua în aritmetica
exactă, chiar dacă nu se utilizează deloc pivotarea. Astfel, am putea să ne
gândim că pivotarea nu este necesară nici pentru stabilitate. Acest lucru
este adevărat, cu condiţia ca matricea să nu fie foarte prost condiţionată.
Teorema 2.11. Fie A = AT ∈ Rn×n pozitiv definită. Dacă cn κ2 (A)eps < 1
cu cn = 3n2 + O(eps), atunci eliminarea gaussiană (sau descompunerea
Cholesky) nu eşuează. Mai mult, dacă L̂ şi D̂ sunt factorii calculaţi numeric
din descompunerea Cholesky şi  = L̂D̂L̂T este descompunerea calculată
numeric, atunci avem estimarea

|âij − aij | ≤ 3α min(i − 1, j)eps + O(eps2 ), (2.34)

unde α = maxi,j |aij |.


Observat, ia 2.1. Rezultatul de mai sus implică faptul că dacă descompu-
nerea Cholesky eşuează, aceasta se întâmplă fie deoarece matricea A nu este

90
pozitiv definită sau este foarte prost condiţionată. În calcule practice, ra-
reori se verifică condiţia cn κ2 (A)eps < 1 înainte de factorizarea efectivă,
deoarece numărul de condiţionare κ2 (A) este mult mai costisitor de calcula
decât factorii descompunerii Cholesky înşişi.

Dacă se suspectează că A este atât de prost condiţionată încât ipoteza să


fie încălcată, pivotarea poate reduce erorile de factorizare datorate rotunjirii.
Pentru matrice pozitiv definite, pivotarea completă se reduce la pivotare
diagonală, deoarece elementul cel mai mare apare întotdeauna pe diagonală.
Putem obţine estimările din teorema 2.2, cu condiţia ca fiecare submatrice
care apare în eliminare să fie pozitiv definită.
h i
(k)
Demonstraţie. Fie Â(k) submatricea (n − k) × (n − k) Â(k) = âij
k+1≤i,j≤n
pentru 0 ≤ k ≤ n. La fel ca în demonstraţia teoremei 2.2, avem relaţia
(k−1)
(k)

(k−1) (k−1)

(k−1) âik âkj
âij = âij − ℓ̂ik âkj (1 + εijk ) (1 + ηijk ) = âij − (k−1)
+µijk ,
âkk
| {z }
(k)
bij

(k−1)
âik (k)
unde ℓ̂ik = (k−1) (1 + δik ), cu |εijk |, |ηijk |, |δik | < eps. Aici, B (k) = [bij ]k+1≤i,j≤n
âkk
este submatricea care s-ar obţine dacă am realiza un pas al eliminării ga-
ussiene asupra lui Â(k−1) în aritmetica exactă, astfel că µijk conţine toate
erorile de rotunjire asociate cu acest pas. Utilizâna aceleaşi transformări ca
în demonstraţia teoremei 2.2, putem scrie

(k−1) (k−1)
âik âkj  
|µijk | ≤ bij eps+ · 2eps + O eps2 . (2.35)
k
(k−1)
âkk

Utilizăm acum faptul că B (k) este pozitiv definită pentru a da o margine a


primilor doi termeni de mai sus. Din lema 2.8(d), avem
 
k  2
(k) (k) (k−1) (k−1)  (k−1)
max bij = max bii = max âii ≤ max âii
X
− âij .
ij i i i
j=1

Mai mult, are loc


(k−1) 2
 
(k−1) (k−1) âik
âik âkj ∗ 
(k−1) (k) †

(k−1)
max (k−1)
= max
(k−1)
= max âii − bii ≤ max âii ,
ij âkk

i âkk i i

91
(k−1)
unde egalitatea (*) este datorată simetriei lui aij şi inegalitatea (†) este
(k) (k) (k)
adevărată deoarece bii > 0. Astfel, luând αk = maxi,j |âij | = maxi âii ,
(2.35) devine
|µijk | ≤ 3αk−1 eps + O(eps2 ). (2.36)
Aceasta implică Â(k) = B (k) + E (k) cu

∥E(k)∥2 ≤ 3(n − k)eps Â(k−1) + O(eps2 ).

2
 
Astfel, dacă arătăm că Â(k) este pozitiv definită cu ck κ2 A(k) eps < 1, ck =
3(n − k)2 + O(eps), atunci inducţia este completă şi putem trage concluzia
că factorizarea Cholesky nu eşuează. Pentru aceasta, considerăm matricea
!
0 0
Ã(k−1) = Â(k−1) + = Â(k−1) + Ẽ (k) .
0 E (k)
Cu alte cuvinte, dacă realizăm un pas al eliminării gaussiene în aritmetica
exactă asupra lui Ã(k−1) , rezultatul ar fi Â(k) . Afirmăm că toate valorile
proprii ale lui Ã(k−1) sunt pozitive, ceea ce implică pozitiv definirea lui
Ã(k−1) . Presupunem contrariul, i.e., cea mai mică valoare proprie a lui Ã(k−1)
este zero ori negativă. Deoarece toate valorile proprii sunt funcţii continue
de perturbaţii (vezi capitolul ??), există 0 < t ≤ 1 astfel încât Â(k−1) + tẼ (k)
are o valoare proprie zero, i.e., este singulară. Dar, avem
 
(k)
tẼ κ2 Â(k−1) 3(n − k)teps + O(eps2 )
2 ≤ <1
(k−1)
 3 (n − k + 1)2 eps + O(eps2 )
2

deci din corolarul2.6, Â(k−1) + tE(k) trebuie să fie nesingulară, contradicţie.


Deci Ã(k−1) trebuie să fie pozitiv definită.
Dorim să arătăm acum că
  1
κ2 Â(k) ≤ 2 .
3 (n − k) eps + O(eps2 )
Avem

 = max z T Â(k) z
(k)
2 ∥z∥2 =1
 
(k−1) −1
= z T Ã(k−1) (k : n, k : n) − (âkk ) a:,k aT:,k z
h i
≤ z T Ã(k−1) (k : n, k : n) z
!
  0
= 0, z T Ã(k−1) ≤ Ã(k−1) .

z 2

92
 −1
Pe de altă parte, deoarece Â(k) este o submatrice principală a lui
−1  
 (k) −1 (k−1) −1
à (k−1) , avem automat Â
≤ Ã
. Astfel, avem

    2 2
κ2 Â (k) ≤ κ2 Ã (k−1) . Acum este suficient să delimităm superior Ã(k−1)

 2
(k−1) −1
şi Ã

individual:

2

≤ Â(k−1) + E (k) ≤ Â(k−1) (1 + 3(n − k)eps),
(k−1)


2 2 2 2
(k−1)

(k−1) −1

à ≤  2
1 − 3(n − k)κ2 Â
(k−1) 2 eps + O(eps )

2
 
(k−1) −1 (k−1) −1
 ck−1 Â

≤ 2
= 2
.
1 − 3 cn−k ck−1 − 3(n − k)
k−1

Înmulţierea celor două cantităţi de mai sus ne dă


 
  κ2 Â(k−1) ck−1 (1 + 3 (n − k) eps)
κ2 Â(k) ≤
ck−1 − 3(n − k)
1 1 + 3 (n − k) eps

eps ck−1 − 3(n − k)
1 1 + 3 (n − k) eps 1
≤ i ≤ ,
eps 3 (n − k)2 + (n − k) + 1 3 (n − k)2 eps
h

deci pasul de inducţie este complet. În fine, (2.36) implică

αk ≤ αk−1 (1 + 3eps) .

Astfel, utilizând aceeaşi analiză ca în teorema 2.2, obţinem estimaţia (2.34),


unde
α = max αk ≤ α0 (1 + eps)n = max |aij | + O (eps) .
0≤k≤n−1 ij

De notat că teorema de mai sus ne spune că factorul de creştere pentru


procesul de eliminare este în esenţă ρ = 1, i.e., nici un element care apare
în procesul de eliminare nu poate fi mai mare decât cel mai mare element al
matricei originale A. Astfel, factorizare Cholesky este regresiv stabilă, chiar
şi fără pivotare.

93
2.4 Eliminare cu rotaţii Givens
În această secţiune, vom discuta o altă metodă de eliminare, care necesită
mai multe operaţii, dar nu necesită pivotare şi care poate fi utilizată şi
la rezolvarea problemelor de aproximare în sensul celor mai mici pătrate.
Vom discuta aici o implementare directă –iar în secţiunea vom da alta mai
sofisticată.
La pasul al i-lea, vom elimina xi din ecuaţiile de la i + 1 la n după cum
urmează: fie
(i) : aii xi + · · · +ain xn = bi
.. ..
. .
(k) : aki xi + · · · +akn xn = bk (2.37)
.. ..
. .
(n) : ani xi + · · · +ann xn = bn
sistemul redus. Dorim să eliminăm xi din ecuaţia (k). În cazul în care aki = 0,
nu avem nimic de făcut deoarece necunoscuta xi este deja eliminată. Altfel,
înmulţim ecuaţia (i) cu − sin α şi ecuaţia (k) cu cos α şi înlocuim ecuaţia
(k) cu combinaţia liniară
(k)new := − sin α · (i) + cos α · (k). (2.38)
Deci, alegem α astfel ca

ki := − sin α · aii + cos α · aki = 0.


anew (2.39)
Deoarece aki ̸= 0, calculăm din (2.39)
aii
cot α = , (2.40)
aki
şi obţinem, utilizând identităţi trigonometrice cunoscute, cantităţile co =
cos α şi si = sin α cu formulele
p
cot = aii /aik , si = 1/ 1 + cot2 , co = si · cot (2.41)
În acest pas de eliminare, în plus faţă de înlocuirea ecuaţiei (k), vom modifica
ecuaţia (i) cu
(i)new := cos α · (i) + sin α · (k). (2.42)
Aceasta se face în scop de stabilitate. Se observă că pivotarea nu mai este
necesară: pentru situaţia în care aii = 0 şi aki ̸= 0, obţinem cot α = 0 şi deci
sin α = 1 şi cos α = 0. Atribuirile (2.38) şi (2.42) interschimbă pur şi simplu
ecuaţiile (k) şi (i), ca şi cum s-ar face pivotare!
Totuşi, efortul de calcul este dublu. Aceste idei ne conduc la programul
din sursa MATLAB 2.7.

94
Sursa MATLAB 2.7 Rezolvarea unui sistem liniar cu rotaţii Givens
function x=EliminationGivens(A,b);
% ELIMINATIONGIVENS solves a linear system using Givens-rotations
% x=EliminationGivens(A,b) solves Ax=b using Givens-rotations. Uses
% the function BackSubstitutionSAXPY.

n=length(A);
for i= 1:n
for k=i+1:n
if A(k,i)~=0
cot=A(i,i)/A(k,i); % rotation angle
si=1/sqrt(1+cot^2); co=si*cot;
A(i,i)=A(i,i)*co+A(k,i)*si; % rotate rows
h=A(i,i+1:n)*co+A(k,i+1:n)*si;
A(k,i+1:n)=-A(i,i+1:n)*si+A(k,i+1:n)*co;
A(i,i+1:n)=h;
h=b(i)*co+b(k)*si; % rotate right hand side
b(k)=-b(i)*si+b(k)*co; b(i)=h;
end
end
if A(i,i)==0
error('Matrix is singular');
end
end
x=BackSubstitutionSAXPY(A,b);

95
2.5 Matrice bandă
O matrice se numeşte matrice bandă dacă conţine elemente nenule numai
pe câteva diagonale alăturate diagonale principale. De exemplu, considerăm
matricea
2 1 −1 0 0 0 0
 

−4 2 3 0 0 0 0
 
 0 −12 3 1 2 0 0
 

 0
A= 0 −24 4 −7 0 0 (2.43)
 
.
 0 0 0 −40 5 1 4 
 
 0 0 0 0 −60 6 −23
 
0 0 0 0 0 −84 7

A este o matrice bandă cu lăţimea superioară de bandă p = 2 şi lăţimea


inferioară q = 1, având în total p+q +1 diagonale nenule. Este uşor de văzut
că, atunci când se calculează descompunerea LU fără pivotare, factorii L şi U
ocupă aceeaşi bandă, i.e., L este o matrice bandă inferioară cu q diagonale
şi U o matrice bandă superioară cu p diagonale nenule. Pentru matricea
(2.43), primul pas al eliminării gaussiene în care eliminăm x1 vom modifica
doar elementele a21 , a22 şi a23 . Realizând descompunerea completă LU fără
pivotare vom obţine factorii A = LU cu

1 0 0 0 0 0 0 2 1 −1 0 0 0 0
   

−2 1 0 0 0 0 0 0 4 1 0 0 0 0
   

 0 −3 1 0 0 0 0 0 0 6 1 2 0 0
   

L= 0 0 1 0 0 0 = 0 0 0 8 1 0 0
   
 −4  , U  .
 0 0 0 −5 1 0 0 0 0 0 0 10 1 4 
  
 0 0 0 0 −6 1 0 0 0 0 0 0 12 1 
   
0 0 0 0 0 −7 1 0 0 0 0 0 0 14

Astfel,descompunerea LU se va rescrie peste matricea A dacă, ca de obicei


nu vom memora elementele diagonale ale lui L.

2.5.1 Memorarea matricelor bandă


Desigur, nu vom memora o matrice banda ca matrice densă n × n , ci
vom evita memorarea elementelor nule. O matrice A cu lăţimea de bandă
inferioară q şi cu lăţimea de bandă superioară p poate fi memorată ca o
matrice densă B de tip n × (p + q + 1). Diagonalele nenule ale lui A devin
coloane ale lui B (cf. figurii 2.3). Preţul plătit pentru economia de memorie
este accesul mai complicat la elemente, deoarece indexarea necesită mai

96
multe operaţii întregi. Astfel,apare o competiţie între economia de memorie
şi economia de operaţii. în plus, viteza procesoarelor moderne este afectată
de accese complicate la memorie datorită efectelor de cache.

Figura 2.3: Memorarea unei matrice bandă

Transformarea matricei bandă A în matricea B este realizată în sursa


MATLAB 2.8.
Matricea din exemplul (2.43) este transformată de apelul
B=StoreBandMatrix(A,1,2)
în

B =
0 2 1 -1
-4 2 3 0
-12 3 1 2
-24 4 -7 0
-40 5 1 4
-60 6 -23 0
-84 7 0 0

Rezolvarea cu pivotare a unui sistem bandă în acest format este lăsată


ca exerciţiu.

97
Sursa MATLAB 2.8 Transformarea într-o matrice bandă
function B=StoreBandMatrix(A,q,p)
% STOREBANDMATRIX stores the band of a matrix in a rectangular matrix
% B=StoreBandMatrix(A) stores the band of A (with lower bandwidth p
% and upper bandwidth q) in the rectangular matrix B of dimensions
% n*p+q+1.
n=length(A);
B=zeros(n,p+q+1); % reserve space
for i=1:n
for j=max(1,i-q):min(n,i+p)
B(i,j-i+q+1)=A(i,j);
end
end

2.5.2 Sisteme tridiagonale


Pentru sisteme tridiagonale, nu vom utiliza transformarea de mai sus,
deoarece este mai uşor să păstrăm cele trei diagonale în trei vectori, c, d şi
b.  
d1 e1
c
 1 d2 e2



c2 d3 e3 
A= (2.44)
 
.. .. .. .

 . . . 

 
 cn−2 dn−1 en−1 
cn−1 dn
Sistemele liniare cu matrice tridiagonală pot fi rezolvate cu O(n) operaţii.
Descompunerea LU fără pivotare generează două matrice bidiagonale
 
1 u1 e1
 
ℓ
 1 1  
 u2 e2 

..

1
 
L= ℓ2 , U =  .
 
u3 .

.. ..

..
 
. .
 
.
 
en−1 
   

ℓn−1 1 un
Pentru a calcula L şi U , considerăm elementele ck şi dk+1 ale matricei A.
Făcând înmulţirea L · U şi comparând elementele se obţin relaţiile
ℓk uk = ck =⇒ ℓk = ck /uk ,
ℓk ek + uk+1 = dk+1 =⇒ uk+1 = dk+1 − ℓk ek .

98
Descompunerea LU se calculează cu

u(1)=d(1);
for k=1:n-1
l(k)=c(k)/u(k);
u(k+1)=d(k+1)-l(k)*e(k);
end

Substituţia directă şi cea inversă cu matricele L şi U sunt imediate. De


notat că putem rescrie vectorii ℓ şi u peste c şi d. Mai mult, soluţia se poate
rescrie peste membrul drept. Înliteratura franceză, algoritmul este cunoscut
sub numele de algoritmul lui Thomas. Cu aceste idei obţinem funcţia Thomas
(vezi sursa MATLAB).

Sursa MATLAB 2.9 Eliminare gaussiană pentru sisteme tridiagonale —


algoritmul lui Thomas
function [x,a,c]=Thomas(c,a,b,x);
%THOMAS Solves a tridiagonal linear system
% [x,a,c]=Thomas(c,a,b,x) solves the linear system with a
% tridiagonal matrix A=diag(c,-1)+diag(a)+diag(b,1). The right
% hand side x is overwritten with the solution. The
% LU-decomposition is computed with no pivoting resulting in
% L=eye+diag(c,-1), U=diag(a)+diag(b,1).

n=length(a);
for k=1:n-1 % LU with no pivoting
c(k)=c(k)/a(k);
a(k+1)=a(k+1)-c(k)*b(k);
end
for k=2:n % forward substitution
x(k)=x(k)-c(k-1)*x(k-1);
end
x(n)=x(n)/a(n); % backward substitution
for k=n-1:-1:1
x(k)=(x(k)-b(k)*x(k+1))/a(k);
end

De exemplu, sistemele tridiagonale apar la interpolarea spline(vezi sec-


ţiunea 3.3.1) şi la rezolvarea problemelor cu valori pe frontieră unidimensio-
nale.

99
2.5.3 Rezolvarea sistemelor bandă cu pivotare
La pivotarea parţială, interschimbarea liniilor poate distruge structura
de bandă şi să introducă elemente nenule. Dacă q este lăţimea de bandă
inferioară şi p lăţimea de bandă superioară, atunci după interschimbarea
liniilor, U va deveni o matrice bandă cu lăţimea superioară p + q. În această
secţiune, vom dezvolta un rezolvitor pentru sisteme bandă care va utiliza
matricea B, în care diagonalele nenule ale lui A vor fi memorate pe coloane.
Vom modifica funcţia Elimination pentru a profita de structura de
bandă şi a evita operaţiile cu elemente nenule. Nu vom putea trata mem-
brul drept ca a (n + 1)-a coloană a lui A. Mai mult, vom „de-vectoriza”
– nu vom putea utiliza întotdeauna operaţii vectoriale după transformarea
ai,j = bi,j−i+q+1 şi de aceea vom rescrie operaţiile utilizând utilizând cicluri.
Căutarea pivotului este limitată la lăţimea inferioară de bandă

maximum=0;
for k=i:min(i+q,n)
if abs(B(k,i-k+q+1))>maximum,
kmax=k; maximum=abs(B(k,i-k+q+1));
end
end

Interschimbarea liniilor la pivotare se realiza prin

h=A(kmax,:); A(kmax,:)=A(i,:); A(i,:)=h;

iar acum devine

for k=i:min(n,i+q+p)
h=B(kmax,k-kmax+q+1);
B(kmax,k-kmax+q+1)=B(i,k-i+q+1);
B(i,k-i+q+1)=h;
end
h=b(kmax); b(kmax)=b(i); b(i)=h;

Partea aceasta se poate vectoriza

h=B(kmax,i-kmax+q+1:min(n,i+2*q+p-kmax+1));
B(kmax,i-kmax+q+1:min(n,i+2*q+p-kmax+1))=B(i,q+1:min(n,2*q+p+1));
B(i,q+1:min(n,2*q+p+1))=h;
h=b(kmax); b(kmax)=b(i); b(i)=h;

Pasul de eliminare

100
A(i+1:n,i)=A(i+1:n,i)/A(i,i);
A(i+1:n,i+1:n+1)=A(i+1:n,i+1:n+1)-A(i+1:n,i)*A(i,i+1:n+1);

se rescrie sub forma unui ciclu

for k=i+1:n
A(k,i)=A(k,i)/A(i,i);
end
for k=i+1:n
for j=i+1:n+1
A(k,j)=A(k,j)-A(k,i)*A(i,j);
end
end

Ţinând cont acum de lăţimea de bandă superioară şi inferioară şi prelu-


crând separat membrul drept, obţinem

for k=i+1:min(n,i+q)
B(k,i-k+q+1)=B(k,i-k+q+1)/B(i,q+1);
end
for k=i+1:min(n,i+q)
b(k)=b(k)-B(k,i-k+q+1)*b(i);
for j=i+1:min(n,i+p+q)
B(k,j-k+q+1)=B(k,j-k+q+1)-B(k,i-k+q+1)*B(i,j-i+q+1);
end
end

Combinând toate acestea se obţine funcţia EliminationBandMatrix (sursa


MATLAB 2.10).

2.5.4 Utilizarea rotaţiilor Givens


Am văzut în secţiunea 2.4 că rotaţiile Givens se pot utiliza ca alternativă
la descompunerea LU pentru rezolvarea sistemelor liniare dense. Această al-
ternativă se poate aplica şi la sisteme bandă: vom arăta cum se procedează
cu sisteme tridiagonale cu matricea A ca în ecuaţia (2.44). Utilizăm matri-
cea rotaţiei Givens G(ik) , care diferă de matricea unitate doar prin patru
elemente,

gii = +gkk = c = cos α,


gik = −gki = s = sin α.

101
Sursa MATLAB 2.10 Eliminare gaussiană cu pivotare parţială pentru
matrice bandă
function x=EliminationBandMatrix(p,q,B,b)
% ELIMINATIONBANDMATRIX solves a linear system with a banded matrix
% x=EliminationBandMatrix(p,q,B,b); solves the banded linear system
% Ax=b with partial pivoting. The columns of B contain the nonzero
% diagonals of the matrix A. The first q columns of B contain the
% lower diagonals of A (augmented by leading zeros) the remaining
% columns of B contain the diagonal of A and the p upper diagonals,
% augmented by trailing zeros. The vector b contains the right-hand
% side.
n=length(B);
B=[B,zeros(n,q)]; % augment B with q columns
normb=norm(B,1);
for i=1:n
maximum=0; % search pivot
for k=i:min(i+q,n)
if abs(B(k,i-k+q+1))>maximum
kmax=k; maximum=abs(B(k,i-k+q+1));
end
end
if maximum<1e-14*normb % only small pivots
error('matrix is singular')
end
if i~=kmax % interchange rows
h=B(kmax,i-kmax+q+1:min(n,i+2*q+p-kmax+1));
B(kmax,i-kmax+q+1:min(n,i+2*q+p-kmax+1))=B(i,q+1:min(n,2*q+p+1));
B(i,q+1:min(n,2*q+p+1))=h;
h=b(kmax); b(kmax)=b(i); b(i)=h;
end
for k=i+1:min(n,i+q) % elimination step
B(k,i-k+q+1)=B(k,i-k+q+1)/B(i,q+1);
end
for k=i+1:min(n,i+q)
b(k)=b(k)-B(k,i-k+q+1)*b(i);
for j=i+1:min(n,i+p+q)
B(k,j-k+q+1)=B(k,j-k+q+1)-B(k,i-k+q+1)*B(i,j-i+q+1);
end
end
end

102
Sursa MATLAB 2.11 Eliminare gaussiană cu pivotare parţială pentru
matrice bandă – continuare
for i=n:-1:1 % back substitution
s=b(i);
for j=i+1:min(n,i+q+p)
s=s-B(i,j-i+q+1)*x(j);
end
x(i)=s/B(i,q+1);
end
x=x(:);

Înmulţind sistemul liniar la stânga cu G(ik) se schimbă doar două linii, ai:
şi ak: :
anew
i: := cos α · aold
i: + sin α · ak: ,
old
(2.45)
k: := − sin α · ai: + cos α·ak: .
anew old old

Vom alege ungiul α pentru a anula elemente din matrice (vezi secţiunea 2.4).
Vom ilustra pentru n = 5. La primul pas vom alege G(12) , care combină
primele două linii şi alege α astfel încât anew
21 = 0:

x x x x X
x x x 0 x x
G(12) x x x = x x x
x x x x x x
x x x x

Se generează un element nenul a13 = X. La al doilea pas se alege G(23) care


schimbă linia a doua şi a treia astfel ca

x x X x x X
0 x x 0 x x X
G(23) x x x = 0 x x ,
x x x x x x
x x x x

103
anulând a32 = 0 şi generând elementul a24 = X. Următoarea rotaţie cu
G(34) ne dă

x x X x x X
0 x x X 0 x x X
G(34) 0 x x = 0 x x X
x x x 0 x x
x x x x

La final, înmulţind cu G(45) , vom obţine A transformată într-o matrice tri-


unghiulară superior R:

x x X x x X
0 x x X 0 x x X
G(45) 0 x x X = 0 x x X = R.
0 x x 0 x x
x x 0 x

Soluţia se poate obţine prin substituţie inversă. Pentru transformare, avem


nevoie doar de cele trei diagonale nenule ale lui A. Ele vor fi rescrise cu
elementele matricei bandă superioare R.

d1 e1 d1 e1 c1
.. .. ..
c1 d2 e2 . . .
.. .. .. .. ..
A= . . . 7→ R = . . cn−2
.. .. ..
. . en−1 . en−1
cn−1 dn dn

Funcţia ThomasGivens rezolvă un sistem tridiagonal utilizând rotaţii Givens


(sursa MATLAB 2.12). Membrul drept este memorat în b şi rescris de soluţie.

104
Sursa MATLAB 2.12 Rezolvarea unui sistem tridiagonal cu rotaţii Givens
function [b,d,e,c]=ThomasGivens(c,d,e,b);
% THOMASGIVENS solves a tridiagonal system of linear equations
% [b,d,e,c]=ThomasGivens(c,d,e,b) solves a tridiagonal linear
% system using Givens rotations. The coefficient matrix is
% A=diag(c,-1)+diag(d)+diag(e,1), and the right hand side b is
% overwritten with the solution. The R factor is also returned,
% R=diag(d)+diag(e,1)+diag(c,2).
n=length(d);
e(n)=0;
for i=1: n-1 % elimination
if c(i)~=0
t=d(i)/c(i); si=1/sqrt(1+t*t); co=t*si;
d(i)=d(i)*co+c(i)*si; h=e(i);
e(i)=h*co+d(i+1)*si; d(i+1)=-h*si+d(i+1)*co;
c(i)=e(i+1)*si; e(i+1)=e(i+1)*co;
h=b(i); b(i)=h*co+b(i+1)*si;
b(i+1)=-h*si+b(i+1)*co;
end;
end;
b(n)=b(n)/d(n); % backsubstitution
b(n-1)=(b(n-1)-e(n-1)*b(n))/d(n-1);
for i=n-2:-1:1,
b(i)=(b(i)-e(i)*b(i+1)-c(i)*b(i+2))/d(i);
end;

105
Capitolul 3

Interpolare

Interpolarea înseamnă inserţia sau generarea unei valori lipsă. Este arta
de a citi printre rândurile unei funcţii tabelate.

3.1 Exemple introductive


Presupunem că ştim doar valorile f (xi ), i = 0, . . . , n ale unei funcţii

x x0 x1 ... xi z xi+1 ... xn


(3.1)
y = f (x) y0 y1 ... yi ? yi+1 ... yn

Există o modalitate de a aproxima valoarea f (z) a funcţiei f în z fără a


evalua f ? De ce ne interesează această problemă?

1. Nu cunoaştem o formulă pentru f , iar valorile tabulate (3.1) sunt sin-


gurele informaţii pe care le avem. Valorile ar fi putut fi obţinute prin
măsurători fizice, de exemplu valorile temperaturii din exteriorul unei
case în timpul unei zile:
t 8am 9am 11am 1pm 5pm
t în ◦ C 12.1 13.6 15.9 18.5 16.1
Ar putea să ne intereseze ce temperatură a fost la 10am.

2. O aplicaţie importantă a interpolării apare la procesarea imaginilor di-


gitale: când o imagine este mărită trebuie să creştem numărul de pixeli.
Aceasta se realizează prin interpolarea valorilor pixelilor adiţionali.

3. O altă utilizare a interpolării (poate nu mai este aşa importantă)


este calculul valorilor intermediare ale unei funcţii tabelate. Înainte

106
de epoca computerelor, tabelele de funcţii erau foarte populare. As-
tronomii utilizau pentru calculele lor cărţi cu tabele de logaritmi şi
de funcţii trigonometrice. Multe din aceste tabele au fost înlocuite
prin programe pe calculator care calculează valorile funcţiei când este
nevoie. Considerăm de exemplu funcţia
Zx
f (x) = esin t d t.
0

Dacă cunoaştem valorile tabelate

x 0.4 0.5 0.6 0.7 0.8 0.9


, (3.2)
y 0.4904 0.6449 0.8136 0.9967 1.1944 1.4063

cât este f (0.66)?

4. În fine, interpolarea se poate utiliza la compresia datelor: într-o tabelă


mare, densă, se poate memora tot a zecea valoare şi să se interpoleze
valorile şterse când este nevoie.

Dacă noua valoare z este în domeniul determinat de punctele de inter-


polare xi atunci vorbim de interpolare. Dacă valoarea dorită z este înafara
domeniului procesul ae numeşte extrapolare. Predicţiile sunt întotdeauna ex-
trapolări: am putea dorim de exemplu să şim ce temperatura va fi la 7 pm în
exemplul de mai sus. Un alt exemplu despre extrapolare este demonstraţia
cu recensământul din Satele Unite în MATLAB. Se cere estimarea populaţiei
din 2010 cunoscând populaţia din datele de recensământ din anii 1900, 1910,
. . . , 2000. Acest exemplu ne arată cât de senzitivă este problema. Depinzând
de model, se pot obţine răspunsuri foarte diferite.
Pentru a interpola datele din tabela (3.1) pentru o anumită valoare z,
vom alege o funcţie model g(x). De regulă, această funcţie de interpolare
trebuie să fie uşor de evaluat şi să aibă următoarea proprietate

g(xk ) = f (xk ) pentru anumiţi xk în vecinătatea lui z.

Dacă g este cunoscută, atunci g(z) se ia ca aproximare a lui f (z). Speranţa


şi scopul este ca eroarea de interpolare |g(z) − f (z)| să fie mică. De notat
că dacă se dau numai valorile (3.1) şi nu mai ştim altceva despre funcţia f ,
atunci problema interpolării este incorect pusă. Orice altă valoare se poate
alege ca „aproximare” pentru f (z). Considerăm funcţia:

f (x) = sin x + 10−3 ln(x − 0.35415)2 .

107
Dacă este tabelată pentru x = 0.33, 0.34, . . . , 0.38, nu ne aşteptăm să avem
o singularitate în z = 0.35415:
x 0.3300 0.3400 0.3500 0.3600 0.3700 0.3800
f (x) 0.3166 0.3250 0.3319 0.3420 0.3533 0.3636
Astfel, dacă o procedură de interpolare dă o valoare de f (0.35415) ≈ 0.3356,
probabil se va accepta. În general, se presupune că f este netedă. În acest
caz se poate spune mai mult despre eroarea de interpolare.

Exemplul 3.1. Dorim să interpolăm f (0.66) cu valorile din tabela (3.2)


alegând funcţia
a
g(x) = .
x−b
Parametrii se determină impunând condiţia ca g să interpoleze în cele două
puncte vecine ale lui z.

Rezolvăm problema cu Symbolic Math Toolbox.


Cu modelul raţional

clear all
digits(8);
syms a b g(x)
g(x)=a/(x-b);
ec1 = g(vpa('0.6')) == vpa('0.8136');
ec2 = g(vpa('0.7')) == vpa('0.9967');
s = solve([ec1, ec2], unique([a, b]));

se obţin coeficienţii

disp([s.a,s.b]);

 
−0.442881 1.1443474

g(x)=subs(g(x), [a,b],[s.a,s.b]);

valoarea interpolantului

108
g(vpa('0.66'))

ans = 0.91438717

valoarea funcţiei şi eroarea

syms t
fa = vpaintegral(exp(sin(t)), t, sym(0), vpa('0.66'))

fa = 0.921698

err = abs(g(vpa('0.66')) - fa)

err = 0.0073107103

Alegerea funcţiei model nu este cea mai inteligentă. Cu un model liniar


g(x) = ax + b

clear a b
syms a b
g(x) = a*x+b;

se obţin coeficienţii

s = solve([ec1, ec2], unique([a, b]));


disp([s.a,s.b]);

 
−0.442881 1.1443474

109
g(x)=subs(g(x), [a,b],[s.a,s.b]);
g(vpa('0.66'))

ans = 0.85204589

iar eroarea este mai mică

err = abs(g(vpa('0.66')) - fa)

err = 0.069651995

3.2 Interpolare polinomială


O alegere uzuală de funcţii model pentru interpolare sunt polinoamele,
deoarece ele sunt uşor de evaluat şi netede, fiind indefinit derivabile. Fiind
date n + 1 puncte în (3.1), căutăm un polinom P (x) astfel ca
P (xi ) = f (xi ), i = 0, . . . , n. (3.3)
Deoarece conform lui (3.3) avem de îndeplinit n + 1 condiţii, avem nevoie
de n + 1 grade de libertate. Considerăm polinomul de grad n
Pn (x) = a0 + a1 x + · · · + an−1 xn−1 + an xn . (3.4)
Trebuie determinaţi cei n + 1 coeficienţi {ai } astfel încât (3.3) să fie satisfă-
cută. Aceasta ne conduce la sistemul liniar
a0 + a1 x0 + · · · + an−1 x0n−1 + an xn0 = f (x0 )
a0 + a1 x1 + · · · + an−1 x1n−1 + an xn1 = f (x1 )
...... .. ..
... .=.
a0 + a1 xn + · · · + an−1 xnn−1 + an xnn = f (xn ).
În formă matricială
1 x0 · · · x0n−1 xn0 f (x0 )
    
a0
 . ..

1 x1 · · · x1n−1 n
x1   ..  
.

= (3.5)
   
 .. .. .. ..    
. . . .   an−1   f (xn−1 ) 
    

1 xn · · · xnn−1 xnn an f (xn )
| {z }| {z } | {z }
V a f

110
Matricea V este matricea Vandermonde şi dacă nodurile sunt distincte este
nesingulară şi sistemul are soluţie unică.
Pe de altă parte matricea Vandermonde tinde să fie prost condiţionată
şi va trebui să reprezentăm polinoamele în altă bază decât cea canonică,
monomială.

3.2.1 Polinoamele Lagrange


În loc să încercăm să interpolăm direct valorile funcţiei f (xi ) în nodu-
rile xi cu un polinom de grad cel mult n, putem căuta o reprezentare a
polinomului de interpolare Pn (x) de forma
n
Pn (x) = f (xj )ℓj (x), (3.6)
X

j=0

unde polinoamele ℓj vor fi de grad n şi vor fi determinate astfel ca Pn (x) să


interpoleze funcţia f în nodurile xj . Aceasta se întâmplă dacă ℓi (xi ) = 1 şi
ℓi (xj ) = 0 pentru i ̸= j, deoarece atunci există doar o contribuţie la sumă
provenind de la al i-lea termen dacă ℓi este evaluat în xi , şi anume
n
Pn (xi ) = f (xj )ℓj (xi ) = ℓi (xi )f (xi ) = f (xi ).
X

j=0

Pentru a determina ℓi (x), trebuie să găsim un polinom care să ia valoarea


1 în xi şi să aibă n zerouri în toate celelalte noduri xj , i ̸= j. Un astfel de
polinom se poate scrie direct în formă factorizată
n
x − xj
ℓj (x) = i = 0, 1, . . . , n. (3.7)
Y
,
j=0
xi − xj
j̸=i

Acest polinom ℓi (x) este zero în xj pentru j ̸= i, deoarece în acest caz unul
dintre factorii de la numărător se anulează. Pe de altă parte, când este eva-
luat în xi , numărătorul şi numitorul devin identice şi valoarea polinomului
este 1, aşa cum s-a dorit. Aceste polinoame se numesc polinoame fundamen-
tale Lagrange şi interpolarea devine foarte foarte simplă cu ajutorul lor.
Cele n + 1 polinoame fundamentale Lagrange există numai dacă numitorii
din ecuaţia (3.7) sunt nenuli, adică dacă nodurile sunt distincte (xi ̸= xj
pentru orice i ̸= j).
Cum ştim că polinomul de interpolare dezvoltat după puterile lui x ca în
(3.4) şi polinomul construit cu funcţiile de bază Lagrange dat de (3.6) repre-
zintă acelaşi polinom? O posibilitate este să dezvoltăm (3.6), să reordonăm
termenii şi să verificăm că expresiile sunt într-adevăr egale.

111
Există, totuşi, un raţionament mai simplu care arată că polinoamele sunt
identice. Presupunem că avem două polinoame de interpolare Q(x) şi P (x),
ambele de grad n astfel încât să aibă loc

Q(xj ) = f (xj ) = P (xj ), j = 0, . . . , n.

Diferenţa d(x) = Q(x) − P (x) este un polinom de grad n şi datorită propri-


etăţii de interpolare a lui P şi Q

d(xj ) = Q(xj ) − P (xj ) = f (xj ) − f (xj ) = 0, j = 0, . . . , n.

Un polinom nenul de grad ≤ n nu poate avea mai mult de n zerouri. Dar


d are n + 1 zerouri; deci, el trebuie să fie identic nul, adică Q(x) ≡ P (x).
Astfel am demonstrat:
Teorema 3.1 (Existenţa şi unicitatea polinomului de interpolare). Fiind
date n + 1 noduri distincte xj , matricea Vandermonde din (3.5) este nesin-
gulară şi există un polinom de interpolare unic Pn de grad ≤ n care verifică
P (xj ) = f (xj ) pentru j = 0, . . . , n.
Exemplul 3.2. We interpolate again the value f (0.66) for the function
given in (3.2). We chose n = 2 and use the three points
x 0.6 0.7 0.8
y 0.8136 0.9967 1.1944
to determine the interpolation polynomial (a quadratic function). We obtain
(x − 0.7)(x − 0.8)
ℓ0 (x) = =⇒ ℓ0 (0.66) = 0.28
(0.6 − 0.7)(0.6 − 0.8)
(x − 0.6)(x − 0.8)
ℓ1 (x) = =⇒ ℓ0 (0.66) = 0.84
(0.7 − 0.6)(0.7 − 0.8)
(x − 0.6)(x − 0.7)
ℓ2 (x) = =⇒ ℓ0 (0.66) = −0.12
(0.8 − 0.6)(0.8 − 0.7)
and

P2 (x) = 0.28 · 0.8136 + 0.84 · 0.9967 − 0.12 · 1.1944 = 0.921 71

Since the exact value is f (0.66) = 0.9216978 the interpolation error is now
−1.01·10−5 and the interpolated value has the same accuracy as the tabu-
lated values.
The MATLAB sources 3.1 and 3.2 gives code for Lagrange interpolation
polynomial and Lagrange basic polynomials, respectively.

112
Sursa MATLAB 3.1 Interpolare Lagrange
function fi=LagrangeInterpolation(x,y,xi)
%LAGRANGEINTERPOLATION - polinomul de interpolare Lagrange
% x,y -coordonatele nodurilor
% xi - punctele in care se evalueaza polinomul

if nargin ~=3
error('numar ilegal de argumente')
end
[mu,nu]=size(xi);
fi=zeros(mu,nu);
np1=length(y);
for i=1:np1
z=ones(mu,nu);
for j=[1:i-1,i+1:np1]
z=z.*(xi-x(j))/(x(i)-x(j));
end;
fi=fi+z*y(i);
end

Sursa MATLAB 3.2 Polinomul Lagrange fundamental ℓk


function v=LagrangeBasicPoly(t,x,k)
%LAGRANGEBASICPOLY - basic Lagrange polynomial
%call v=LagrangeBasicPoly(t,x,k)
%t - evaluation points
%x - nodes
%k - index

k=k+1;
v=ones(size(t));
n=length(x);
for i=[1:k-1,k+1:n]
v=v.*(t-x(i))/(x(k)-x(i));
end

113
3.2.2 Eroarea în interpolarea polinomială
If the function f has continuous derivatives in the range of interpolation,
then an error term can be derived for the interpolation formula.
Teorema 3.2 (Interpolation Error). Let f , ′ , . . . , f (n+1) be continuous
in the interval [x0 , xn ], where x0 < x1 < · · · < xn . If the polynomial Pn
interpolates f in the nodes xj then
(x − x0 ) (x − x1 ) · · · (x − xn ) (n+1)
R(x) := f (x) − Pn (x) = f (ξ) , (3.8)
(n + 1)!
where ξ is some value between the nodes x0 , x1 , . . . , xn and x.
Demonstraţie. For x = xk the theorem trivially holds, since both sides va-
nish, so let us consider a fixed x such that x ̸= xk, k = 0, . . . , n. Define
n
L(t) = (t − xi ) (3.9)
Y

i=0

and consider the function


f (x) − Pn (x)
F (t) = f (t) − Pn (t) − cL(t), unde c =
L(x)
Clearly F (xk ) = 0, k = 0, 1, . . . , n, but also F (x) = 0 because of the special
choice of the constant c. Thus F has at least n + 2 distinct zeros. By Rolle’s
theorem, the continuity of F implies that there is a zero of F between any
two zeros of F . Therefore F has at least n + 1 distinct zeros. If we continue
to take derivatives and count the zeros we finally find that
F (n+1) (t) = f (n+1) (t) − Pn(n+1) (t) − cL(n+1) (t) (3.10)
has at least one zero ξ. Since Pn is of degree n we have P (n+1) (t) ≡ 0, and,
because L is a polynomial of degree n + 1 with leading coefficient 1, we
obtain
L(n+1) (t) = (n + 1)!.
If we insert this for t = ξ in Equation (3.10) and if we solve the equation
F (n+1) (ξ) = 0
for c then we get using the definition of c
f (x) − Pn (x) f (n+1) (ξ)
c= =
L(x) (n + 1)!
which is what we wanted to prove.

114
Observat, ia 3.1. L(x), dat de (3.9), se numeşte polinomul nodurilor.
To estimate the interpolation error in Example 3.2 with the expression
in (3.8), we need to compute the maximum of |f | in the interval [0.6, 0.8].
Since  x 
d3 Z  
f ′′′ (x) = 3  esin t d t = esin x cos2 x − sin x
dx
0
and since f ′′′is monotonically decreasing in this interval with f (0.6) =
0.2050 and f (0.8) = −0.4753, we conclude
max |f (x)| = |f (0.8)| = 0.4753.
0.6≤x≤0.8

Furthermore

max |L(x)| = 3.849 · 10−4


0.6≤x≤0.8

and thus for all x ∈ (0.6, 0.8) the error can be bounded by
|Rn (x)| ≤ 3.04910−5 .
For x = 0.66 we have |L(0.66)| = 3.36·10−4 and thus we get the sharper
bound
|Rn (0.66)| ≤ 2.6617·10−5 .
The estimate is about twice as large as the exact interpolation error.
Observat, ia 3.2. • Normally the derivative f (n+1) is not available and
so it is difficult to use the error term given above unless a bound on
this derivative is known.
• From the product L(x) in the error term, one can expect large interpo-
lation errors towards the ends of the interval in which the interpolation
is performed, since many of the terms in the product will be large. This
is especially the case if many nodes are used. An impressive example
was given by Runge and is reproduced in Figure 3.1. The function
which is interpolated is
1
f (x) =
1 + x2
and the nodes are chosen to be equidistant on the interval x ∈ [−5, 5].
The polynomials indeed still interpolate the function values but be-
tween the nodes the interpolation error is unacceptably large for hi-
gher degree polynomials, especially near the boundary. A remedy is to

115
use non-equidistant nodes which are more closely spaced at the ends
of the interval, for example Chebyshev nodes, which are derived from
the roots of the Chebyshev polynomials. We discuss Chebyshev poly-
nomials in detail in Section ??. Another possibility is to use piecewise
polynomials, as we will see in the Section 3.3, which leads to spline
interpolation in Section 3.3.1.
Here is the MATLAB code for Figure 3.1.

f = @(x) 1./(1+x.^2);
t=linspace(-5,5,1500);
V=zeros(length(t),2);
k=0;
for n=[4,8]
x=linspace(-5,5,n+1)';
y=f(x);
k=k+1;
V(:,k)=LagrangeInterpolation(x,y,t);
end
h=plot(t,f(t),t,V,'k--');
n=20;
x=linspace(-5,5,n+1); y=f(x);
v=LagrangeInterpolation(x,y,t);
plot(t,f(t),t,v,'k--')

1 10

0
0.5

-10

0
-20

-30
-0.5

-40

-1
-50

-1.5 -60
-5 -4 -3 -2 -1 0 1 2 3 4 5 -5 -4 -3 -2 -1 0 1 2 3 4 5

(a) n = 4, 8 (b) n = 20

Figura 3.1: Contraexemplul lui Runge, cu noduri echidistante. La stânga


n = 4, 8, la dreapta n = 16.

116
3.2.3 Formula baricentrică
Interpolarea cu formula lui Lagrange (3.6) nu este foarte eficientă, deoa-
rece pentru a adăuga un nod nou de interpolare, trebuie să realizăm O(n2 )
operaţii. Există o variantă numtită formula baricentrică, care necesită doar
O(n) operaţii pe nod. Pentru a o deduce considerăm
n Y
n
x − xj
Pn (x) = f (xi ).
X

i=0 j=0 i
x − xj
j̸=i

Definim ponderila baricentrice


1
wi = n , i = 0, . . . , n.
(xi − xj )
Y

j=0
j̸=i

Pentru x ̸= xi , deoarece
L(x)
ℓi (x) = wi ,
x − xi
unde L(x) este polinomul nodurilor (dat de (3.9)) şi
n
ℓi (x) = 1,
X

i=0

vom obţine pentru polinomul de interpolare Lagrange


n n
L(x)
ℓi (x)f (xi ) f (xi )
X X
wi
i=1 i=1
x − xi
Pn (x) = n = n ,
L(x)
ℓi (x)
X X
wi
i=1 i=1
x − xi

din care după simplificare se obţine


n
wi
f (xi )
X

i=1
x − xi
Pn (x) == n . (3.11)
X wi
i=1
x − xi

Pentru a interpola cu formula baricentrică vom calcula întâi coeficienţii


wi în O(n2 ) operaţii cu funcţia dată de sursa MATLAB 3.3.

117
Sursa MATLAB 3.3 Ponderi Lagrange baricentrice
function w = BarycentricWeigths( x )
%BARYCENTRICWEIGHTS - compute barycentric weights(coefficient)
%call w = barycentricweigths( x )
%x - nodes
%w - weights

n=length(x);
w=ones(1,n);
for j=1:n
w(j)=1/prod(x(j)-x([1:j-1,j+1:n]));
end
end

Pentru un nod de interpolare nou z, calculăm ponderile µi = wi /(z −


xi ) şi evaluăm apoi Pn (z) = ni=0 µi f (xi )/ ni=0 µi cu doar O(n) operaţii.
P P

Obţinem funcţia BarycentricLagrange (vezi sursa MATLAB 3.4).


Pentru detalii asupra interpolării baricentrice, inclusiv cele legate de im-
plementare vezi [?].

3.2.4 Formula de interpolare a lui Newton


În această formulă, utilizăm polinoamele Newton definite prin
n−1
πk (x) = (x − xj ).
Y

j=0

Polinoamele de interpolare iau forma

Pn (x) = d0 π0 (x) + d1 π1 (x) + · · · + dn πn (x). (3.12)

Condiţiile de interpolare (3.3) ne conduc la un sistem de ecuaţii liniare cu


necunoscutele coeficienţii di :
n
dj πj (xi ) = f (xi ), i = 0, 1, . . . , n. (3.13)
X

j=0

118
Sursa MATLAB 3.4 Interpolare Lagrange baricentrică
function ff=BarycentricLagrange(x,y,w,xx)
%BARYLAGRANGE - barycentric Lagrange interpolation
%call ff=baryLagrange(x,y,xi)
%x - nodes
%y - function values
%w - barycentric weights
%xx - interpolation points
%ff - values of interpolation polynomial

numer = zeros(size(xx));
denom = zeros(size(xx));
exact = zeros(size(xx));
n = length(x);
for j=1:n
xdiff = xx-x(j);
temp = w(j)./xdiff;
numer = numer+temp*y(j);
denom = denom+temp;
exact(xdiff==0) = j;
end
ff = numer ./ denom;
jj = find(exact);
ff(jj) = y(exact(jj));
end

119
Matricea sistemului (3.13) este triunghiulară inferrior

1
 
π0 (x0 ) · · · πn (x0 )
 
 1 x1 − x0 
 π0 (x1 ) · · · πn (x1 )
   
= 1 x2 − x0 (x2 − x0 ) (x2 − x1 )
  
 .. .. .. .

. . .
  .. .. .. ..

 
. . . .
 
π0 (xn ) · · · πn (xn )
 
1 xn − x0 (xn − x0 ) (xn − x1 ) j=0 (xn − xj )
Qn−1

Coeficienţii dj se pot calcula prin substituţie directă:

f (xi ) − j=0 dj πj (xi )


Pi−1
d0 = f (x0 ), di = , i = 1, . . . , n. (3.14)
πi (xi )

Totuşi, există un algoritm mai simplu care calculează aceşti coeficienţi bazat
pe diferenţe divizate. Definiţia este recursivă:

f [xi ] = f (xi ) , diferenţele divizate de ordin zero,


f [xi+1 , xi+2 , . . . , xi+k ] − f [xi , xi+1 , . . . , xi+k−1 ]
f [xi , xi+1 , . . . , xi+k ] = , i = 1, . . . , n.
xi+k − xi

De exemplu, diferenţele de ordinul întâi se pot evalua cu

f [x1 ] − f [x0 ] f (x1 ) − f (x0 )


f [x0 , x1 ] = = .
x1 − x0 x1 − x0
A doua diferenţă divizată este
f (x2 )−f (x1 ) f (x1 )−f (x0 )
f [x1 , x2 ] − f [x0 , x1 ] x2 −x1 − x1 −x0
f [x0 , x1 , x2 ] = = .
x2 − x0 x2 − x0
Calculul diferenţelor divizate poate fi aranjat într-un tablou triunghiular,

x0 f [x0 ]
x1 f [x1 ] f [x0 , x1 ]
x2 f [x2 ] f [x1 , x2 ] f [x0 , x1 , x2 ]
x3 f [x3 ] f [x2 , x3 ] f [x1 , x2 , x3 ]
.. .. .. ..
. . . .
xn f [xn ] f [xn−1 , xn ] f [xn−2 , xn−1 , xn ] · · · f [x0 , . . . , xn ]

120
Presupunem că vrem să adaugăm punctul (x, f (x)) în partea de sus a tabelei
diferenţelor divizate:

x f [x]
x0 f [x0 ] f [x, x0 ]
..
x1 f [x1 ] f [x0 , x1 ] .
.. .. .. .. . .
. . . . .
xn−1 f [xn−1 ] f [xn−2 , xn − 1] · · · · · · f [x, x0 , . . . , xn−1 ]
xn f [xn ] f [xn−1 , xn ] ··· ··· f [x0 , . . . , xn ] f [x, x0 , . . . , xn ]

Avem
f [x0 ] − f [x]
f [x, x0 ] = =⇒ f (x) = f [x0 ] + (x − x0 ) f [x, x0 ] (3.15)
x0 − x
f [x0 , x1 ] − f [x, x0 ]
f [x, x0 , x1 ] = =⇒ f [x, x0 ] = f [x0 , x1 ] + (x − x1 ) f [x, x0 , x1 ]
x1 − x
Inserând în (3.15) găsim

f (x) = f [x0 ] + (x − x0 ) (f [x0 , x1 ] + (x − x1 ) f [x, x0 , x1 ])


= f [x0 ] + (x − x0 ) f [x0 , x1 ] + (x − x0 ) (x − x1 ) f [x, x0 , x1 ] .

Dacă continuăm în acelaşi mod eliminarea diferenţelor divizate în care apare


x, obţinem

f (x) = Q(x) + (x − x0 )(x − x1 ) · · · (x − xn )f [x, x0 , x1 , . . . , xn ], (3.16)

unde
n n−1
Q(x) = f [x0 , x1 , . . . , xk ] (x − xk ) (3.17)
X Y

k=0 k=0
ieste un polinom de gradul n. De notat că dacă punem x → xi în (3.16),
atunci obţinem f (xi ) = Q(xi ) deoarece al doilea termen se anulează. Rezultă
că Q trebuie să fie polinomul de interpolare unic determinat. Comparând
expresia din (3.17) cu (3.12), deducem că coeficienţii Newton sunt diferenţele
divizate de pe diagonala tabelei de diferenţe divizate:

di = f [x0 , x1 , . . . , xi ], i = 0, . . . , n.

Funcţia dată în sursa MATLAB 3.5 calculează coeficienţii utilizând schema


cu diferenţe divizate.
De noata că în algoritmul de mai sus construim întreaga tabelă de di-
ferenţe divizate înainte de a extrage diagonala. Este posibil să se reducă

121
Sursa MATLAB 3.5 Coeficienţii polinomului de interpolare Newton (di-
ferenţe divizate)
function [d,D]=NewtonCoefficients(x,y)
% NEWTONCOEFFICIENTS divided differences for the Newton interpolation
% [d,D]=NewtonCoefficients(x,y); computes the divided differences
% needed for constructing the Newton form of the interpolating
% polynomial through the points (x,y)

n=length(x); % degree of interpolating polynomial+1


x=x(:); y=y(:);
D=zeros(n,n);
D(:,1)=y;
for i=2:n % divided differences
D(i:n,i)=diff(D(i-1:n,i-1))./(x(i:n)-x(1:n-i+1));
end
d=diag(D);

necesaru de memorie la O(n) rescriind succesiv diferenţele divizate care nu


mai sunt necesare.
Cu funcţia MATLAB NewtonInterpolation, (vezi sursa 3.6) evaluăm
polinomul de interpolare pentru noul argument z în forma Horner
Pn (z) = f [x0 ] + (z − x0 ) (f [x0 , x1 ] + (z − x1 ) f [x0 , x1 , x2 ]
+ (z − xn−1 ) (f [x0 , . . . , xn ]) · · · ))
utilizând recurenţa
p := f [x0 , x1 , . . . xn ]
p = (z − xi )p + f [x0 , x1 , . . . , xi ] , i = n − 1, n − 2, . . . , 0.
Diferenţele divizate au multe proprietăţi interesante. Comparând expre-
sia din (3.16) şi eroare de interpolare (3.8)
n n
f (n+1) (ξ)
f (x) = P (x) + (x − xk ) = P (x) + (x − xk )f [x, x0 , . . . xn ]
Y Y

k=0
(n + 1)! k=0

observăm că diferenţele divizate sunt aproximaţii ale derivatelor:


Lema 3.3. Există un ξ între nodurile x, x0 , x1 , . . . , xn astfel încât
f (n+1) (ξ)
f [x, x0 , . . . xn ] = .
(n + 1)!

122
Sursa MATLAB 3.6 Interpolare Newton
function yy=NewtonInterpolation(x,d,xx)
% NEWTONINTERPOLATION interpolate using the Newton polynomial
% yy=NewtonInterpolation(x,d,xx); uses the points (x,.)
% and the precalculated divided difference coefficients d for the
% Newton form of the interpolation polynomial P and iterpolates
% the values yy=P(xx)

n=length(x);
yy=d(n);
for i=n-1:-1:1
yy=yy.*(xx-x(i))+d(i);
end;
end

Analogia între formula de interpolare a lui Newton şi dezvoltarea este


acum evidentă: polinomul Taylor al lui f dezvoltat în jurul lui x0 ,
n
f (k) (x0 )
Tn (x) = (x − x0 )k ,
X

k=0
k!

este foarte asemănător cu polinomul de interpolare Qn (x) dat de (3.17).


O altă proprietate utilă este independent, a diferent, elor divizate de ordi-
nea nodurilor, e.g., f [x0 , x1 , x2 ] = f [x2 , x1 , x0] = f [x1 , x0 , x2 ].

Teorema 3.4 (Simetria diferenţelor divizate). Diferenţa divizată f [xi , xi+1 , . . . , xi+k ]
este o funcţie simetrică de argumentele sale (nu depinde de ordinea noduri-
lor) şi este dată de
i+k
f (xj )
f [xi , xi+1 , . . . , xi+k ] = (3.18)
X
i+k
.
j=i
(xj − xp )
Y

p=i
p̸=j

Demonstraţie. Imediată, ţinând cont că diferenţa divizată este coeficientul


dominat al polinomului de interpolare Lagrange cu nodurile xi , xi+1 , . . . , xi+k .
Formula se obţine egalând coeficientul dominant al formei Newton a PIL cu
cel al formei clasice.

123
3.2.5 Interpolare cu polinoame ortogonale
Vom considera o altă bază pentru a reprezenta polinomul de interpolare:
mulţimea polinoamelor ortogonale ce corespund nodurilor xi , i = 0, . . . , m.
În cazul nostru produsul scalar este definit prin
n
⟨pj , pk ⟩ = pj (xi )pk (xi ).
X

i=0

Vom scrie relaţia de recurenţă pentru polinoame ortogonale sub forma:

pk+1 (x) = (x − αk+1 ) pk (x) − βk pk−1 (x), k = 0, 1, 2, . . .


(3.19)
p−1 (x) ≡ 0, p0 (x) ≡ 1, β0 = 0
cu
⟨xpk , pk ⟩ ∥pk ∥2
αk+1 = , βk = .
∥pk ∥2 ∥pk−1 ∥2
Coeficienţii αk şi βk depind de nodurile xi . În particular,
n
⟨xp0 , p0 ⟩ ⟨x, 1⟩ 1 X
α1 = = = xi ,
⟨p0 , p0 ⟩ ⟨1, 1⟩ n + 1 i=0

adică α1 este media nodurilor. În general,


n n
xi p2k (xi ) p2k (xi )
X X

i=0 i=0
αk+1 = n şi βk = n .
p2k (xi ) p2k−1 (xi )
X X

i=0 i=0

Pentru k ≤ n considerăm problema de aproximare

b0 p0 (xj ) + b1 p1 (xj ) + · · · + bk pk (xj ) ≈ f (xj ), j = 0, . . . , n (3.20)

sau în notaţie matricială P b ≈ f

p0 (x0 ) p1 (x0 ) · · · pk (x0 ) f (x0 )


    
b0

p0 (x1 ) p1 (x1 ) · · · pk (x1 ) 
b1  
f (x1 ) 
= (3.21)
    
 .. .. .. ..  .. .. 

 . . . .

 .
 
  .


p0 (xn ) p1 (xn ) · · · pk (xn ) bk f (xk )

Dacă k = n, atunci avem n + 1 ecuaţii cu n + 1 necunoscute bi . Totuşi,


dacă k < n, sistemul P x = b este în general incompatibil, deci trebuie să

124
rezolvăm (3.21) ca o problemă de cea mai bună aproximare în sensul celor
mai mici pătrate. Deoarece matricea P este ortogonală soluţia se obţine uşor
cu ecuaţiile normale
P T P b = P T f.
Deoarece P T P este diagonală soluţia se obţine cu
n
pj (xi )fi
X

i=0 pTj f
bj = n = , j = 0, . . . , k.
∥pj ∥2
p2j (xi )
X

i=0
Funcţia MATLAB OrthogonalPolynomialCoefficients calculează ma-
tricea P , coeficienţii αk şi βk din relaţia de recurenţă şi coeficienţii aproxi-
mantei bi .
Dacă dorim să interpolăm pentru valori noi xx vom utiliza relaţia de
recurenţă (3.19) pentru construi matricea valorilor polinoamelor ortogo-
nale în punctele xx. Combinaţia liniară a acelor coloane cu k coeficienţi
bi ne dă cel mai bun polinom de aproximare de grad k − 1 în sensul celor
mai mici pătrate pentru punctele date (x, y). Matricea pp din funcţia MA-
TLAB OrthogonalInterpolation conţine valorile polinoamelor ortogonale
în punctele xx iar matricea yy conţine în coloanele sale valorile polinoamelor
de cea mai bună aproximare pentru argumentele xx.
Exemplul 3.3. Utilizăm 13 puncte echidistante de pe graficul funcţiei
f (x) = esin x :
Pentru probleme de fitting, adesea nu este necesar să interpolăm datele
pentru că ele pot conţine deja erori de măsurare sau de rotunjire care pot fi
amplificate de interpolarea de grad mare. În loc de aceasta, putem utiliza cu
rezultate satisfăcătoare aproximări în sensul cmmp, cum este polinomul de
grad 7 din figura (??). Ca alternativă, dacă cunoaştem eroarea de măsurare
δ şi dorim să aproximăm cu polnomul de cel mai mic grad k pentru care
reziduul rk satisface ∥rk ∥ ≤ δ.
Să notăm cu Pk = [p0 , p1 , . . . , pk ] matricea ce conţine primele k + 1
coloane ale lui P . Reziduul polinomului de aproximare de grad k se poate
calcula explicit cu

rk = y − Pk bk , bTk = (b0 , b1 , . . . bk ).

Dacă creştem gradul cu 1 atunci

rk+1 = y − Pk+1 bk+1 = y − Pk bk − bk+1 pk+1 = rk − bk+1 pk+1 .

125
Dacă calculăm lungimea

∥rk+1 ∥2 = (rk − bk+1 pk+1 )T (rk − bk+1 pk+1 )


= ∥rk ∥2 − 2bk+1 pTk+1 rk + b2k+1 ∥pk+1 ∥2 .

Dar deoarece pk+1 ⊥ Pk obţinem

pTk+1 rk = pTk+1 (y − Pk bk ) = pTk+1 y.

Coeficienţii bk se calculează cu

pTk y
bk =
∥pk ∥2

Thus, pTk+1 rk = pTk+1 y = bk+1 ∥pk+1 ∥2 . Dacă introducem aceasta în expresia


lui rk+1 , obţinem o formulă care ne permite să calculăm norma reziduului
recursiv:
∥rk+1 ∥2 = ∥rk ∥2 − b2k+1 ∥pk+1 ∥2 . (3.22)

3.2.6 Schimbarea bazei. Relaţia cu LU şi QR


Am discutat până acum diverse reprezentări ale polinoamelor de inter-
polare. Prima a utilizat ca bază polinomială baza monomială (canonică).

m(x) = [1, x, x2 , . . . , xn ]T .

Formula de interpolare a lui Lagrange utilizează baza polinomială Lagrange

ℓ(x) = [ℓ0 (x), ℓ1 (x), . . . , ℓn (x)]T .

Pentru interpolarea Newto am folosit baza polinoamelor Newton


i−1
π(x) = [π0 (x), π1 (x), . . . , πn (x)] cu πi (x) = (x − xi ),
Y
T

j=0

iar pentru aproximare în sensul celor mai mici pătrate, am introdus baza
formată din polinoame ortogonale, care interpolează dacă k = n: p(x) =
[p0 (x), p1 (x), . . . , pn (x)]T .
Introducem vectorul coeficienţilor monoamelor

a = [a0 , a1 , . . . , an ]T ,
vectorul valorilor funcţiei

126
f = [f0 , f1 , . . . , fn ]T ,
vectorul diferenţelor divizate utilizat în interpolarea Newton

d = [d0 , d1 , . . . , dn ]T ,
şi vectorul coeficienţilor polinoamelor ortogonale

b = [b0 , b1 , . . . , bn ]T .
Cu aceste notaţii, produsul scalar descrie cele patru reprezentări ale po-
linomului de interpolare:
Pn (x) = aT m(x) = f T ℓ(x) = dT π(x) = bT p(x). (3.23)
Vrem să determinăm matrice care să realizeze transformările între bazele
polinomiale (schimbările de bază). Coeficienţii ai utilizaţi pentru baza mo-
nomială sunt daţi de soluţia sistemului liniar Va = f , unde V este matricea
Vandermonde. Utilizând ecuaţia (3.23) avem
f T ℓ = aT m = (V−1 f )T m = f T V−T m.
Deorece ultima ecuaţie are loc pentru orice alegere posibilă a valorilor f ale
funcţiei, conchidem că
ℓ = V−T m =⇒ VT ℓ = m.
Astfel, transpusa matricei Vandermonde transformă polinoamele Lagrange
fundamentale în monoame,
1 1 ··· 1 ℓ0 (x) 1
    

x0 x1 · · · xn   ℓ1 (x) 
 
x 
= (3.24)
   
.. .. .. . ..   .. .
. .. 
   
. . .   .
   
  
xn0 xn1 · · · xnn ℓn (x) xn
De notat că ecuaţia (3.24) este chiar reprezentarea monoamelor prin poli-
noame de interpolare Lagrange!
Trebuie să existe o relaţie similară între polinoamele Lagrange şi Newton.
Să notăm cu UT d = f , unde
1
 

 1 x1 − x0 

U =
T 1 x2 − x0 (x2 − x0 ) (x2 − x1 )
 
,
 .. .. .. .. .. 
. . . . .
 
 
1 xn − x0 (xn − x0 ) (xn − x1 ) · · · (x n − xj )
Qn−1
j=0

127
sistemul liniar (3.13) cu care diferenţele divizate se pot calcula din valorile
funcţiei. Utilizând din nou ecuaţia (3.23), obţinem

dT π = f T ℓ = dT U ℓ =⇒ Uℓ(x) = π(x).

Astfel, matricea triunghiulară superior U transformă polinoamele Lagrange


în polinoame Newton:
1 1 1 1
    
··· ℓ0 π0

 x1 − x0 x2 − x0 ··· xn − x0 
 ℓ1  
  π1 

(x2 − x0 ) (x2 − x1 ) · · · (xn − x0 ) (xn − x1 ) ℓ2 = π2
    
  

.. .. 
..  
.. 
. . . .
    
    
(xn − xj )
Qn−1
j=0 ℓn πn
(3.25)
Rezultatul este imediat, deoarece (3.25) este reprezentarea Lagrange a poli-
noamelor Newton!
In continuare vom găsi o relaţie între monoame şi polinoamele Newton.
Căutăm o matrice triunghiulară inferior L cu Lπ(x) = m(x). L trebuie să fie
triunghiulară inferior, deoarece polinoamele Newton şi monoamele au acelaşi
grad. Pentru a determina L avem nevoie de nişte proprietăţi adiţionale ale
diferenţelor divizate.
Diferenţele divizate pot fi interpretate ca un proces de eliminare. Fie
funcţia Hp (x0 , . . . , xk ) suma tuturor produselor omogene de grad p ale vari-
abilelor x0 , . . . , xk . De exemplu, avem

Hp (x0 ) = xp0
k
H1 (x0 , . . . , xk ) =
X
xj
j=0
p
Hp (x0 , x1 ) = xj0 x1p−j .
X

j=0

Pentru aceste produse omogene are loc Lema lui Miller[?]:


Lema 3.5 (Lema lui Miller).
Hp+1 (x0 , . . . , xk−1 ) − Hp+1 (x1 , . . . , xk )
Hp (x0 , . . . , xk ) = . (3.26)
x0 − xk
Demonstraţie. Rescriem membrul drept al relaţiei (3.26) sub forma
Pp+1
Hp+1 (x0 , . . . , xk−1 ) − Hp+1 (x1 , . . . , xk ) (xs0 − xsk ) Hp+1−s (x1 , . . . , xk−1 )
= s=1
.
x0 − xk x0 − xk

128
Dar,
s−1
xs0 − xsk X q q+1−s
= x0 xk = Hs−1 (x0 , xk ) .
x0 − xk q=0

Astfel, membrul drept al relaţiei (3.26) este egal cu


p
Hs (x0 , xk ) Hp−s (x1 , . . . , xk−1 ) = Hp (x0 , . . . , xk ) .
X

s=0

Considerăm acum polinomul de interpolare dezvoltat în baza monomială:

Pn (x) = a0 + a1 x + · · · + an xn ,
şi sistemul de ecuaţii liniare (condiţiile de interpolare) cu matricea Van-
dermonde n
aj xji = f (xi) , i = 0, . . . , n. (3.27)
X

j=0

Teorema 3.6. Schema cu diferenţe divizate elimină coeficienţii necunoscuţi


ai polinomului de interpolare din (3.27). Mai exact,
n
f [xi , . . . , xi+k ] = ak + aj Hj−k (xi , . . . , xi+k ). (3.28)
X

j=k+1

Demonstraţie. Demonstraţia se face prin inducţie după coloane. Pentru ca-


zul de bază, avem
j
− nj=0 aj xji
Pn P n
j=0 aj xi
f [xi , xi+1 ] = = a1 + aj Hj−1 (xi , xi+1 ) .
X
xi − xi+1 j=2

Deci, teorema are loc pentru a doua coloană. Presupunem că are loc pentru
primele k − 1 coloane. Atunci

f [xi , . . . , xi+k−1 ] − f [xi+1 , . . . xi+k ]


f [xi , . . . , xi+k ] =
xi − xi+k
n
aj (Hj−k+1 (xi , . . . , xi+k−1 ) − Hj−k (xi+1 , . . . xi+k ))
X

j=k
= .
xi − xi+k

129
Înmulţind numitorii în sumă şi aplicând lema 3.5, obţinem
n
f [xi , . . . , xi+k ] = ak + aj Hj−k (xi , . . . , xi+k ).
X

j=k+1

În concluzie, dacă valorile interpolate f (xi ) sunt valorile unui polinom


de grad n, atunci
P n (0)
f [x0 , . . . , xn ] = an = n (3.29)
n!
şi f [x0 , . . . , xn+k ] = 0 pentru k = 1, 2, . . . .
Mai mult, (3.28) ne dă relaţia dintre diferenţele divizate di şi coeficienţii
ai . Avem LT a = d, unde

1
 

 H1 (x0 ) 1 

L= H2 (x0 ) H1 (x0 , x1 ) 1
 
.

.. .. .. ..

. . . .
 
 
Hn (x0 ) Hn−1 (x0 , x1 ) · · · H1 (x0 , . . . , xn−1 ) 1

Din ecuaţia (3.23) obţinem

aT m = dT π = aT Lπ =⇒ Lπ(x) = m(x).

Am obţinut următorul rezultat: matricea triunghiulară inferior L trans-


formă polinoamele Newton în monoame.
Din relaţia VT ℓ = m dintre polinoamele Lagrange şi monoame şi din
relaţia Uℓ = π care leagă polinoamele Lagrange de polinoamele Newton
putem elimina ℓ şi astfel să obţinem o legătură între polinoamele Newton şi
monoame
VT U −1 π = m =⇒ VT U −1 = L⇐⇒ VT = LU.
Ultima ecuaţie ne spune că transpusa matricei Vandermonde a fost factori-
zată ca produs dintre o matrice triunghiulară inferior şi una triunghiulară
superior. Deoarece pe diagonala lui L avem elemente unu, factorizarea este
unică şi aceasta este factorizarea obţinută aplicând eliminarea gaussiană lui
VT .

130
Teorema 3.7. Descompunerea LU a matricei Vandermonde

1 x1 · · · xn−1 xn0
 
0

1 x2 · · · x1
n−1
xn1 
V =
 
.. .. .. .
.. 
. . . . 


1 xn · · · xn−1
n xnn

este V = U T LT , respectiv V T = LU , unde


1
 

 H1 (x0 ) 1 

L= H2 (x0 ) H1 (x0 , x1 ) 1
 


.. .. .. ..

. .

. .

 
Hn (x0 ) Hn−1 (x0 , x1 ) · · · H1 (x0 , . . . , xn−1 ) 1
şi
1 1 1 1
 
···

 x1 − x0 x2 − x0 ··· xn − x0 

U = (x2 − x0 ) (x2 − x1 ) · · · (xn − x0 ) (xn − x1 )
 


.. .. 
. .
 
 
(xn − xj )
Qn−1
j=0

Coeficienţii polinomului de interpolare în baza monomială sunt soluţiile sis-


temului Va = f . Ei pot fi calculaţi utilizând descompunerea LU V = U T LT
astfel

1. rezolvând sistemul U T d = f prin substituţie directă, obţinând vectorul


intermedia d al diferenţelor divizate şi

2. rezolvând sistemul LT a = d prin substituţie inversă.

Baza polinomială se poate calcula rezolvând sistemul VT ℓ(x) = m(x) şi


utilizând VT = LU :

1. substituţia directă pentru Lπ(x) = m(x), obţinându-se vectorul inter-


mediar al polinoamelor Newton;

2. substituţia inversă pentru U ℓ(x) = π(x), obţinându-se polinoamele La-


grange.

Verificăm teorema pe un caz particular cu codul Symbolic Math Toolbox:

131
v=sym('x',[4,1]);
V=fliplr(vander(v));
VT=V.';
[L,U]=lu(VT);
L=simplify(L);
U=simplify(U);
L
U

Obţinem, aşa cum ne-am asteptat, descompunerea


1 0 0 0
 
 x1 1 0 0 
L=
 
x1 2 x1 + x2 1 0

 
x1 3 x1 2 + x1 x2 + x2 2 x1 + x2 + x3 1
1 1 1 1
 
 0 x2 − x1 x3 − x1 x4 − x1 
U = .
 
 0 0 (x1 − x3 ) (x2 − x3 ) (x1 − x4 ) (x2 − x4 ) 
0 0 0 − (x1 − x4 ) (x2 − x4 ) (x3 − x4 )
Pentru baza polinoamelor ortogonale, condiţia de interpolare este

b0 p0 (xj ) + b1 p1 (xj ) + · · · + bn pn (xj ) = fj , j = 0, ..., n.

Matricea acestui sistem liniar în necunoscutele bi ,


p0 (x0 ) p1 (x0 ) · · · pn (x0 )
 

p0 (x1 ) p1 (x1 ) · · · pn (x1 ) 
P =
 
.. .. .. .. 

 . . . .


p0 (xn ) p1 (xn ) · · · pn (xn )

este ortogonală: P T P = D2 unde D = diag{∥p0 ∥ , ∥p1 ∥ , . . . , ∥pn ∥}. Astfel,


aşa cum am văzut mai înainte, soluţia este uşor de calculat,

b = D−2 P T f .

Înlocuid această espresie în (3.23), obţinem

Pn (x) = f T ℓ(x) = bT p(x) = f P D−2 p(x).

Deoarece această relaţie are loc pentru orice f , concluzionăm că

ℓ(x) = P D−2 p(x) ⇐⇒ P ℓ(x) = p(x).

132
Trebuie să existe o matrice triunghiulară inferior G care transformă po-
linoamele ortogonale în monoame

Gp(x) = m(x).

Dacă scriem această ecuaţie pentru x = x0 , x1 , . . . , xn , obţinem pentru G


ecuaţia matricială
  
GP T = V T ⇐⇒ V = P GT = P D−1 DGT .

Astfel, am descompus matricea Vandermonde V într-un produs dintre o ma-


trice ortonormală Q = P D−1 şi o matrice triunghiulară superior R = DGT .
Aceasta este descompunerea QR, folosită la rezolvarea stabilă a sistemelor
liniare şi la aproximări discrete în sensul celor mai mici pătrate.
Deci, pentru a calcula matricea G, putem calcula descompunerea QR
V = QR în modul standard, utilizând de exemplu reflexii Householder şi
să calculăm apoi G = RT D−1 . Alternativ, dacă ştim V şi P , putem rezolva
în raport cu G în GP T = V T pentru a obţine G = V T P D−2 . Deoarece
sunt valabile ambele reprezentări ale polinomului de interpolare p(x)T b =
m(x)T a, înlocuind m(x) = Gp(x) vom obţine relaţia

GT a = b.

Rezumând toate rezultatele se obţine teorema care urmează.


Teorema 3.8. Fie pk (x) polinomul ortogonal de grad k,

p(x) = [p0 (x), p1 (x), . . . , pn (x)]T

, P T = [p(x0 ), p(x1 ), . . . , p(xn )]T . Fie D matricea diagonală

D = diag{∥p0 ∥ , ∥p1 ∥ , . . . , ∥pn ∥}

şi fie V = QR descompunerea QR a matricei Vandermonde. Atunci

1. Q = P D−1 şi R = D−1 P T V .

2. Schimbarea de bază între polinoamele Lagrange ℓi (x) şi polinoamele


ortogonale pi (x) este P T ℓ(x) = p(x).

3. Schimbarea de bază între polinoamele ortogonale pi (x) şi monoamele


mi (x) = xi este Gp(x) = m(x) unde G = DRT = V T P D−2 .

4. Coeficienţii monoamelor polinomului de interpolare ai şi coeficienţii


polinoamelor ortogonale bi sunt legaţi prin GT a = b.

133
3.2.7 Interpolare Aitken-Neville
În această secţiune vom discuta încă un algoritm de calcul al polino-
mului de interpolare. El este utilizat pentru a interpola valoarea de funcţie
f (z) prin calculul şirului {P n(z)} pentru n = 0, 1, 2, . . . care se obţine adă-
ugând succesiv noduri de interpolare. Se speră că acest şir va converge către
valoarea funcţiei f (z).
Fie Tij (x) polinomul de grad ≤ j ce interpolează datele

x xi−j xi−j+1 ··· xi


y yi−j yi−j+1 ··· yi

Vom aranja aceste polinoame într-o matrice triunghiulară inferior (aşa-


numita schemă Aitken-Neville):
x y
x0 y0 = T00
x1 y1 = T10 T11
.. .. .. (3.30)
. . .
xi yi = Ti0 Ti1 · · · Tii
..
··· ··· ··· ··· .

Teorema 3.9. Polinoamele Tij se pot calcula cu formula de recurenţă

Ti0 = yi



(xi − x)Ti−1,j−1 + (x − xi−j )Ti,j−1


Tij = i = 0, 1, 2, . . . (3.31)
xi − xi−j 

j = 1, 2, . . . , i

Demonstraţie. Prin inducţie. Baza: Ti,0 interpolează funcţia într-un singur


nod.
Ipoteza inducţiei: Fie
Ti,j−1 polinomul de interpolare cu nodurile xi−j+1 , . . . , xi
şi
Ti−1,j−1 polinomul de interpolare cu nodurile xi−j , . . . , xi−1 .
Dacă calculăm Tij conform (3.31), atunci Tij este un polinom de grad
≤ j. Dacă xk este un nod comun al lui Ti−1,j−1 şi Ti,j−1 atunci
Ti−1,j−1 (xk ) = Ti,j−1 (xk ) = yk ,
şi deci
(xi − xk ) yk + (xk − xi−j ) yk
Ti,j (xk ) = = yk .
xi − xi−j

134
Pentru nodul xi obţinem
0 · yk + (xi − xi−j ) yk
Ti,j (xi ) = = yk
xi − xi−j
şi la fel, are loc Ti,j (xi−j ) = yi−j . Deci, Ti,j este polinomul de interpolare
din enunţul teoremei.

Exemplul 3.4. Dându-se punctele


x 0 5 −1 2
y −5 235 −9 19
recurenţa (3.31) produce schema


x y

−5


235 48 z − 5 (3.32)


22 z 2


−9 122 z
3 + 95
3 3 + 3 −5
34 z

94 z 2 14 z 3 10 z 2
19 28 z
+ 13 10 z
9 − 9 − 9
185
+ + 32 z
− 5


3 9 9 9

care se poate obţine cu Symbolic Math Toolbox. Dăm codul

x = [sym(0), sym(5), sym(-1), sym(2)];


y = [sym(-5), sym(235), sym(-9), sym(19)];
syms z
T = sym(zeros(4, 4));
for i = sym(1) : sym(4)
T(i, 1) = y(i);
for j = sym(1) : i - 1
T(i, j + 1) = collect(((x(i) - z) * T(i - 1, j) + (z - x(i - j)) ...
* T(i, j))/(x(i) - x(i - j)), z);
end
end
disp(T)

şi rezultatul
−5 0 0 0
 

 235 48 z − 5 0 0 

22 z 2
3 + 3 + 343 z − 5 0
122 z 95
−9
 
 3 
94 z 2 14 z 3 10 z 2
19 3 + 3
28 z 1
9 − 109 z − 185
9 9 + 9 + 32 z
9 −5
De obicei această schemă nu se calculează în mod simbolic pentru o variabilă
x ci pentru un număr fixat x. Cantităţile Ti,k vor fi numere.

135
Funcţia MATLAB AitkenInterpolation implementează schema Aitken-
Neville (vezi sursa MATLAB 3.7). Ea calculează polinomul de interpolare
Lagrange cu o toleranţă dată şi dacă toleranţa tol lipseşte, generează un
tabel triunghiular Aitke-Neville cu length(x) linii.

Sursa MATLAB 3.7 Schema Aitken-Neville


function T=AitkenInterpolation(x,y,z,tol)
% AITKENINTERPOLATION interpolation using the Aitken Neville scheme
% T=AitkenInterpolation(x,y,z) uses the ponts (x,y) to generate
% the Aitken-Neville Scheme for the scalar interpolation value z
% with tolerance tol

n=length(x); T=zeros(n);
T(1,1)=y(1);
for i=2:n
T(i,1)=y(i);
for j=1:i-1
T(i,j+1)=((x(i)-z)*T(i-1,j)+(z-x(i-j))*T(i,j))/(x(i)-x(i-j));
end
if nargin >3 && abs(T(i,i)-T(i-1,i-1))<tol
T=T(1:i,1:i);
return
end
end
if nargin > 3
warning('unable to attain the precision')
end

Exemplul 3.5. Calculăm schema Aitken-Neville pentru valorile funcţiei


f (x) = 0x esin t dt date în tabela (3.2) pentru x = 0.66:
R

x y
0.40 0.49040
0.50 0.64490 0.89210
0.60 0.81360 0.91482 0.92164
0.70 0.99670 0.92346 0.92173 0.92172
0.80 1.19440 0.91762 0.92171 0.92172 0.92172
0.90 1.40630 0.89774 0.92160 0.92169 0.92171 0.92171
Observăm că T22 = 0.9217... ( T(3,3) cu funcţia din sursa MATLAB
3.7), aceeaşi valoare cu P2 (0.66) din exemplul 3.2, obţinută prin interpolare

136
Lagrange.

Secvenţa MATLAB corespunzătoare exemplului 3.5 este:

x = 0.4:0.1:0.9;
y = [0.4904 0.6449 0.8136 0.9967 1.1944 1.4063];
z=0.66;
T=AitkenInterpolation(x,y,z);

3.2.8 Extrapolare
Extrapolarea este identică cu interpolarea, cu excepţia faptului că valoa-
rea de interpolare z este înafara intervalului determinat de nodurile xj . Fără
a restrînge generalitatea putem presupune că z = 0, deoarece putem face
schimbarea de variabilă x′ := x − z.
Extrapolarea se utilizează frecvent la calculul limitelor. Fie h parametrul
de discretizare şi T (h) o aproximare a unei cantităţi necunoscute a0 cu
proprietatea:
lim T (h) = a0 . (3.33)
h→0

Ipoteza uzuală este că T (0) este dificil de calculat – posibil numeric instabilă
sau necesită prea multe operaţii. Dacă calculăm mai multe valori de funcţie
T (hi ) pentru hi > 0 şi construim polinomul de interpolare Pn atunci Pn (0)
va fi o aproximare a lui a0 .
Şirul {Pn (0)}, pentru n = 0, 1, 2, . . . , este dat de diagonala schemei
Aitken-Neville. Astfel, pentru extrapolare cu polinoame schema Aitken-
Neville este algoritmul natural. Sperăm ca schema să conveargă către a0 .
Aceasta se întâmplă sigur dacă T (h) are o dezvoltare asimptotică de forma

T (h) = a0 + a1 h + · · · + ak hk + Rk (h) cu |Rk (h)| < Ck hk+1 , (3.34)

şi dacă şirul {hi } este astfel încât

hi+1 < chi with 0 < c < 1,

adică, dacă converge suficient de rapid către zero. În acest caz, diagonala
schemei Aitken-Neville converge către a0 mai repede decât coloanele [10].
Deoarece z = 0, recurenţa (3.31) pentru schema Aitken-Neville devine

hi Ti−1,j−1 − hi−j Ti,j−1


Tij = . (3.35)
hi − hi−j

137
Mai mult, dacă alegem şirul

hi = h0 2−i , (3.36)

se obţine recurenţa
2−j Ti−1,j−1 − Ti,j−1
Tij = . (3.37)
2−j − 1
Dacă în dezvoltarea asimptotică (3.34) lipsesc puterile impare ale lui h, are
loc
T (h) = a0 + a2 h2 + a4 h4 + · · · . (3.38)
Un astfel de exemplu este dezvoltarea asimptotică pentru formula trapezelor.
În acest caz este avantajos să extrapolăm cu un polinom în variabila x = h2 .
Astfel se obţine o aproximare mai rapidă şi de ordin mai înalt a lui (3.38).
În loc de (3.35) vom utiliza

h2i Ti−1,j−1 − h2i−j Ti,j−1


Tij = . (3.39)
h2i − h2i−j

Mai mult, dacă utilizăm pentru hi şirul (3.36), obţinem recurenţa

4−j Ti−1,j−1 − Ti,j−1


Tij = , (3.40)
4−j − 1
care este utilizată în algoritmul lui Romberg de integrare. De notat că pro-
cesul de extrapolare Aitken-Neville este identic în acest caz cu extrapolarea
Richardson. Pentru alegerea specială a şirului hi în conformitate cu (3.36)
se obţine algoritmul de extrapolare din sursa MATLAB 3.8.

Exemplul 3.6. Diferenţa divizată

f (x + h) − f (x)
T (h) = , (3.41)
h
este o aproximare a lui a0 = f ′ (x) deoarece limh→0 T (h) = f ′ (x). Dacă
dezvoltăm funcţia f

h ′ h2
f (x + h) = f (x) + f (x) + f ′′ (x) + · · ·
1! 2!
şi înlocuim seria în (3.41), obţinem

h ′′ h2
T (h) = f ′ (x) + f (x) + f ′′′ (x) + · · ·
2! 3!

138
Sursa MATLAB 3.8 Extrapolare Aitken-Neville
function A=AitkenExtrapolation(T,h0,tol,factor)
% AITKENEXTRAPOLATION Aitken-Neville scheme for extrapolation
% A=AitkenExtrapolation(T,h0,tol,factor); computes the
% Aitken-Neville Scheme for the function T and h_i=h0/2^i until the
% relative error of two diagonal elements is smaller than tol. The
% parameter factor is 2 or 4, depending on the asymptotic expansion
% of the function T.

h=h0; A(1,1)=T(h);
for i=2:15
h=h/2; A(i,1)=T(h); vhj=1;
for j=2:i
vhj=vhj/factor;
A(i,j)=(vhj*A(i-1,j-1)-A(i,j-1))/(vhj-1);
end;
if abs(A(i,i)-A(i-1,i-1))<tol*abs(A(i,i)), return
end
end
warning(['limit of extrapolation steps reached. ', ...
'Required tolerance may not be met.']);

139
Dezvoltarea asimptotică conţine toate puterile lui h. Dacă utilizăm pentru
hi şirul (3.36), vom extrapola cu recurenţa (3.37). Totuşi, dacă utilizăm
aproximarea simetrică
f (x + h) − f (x − h)
T (h) = ,
2h
obţinem
h2 ′′′ h4
T (h) = f ′ (x) + f (x) + f (4) (x) + · · · (3.42)
3! 5!
şi putem extrapola cu recurenţa (3.40).

3.3 Interpolare polinomială pe porţiuni


Aşa cum s-a arătat deja cu contraexemplul lui Runge (vezi figura 3.1), in-
terpolarea polinomială nu produce întotdeauna rezultatele dorite. Exemplul
următor ilustrează cu claritate acest lucru.

14

12

10

-2

-4
0 2 4 6 8 10 12 14 16 18 20

Figura 3.2: Rezultat nedorit la interpolare, din cauza valorilor negative

Exemplul 3.7. Polinomul de interpolare prin punctele

x 1 2.5 3 5 13 18 20
(3.43)
y 2 3 4 5 7 6 3

are graficul din figura 3.2.

140
8

1
0 2 4 6 8 10 12 14 16 18 20

Figura 3.3: Interpolare polinomială pe porţiuni prin parabole

Dacă valorile din tabela 3.43 sunt puncte de pe graficul unei funcţii care
trebuie să fie pozitivă dintr-un motiv de natură fizică, atunci nu este de dorit
să aproximăm funcţia prin polinomul său de interpolare, deoarece acesta este
negativ pe intervalul (7, 11).
Dacă alegem să interpolăm pe porţiuni prin polinoame de grad mai mic,
de exemplu printr-un polinom de grad doi prin câte trei puncte consecutive,
obţinem figura 3.3. De această dată, interpolantul este pozitiv; totuşi, de-
rivata lui nu mai este continuă în punctele în care bucăţile polinomiale se
racordează.

Ideea de interpolare spline este de a aproxima pe porţiuni cu polinoame


de grad mic pentru a obţine o aproximare neoscilantă care să fie şi netedă
(i.e., să fie derivabilă de cât mai multe ori posibil) în nodurile în care bucăţile
se întâlnesc.

3.3.1 Spline cubice clasice


Pentru a evita derivatele discontinue, trebuie să prescriem nu numai o
valoare de funcţie comună dar de asemenea aceeaşi valoare pentru derivată
în nodurile în care două bucăţi polinomiale se întâlnesc. Presupunem că se
dau punctele
x x1 x2 . . . xn
y y1 y2 . . . yn

141
Cea mai simplă posibilitate este de a alege xi ca nod şi să interpolăm în
fiecare interval
[xi , xi+1 ], i = 1, 2, . . . , n − 1
printr-un polinom Pi . Indexul i nu se referă la gradul polinomului ci la
numărul intervalului. Polinomul Pi va trebui să satisfacă condiţiile:

Pi (xi ) = yi , Pi (xi+1 ) = yi+1 interpolare


(3.44)
Pi′ (xi ) = yi , Pi′ (xi+1 ) = yi+1 continuitatea derivatei

Desigur, trebuie să determinăm derivatele yi′ , care în general nu se dau.


Polinomul Pi trebuie să satisfacă patru condiţii –dacă alegem să fie de gradul
trei el va fi unic determinat. Pentru a simplifica calculele facem schimbarea
de variabilă
x − xi
t= cu hi = xi+1 − xi , (3.45)
hi
unde t este o variabilă locală în al i-lea interval. Polinomul

Qi (t) = Pi (xi + thi ) (3.46)

este de gradul trei în t. Derivata sa este

Q′i (t) = hi Pi′ (xi + thi ), (3.47)

şi astfel condiţiile (3.44) devin

Qi (0) = yi , Qi (1) = yi+1


(3.48)
Q′i (0) = hi yi′ , Q′i (1) = hi yi+1

Un calcul simplu în MuPAD

reset();
Q[i]:=t->a*t^3+b*t^2+c*t+d:
ec1:=Q[i](0)=y[i], Q[i](1)=y[i+1]:
ec2:=D(Q[i])(0)=h[i]*y'[i], D(Q[i])(1)=h[i]*y'[i+1]:
solve({ec1,ec2},{a,b,c,d}):
assign(op(%)):
collect(Q[i](t),[y[i],y[i+1],h[i],y'[i],y'[i+1]]);

sau în Symbolic MATH Toolbox

142
clear all
syms t a b c d h_i
syms y [1 2]
syms Q_i(t) dy [1 2]
Q_i(t)=a*t.^3+b*t.^2+c*t+d;
ec=[Q_i(0)==y(1), Q_i(1)==y(2), subs(diff(Q_i(t),t),t,0)==...
h_i*dy(1),subs(diff(Q_i(t),t),t,1)==h_i*dy(2)];
s=solve(ec,[a,b,c,d]);
Q_i(t)=collect(subs(Q_i, [a,b,c,d],[s.a, s.b, s.c, s.d]),[y,h_i,dy])
ne dă
   
Qi (t) = 2 t3 − 3 t2 + 1 yi + 3 t2 − 2 t3 yi+1
    (3.49)
+ t3 − 2 t2 + t hi yi′ + t3 − t2 hi yi+1

Definit, ia 3.1 (Polinoame cubice Hermite, forma cardinală). Polinoamele

H03 (t) = 1 − 3t2 + 2t3 H13 (t) = t − 2t2 + t3


H33 (t) = 3t2 − 2t3 H23 (t) = −t2 + t3

se numesc polinoame cubice Hermite, iar (3.49) este forma cardinală a poli-
nomului de interpolare.
Qi poate fi evaluată prin expresia (3.49); totuşi o schemă mai eficientă
se bazează pe interpolarea Hermite. Pentru aceasta, se formează diferenţele
în schema următoare scăzând valoarea de deasupra din cea de dedesubt:
hi yi′

a0 = yi a2
↘ ↗ ↘
a1 a3 (3.50)
↗ ↘ ↗
yi+1 b


hi yi+1
în acest mod se obţin coeficienţii a0 , a1 , a2 şi a3 şi putem calcula

Qi (t) = a0 + (a1 + (a2 + a3 t) (t − 1)) t (3.51)

utilizând doar 3 înmulţiri şi 8 adunări/scăderi. Verificarea că (3.51) conduce


la acelaşi polinom ca (3.49) rămâne ca exerciţiu.

143
În secţiunea următoare, vom investiga mai multe posibilităţi de alegere
a derivatelor yi′ . Presupunând că acestea sunt cunoscute şi deci şi şi poli-
noamele Qi pentru i = 1, . . . , n − 1, funcţia compusă globală g se numeşte
funcţie spline cubică . Pentru a interpola cu g pentru o valoare x = z, se
procedează în trei paşi:

1. Determinăm intervalul care conţine z, i.e. calculăm indicele i pentru


care xi ≤ z < xi+1 .

2. Calculăm variabila locală t = (z − xi )/(xi+1 − xi ).

3. Evaluăm g(z) = Qi (t) cu (3.50) şi (3.51).

Pentru a găsi intervalul care conţine z, vom utiliza căutarea binară.


Aceasta se realizează în funcţia MATLAB SplineInterpolation (sursa
MATLAB 3.9).

Sursa MATLAB 3.9 Spline cubic generic


function g=SplineInterpolation(x,y,ys,z)
% SPLINEINTERPOLATION generic interpolation with cubic splines
% g=SplineInterpolation(x,y,ys,z);
% x - nodes
% y,ys -function values and derivatives at x
% z - evaluation points
% g -spline value

s = subintbinsearch(x,z); %binary search


h=diff(x);
t=(z-x(s))./h(s);
% coefficients
a0=y(1:end-1); a1=y(2:end)-a0; a2=a1-h.*ys(1:end-1);
a3= h.*ys(2:end)-a1; a3=a3-a2;
% eval spline
g=a0(s)+(a1(s)+(a2(s)+a3(s).*t).*(t-1)).*t;
end

Funcţia MATLAB SplineInterpolation utilizează căutarea binară (vezi


sursa MATLAB 3.10)

144
Sursa MATLAB 3.10 Cautare binară
function sipos = subintbinsearch(x,z)
%SUBINTBINSEARCH find the subinterval of x containing z
% use binary search
sipos = zeros(size(z));
z = z(:);
n=length(x);
for k=1:length(z)
a=1; b=n; %i=a;
while a+1~=b
i=floor((a+b)/2);
if x(i)<z(k)
a=i;
else
b=i;
end
end
sipos(k)=a;
end
end

145
3.3.2 Derivatele funcţiei spline
Aşa cum am văzut în secţiunea precedentă, pentru a construi o funcţie
spline avem nevoie de derivatele în noduri. În principiu, putem prescrie orice
valoare pentru ele; totuşi, are sens să estimăm derivatele din valorile date
ale funcţiei. O estimare simplă a derivatei în punctul (xi , yi ) este dată de
panta dreptei ce trece prin punctele vecine(vezi figura ??),
yi+1 − yi yi+1 − yi
yi′ = = , i = 2, 3, . . . , n − 1. (3.52)
xi+1 − xi hi+1 + xi

Figura 3.4: Panta dreptei ce trece prin două puncte vecine

Utilizând (3.52), putem calcula derivatele în toate nodurile interioare.


Pentru cele două puncte de pe frontieră (capetele intervalului) , avem mai
multe posibilităţi:
1. Utilizarea pantei dreptei ce trece prin primele două (respectiv ultimele
yn −yn−1
două) puncte y1′ = xy22 −y
−x1 , respectiv yn = xn −xn−1 . . În MATLAB ,
1 ′

derivatele ys pot fi calculate cu

n=length(x);
ys=(y(3:n)-y(1:n-2))./(x(3:n)-x(1:n-2));
ys=[(y(2)-y(1))/(x(2)-x(1)); ys; (y(n)-y(n-1))/(x(n)-x(n-1))];

2. Condiţii pe frontieră naturale: ele se definesc astfel ca derivatele de


ordinul doi să se anuleze la capete. Din ecuaţiile Q′′1 (0) = 0 şi Q′′n (1) = 0
we obţinem
3 y2 − y1 1 ′ 3 yn − yn−1 1 ′
y1′ = − y2 şi yn′ = − yn−1 .
2 h1 2 2 hn−1 2

146
3. Un caz important sunt condiţiile pe frontieră periodice. Dacă valorile
de funcţie provin dintr-o funcţie periodică, atunci y1 = yn şi putem
alege
y2 − yn−1
y1′ = yn′ = .
h1 + hn−1
Alegerea corespunde din nou pantei dreptei prin punctele vecine.

Funcţiile spline calculate cu aceste derivate construite se numesc Spline


functions which are computed with these constructed derivatives are called
funcţii spline cu deficienţă.
Să interpolăm din nou punctele din tabela 3.43. Utilizând pantele punc-
telor vecine şi condiţiile pe frontieră naturale, obţinem splinele cu deficienţă
din figura 3.5. Am reprezentat şi derivatele g ′ şi g ′′ . Observăm că g ′ (linia
punctată) este continuă, în timp ce g ′′ (linia întreruptă) este discontinuă.

-2

-4

-6

-8
0 2 4 6 8 10 12 14 16 18 20

Figura 3.5: Spline cu deficienţă

Se pune problema dacă este posibil să alegem derivatele yi′ în aşa fel încât
derivatele secunde g ′′ să fie de asemenea continue. Dorim ca

Pi′′ (xi+1 ) = Pi+1


′′
(xi+1 ), i = 1, 2 . . . , n − 2. (3.53)

Scrise în variabila locală t cu Qi (t) = Pi (xi + hi t), condiţiile (3.53) devin

Q′′i (1) Q′′ (0)


2 = i+1 , i = 1, 2 . . . , n − 2. (3.54)
hi h2i+1

147
Dacă derivăm Qi în (3.49) obţinem

Q′′i (t) = yi (−6+12t)+yi+1 (6−12t)+hi yi′ (−4+6t)+hi yi+1



(−2+6t), (3.55)

şi dacă inserăm aceasta în (3.54), după grupare şi simplificare vom avea

1 ′ 2 2 1 ′ 3 3
 

y + + yi+1 + yi+2 = 2 (yi+2 − yi+1 ) − 2 (yi − yi+1 ) .
hi i hi hi+1 hi+1 hi+1 hi
(3.56)
Ecuaţia (3.56) este liniară în derivatele necunoscute yi , yi+1 şi yi+2 . Putem
′ ′ ′

scrie o astfel de ecuaţie pentru i = 1, 2 . . . , n − 2. În notaţie matriceală,


obţinem un sistem liniar de n − 2 ecuaţii cu n necunoscute,

Ay′ = c (3.57)

unde y′ = (y1 , y2 , . . . , yn )T este vectorul necunoscutelor< iar


 
b1 a1 b2

b2 a2 b3 
A=
 
.. .. .. 

 . . . 

bn−2 an−2 bn−1

o matrice tridiagonală cu elementele


1 2 2
bi = , ai = + , i = 1, 2 . . . , n − 2.
hi hi hi+1

Membrul drept al ecuaţiei (3.57) este

3 (d2 + d1 )
 

3 (d3 + d2 ) 
c =
 
.. ,
.
 
 
3 (dn−1 + dn−2 )

unde
yi+1 − yi
di = , i = 1, 2, . . . , n − 1. (3.58)
h2i
Am obţinut astfel n − 2 ecuaţii liniare pentru derivatele necunoscute. Mai
avem nevoie de încă două ecuaţii pentru a le determina unic. La fel ca în cazul
splinelor cu deficienţă, putem impune condiţii pe frontieră suplimentare.
Considerăm trei posibilităţi:

148
1. Condiţii pe frontieră naturale: P1′ (x1 ) = Pn−1
′ (xn ) = 0. Aceste condiţii
ne mai dau două ecuaţii:
2 ′ 1
y1 + y2′ = 3d1 ,
h1 h1
(3.59)
1 ′ 2 ′
y + y = 3dn−1 ,
hn−1 n−1 hn−1 n

care se obţin din Q′′1 (0) = Q′′n−1 (1) = 0 utilizând (3.55). Dacă le adău-
găm sistemului de ecuaţii (3.57), atunci putem determina derivatele yi
rezolvând un sistem liniar cu matricea tridiagonală. Utilizând rezolvi-
torul tridiagonal Thomas (vezi algoritmul 2.9 din capitolul 2), obţinem
derivatele cu instrucţiunile

h=x(2:n)-x(1:n-1);
a=2./h(1:n-2)+2./h(2:n-1);
b=1./h(1:n-1);
aa=[2/h(1); a; 2/h(n-1)]
bb=3*[d(1); d(2:n-1)+d(1:n-2); d(n-1)]
ys=Thomas(b,aa,b,bb)

Funcţia spline s : [x1 , xn ] → R care este determinată în acest mod


pe porţiuni de polinoamele Pi (x), i = 1, 2, . . . , n − 1, este un model
simplificat al formei unui spine de lemn care trece prin punctele date,
aşa cum ne arată teorema următoare.

Teorema 3.10. Pentru o mulţime dată de puncte (xi , yi ), i = 1, 2, . . . , n,


fie s : [x1 , xn ] → R funcţia spline cubică clasică ce satisface s(xi ) = yi ,
i = 1, 2, . . . , n. Atunci pentru orice funcţie de două ori continuu di-
ferenţiabilă f : [x1 , xn ] → R ce satisface f (xi ) = yi , i = 1, 2, . . . , n
şi
s′′ (xn )(f ′ (xn ) − s′ (xn )) = s′′ (x1 )(f ′ (x1 ) − s(x1 )), (3.60)
avem că Z xn Z xn
2 2
s′′ (x) dx ≤ f ′′ (x) d x, (3.61)
x1 x1

i.e. funcţia spline s(x) minimizează energia potenţială definită de in-


tegrala din (3.61)1 .
1
Integrala corectă a energiei unui spline subţire de lemn este de fapt
Z xn
2 5/2
s′′ (x) / 1 + s′2 (x) dx,
x1

149
Demonstraţie. Fie s(x) care minimizează xx1n (s′′ (x))2 d x. Orice func-
R

ţie de două ori continuu diferenţiabilă ce trece prin punctele (xi , yi ),


i = 1, 2, . . . , n poate fi scrisă sub forma

f (x) := s(x) + εh(x),

unde ε ∈ R, iar h este o funcţie de două ori continuu diferenţiabilă


cu zerouri în xi , h(xi ) = 0, i = 1, 2, . . . , n. Condiţia de minimalitate
(3.61) devine
Z xn Z xn
2 2
s′′ (x) dx ≤ s′′ (x) + εh′′ (x) dx
x1 x1
Z xn Z xn Z xn
2 2
= s′′ (x) d x+2ε s′′ (x)h′′ (x)d x+ε2 h′′ (x) d x.
x1 x1 x1

Pentru o funcţie fixată h(x), această condiţie este satisfăcută pentru


orice ε dacă şi numai dacă
Z xn
s′′ (x)h′′ (x)d x = 0, (3.62)
x1

aşa cum se poate vedea prin derivare. Integrarea prin părţi ne conduce
la Z xn
′′ ′
xn
s (x)h (x) x1 −
s′′′ (x)h′ (x)d x = 0. (3.63)
x1

Acum condiţia (3.60) implică faptul că termenii de pe frontieră din


ecuaţia (3.63) se anulează. Deoarece s′′′ (x) este constantă pe fiecare
interval (xi−1 , xi ), i = 2, 3, . . . , n, să presupunem egală cu constanta
Ci , al doilea termen din (3.63) devine
Z xn n Z xi n
s′′′ (x)h′ (x)d x = h′ (x)d x = Ci (h(xi ) − h(xi−1 )) = 0,
X X
Ci
x1 i=2 xi−1 i=2

deoarece h se anulează în noduri şi deci (3.62) are loc, ceea ce implică


(3.61) şi încheie demonstraţia.

Observă că pe lângă condiţiile pe frontieră naturale s′′ (x1 ) = s′′ (xn ) =


0 din (3.60), condiţiile pe frontieră complete sau limitate s′ (x1 ) =
dar este dificil de tratat matematic, see [3]: “Die Extremaleigenschaft des interpolieren-
den Splines wird häufig für die grosse praktische Nützlichkeit der Splines verantwortlich
gemacht. Dies ist jedoch glatter ’Volksbetrug’.”

150
f ′ (x1 ) şi s′ (xn ) = f ′ (xn ) conduc de asemenea la un spline ce mini-
mizează energia dintre toate funcţiile ce interpolează f în noduri şi
derivatele de ordinul I în capete.
Când interpolăm funcţia f cu un spline, este mai bine să utilizăm
condiţii pe frontieră complete, deoarece cu condiţii libere ordinul de
aproximare este afectat la capete şi scade de la O(h4 ) la O(h2 ). Ca o
alternativă, se poate utiliza abordarea descrisă în continuare, care nu
necesită cunosşterea derivatelor lui f , dar care pierde proprietatea de
minimizare a enegiei in apropierea frontierei.
2. Condiţii „not-a-knot”sau de Boor: Dorim ca polinoamele de pe primele
două şi respectiv de pe ultimele două intervale să coincidă:

P1 (x) ≡ P 2(x) ∧ Pn−2 (x) ≡ Pn−1 (x). (3.64)

Obţinem ecuaţiile:
1 ′ 1 1 h1
 
y + + y ′ = 2d1 + (d1 + d2 )
h1 1 h1 h2 2 h1 + h2
1 1 1 ′ hn−1
 
+ y′ + y = 2dn−1 + (dn−1 + dn−2 )
hn−2 hn−1 n−1 hn−1 n hn−1 + hn−2
(3.65)
La prima vedere condiţia (3.64) poate părea ciudată. Motivaţia este
următoarea: dacă valorile de funcţie yi corespund unor noduri echidis-
tante cu pasul h şi provin dintr-o funcţie netedă diferenţiabilă f , atunci
conform estimării (3.8) a erorii ne aşteptăm ca eroarea de interpolare
să fie ∼ h4 . Se poate arăta că în acest caz pentru un spline cu con-
diţii pe frontieră naturale eroarea de interpolare este ∼ h2 . Condiţiile
naturale nu sunt de loc naturale din punct de vedere al aproximării
funcţiilor. De fapt, nu este clar de ce funcţia f pe care dorim să o apro-
ximăm trebuie să-şi anuleze derivatele secunde la capetele intervalului.
Condiţia de Boor (3.64) ne conduce la o aproximare ∼ h4 [4].
Pentru a obţine (3.65), este suficient să cerem ca primele două (res-
pectiv ultimele două) polinoame să aibă aceeaşi derivată de ordinul
trei. Deoarece derivata a treia a unui polinom cubic este constantă,
cele două polinoame trebuie să fie identice. Pentru primele două poli-
noame, ecuaţia
P1′′′ (x2 ) = P2′′′ (x2 )
ieste echivalentă cu
1 (1)
Q′′′ Q′′′ (0)
3 = 23 ,
h1 h2

151
care se scrie
1 ′ 1 1 1 d1 d2
   
y + − 2 y2′ − 2 y3′ = 2 − . (3.66)
h21 1 2
h1 h2 h2 h1 h2
Ecuaţia (3.66) se poate adăuga în faţa sistemului (3.57). La fel, a
doua ecuaţie din (3.64) produce o ecuaţie care se poate adăuga la
sfârşitul sistemului (3.57). Astfel, am obţinut din nou n ecuaţii cu n
necunoscute. Din păcate, matricea nu mai este tridiagonală. Dacă vrem
să rezolvăm sistemul cu un rezolvitor tridiagonal, trebuie să înlocuim
(3.66) cu una echivalentă ce conţine doar necunoscutele y1′ şi y2′ . Să
notăm cu (I) ecuaţia (3.66) şi cu (II) prima ecuaţie a sistemului (3.57).
Ambele ecuaţii conţin necunoscutele y1′ , y2′ şi y3′ . Cu combinaţia liniară
1
(I) + (II)
h2
eliminăm necunoscuta y3′ şi obţinem după împărţirea cu h1 + h2
1 1
ecuaţia

1 ′ 1 1 h1
 
y + + y ′ = 2d1 + (d1 + d2 ) (3.67)
h1 1 h1 h2 2 h1 + h2
pe care o vom utiliza în loc de (3.66) pentru a conserva structura
tridiagonală a sistemului. Similar se obţine a doua ecuaţie din (3.65).
Pentru a rezolva sistemul tridiagonal vom utiliza din nou funcţia Thomas
(vezi algoritmul 2.9).
De notat că funcţia MATLAB YY=spline(X,Y,XX) returnează în YY
valorile interpolantului spline de Boor în XX.

3. Condiţii pe frontieră periodice: Dacă yi sunt valori ale unei funcţii


periodice, atunci y1 = yn . În plus, vom cre ca derivatele de ordin întâi
şi doi să fie identice:

P1′ (x1 ) = Pn−1



(xn ),
(3.68)
P1′′ (x1 ) = Pn−1
′′
(xn ).

Prima condiţie din (3.68) este echivalentă cu

y1′ = yn′ (3.69)

iar a doua exprimată în funcţie de Qi , devine


Q′′1 (0) Q′′ (1)
2 = n2 ,
h1 hn

152
ceea ce ne conduce la ecuaţia
1 1 1 1 ′
 
2 + y1′ + y2′ + y = 3 (d1 + dn−1 ) . (3.70)
h1 hn−1 h1 hn−1 n−1

Dacă utilizăm (3.69) pentru a elimina necunoscuta yn′ , obţinem siste-


mul de ecuaţii liniare By′ = c cu (n − 1) necunoscute şi (n − 1) ecuaţii.
Matricea sa are forma
0 ··· 0
 
a0 b1 bn−1
 b
 1 a2 b2 0 ··· 0 
.. 

 .. .. ..

0 . . . . 
B= (3.71)
 
.. .. .. .. 

 . . . . 0 

.. ..
 
0 . .
 
 bn−2 
bn−1 0 ··· 0 bn−2 an−2

unde elementele au forma


1
bi = , i = 1, 2, . . . , n − 1
hi
şi
2 2
a0 = +
hn−1 h1
2 2
ai = + , i = 1, 2, . . . , n − 2.
hi hi+1

Membrul drept c al sistemului se calculează cu ajutorul coeficienţilor


di , definiţi în ecuaţia (3.58),

3 (d1 + dn−1 )
 

3 (d2 + d1 ) 
c= (3.72)
 
.. 
.
 
 
3 (dn−1 + dn−2 )

Exceptând cele două elemente din colţul din stânga jos şi dreapta sus,
matricea este tridiagonală. Vom vedea în secţiunea următoare cum se
poate rezolva eficient un astfel de sistem.

153
3.3.3 Formula Sherman–Morrison–Woodbury
Fie A o matrice n × n şi U , V matrice n × p cu p ≤ n (de obicei p ≪ n).
Atunci orice soluţie x a sistemului liniar
 
A + UV T x = b (3.73)

este de asemenea soluţie a sistemului augmentat


Ax + U y = b
(3.74)
V Tx − y = 0
Dacă presupunem că matricele din următoarele calcule algebrice sunt inver-
tibile, atunci rezolvând prima ecuaţie în raport cu x, vom obţine

x = A−1 b − A−1 U y. (3.75)

Introducând în a doua ecuaţie din (3.74), obţinem

y = (I + V T A−1 U )−1 V T A−1 b, (3.76)

deci
x = A−1 b − A−1 U (I + V T A−1 U )−1 V T A−1 b.
Dar din (3.73) şi (3.74), avem
 −1
x = A + UV T b

şi
 −1
y = V T A + UV T b.
Egalând cele două expresii pentru x şi y cu expresiile (3.75) şi (3.76) obţinem
ecuaţiile matriciale:

V T (A + U V T )−1 = (I + V T A−1 U )−1 V T A−1 ,


(A + U V T )−1 = A−1 − A−1 U (I + V T A−1 U )−1 V T A−1 . (3.77)

Ecuaţia (3.77) se numeşte formula Shermann-Morrison-Woodbury. Matricea


(mică) p × p dată de I + V T A−1 U se numeşte matrice de capacitanţă. For-
mula Sherman-Morrison-Woodbury este utilă pentru a calcula inversa unei
schimbări de rang p a matricei A. Considerăm câteva aplicaţii:

1. Dacă A este rară şi/sau Av = b este uşor de rezolvat, atunci este


convenabil să utilizăm formula Sherman–Morrison–Woodbury pentru
a calcula soluţia sistemului (A + U V T )x = b. Algoritmul este

154
(a) Rezolvă Ay = b.
(b) Calculează matricea n × p W rezolvând AW = U . Aceasta se
poate combina cu primul pas rezolvând simultan sistemul liniar
cu aceeaşi matrice a coeficienţilor A cu p + 1 membri drepţi.
(c) Construieşte matricea de capacitanţă C = I + V T W ∈ Rp×p şi
rezolvă sistemul liniar Cz = V T y.
(d) Soluţia este x = y − W z.

2. O schimbare de rang I a matricei unitate. Formula Sherman-Morrison-


Woodbury devine
 −1 1
I + uv T =I− uv T .
1 − vT u
Dacă avem de rezolvăm sistemul liniar Bx = b cu B = I + uv T , atunci
soluţia poate fi calculată cu O(n) operaţii ca o combinaţie liniară a
vectorilor b şi u:
vT b
x=b− u.
1 − vT u
3. Spline cu condiţii periodice pe frontieră. Matricea B definită în ecuaţia
(3.71) este o modificare de rang I a unei matrice tridiagonale. Cu
e = e1 + en−1 = (1, 0, ..., 0, 1)T avem
1
B =A+ eeT
hn−1
cu matricea tridiagonală
 
ã0 b1
b
 1 a1 b2 

 .. .. 
A=

b2 . . .

..
 
. an−3 bn−2 
 

bn−2 ãn−2

Coeficienţii ai şi bi sunt la fel ca cei daţi în ecuaţia (3.71), dar


1 2 2 1
ã0 = + , ãn−2 = + .
hn−1 h1 hn−2 hn−1
Rezolvarea sistemului By = c ale cărui necunoscute sunt derivatele
necesită trei paşi. Vom utiliza funcţia Thomas (algorithmul 2.9) pentru
a rezolva sistemele liniare cu matrice tridiagonale:

155
(a) Rezolvă Au = e cu Thomas.
(b) Rezolvă Av = c cu Thomas.
(c)
v1 + vn−1
y′ = v − u.
u1 + un−1 + hn−1

3.3.4 Curbe spline


Dându-se n puncte în plane (xi , yi ) pentru i = 1, 2, . . . , n, dorim să
se conectăm printr-o curbă netedă. Numerotarea punctelor este crucială;
reordonarea lor ne va da o altă curbă.
Curbele plane se reprezintă prin funcţii parametrice

(x(s), y(s)) cu s1 ≤ s ≤ sn .

Şirul {si } de valori ale parametrului poate fi ales arbitrar, trebuie să ţinem
cont doar de monotonie, ceea ce înseamnă că şirul trebuie să fie strict crescă-
tor si < si+1 . Adesea parametrizarea aleasă este lungimea arcului, de aceea
este rezonabil să parametrizăm utilizând distanţa dintre punctele succesive

s1 = 0
q (3.78)
si+1 = si + (xi+1 − xi )2 + (yi+1 − yi )2 , i = 1, 2, . . . , n − 1

După calculul şirului {si } conform (3.78), avem datele

s s1 s2 . . . sn
pentru x(s)
x x1 x2 . . . xn
s s1 s2 . . . sn
pentru y(s).
y y1 y2 . . . yn

Ambele funcţii x(s) şi y(s) pot fi acum interpolate cu un interpolant spline şi


apoi curba poate fi reprezentată grafic. Pentru curbe închise, este important
să se utilizeze condiţii de periodicitate pentru a evita „colţurile” la capete.

Exemplul 3.8. Pentru punctele

x 1.31 2.89 5.05 6.67 3.12 2.05 0.23 3.04 1.31


y 7.94 5.50 3.47 6.40 3.77 1.07 3.77 7.41 7.94

Obţinem curba din figura 3.7 utilizând spline cu deficienţă cu condiţii pe


frontieră periodice.

156
8

1
0 1 2 3 4 5 6 7

Figura 3.6: Curbă spline închisă periodică

3.4 Interpolare trigonometrică


În prelucrarea semnalelor, se studiază diferite reprezentări ale unui sem-
nal f (t). Pentru semnale sonore, se consideră că f (t) este periodică (sau
aproape periodică) cu prioada T , adică f (t + T ) = f (t), pentru orice t ∈ R.
În astfel de cazuri, se consideră frecvent descompunerea în frecvenţă sau
Fourier a lui f :
∞ ∞
2πkt 2πkt
   
f (t) ∼ a0 + ak cos + bk sin (3.79)
X X
,
k=1
T k=1
T
RT
unde a0 = 1
T 0 f (t)d t şi

ZT ZT
2 2πkt 2 2πkt
   
ak = f (t) cos d t, bk = f (t) sin dt
T T T T
0 0

pentru k ≥ 1 sunt coeficienţii Fourier reali ai lui f . Prin schimbarea de


variabilă x = 2πt/T , putem presupune fără a restrânge generalitatea că
T = 2π, adică, putem considera numai funcţii 2π-periodica. Menţionăm
că în (3.79), we write ∼ în loc de = deoarece este vorba de o dezvoltatre
formală, şi nu am studiat dacă pentru un t dat dacă seria converge, sau dacă
atunci când converge converge către f (t) sau către alte valori.
Din punct vedere practic, descompunerea Fourier este utilă deoarece

157
(i) pentru semnale sonore, funcţiile sin(2πkt/T ) şi cos(2πkt/T ) corespund
armonicelor frecvenţelor fundamentale 1/T şi sunt natural interpre-
tate ca zgomot (pitch) de către urechea umană. Pentru alte tipuri de
semnale (e.g., semnale electrice), sinusoidele diferitelor frecvenţe au
interpretări naturale.

(ii) Amplitudinile pentru frecvenţe mai înalte tind să fie mult mai mici
decât cele ale frecvenţelor joase. Astfel, este posibil să comprimăm
semnalul setând coeficienţii frecvenţelor mari pe zero, fără a afecta
semnificativ calitatea semnalului.

Observat, ia 3.3. Punctul al doilea de mai sus are fundament teoretic: con-
form lemei Riemann–Lebesgue lemma, pentru orice funcţie f : [a, b] → R,
integrabilă, avem

Zb Zb
lim f (t) sin ktd t = 0, lim f (t) cos ktd t = 0.
k→∞ k→∞
a a

(Pentru o demonstraţie, vezi de exemplu [?, p. 103]). Aceasta implică faptul


că ak şi bk descresca către 0 pentru k mare, deşi rata de descreştere depinde
de proprietăţile de netezime ale lui f . Acest lucru este discutat mai detaliat
în secţiunea 3.4.3.

Pe calculatoare numerice, semnalele sunt uzual reprezentate ca o sec-


venţă discretă de eşantioane echidistante, i.e., în loc de a avea f (t) pentru
orice t ∈ R, avem yj = f (tj ) pentru tj = jh, unde h > 0 este fixat şi nh = T
pentru o valoare naturală a lui n. Cu alte cuvinte, avem un şir n-periodic
{yj } care se presupune că reprezintă f (t) într-un anumit mod. Este natural
să punem următoarele întrebări:

1. Cum se construieşte o funcţie 2π-periodică p(t) din punctele {(tj , yj )}j∈Z


?

2. Este funcţia reconstruită p(t) identică cu f (t), şi dacă nu, cât de mare
este eroarea |p(t) − f (t)|?

3. Cum se calculează descompunerea Fourier a lui p(t) eficient?

4. Care este relaţia dintre descompunerea Fourier a lui f (t) şi p(t)?

158
3.4.1 Polinoame trigonometrice
Fie {yj }2n−1
j=0 un şir 2n-periodic. Definim un polinom trigonometric de
grad 2n prin
n n−1
p2n (x) = a0 + ak cos kx + bk sin kx.
X X

k=1 k=1

Dorim să ştim dacă există un polinom trigonometric de grad 2n astfel încât


p2n (xj ) = yj pentru xj = jπ/n, j = 0, 1, . . . , 2n − 1, şi dacă un astfel de
polinom este unic. Pentru aceasta, să rescriem polinomul în formă complexă:
pentru −n ≤ k ≤ n, punem
1
(ak − ibk ) , 1 ≤ k ≤ n − 1

 12 (a + ib ) , −n + 1 ≤ k ≤ −1



k k
ck = 2

 a0 , k = 0,
k = ±n.


an ,

Utilizând această definiţie, calculăm


n
1X   1 n−1
X  
p2n (x) = c0 + ak eikx + e−ikx + bk eikx − e−ikx
2 k=1 2i k=1
1   n−1
X ak − ibk n−1
X ak + ibk
= c0 + an einx + e−inx + eikx + e−ikx
2 k=1
2 k=1
2
n−1
1 1
= c−n e−inx + ck eikx + cn einx .
X
2 k=−n+1
2

Introducem notaţia prescurtată convenabilă


n

p2n (x) =
X
ck eikx ,
k=−n

unde prim înseamnă că primul şi ultimul termen se înmulţesc cu 1/2. Se


observă că avem o problemă de interpolare similară cu interpolarea polino-
mială: dorim să ştim dacă, pentru orice secvenţă y0 , y1 , ..., y2n−1 ∈ C, există
un set unic de coeficienţi c−n , c−n+1 , . . . , cn astfel încât
n n

p2n (xj ) = yj = = j = 0, 1, . . . , 2n − 1.
X X
ikxj
ck e ck eπijk ,
k=−n k=−n

159
Pentru a răspunde la această întrebare, observăm că eπijk/n = eπi(j+2n)k/n
este un şir 2n-periodic şi că cn = c−n . Astfel, dacă extindem secvenţa finită
c−n , . . . , cn−1 la un şir 2n-periodic, atunci putem scrie
2n−1
yj =
X
ck eπik/n ,
k=0

deoarece termenii pentru k = ±n sunt identici şi pot fi combinaţi. Astfel, în


formă matricială, avem

1 1 1
 
··· c0
 
y0


 1 ω2n 2n−1
· · · ω2n 
 c1  
  y1 

2(2n−1)
1 2
 
 ω2n · · · ω2n  c2 =
 
y2

,
.. .. .. .. .. ..
    
. . . .
 
. .
    
    
(2n−1)2 c2n−1 y2n−1
1 ω2n
2n−1
· · · ω2n
| {z }| {z } | {z }
c y
V

sau V c = y, unde ω2n = eπi/n . Cu alte cuvinte, există un singur polinom


trigonometric de interpolare de grad 2n dacă şi numai dacă V este nesingu-
lară.
Teorema 3.11. Fie {yj }j∈Z un şir n-periodic, unde n este par. Atunci
polinomul trigonometric unic de grad n care satisface pn (xj ) = yj pentru
xj = 2πj/n este dat de
n/2
X′
pn (x) = ck eikx ,
k=−n/2

unde {ck }k∈Z este un şir n-periodic dat de transformarea Fourier dis-
cretă (DFT)
1 n−1
ck = (Fn y)k = yj e−2πijk/n . (3.80)
X
n j=0

În plus, yj se poate obţine din ck via transformata Fourier discretă


inversă (IDFT)
  n−1
yj = Fn−1 c = (3.81)
X
ck e2πijk/n .
j
k=0

Demonstraţie. Vom arăta existenţa şi unicitatea polinomului de interpolare


trigonometric construid explicit inversa lui V . De fapt, vom arăta că V ∗ V =

160
nI, unde V ∗ este transpusa conjugată a lui V iar I este matricea unitate.
(j−1)(k−1)
Intâi, observăm că elementul (j, k) al lui V este ωn , ceea ce înseamnă
n n−1
[V ∗ V ]kl = ωn−(k−1)(j−1) ωn(j−1)(l−1) = for 1 ≤ k, l ≤ n.
X X
ωnj(l−k) ,
j=1 j=0

Dacă k = l, atunci valoare sumei care ne dă fiecare element este 1, astfel că


[V ∗ V ]kk = n. Dacă k ̸= l, atunci ωnk−l ̸= 1 (deoarece 1 ≤ k, l ≤ n şi ωnm = 1
dacă şi numai dacă m este divizibil prin n). Astfel, putem scrie
n−1 n(k−l)
1 − ωn
= = 0.
X
ωnj(k−l)
j=0 1 − ωnk−l

Aceasta ne arată că
(
∗ n, dacă k = l
[V V ]kl =
0, dacă k ̸= l,

deci V ∗ V = nI. Astfel, c = n1 V ∗ y, astfel că

1 n−1 −jk 1 n−1


ck = ωn yj = yj e−2πijk/n ,
X X
n j=0 n j=0

adică (3.80). Ecuaţia (3.81) este doar un alt mod de a scrie pn (xj ) pentru
j = 0, 1, . . . , n − 1.

Demostraţia de mai sus ne arată că matricea V / n, este o matrice or-
togonală, deci problemele calculării DFT şi IDFT sunt bine condiţionate.

3.4.2 Transformata Fourier rapidă (FFT)


O implementare directă a transformatei Fourier discretă ce utilizează
(3.80) necesită O(n) operaţii pe element în vectorul c = Fn y, în total O(n2 )
operaţii. Totuşi, dacă n = 2m este o putere a lui 2, există algoritmi care
calculează Fn y cu doar O(n log2 n) operaţii. Astfel de algoritmi sunt cunos-
cuţi sub numele colectiv de transformata Fourier „rapidă” (“fast” Fourier
transform - FFT), iar FFT este amintit ca unul dintre algoritmii din top
10 al secolului precedent [?]; vom prezenta o versiune recursivă bazată pe
lucrarea originară a lui Cooley şi Tukey [?].

161
Vom ilustra numai algoritmul pentru transformata Fourier inversă (3.81),
cel pentru transformarea directă fiind similar. Întâi, să partiţionăm suma din
(3.81) în termeni pari şi impari:

  n−1
Fn−1 y =
X
yj e2πijk/n
k
j=0
n/2−1 n/2−1
= +
X X
2πi(2j)k/n
y2j e y2j+1 e2πi(2j+1)k/n
j=0 j=0
n/2−1 n/2−1
2πijk 2πijk
= +e
X X
2πik/n
y2j e n/2 y2j+1 e n/2 .
j=0 j=0

Se observă că cele două sume au exact aceeaşi formă ca tranformata Fourier


inversă de lungime n/2. Astfel, putem scrie
     
−1 −1
Fn−1 y = Fn/2 ye + e2πik/n Fn/2 yo , (3.82)
k k k

unde ye şi yo sunt partea pară şi respectiv cea impară a şirului n-periodic


y. Aceasta înseamnă că putem apela recursiv rutina IFFT routine pentru
doi vectori mai mici şi se continuă cu subdivizarea problemei până când
se ajunge la un vector de lungime 1, pentru care vectorul şi transformata
sa Fourier inversă sunt identice. Putem să revenimîn sus pe arborele de
recursivitate şi să combinăm elementele pare şi impare conform (3.82) până
când se obţine transformata Fourier inversă a vectorului iniţial. Funcţia
MATLAB următoare implementează aceasta:
****myIFFT.m
Pentru a calcula transformata Fourier directă, trebuie doar să înlocuim
e 2πik/n cu e−2πik/n şi să împărţim rezultatul final cu n.

Exemplul 3.9. Pentru a calcula transformata Fourier inversă a vectorului


[1, 2, 3, 4], avem diagrama din figura 3.7. De notat că atunci când combinăm
transformata pară şi impară într-un vector mai larg, trebuie să extindem
periodic vectorii mai sus.

În exemplul de mai sus, prima jumătate a diagramei nu conţine nici o


operaţie aritmetică, deoarece algoritmul subdivizează problema până când
se obţin vectori de lungime 1. Ultima jumătate a diagramei conţine log2 n
coloane; în fiecare coloană, trebuie realizate în total n adunări şi n înmulţiri.
Astfel costul total al algoritmului este O(n log2 n).

162
Figura 3.7: Exemplul 3.9

Observat, ia 3.4. Funcţiile MATLAB fft şi ifft implementează transfor-


mata Fourier discretă şi inversa sa în cod compilat. De notat că spre deo-
sebire de definiţiile (3.80) şi (3.81), fft din MATLAB pune împărţirea la n
în transformarea inversă, i.e., MATLAB utilizează
n−1
    1 n−1
= yj e−2πijk/n , Fen−1 y =
X X
Fen y e2πijk/n .
k
j=0
j n k=0

3.4.3 Eroarea în interpolarea trigonometrică


În secţiunea precedentă, am arătat cum putem calcula transformata Fo-
urier discretă a unui şir n-periodic {yj }j∈Z , din care putem construi un
polinom trigonometric pn (x) astfel încât

2πj
 
pn = yj , j = 0, . . . , n − 1,
n

pentru n par. Presupunem că yj sunt valori (eşantionări) echidistante ale


unei funcţii 2π-periodice f : R → C, adică,
2πj 2πj
   
pn =f = yj , j = 0, . . . , n − 1.
n n

163
Ce putem spune despre eroarea de interpolare pn (x)−f (x) în puncte care nu
sunt noduri? Pentru a studia această, introducem seria Fourier a lui f (x)

1
Z 2π
f (x) ∼ fb(k)eikx , fb(k) = fb(k)e−ikx d x,
X

k=−∞
2π 0

care este versiunea complexă a lui (3.79). Observăm că dacă k∈Z fb(k)
P

converge absolut, atunci din criteriul lui Weierstrass (Weierstrass M-test),


seria Fourier converges uniform şi “∼” devine egalitate, i.e.,

f (x) = fb(k)eikx .
X

k=−∞

Lema 3.12. Fie f : R → C o funcţie 2π-periodică şi absolut integrabilă pe


[0, 2π] şi
n
1X 2πj −2πijk/n
 
fn (k) =
b f e
n j=0 n

al k-lea element al transformării Fourier discrete a eşantionărilor lui f .


Dacă k∈Z fb(k) converge absolut, atunci
P

fbn (k) = fb(k + jn).


X

j∈Z

Demonstraţie. Dacă scriem xl = 2πl/n şi ωn = e2πi/n , atunci

1 n−1
fbn (k) = f (xl )ωn−kl
X
n l=0
∞ ∞
1 n−1 1 n−1
" #
= fb(m)eimxl ωn−kl = fb(m)
X X X X
ωn(m−k)l .
n l=0 m=−∞ m=−∞
n l=0

Acum dacă m − k este divizibil prin n, adică, dacă m = k + jn pentru un


anumit j ∈ Z, atunci ωnm−k = 1, astfel că termenul din interiorul parantezei
pătrate este egal cu 1. Dacă, pe de altă parte, m − k nu este divizibil cu n,
atunci ωnm−k ̸= 1, şi un raţionament analog celui din teorema 3.11 ne arată
că suma interioară se anulează. Deci, avem

fbn (k) = fb(k + jn),


X

j∈Z

ceea ce trebuia arătat.

164
Observat, ia 3.5. Transformata Fourier discretă fbn (k) poate fi considerată
aproximarea lui fb(k) prin regula trapezelor: pentru o funcţie 2π-periodică
f , avem

Z2π
1 1 2π n−1
X f (xj )e−ikxj + f (xj+1 )e−ikxj+1
fb(k) = f (x)e−ikx d x ≈
2π 2π n j=0 2
0

1 1 n−1 1
= f (0) + f (xj )e−πijk/n + f (2π)
X
2n n j=1 2n
n
1 X′
= f(xj )e−πijk/n = fbn (k).
n j=0

Observat, ia 3.6. Lema anterioară arată că coeficienţii Fourier discreţi se


pot obţine adăugând copii ale spectrului fb(k) translataţi cu un multiplu de
n. Deoarece fb(k) → 0 când |k| → ∞, se aşteptă ca fbn (k) să fie o aproximaţie
proastă pentru k mare, deoarece fbn (k) este n-periodic. Pentru frecvenţe joase
(k mic), avem
fbn (k) − fb(k) = fb(k + jn),
X

j∈Z
j̸=0

deci eroarea este o sumă de coeficienţi aparţinând frecvenţelor înalte (peste


n/2 sau sub −n/2). Astfel, dacă n este suficient de mare astfel ca domeniul
[−n/2, n/2] să conţină toţi coeficienţii cu excepţia celor mai mici, eroarea va
fi mică; altfel, eroarea va fi mare, datorită „contamination”” cu componente
de înaltă frecvenţă. Acest fenomen este cunoscut sub numele de aliasing;
vezi Figura 3.8.

Teorema 3.13 (Eroarea în interpolarea trigonometrică). Fie f : R → C ast-


X′
fel ca k∈Z fb(k) să fie absolut convergentă şi fie pn (x) = fbn (k)eikx
P
|k|≤n/2
polinomul său trigonometric de interpolarede grad n (n par). Atunci
X′
|pn (x) − f (x)| ≤ fb(k) .

k≥n/2

165
Figura 3.8: Sus: o funcţie 2π-periodică f (x). Mijloc: coeficienţii Fourier fb(k)
ai lui f . Jos: O comparaţie între A comparison between fb(k) (albastru) şi
TFD fb8 (k) cu 8 puncte (roşu). Diferenţa dintre punctele roşii şi albastre se
datorează aliasing-ului.

Demonstraţie. Avem

X

|pn (x) − f (x)| ≤ fbn (k)eikx − fb(k)eikx
X
|k|≤n/2 k∈Z

X 
′  ′
= fbn (k) − fb(k) eikx − fb(k)eikx
X
|k|≤n/2 |k|≥n/2

X′ X′
fn (k) − f (k) + f (k)

≤ b b b
|k|≤n/2 |k|≥n/2

X′ X X′
f (k + jn) + f (k)

≤ b b
|k|≤n/2 j∈Z |k|≥n/2
j̸=0

X′
Suma dublă de mai sus este egală cu f (m) , deoarece orice m
b
|m|≥n/2|
care nu este multiplu impar de n/2 se poate scrie în mod unic sub forma
k + jn cu |k| < n/2 şi j ∈ Z. Mai mult, sunt exact două moduri de scriere
k + jn când m este un multiplu impar de n/2 (cu k = ±n/2), dar termenii
corespunzători au ponderea 1/2. Astfel, fiecare fb(k + jn) corespunde unui

166
fb(m) diferit, exceptând k = ±n/2, când doi termeni se dubează până la
anulare cu jumătate din ponderi (coeficienţi). The condiţia j ̸= 0 exclude
domeniul m ∈ (−n/2, n/2) şi lasă jumătate din ponderi (coeficienţi) intacte
pentru m = ±n/2. Deci, conchidem că
X′
|pn (x) − f (x)| ≤ 2 fb(k) .

|k|≥n/2

Urmează două aplicaţii imediate ale teoremei anterioare:

1. Dacă f este band-limited (limitată în bandă) i.e., dacă există M > 0


astfel ca fb(k) = 0 pentru orice |k| > M , atunci pn (x) = f (x) ori de
câte ori n > 2M . Cu alte cuvinte, dacă luăm suficiente valori ale func-
ţiei f (x), atunci este posibil să reconstruim perfect f (x) prin interpo-
lare. Acest rezultat este cunscut sub numele de teorema de eşantionare
(sampling theorem, [?]).

2. Dacă f este continuu derivabilă de r ori, atunci integrând prin părţi


repetat, obţinem
Z 2π Z 2π
−1
2π fb(k) = f (x)e−ikx d x = f ′ (x)e−ikx d x
0 ik 0
r Z 2π
−1

= ··· = f (r)
(x)e−ikx d x,
ik 0

astfel că
1 1 2π (r) C
 Z 
f (k) ≤ f (x) d x = r
b
r
|k| 2π |k|

0
Deci,

dy
Z ∞
X′ Ce
|pn (x) − f (x)| ≤ 2 f (k) ≤ 4C ≤ ,
b
r y r−1
n/2 y
|k|≥n/2

unde Ce este o constantă ce depinde de funcţia f şi de r, dar este


independentă de k. Astfel, cu cât f este mai netedă, cu atât pn (x)
converge mai repede către f (x) atunci câd creştem numărul de valori
n.

Observat, ia 3.7. Pentru funcţii f derivabile de r ori, se poate arăta că


eroare de interpolare descreşte ca O(n−r ), nu ca marginea pesimistă O(n−r+1 )
de mai sus.

167
3.4.4 Convoluţie cu FFT
Fie {yj }j∈Z şi {zj }j∈Z două şiruri n-periodice. Convoluţia lui y şi z este
de asemenea un şir n-periodic cu al k-lea element definit prin
k−1
(y ∗ z)k = (3.83)
X
yk−j zj .
j=0

Convoluţia are multe aplicaţii importante în prelucrarea semnalelor. Ca


exemplu, fie {yj }j∈Z un semnal acustic n-periodic căruia dorim să-i adă-
ugăm un efect de ecou. Este uşor de văzut cum lucrează ecoul examinând
acţiunea sa asupra impulsului unitate δ, adică, când
(
1, k divizibil prin n
δk =
0, altfel

Când se adaugă un ecou la δ, impulsul este repetat după o întârziere fixă


d, dar cu un factor de atenuare după fiecare repetiţie, notat cu α. Cu alte
cuvinte, semnalul transformat z = Hδ are forma
(
αm , k = md, m = 0, 1, . . . , nd
 
zk =
0, 0 ≤ k ≤ n − 1, k ̸= md
zn+k = zk

Semnalul z este cunoscut sub numele de răspuns în impuls (impulse


response) al lui H, deoarece se obţine aplicând H impulsului unitate δ, vezi
figura 3.9. Considerăm acum Hy pentru un semnal general y. Să introducem
operatorul de deplasare E ce satisface (Ez)k = zk−1 , adică, ia un şir z şi îl
deplasează la dreapta cu o poziţie (vezi figura 4.9). Atunci, şirul general y
se poate scrie ca o sumă de impulsuri deplasate
n−1
y=
X
yj E j δ.
j=0

Presupunând că H este linear şi invariant la deplasări (sau invariant


în timp în terminologia prelucrării semnalelor), i.e., dacă presupunem că
HE = EH, atunci
n−1 n−1 n−1
Hy = H yj E j δ = yj E j (Hδ) =
X X X
yj E j z
j=0 j=0 j=0

168
Figura 3.9: Sus: Impulsul unitate δ pentru un şir 16-periodic. Mijloc: Im-
pulsul deplasat Eδ. Jos: Răspunsul în impuls al operatorului de ecou H, cu
întârzierea d = 4 şi factorul de atenuare α = 1/2.

unde z = Hδ este răspunsul în impuls al lui H. În această ipoteză, al k-lea


element al lui Hy satisface
n−1   n−1
(Hy)k = =
X X
yj E j z yj zk−j .
k
j=0 j=0

Cu alte cuvinte, Hy se obţine prin convoluţia lui y cu răspunsul în impuls


z, care caracterizează complet H. Deoarece H este un operator linear pe
spaţiul şirurilor n-periodice, putem scrie H în formă matricială:
  
z0 zn−1 · · · z1 y0

z1 z0 · · · z2    y1
 
Hy = 
 
.. .. .. ..   . .
. . . .    ..
  
 
zn−1 zn−2 · · · z0 yn−1

Matricea de mai sus are valori costante de-a lungul fiecărei diagonale, care
se „înfăşoară” când ating latura din dreapta; astfel de matrice se numesc
circulante. Orice matrice circulantă se poate scrie ca o convoluţie şi reciproc.
Relaţia fundamentală între convoulţii şi transformate Fourier discrete este
dată de lema care urmează.

169
Lema 3.14. Fie y şi z două şiruri periodice. Atunci

Fn (y ∗ z) = n (Fn (y) ⊙ Fn (z)) ,

unde ⊙ desemnează înmulţirea punctuală (element cu element).

De notat că lema implică simetria operatorului de convoluţie, adică,


y ∗ z = z ∗ y, în ciuda aparentei asimetrii a definiţiei.

Demonstraţie. Avem

1 n−1
X n−1
(Fn (y ∗ z))k = yl zj−l e−2πijk/n
X
n j=0 l=0

1 n−1
X n−1
= yl zj−l e−2πi(j−l)k/n e−2πilk/n
X
n j=0 l=0
 
1 n−1 n−1
=  yl e−2πilk/n zj−l e−2πi(j−l)k/n 
X X
n l=0 j=0
 
1 n−1 n−1
=  yl e−2πilk/n zj e−2πijk/n 
X X
n l=0 j=0

= n (Fn (y))k (Fn (z))

Calculul direct al convoluţiei utilizând (3.83) necesită O(n2 ) operaţii,


dar lema de mai sus ne sugerează algoritmul următor cu FFT:

Algoritmul 3.15 (Calculul convoluţiei a două şiruri n-periodice). Intrare


y şi z două şiruri periodice, ieşire şirul n-periodic w

b = Fn y and z
1. Utilizează FFT pentru a calcula y b = Fn z.

b = n (y
2. Calculează w b).
b⊙z

3. Utilizează IFFT pentru a calcula w = Fn−1 w.


b

Deoarece paşii 1 şi 3 costă fiecare O(n log n) şi pasul 2 costă O(n), costul
total este O(n log n), care este mult mai mic dec ât O(n2 ) când n este mare.

170
Capitolul 4

Aproximare în sensul celor


mai mici pătrate

A basic problem in science is to fit a model to observations


subject to errors. It is clear that the more observations that are
available, the more accurately will it be
possible to calculate the parameters in the model. This gi-
ves rise to the problem of “solving” an overdetermined linear or
nonlinear system of equations. It can be shown
that the solution which minimizes a weighted sum of the squ-
ares of the residual is optimal in a certain sense.
Åke Björck, Numerical Methods for Least Squares Problems,
SIAM, 1996.

Least squares problems appear very naturally when one would like to es-
timate values of parameters of a mathematical model from measured data,
which are subject to errors (see quote above). They appear however also
in other contexts, and form an important subclass of more general opti-
mization problems, see Chapter ??. After several typical examples of least
squares problems, we start in Section ?? with the linear least squares pro-
blem and the natural solution given by the normal equations. There were
two fundamental contributions to the numerical solution of linear least squ-
ares problems in the last century: the first one was the development of the
QR factorization by Golub in 1965, and the second one was the implicit QR
algorithm for computing the singular value decomposition (SVD) by Golub
and Reinsch (1970). We introduce the SVD, which is fundamental for the
understanding of linear least squares problems, in Section ??. We postpone

171
the description of the algorithm for its computation to Chapter ??, but use
the SVD to study the condition of the linear least squares problem in Sec-
tion ??. This will show why the normal equations are not necessarily a good
approach for solving linear least squares problems, and motivates the use of
orthogonal transformations and the QR decomposition in Section ??. Like in
optimization, least squares problems can also have constraints. We treat the
linear least squares problem with linear constraints in full detail in Section
??, and a special class with nonlinear constraints in Section ??. We then
turn to nonlinear least squares problems in Section ??, which have to be
solved by iteration. We show classical iterative methods for such problems,
and like in the case of nonlinear equations, linear least squares problems
arise naturally at each iteration. We conclude this chapter with an interes-
ting example of least squares fitting with piecewise functions in Section ??.
The currently best and most thorough reference for least squares methods
is the book by Åke Björck [1].

4.1 Exemple introductive


Vom începe capitolul cu câteva exemple tipice care conduc la probleme
de aproximare în sensul celor mai mici pătrate.

2.539300cm14.447200cm

Figura 4.1: Măsurarea unui segment de drum

Exemplul 4.1. [Măsurarea unui segment de drum - Stiefel]La măsurarea


unui segment de drum, presupunem că am efectuat 5 măsurători

AD = 89m, AC = 67m, BD = 53m, AB = 35m şi CD = 20m,

şi că dorim să determinăm lungimile segmentelor x1 = AB, x2 = BC şi


x3 = CD.
Conform observaţiilor obţinem un sistem cu mai multe ecuaţii decât

172
necunoscute (sistem supradeterminat):
x1 + x2 + x3 = 89 1 1 1 89
   

x1 + x2 = 67 
 1 1 0 


 67 

x2 + x3 = 53 ⇔ Ax = b, A =  0 1 1 , b =  53 .
   
= 35 1 0 0 35
   
x1    
x3 = 20 0 0 1 20
Din ultimele trei ecuaţii se obţine soluţia x1 = 35, x2 = 33 şi x3 = 20.
Totuşi, dacă înlocuim în primele două ecuaţii se obţine
x1 + x2 + x3 − 89 = −1,
x1 + x2 − 67 = 1.
Ecuaţiile sunt contradictorii şi se ajunge la un sistem incompatibil.
Un remediu este să găsim o soluţie aproximativă care satisface sistemul cât
mai bine posibil. Considerăm vectorul reziduu
r = b − Ax.
Căutăm un vector x care să minimizeze într-un anumit sens vectorul reziduu.
h iT
x= 35.1250 32.5000 20.6250

Exemplul 4.2. Cantitatea f a unui component într-o reacţie chimică des-


creşte odată cu timpul t exponenţial conform cu:
f (t) = a0 + a1 e−bt .
Dacă materialul este cântărit la momente de timp diferite se obţine un tabel
de valori măsurate:
t t1 · · · tm
y y1 · · · ym
Problema este de a estima parametrii modelului a0 , a1 şi b din aceste obser-
vaţii. Fiecare punct măsurat (ti , yi ) ne conduce la o ecuaţie:
f (ti ) = a0 + a1 e−bti ≈ yi , i = 1, . . . , m. (4.1)
Dacă nu sunt erori de măsurare, atunci putem înlocui simbolul aproximativ
din ecuaţia (4.1) cu o egalitate şi să utilizăm trei ecuaţii pentru a determina
parametrii. Totuşi, în practică erorile de măsurare sunt inevitabile. Mai mult,
ecuaţiile modelului nu sunt chiar corecte ci doar modelează aproximativ
comportarea fizică. În general ecuaţiile se vor contrazice unele pe altele şi
avem nevoie de un mecanism de a echilibra erorile de măsurare, e.g. cerând
ca (4.1) să fie satisfăcută cât mai bine posibil.

173
4.973200cm7.117100cm

Figura 4.2: Punctem măsurate pe două drepte ortogonale

Exemplul 4.3. Exemplul următor provine din metrologia coordonatelor.


Aici o maşină de măsurare a coordonatelor măsoară două mulţimi de puncte
pe două drepte ortogonale (vezi figura 4.2). Dacă reprezentăm dreapta g1
prin ecuaţiile
g1 : c1 + n1 x + n2 y = 0, n21 + n22 = 1, (4.2)
atunci n = (n1 , n2 ) este vectorul normal pe g1 . Ecuaţia de normalizare
n21 + n22 = 1 ne asigură unicitatea parametrilor c, n1 şi n2 . Dacă introducem
coordonatele unui punct măsurat Pi = (xi , yi ) în ecuaţia (4.2), obţinem
reziduul ri = c1 + n1 xi + n2 yi şi di = |ri | este distanţa de la Pi la g1 . Ecuaţia
dreptei g2 ortogonală pe g1 este
g2 : c2 − n2 x + n1 y = 0, n21 + n22 = 1. (4.3)
Dacă introducem coordonatele ale q puncte măsurate Qi în (4.3) şi ale p
puncte Pi în ecuaţia (4.2), obţinem următorul sistem de ecuaţii pentru de-
terminarea parametrilor c1 , c2 , n1 şi n2 :
1 0 x P1 0
   
yP1

 1 0 x P2 yP2 


 0 

 .. .. .. ..    .. 
. . . . c1 .
   
   
1 0 x Pp 0
   
yPp  c2   cu restricţia n2 + n2 = 1. (4.4)
   
 ≈
0 1 xQ1 0

1 2
yQ1  n1  
  
   

 0 1 xQ2 yQ2 
 n2 
 0 

 .. .. .. ..   .. 
. . . .  .
   
  
0 1 xQq yQq 0

174
Observaţi diferenţa dintre ecuaţiile CMMP şi restricţie: în timp ce ecuaţiile
de tipul g1 sau g2 trebuie satisfăcute doar aproximativ, restricţia n21 +n22 = 1
trebuie satisfăcută exactde soluţie.

3.147800cm10.346100cm

Figura 4.3: Sistem cu intrarea u şi ieşirea y

Exemplul 4.4. În teoria controlului, se consideră frecvent sisteme ca cele


din figura 4.3. Vectorii u şi y sunt semnalele de intrare şi de ieşire măsurate în
diverse momente de timp. Fie yt+i = y(t+i∆t). Un model simplu presupune
o relaţie liniară între ieşire şi intrare de forma

yt+n +an−1 yt+n−1 +· · ·+a0 yt ≈ bn−1 ut+n−1 +bn−2 ut+n−2 +· · ·+b0 ut . (4.5)

Problema este de a determina parametrii ai şi bi din măsurătorile lui u şi


y. Pentru fiecare moment de timp se obţine o nouă ecuaţie de forma (4.5).
Dacă le scriem pe toate împreună, obţinem un sistem de ecuaţii liniare:
 
an−1

 an−2 


yn−1 yn−2 · · · y0 −un−1 −un−2 · · · −u0
 ..  
−yn

.
 
 

 yn yn−1 · · · y1 −un −un−1 · · · −u1 
  a0   −yn+1
  

≈
yn+1 yn · · · y2 −un+1 −un · · · −u2   −yn+2
  
  b 
  n−1
.. .. .. .. .. .. .. .. ..
   
. . . . . . . .  bn−2 .
 

 .
 .

 .


bn
(4.6)
O matrice se numeşte matrice Toeplitz dacă are elemente constante pe diago-
nale. Aici în (4.6), matricea se compune din două matrice Toeplitz. Numărul
de ecuaţii nu este fixat, deoarece se pot genera noi ecuaţii adăugând pur şi
simplu noi măsurători.

175
Exemplul 4.5. În robotică şi în alte aplicaţii, se întâlneşte frecvent pro-
blema de tip Procust sau una din variantele sale (vezi [?, Chapter 23]). Se
consideră un corp dat (e.g., o piramidă ca în figura 4.4) şi o copie a aceluişi
corp. Presupunem că ştim coordonatele a m puncte xi pe primul corp şi că
punctele corespunzătoare ξi au fost măsurate pe alt corp în altă poziţie în
spaţiu. Dorim să rotim şi să translatăm al doilea corp astfel ca el să poată
fi suprapus pe primul corp cât mai bine posibil. Cu alte cuvinta, căutăm
o matrice ortogonală Q (produs de trei rotaţii) şi un vector de translaţie t
astfel încât ξi ≈ Qxi+t pentru i = 1, . . . , m.

6.218600cm9.974900cm

Figura 4.4: Problema lui Procust sau problema înregistrării

Exemplele de mai sus sunt o ilustrare a diferitelor clase de probleme


de aproximare. De exemplu, în exemplele 4.1 şi 4.4, ecuaţiile sunt liniare.
Totuşi în exemplul 4.2 (reacţii chimice), sistemul de ecuaţii (4.1) este neli-
niar. În exemplul din meteorologie 4.3, ecuaţiile sunt liniare, dar ele trebuie
să verifice restricţia neliniară n21 + n22 = 1. În fine, avem de asemenea o
problemă neliniară în exemplul 4.5, şi nu este clar cum să parametrizăm
matricea necunoscută Q. Cu toate acestea, în toate exemplele de mai sus,
dorim să satisfacem nişte ecuaţii cât mai mai bine posibile; aceasta se indică
prin simbolul de aproximare “≈” şi va trebui să definim ce înţelegem prin
aceasta.
Există probleme de aproximare în sensul celor mai mici pătrate care nu
au legătură cu măsurătorile cum ar fi exemplul următor:

176
Exemplul 4.6. Considerăm două drepte g şi h din spaţiu. Presupunem că
sunt date printr-un punct şi un vector de direcţie:

g : X = P + λt
h : Y = Q + µs

Dacă ele se intersectează, atunci trebuie să existe un λ şi un µ astfel încât

P + λt = Q + µs. (4.7)

Rearanjând (4.7) ne conduce la


   
t1 −s1 ! Q1 − P1
λ
 t2 −s2  =  Q2 − P2  , (4.8)
   
µ
t3 −s3 Q3 − P3

un sistem de 3 ecuaţii cu două necunoscute. Dacă ecuaţiile sunt consitente,


atunci putem utiliza două din ele pentru d determina punctul de intersecţie.
Dacă, totuşi, avem o pereche de drepte oarecare (strâmbe, i.e., dacă (4.8)
nu are nici nici o soluţie) atunci am pute fi interesaţi în a determina punctul
X pe g şi Y pe h care sunt cele mai apropiate, adică pentru care vectorul
distanţă r = X − Y are lungimea minimă ∥r∥22 → min. Astfel, suntem
interesaţi în rezolvarea sistemului (4.8) în sensul celor mai mici pătrate.

4.2 Problema liniară de ASCMMP şi ecuaţiile nor-


male
Linear least squares problems occur when solving overdetermined linear
systems, i.e. we are given more equations than unknowns. In general, such
an overdetermined system has no solution, but we may find a meaningful
approximate solution by minimizing some norm of the residual vector.
Given a matrix A ∈ Rm×n with m > n and a vector b ∈ Rm we are
looking for a vector x ∈ Rn for which the norm of the residual r is minimized,
i.e.
∥r∥ = ∥b − Ax∥ −→ min . (4.9)
The calculations are simplest when we choose the 2-norm. Thus we will
minimize the square of the length of the residual vector

∥r∥22 = r12 + r22 + · · · + rn2 −→ min . (4.10)

177
To see that this minimum exists and is attained by some x ∈ Rn , observăm
că E = {b − Ax|x ∈ Rn } is a non-empty, closed and convex subset of Rm .
Since Rm equipped with the Euclidean inner product is a Hilbert space,
[?, Thm. 4.10] asserts that E contains a unique element of smallest norm,
so there exists an x ∈ Rn (not necessarily unique) such that ∥b − Ax∥2 is
minimized.
The minimization problem (4.10) gave rise to the name Least Squares
Method. The theory was developed independently by Carl Friedrich Gauss in
1795 and Adrien-Marie Legendre who published it first in 1805. On January
1, 1801, using the least squares method, Gauss made the best prediction of
the orbital positions of the planetoid Ceres based on measurements of G.
Piazzi, and the method became famous because of this.
We characterize the least squares solution by the following theorem.
Teorema 4.1 (Least squares solution). Let

S = {x ∈ Rn with ∥b − Ax∥ −→ min}

be the set of solutions and let rx = b − Ax denote the residual for a specific
x. Then
x ∈ S ⇐⇒ Arx = 0 ⇐⇒ rx ⊥ R(A), (4.11)
where R(A) denotes the subspace spanned by the columns of A.
Demonstraţie. We prove the first equivalence, from which the second one
follows easily.
“⇐=”: Let Arx = 0 and z ∈ Rn be an arbitrary vector. It follows that
rz = b − Az = b − Ax + A(x − z), thus rz = rx + A(x − z). Now

∥rz ∥22 = ∥rx ∥22 + 2(x − z)T AT rx + ∥A(x − z)∥22 .


But AT rx = 0 and therefore ∥rz ∥2 ≥ ∥rx ∥2 . Since this holds for every z then
x ∈ S.
“=⇒”: We show this by contradiction: assume AT rx = z ̸= 0. We consi-
der u = x + εz with ε > 0:

rz = b − Au = b − Ax − εAz = rx − εAz.
Now ∥rz ∥22 = ∥rx ∥22 − 2εz T AT rx + ε2 ∥Az∥22 . Because AT rx = z we obtain

∥ru ∥22 = ∥rx ∥22 − 2 ∥z∥22 + ε2 ∥Az∥22 .

We conclude that, for sufficient small ε, we can obtain ∥ru ∥22 < ∥rx ∥22 .
This is a contradiction, since x cannot be in the set of solutions in this case.

178
Thus the assumption was wrong, i.e., we must have AT rx = 0, which proves
the first equivalence in (4.11).

The least squares solution has an important statistical property which


is expressed in the following Gauss-Markoff Theorem. Let the vector b of
observations be related to an unknown parameter vector x by the linear
relation

Ax = b + ε, (4.12)
where A ∈ Rm×n is a known matrix and is a vector of random errors. In
this standard linear model it is assumed that the random variables εj are
uncorrelated and all have zero mean and the same variance.
Teorema 4.2 (Gauss-Markov). Consider the standard linear model (4.12).
Then the best linear unbiased estimator of any linear function cT x is the
least square solution of ∥b − Ax∥22 −→ min.
Demonstraţie. Consult a statistics textbook, for example [?, p. 181].

Equation (4.11) can be used to determine the least square solution. From
AT rx = 0 it follows that AT (b − Ax) = 0, and we obtain the Normal Equa-
tions of Gauss:
AT Ax = AT b. (4.13)
Exemplul 4.7. We return to Example 4.1 and solve it using the Normal
Equations.
3 2 1 191
    
x1
AT Ax = AT b ⇐⇒  2 3 2   x2  =  209  .
    
1 2 3 x3 162
The solution of this 3 × 3 system is
35.125
 

x =  32.500  .
 
20.625
The residual for this solution becomes
0.7500
 

 −0.6250 

r = b − Ax =  −0.1250 , ∥r∥2 = 1.1726.
 
−0.1250
 
 
−0.6250

179
Notice that for the solution x = (35, 33, 20)T obtained
√ by solving the last
three equations we obtain a larger residual ∥r∥2 = 2 = 1.4142.

There is also a way to understand the normal equations geometrically


from (4.11). We want to find a linear combination of columns of the matrix
A to approximate the vector b. The space spanned by the columns of A is the
range of A, R(A), which is a hyperplane in Rm , and the vector b in general
does not lie in this hyperplane, as shown in Figure 4.5. Thus, minimizing
∥b − Ax∥2 is equivalent to minimizing the length of the residual vector r,
and thus the residual vector has to be orthogonal to R(A), as shown in
Figure 4.5.
The normal equations (4.13) concentrate data since B = AT A is a small
n × n matrix, whereas A is m × n. The matrix B is symmetric, and if
rank(A) = n, then it is also positive definite. Thus, the natural way to solve
the normal equations is by means of the Cholesky decomposition:

1. Form B = AT A (we need to compute only the upper triangle since B


is symmetric) and compute c = AT b.

2. Decompose B = RT R (Cholesky) where R is an upper triangular


matrix.

3. Compute the solution by forward- (RT y = c) and back-substitution


(Rx = y).

5.186200cm7.169800cm

Figura 4.5: r este ortogonal pe R(A).

180
We will see later on that there are numerically preferable methods for
computing the least squares solution. They are all based on the use of or-
thogonal matrices (i.e. matrices B for which B T B = I).
Notice that when solving linear systems Ax = b with n equations and n
unknowns by Gaussian elimination, reducing the system to triangular form,
we make use of the fact that equivalent systems have the same solutions:

Ax = b ⇐⇒ BAx = Bb if B is nonsingular.

For a system of equations Ax ≈ b to be solved in the least squares sense,


it no longer holds that multiplying by a nonsingular matrix B leads to an
equivalent system. This is because the transformed residual Br may not
have the same norm as r itself. However, if we restrict ourselves to the class
of orthogonal matrices,

Ax ≈ b ⇐⇒ BAx ≈ Bb if B is orthogonal,

then the least squares problems remain equivalent, since r = b − Ax and


Br = Bb − BAx have the same length,

∥Br∥22 = (Br)T (Br) = rT B T Br = rT r = ∥r∥22 .

Orthogonal matrices and the matrix decompositions containing orthogo-


nal factors therefore play an important role in algorithms for the solution of
linear least squares problems. Often it is possible to simplify the equations
by pre-multiplying the system by a suitable orthogonal matrix.

181
Capitolul 5

Rezolvarea numerică a
ecuaţiilor diferenţiale
ordinare

The numerical approximation of solutions to differential equations is of


paramount importance in science and engineering, and there is a subclass
of problems, namely ordinary differential equations, for which the field has
reached a certain maturity. This is much less so for partial differential equ-
ations, for which the theory about existence of solutions is also much less
complete. The focus of this chapter is therefore only on the numerical solu-
tion of ordinary differential equations. We start in Section 5.1 with several
historical examples of ordinary differential equations to illustrate both how
useful differential equations are for modeling, and how one might go about
finding approximate solutions, since most differential equations cannot be
solved in closed form. We then give an introduction to the theory of ordinary
differential equations in Section 5.2, and present two basic solution methods,
the power series expansion and the method of Euler. Next, we consider in
Sections 5.3 and ?? the two main classes of numerical methods for ordinary
differential equations (see the first quote above), namely Runge-Kutta me-
thods and linear multistep methods. For both types of methods, we derive
order conditions using Maple and prove convergence of the approximate so-
lutions to the continuous ones. We also discuss the important concept of zero
stability, which is necessary for the convergence of linear multistep methods.
Many problems of practical interest can only be solved adequately by
special numerical methods, whose properties are related to the underlying
dynamics of the problem. We will consider one such class of problems, known

182
as stiff problems, in Section ??, where the concept of A-stability becomes
important. Another class of problems is the long term integration of sys-
tems that contain invariant physical quantities (momentum, energy, etc.).
Numerical methods that are able to preserve such quantities in the discrete
solution are called geometric integrators and are the subject of discussion in
Section ??. We briefly treat delay differential equations in Section ??.
The best current reference on the numerical solution of ordinary diffe-
rential equations, including stiff problems and geometric integration, are the
three monographs by Hairer, Nørsett and Wanner [?], Hairer and Wanner
[?] and Hairer, Lubich and Wanner [?]. The books by Butcher [2, ?] also
contains a section on general linear methods, which combine Runge-Kutta
and linear multistep ideas.

5.1 Introductory Examples


Differential equations arose naturally after the invention of differential
calculus by the two giants Newton and Leibniz. Newton considered in 1671
one of the first ordinary differential equations

y ′ = 1 − 3x + y + x2 + xy. (5.1)

To find a function y(x) satisfying this equation, Newton assumed that both
x and y are small1 , and thus deduced from (5.1) that

y ′ ≈ 1, pentru x, y mici.

Assuming equality, the above approximation can be integrated to obtain

y ≈ x.

Inserting this approximation back into (5.1) and keeping one more term, one
finds a new approximation for the derivative,

y ′ ≈ 1 − 3x + x = 1 − 2x,

which in turn after integration, leads to

y ≈ x − x2 .

Inserting this again into (5.1) and keeping one more term leads to

y ′ ≈ 1 − 2x + x2 ,
1
În notaţie modernă, aceasta corespunde condiţiei iniţiale y(0) = 0.

183
and after integration to
x3
y = x − x2 + .
3
This process can be continued in the same fashion to obtain a series appro-
ximation of the solution y(x) of (5.1); this procedure is known today as the
Taylor series approach, see Section 5.2.3.
Leibniz in turn worked on the famous “silver watch problem”, which was
first posed by Claude Perrault to Leibniz during the latter’s stay in Paris
between 1672 and 1676: suppose a silver watch with a chain attached to it
is put on a table, as shown in Figure 5.1. What trajectory will the silver
watch follow if one pulls on the chain along the x-axis?

Figura 5.1: Problema ceasului de argint, rezolvată de Leibniz şi Bernoulli

Since the watch always moves in the direction of the chain, we obtain
the differential equation
y y
y′ = − = −p 2 .
c a − y2

To solve this problem, both Joh. Bernoulli and Leibniz invented indepen-
dently the method of separation of variables: the equation is equivalent to
p
a2 − y 2
− d y = d x,
y

184
which leads after integration to the implicit solution
Z p 2
a − y2 q
a
x=− d y = − a2 − y 2 + a arctanh p + C, (5.2)
y a2− y2
which can be obtained by MuPAD using the int command,
reset();
assume(a>0);
rez:=int(-sqrt(a^2-y^2)/y,y) assuming y<=a and y>=0;

a+
p ! q
a2 − y 2
a ln − a2 − y 2
y

rez1:=simplify(rewrite(rez,arctanh),IgnoreAnalyticConstraints);
p ! q
a2 − y 2
2 a arctanh − a2 − y 2
a+y
Cele două soluţii sunt echivalente, lucru care se poate verifica uşor prin
derivare
simplify(diff(rez1,y)-diff(rez,y)) assuming y>=0;

Fără comenzile assume MuPAD nu simplifică a2 . MuPAD poate fi utilizat
pentru a rezolva ecuaţia diferenţială direct, cu comenzile ode şi solve (sau
ode::solve)
ec:=ode(y'(x)=-y(x)/sqrt(a^2-y(x)^2),y(x)):
solve(ec);
 s s  
a 2 1 q
{0} ∪ solve a ln  2
−1−a 2
 + a2 − y 2 = C47 − x, y 
y y
Acest exemplu ne arată că soluţiile EDO nu pot fi obţinute întotdeauna
în formă explicită, vezi soluţia implicită definită de (5.2), care nu poate fi
rezolvată în raport cu y. Euler a adunat printr-un efort monumental toate
EDO cărora a reuşit să le găsească soluţii în formă închisă, care acum pot
fi găsite în volumele XXII şi XXIII din Euler Opera Omnia. El a bănuit că
anumite EDO nu au soluţii în formă închisă şi a propus în [?] un procedeu
simplu de aproximare a soluţiilor, numit acum metoda explicită a lui Euler
(Forward Euler method), vezi subsecţiunea 5.2.5. A durat aproape un secol
până când Liouville a dat prima demonstraţie că ecuaţia diferenţială

y ′ = x2 + y 2

185
nu are soluţii care să se exprime cu ajutorul funcţiilor elementare [?]. Este
instructive să cerem MuPAD să rezolve această ecuaţie,
ec2:=ode(D(y)(x)=y(x)^2+x^2,y(x)):
Simplify(solve(ec2));
   2  2  
 x C51 J− 3 x2 + C52 Y− 3 x2 
4
−  2 4 2 
 C51 J 1 x + C52 Y 1 x
2

2
4 4

Aici Y şi J sunt funcţiile Bessel. Aceasta ne arată că astăzi mult mai multe
funcţii sunt elementare decât pe vremea lui Liouville. Nici Newton nici Eu-
ler nu au arătat că procedeele lor de aproximare converg către soluţia EDO
corespunzătoare; Cauchy a demonstrat riguros în 1820 că metoda lui Euler
converge în cazul unei EDO generale, neliniare şi în 1835 că dezvoltarea în
serie a lui Newton este de asemenea convergentă. Pentru mai multe informa-
ţii despre istoria fascinantă a dezvoltării EDO şi a rezolvării lor numerice,
vezi [?, ?].

5.2 Basic Notation and Solution Techniques


After the introduction of some basic notation and terminology for di-
fferential equations, we show in this section how solutions to differential
equations can be approximated by a series or Euler’s historical method.

5.2.1 Notation, Existence of Solutions


An ordinary differential equation (abbreviated ODE) is an equation in
which the unknown is a function of a single variable (often denoted t); it con-
tains the function and its derivatives of various orders. ODEs are important
for modeling time dependent processes in many disciplines, e.g. in enginee-
ring, physics, chemistry and economics. For instance, in classical mechanics,
if the position, velocity, acceleration and various forces acting on a body are
given, Newton’s second law of motion allows us to express these variables
as a differential equation and, by solving it, to compute the position of the
body as a function of time.
A first-order differential equation for an unknown function y(t) has the
form
y ′ = f (t, y) (5.3)
where the function f (t, y) is given. A function y(t) is a solution of (5.3) if

y ′ (t) = f (t, y(t))

186
is valid for all t.

Exemplul 5.1. The differential equation

y ′ = f (t, y) = y (5.4)

has y(t) = et as a solution. In general, (5.3) will have infinitely many so-
lutions: for instance, the functions y(t) = Cet with any C ∈ R are also
solutions of (5.4). To obtain a unique solution, one has to prescribe an ini-
tial condition, for instance by requiring that y(0) = 1.

A differential equation of order p has the form


 
F t, y, y ′ , . . . , y (p) = 0. (5.5)
The general solution of (5.5) will contain in general p constants of inte-
gration. By requiring p initial or boundary conditions, a particular solution
is selected from the family of solutions.
We have an initial value problem if all p conditions are given for the same
value t = t0 . However, the p conditions can also be spread over different
points t. A frequent case is to have the conditions at two values of t; in
this case, we have a two-point boundary value problem, see also Section
??. A classical case stems from military applications: shooting a canon ball
firing a cannon towards a target is described by a second-order differential
equation
with two boundary conditions

y ′′ = f t, y, y ′ , y (t0 ) = y0 , y (t1 ) = y1 .


From a theoretical point of view, the distinction between initial and bo-
undary value problems is not important. The conditions simply determine
a particular solution. For the numerical methods, however, there is a big
difference: initial value problems are easier to solve.

Teorema 5.1 (Existenţă şi unicitate). Let f (t, y) be defined and continuous


for −∞ < a ≤ t ≤ b < ∞ and −∞ < y < ∞ and suppose there exists a
constant L > 0 such that for all t ∈ [a, b] and all y, ỹ ∈ R, the Lipschitz
condition
|f (t, y) − f (t, ỹ)| ≤ L|y − ỹ| (5.6)
holds. Then for any given η ∈ R, there exists a unique function y(t) with

1. y is continuously differentiable for t ∈ [a, b].

187
2. y ′ = f (t, y), ∀t ∈ [a, b].

3. y(a) = η.

Demonstraţie. See the classical books of Henrici [?] or Hairer, Nørsett and
Wanner [?].

Equation (5.6) holds if the partial derivative ∂f /∂y exists, but this con-
dition is not necessary.

Exemplul 5.2. The function f (t, y) = |y| meets the conditions of the The-
orem 5.1.

|f (t, y) − f (t, ỹ)| ≤ ||y| − |ỹ|| ≤ |y − ỹ| , L = 1.

Thus we have a unique solution, namely

y(a) = η > 0 =⇒ y(t) = ηet−a , y ′ = ηet−a = y = |y|


y(a) = η < 0 =⇒ y(t) = ηea−t , y ′ = −ηea−t = |y| .

As a second example, consider f (t, y) = |y|. This time f is still con-


p

tinuous but does not satisfy the Lipschitz condition (5.6). For y, ỹ > 0, let
ỹ → y. Then p p
|y| − |ỹ| 1

→ p .
|y − ỹ| 2 |y|
and the expression is not bounded for y → 0. To compute the solutions, we
distinguish three cases:

a) if y > 0, we can use the separation of variables technique from Section


5.1 to obtain
2d y
2
√ √ t t

y′ = y =⇒ √ = d t =⇒ y = + C =⇒ y = +C .
2 y 2 2

b) if y < 0, we can proceed similarly and get


q √ 2d y √ t
y′ = |y| = −y =⇒ − √ = −d t =⇒ −y = − + C.
2 y 2
2
Thus y = − (t−a)
4 cu a = 2C.

c) Also y(t) = 0 is a particular solution.

188
We now construct for the initial condition y(2) = −1 the solution

(t−4)2
 − 4

 2≤t<4
y(t) = 0 4 ≤ t ≤ a (a > 0)
(t−a)2



4 t > a.

This solution is continuously differentiable and not unique, since it is a family


of solutions for every a.

5.2.2 Analytical and Numerical Solutions


MuPAD can solve differential equations analytically. For instance, for
y ′ = |y|, y(2) = −1 we get
p

ecd:=ode({diff(y(t),t)=sqrt(abs(y(t))),y(2)=-1},y(t)):
solve(ecd);
2
t2 (t − 4)
( )
− ,−
4 4

Se poate verifica că a doua soluţie nu mai satisface ecuaţia pentru t > 4.


As with antiderivatives, it is often impossible to solve a differential equ-
ation analytically, that is, by algebraic manipulations only. The equation

y ′ = t2 + y 2

fulfills the condition of Theorem 5.1 and thus has a unique solution for
y(0) = 1. However, as we have seen in Section 5.1, it took almost a century
before Liouville gave a first proof that this differential equation cannot be
solved in terms of elementary functions.
Even when an analytical solution is available, it may be of questionable
usefulness. The linear differential equation
1
y ′′ = t2 y + t + 1 −
t
is solved in MuPAD with

ecd2:=ode(diff(y(t),t$2)=t^2*y(t)+t+1-1/t,y(t));
solve(ecd2);

189


 2 √
   π I 1
t
2
t2 (t2 +t−1) √
t2
K
 R
− 4    dt t2

 1      
2
 2 2 2 2
t t5/2 I 1 4 t2 K− 3 t 2 +t5/2 I− 3 t2 K 1 t2

 4

4 4 4
√ √


 t π





 2 √ √  2 √
C2 K 1 t2 t2 π 2 41/4 C1 I 1 t2 t2
+ √4
√ + √  
4

t π 4 t Γ 34
√  2 
√  2 √ R 2 43/4 Γ( 43 ) K 1 t
2 (t2 +t−1)

π 2 41/4 I 1 t2

t2  4     √ dt 

   
2 2 2 2
2 π t3/2 I 1 t2 K− 3 t2 +t3/2 I− 3 t2 K 1 t2
4

t2 

+ 4
√  4
 4 4

4 t Γ 34 






The result is a long complicated expression that may not be very in-
formative. The two independent solutions of the homogeneous equation are
constructed with Bessel, gamma and hypergeometric functions.
Another example is the linear differential equation

y ′′ + 5y ′ + 4y = 1 − e−t , y(0) = y ′ (0) = 0.

Rezolvând în MuPAD obţinem soluţia


de:=ode({diff(y(t),t$2)+5*diff(y(t),t)+4*y(t)=1-exp(t),
y(0)=0,D(y)(0)=0},y(t));
sol:=solve(de);
f:=t-->op(sol);
e−4 t e−t et 1
t 7→
− − +
60 6 10 4
Putem rezolva ecuaţia şi cu ode::series
ss:=ode::series(de,t=0,8);
g:=t-->expr(op(ss));
13 t7 17 t6 17 t5 t4 t3
+
t 7→ − − + −
240 180 120 6 6
Dacă evaluăm soluţia pentru valori mici ale lui t
for t from 1e-4 to 1e-3 step 1e-4 do
print(t,f(t),g(t), abs(f(t)-g(t)))
end_for;

190
se obţine

t f analitic g serie |f − g|
0.0001 −1.666505475 10−13 −1.666500014 10−13 5.461118297 10−19
0.0002 −1.333066470 10−12 −1.333066712 10−12 2.422830811 10−19
0.0004 −1.066240238 10−11 −1.066240145 10−11 9.343403289 10−19
0.0005 −2.082292064 10−11 −2.082292109 10−11 4.475716930 10−19
0.0006 −3.597841122 10−11 −3.597841101 10−11 2.108974516 10−19
0.0007 −5.712667405 10−11 −5.712667380 10−11 2.521347928 10−19
0.0008 −8.526511355 10−11 −8.526511306 10−11 4.828091614 10−19
0.0009 −1.213907343 10−10 −1.213907336 10−10 6.675039172 10−19
0.0010 −1.665001418 10−10 −1.665001416 10−10 2.265879094 10−19

Aşa cum se poate vedea, soluţia analitică poate suferi de anulare, în timp
ce soluţia aproximativă are mai multe cifre corecte. Astfel, trebuie să fim
conştienţi că atunci când o soluţie analitică este evaluată numeric, rezultatul
nu este neapărat mai precis decât unul obţinut printr-o metodă numerică.

5.2.3 Solution by Taylor Expansions


Following Newton’s footsteps from Section 5.1, we now discuss methods
for finding the solution of a differential equation in series form. The basic
idea is to expand both sides of the differential equation y = f (t, y) in a
Taylor series
and compare coefficients. Let (t0 , y0 ) be the expansion point and consider
the ansatz

y (k) (t0 )
y (t0 + h) = ak hk , cu ak = (5.7)
X
.
k=0
k!
Let us consider two methods for computing the coefficients of the series and
demonstrate the procedure for the model problem

y ′ = t2 + y 2 , y(0) = 1. (5.8)

The first method computes derivatives by differentiating the differential equ-


ation. With the initial condition y(t0 ) = y0 , we get

y ′ = f (t0 , y0 ) =⇒ y ′ (t0) is known


y ′′ = ft + y ′ fy =⇒ y ′′ (t0) is known
2
y ′′′ = ftt + y ′ fty + y ′ fyy + fy y ′′ =⇒ y ′′′ (t0) is known.

The expressions soon get complicated in the general case.

191
For a specific differential equation, the computations are usually simpler.
By differentiating (5.8), we get

y ′ = t2 + y 2 ,
y ′′ = 2t + 2yy ′ ,
(5.9)
y ′′′ = 2 + 2y ′2 + 2yy ′′ ,
y (4) = 6y ′ y ′′ + 2yy ′′′ .

Using the initial condition t0 = 0 and y(t0 ) = 1 in (5.9), we obtain

y ′ (0) = 1, y ′′ (0) = 2, y ′′′ (0) = 8, y (4) (0) = 28

and therefore
2 2 8 28 4 7
y(t) = 1 + t + t + t3 + t4 + · · · = 1 + t + t2 + t3 + t4 + · · ·
2! 3! 4! 3 6
The same result we obtain with MuPAD using the ode::series procedure:

ecd1:=ode({diff(y(t),t)=t^2+y(t)^2,y(0)=1},y(t));
ode::series(ecd1,t=0);

4 t3 7 t4 6 t5
( )
 
1 + t + t2 + + + + O t6
3 6 5

The idea is now to expand the solution locally by choosing a small step
size ∆t and then to advance to a next point of the solution,

tn+1 = tn + ∆t
y ′ (tn ) y ′′ (tn ) 2
yn+1 = y(tn + ∆t) = y (tn ) + ∆t + ∆t + · · ·
1! 2!
We now solve our model problem (5.8) using (5.9) and compare the results
with the MATLAB integrator ode45
t=0; y=1; dt=0.01; T=[t,y];
while t<0.8
y1=t^2+y^2;
y2=2*t+2*y*y1;
y3=2+2*y1^2+2*y*y2;
y4=6*y1*y2+2*y*y3;
y=y+y1*dt+y2/2*dt^2+y3/6*dt^3+y4/24*dt^4;
t=t+dt;

192
T=[T;t,y];
end
[t,Y]=ode45(@(t,y)t^2+y^2,[0:dt:0.8],1);
norm(T(:,2)-Y)
When we execute this program, we see that the norm of the difference
of the function values is 4.7643e-04, which shows good agreement between
the two methods.
The second method is a power series approach: we use here the ansatz

y (t + ∆t) = ai+1 ∆ti . (5.10)
X

i=0

We have shifted the index of the coefficients by one because MATLAB does
not allow zero indices. Introducing this series into the differential equation

y ′ = t2 + y 2 ,

we obtain with
∞ ∞
y ′ (t + ∆t) = iai+1 ∆ti−1 = (k + 1) ak+2 ∆tk
X X

i=1 k=0

and
 
∞ ∞ ∞ k+1
2
y (t + ∆t) = ai+1 ∆t aj+1 ∆t = aj ak+2−j  ∆tk
X X X X
i j 
i=0 j=0 k=0 j=1

the equation
 
∞ ∞ k+1
(k + 1) ak+2 ∆tk = (t + ∆t)2 + aj ak+2−j  ∆tk .
X X X

k=0 k=0 j=1

Comparing the coefficients on both sides, we get with a1 = y(t0 ) the equa-
tions:
k =0: a2 = t2 + a21
k =1: 2a3 = 2t + a1 a2 + a2 a1 = 2t + 2a1 a2
k = 2 : 3a4 = 1 + a1 a3 + a2 a2 + a3 a1 = 1 + 2a1 a3 + a22
>2: (k + 1)ak+2 = k+1
P
k j=1 aj ak+2−j .

Thus, we can solve each equation sequentially for a new coefficient. The
MATLAB function below computes the coefficients of (5.10)

193
function a=DEQseries(t,y,n);
% DEQSERIES taylor series for a particular differential equation
% a=DEQseries(t,y,n); computes n coefficients of the Taylor series
% y(t+dt)=sum_{k=0} a_{k+1} dt^k of the solution of the differential
% equation y'=t^2+y^2 using the power series ansatz
a=zeros(1,n);
a(1)=y;
a(2)=t^2+a(1)^2;
a(3)=t+a(1)*a(2);
a(4)=(1+2*a(1)*a(3)+a(2)^2)/3;
for k=4:n-1
a(k+1)=a(1:k)*a(k:-1:1)'/(k);
end

We can choose the order n of the expansion, e.g. n = 7:

>> a=DEQseries(0,1,7)
a =
1.0000 1.0000 1.0000 1.3333 1.1667 1.2000 1.2333

For n = 5, we obtain the same coefficients as with MuPAD using the


ode::series procedure.

5.2.4 Computing with Power Series


We need to manipulate power series when inserting an ansatz of the form
(5.10) into a differential equation. We consider some basic operations. Let
n n n
r(t) = p(t) = q(t) =
X X X
ri ti , pi ti , qi ti .
i=0 i=0 i=0

a) Addition: r(t) = p(t) ± q(t), ri = pi ± qi

b) Multiplication: r(t) = p(t)q(t), ri =


Pi
j=0 pj qi−j .

c) Division: r(t) = p(t)/q(t) ⇐⇒ r(t)q(t) = p(t) thus = pi .


Pi
j=0 rj qi−j
If we solve the equation for ri we get
 
i−1
1 
ri = (5.11)
X
pi − rj qi−j  .
q0 j=0

194
This formula reminds us very much of back substitution! Indeed, if we
connect a power series

p(t) = p0 + p1 t + · · ·

to its Toeplitz matrix


 
p0 p1 p2 p3 ···

 p0 p1 p2 · · ·
P = p0 p1 · · ·
 

· · ·

 p0
..
 
.

then the series operations correspond to the matrix operations.

r = p ± q ⇐⇒ R = P ± Q
r = pq ⇐⇒ R = P Q
r = p/q ⇐⇒ R = Q−1 P ⇐⇒ QR = P

Now let P , Q and R be n × n Toeplitz matrices. Consider only the last


column of R in the equation QR = P . We multiply by en and obtain
QRen = P en :
    
q0 q1 · · · qn rn pn

q0 · · · qn−1 
 rn−1  pn−1 
   
=


.. ..   ..   .. 
   
.

 . .  .   . 
q0 r0 p0

It is now evident that the formula (5.11) is equivalent to solving for


r0 , . . . , rn by back substitution.

d) Exponential function: The trick here is to solve the differential equ-


ation for the exponential by differentiating r(t) = ep(t) :

r′ (t) = p′ (t)ep(t) = p′ (t)r(t). (5.12)

Inserting the series expansion into (5.12), we get


 
n−1 n−1 n n i
(i + 1) ri+1 ti = (i + 1) pi+1 ti rk tk = (i + 1) pj+1 ri−j  ti ,
X X X X X

i=0 i=0 k=0 i=0 j=0

195
so comparing coefficients gives
i
(i + 1)ri+1 = (j + 1)pj+1 ri−j .
X

j=0

By letting i := i−1 and performing the change of variables k = i−j−1,


we obtain Miller’s formula
i−1
1X
r0 = e ,
p0
ri = (i − k) pi−k rk , i = 1, 2, . . . , n. (5.13)
i k=0

Exemplul 5.3. We consider p(t) = −1 + t + 2t2 + 4t3 − 2t4 + t5 , compute


ep(t) using Miller’s formula (5.13) and compare the result we get with the
corresponding Toeplitz matrix using MATLAB’s matrix function expm(P).

p=[-1 1 2 4 -2 1]
n=length(p)-1; % Miller for exponential
r=exp(p(1));
for i=1:n
s=0;
for k=0:i-1
s=s+(i-k)*p(i-k+1)*r(k+1);
end
r=[r s/i];
end
P=triu(toeplitz(p));
R=expm(P); % exponential matrix
[R(:,n+1) r(end:-1:1)']; % compare results

p =
-1 1 2 4 -2 1
ans =
4.1724 4.1724
1.8547 1.8547
2.2686 2.2686
0.9197 0.9197
0.3679 0.3679
0.3679 0.3679

We get with both methods the same results


r(t) = ep(t) = 0.3679 + 0.3679t + 0.9197t2 + 2.2686t3 + 1.8547t4 + 4.1724t5 .

196
Using MuPAD for the same computation,

p:=-1+t+2*t^2+4*t^3-2*t^4+t^5:
series(exp(p),t=0):
float(%);

0.3678794412 + 0.3678794412 t + 0.9196986029 t2 + 2.268589887 t3


 
+ 1.854725516 t4 + 4.172365995 t5 + O t6

e) Trigonometric functions c(t) = cos(p(t)) and s(t) = sin(p(t)): Here,


we use the differential equations simultaneously for both series. For
t = 0, we have the initial coefficients c0 = cos(p0 ) and s0 = sin(p0 ).
Applying Miller’s formula (5.13), we get
i−1
1X
ci = − (i − k) pi−k sk ,
i k=0
i−1
1X
si = (i − k) pi−k ck .
i k=0

The coefficients of the series for cos(p(t)) and sin(p(t)) can thus be
computed by running these two recurrences simultaneously.

f) Composition of series: Given the two series

p(t) = p0 + p1 t + p2 t2 + · · · ,
q(t) = q0 + q1 t + q2 t2 + · · · ,

we want to compute the series for p(q(t)). If we simply insert the series
we get

p(q(t)) = p0 + p1 (q0 + q1 t + q2 t2 + · · · )1
+ p2 (q0 + q1 t + q2 t2 + · · · )
+ p3 (q0 + q1 t + q2 t2 + · · · )3
+ ··· .

Assume we have expanded q(t)n and computed the coefficients


(n) (n) (n)
q(t)n = q0 + q1 t + q2 t2 + · · · ,

197
then we would have
(1) (2) (3)
p(q(t)) = p0 + p1 q0 + p2 q0 + p3 q0 + · · ·
(1) (2)
+ (p1 q1 + p2 q1 + · · · )t
(1) (2)
+ (p1 q2 + p2 q2 + · · · )t2
+ ··· .

The new coefficients above are all infinite sums that may or may not
be convergent, so the coefficients may not actually exist! Therefore,
the composition of series is only possible for series q(t) with q0 = 0
(these are non-unit series). In this case, the powers become
(n) (n)
q(t)n = qn(n) tn + qn+1 tn+1 + qn+2 tn+2 + · · ·

and all the new coefficients are finite sums:


(1) (1) (2)
p(q(t)) = p0 + p1 q1 t + (p1 q2 + p2 q2 )t2
(1) (2) (3)
+ (p1 q3 + p2 q3 + p3 q3 )t3
+ ··· .

Exemplul 5.4.
2 3 2 3
e(e ) = e1+t+ 2! + 3! +··· = e1 et+ 2! + 3! +··· .
t t t t t

By separating the first term, we obtain a non-unit series and thus


5 5 13
 
e(e ) = e 1 + t + t2 + t3 + t4 + t5 + · · ·
t
.
6 8 30

5.2.5 Euler’s Method


Differential equations are a powerful tool for modeling, as we have already
seen in the silver watch example. We now present another example that
shows how easily one can model complicated problems using ODEs, and
how quickly one can run into problems that cannot be solved analytically.
Suppose you are jogging along a given path described by your position
in time, (ξ(t), η(t)), and suddenly a dog in a neighbor’s garden sees you and
starts chasing you at maximal speed w, as shown in Figure 5.2. What is the
trajectory of the dog if we assume it is always running directly toward you?

198
Since the speed of the dog is constant, we have

ẋ2 + ẏ 2 = w2 , (5.14)

where we denote the time derivative by a dot above the variable. Since the
dog is always running toward you, its direction is proportional to (ξ − x, η −
y)T , which implies
! !
ẋ(t) ξ(t) − x(t)
= λ(t) , (5.15)
ẏ(t) η(t) − y(t)

where λ is a constant of proportionality.

Figura 5.2: Câine urmărind un jogger

To find this constant, we substitute (10.15) into (10.14) to obtain


w2
λ2 (t) = .
(ξ(t) − x(t))2 + (η(t) − y(t))2
The trajectory of the dog is therefore described by the system of ordinary
differential equations
! !
ẋ(t) w ξ(t) − x(t)
=q , (5.16)
ẏ(t) (ξ(t) − x(t))2 + (η(t) − y(t))2 η(t) − y(t)

with initial conditions given by the initial position of the dog, (x(0), y(0)) =
(x0 , y0 ). To find the trajectory of the dog, it remains to solve this initial value

199
problem. While for the special case of the silver watch problem, an implicit,
closed-form solution exists, there is no hope of finding a closed-form solution
for a general jogging path (ξ(t), η(t)), so we need to resort to a numerical
method.
A very natural and simple approach to obtain a numerical solution is
the Forward Euler method, which was invented when Euler realized that
probably not all ODEs can be solved in closed form. Instead of trying to
solve the differential equation (5.16) directly, we use it to determine the
direction the dog will choose initially, at position (x0 , y0 ). This direction is
given by the differential equation to be
! !
ẋ(0) w ξ0 − x 0
=q ,
ẏ(0) (ξ0 − x0 )2 + (η0 − y0 )2 η0 − y0

where we denote the initial position of the jogger by (ξ0 , η0 ) := (ξ(0), η(0)).
Note that all quantities on the right hand side are known. Euler’s idea was
to advance in this direction for a short time ∆t1 , as shown in Figure 5.3.
Then the new position (x1 , y1 ) at time t1 = ∆t1 is an approximation of the
exact position (x(t1 ), y(t1 )), and one can repeat the same procedure starting
with position (x1 , y1 ) and going for a short time ∆t1 along the direction
! !
ẋ(t1 ) w ξ(t1 ) − x(t1 )
=q ,
ẏ(t1 ) (ξ(t1 ) − x(t1 ))2 + (η(t1 ) − y(t1 ))2 η(t1 ) − y(t1 )

where (ξ1 , η1 ) := (ξ(t1 ), η(t1 )) in Figure 5.3. Again the right hand side is
known, so one can advance again over a short time interval ∆t2 to find
a new position (x2 , y2 ), which approximates the exact position of the dog
(x(t2 ), y(t2 )) at t2 = t1 + ∆t2 , and so on.
If one applies this procedure to a general system of ordinary differential
equations,
y′ = f (t, y), y(t0 ) = y0 , (5.17)
one obtains the Forward Euler method

yk+1 = yk + ∆tf (tk , yk ) . (5.18)

A MATLAB implementation of this method for a general system of ordinary


differential equations is given by MATLAB source 5.1.
If we implement the right hand side function for the dog-and-jogger
problem in the MATLAB function

200
Figura 5.3: The Forward Euler (FE) method applied to the dog-jogger pro-
blem.

Sursa MATLAB 5.1 Metoda lui Euler pentru EDO


function [t,y]=ForwardEuler(f,tspan,y0,N)
% FORWARDEULER solves system of ODEs using the Forward Euler method
% [t,y]=ForwardEuler(f,tspan,y0,n) solves dy/dt=f(t,y) with initial
% value y0 on the time interval tspan doing N steps of Forward Euler
dt=(tspan(end)-tspan(1))/N;
t=(tspan(1):dt:tspan(end))';
y=zeros(N+1,length(y0));
y(1,:)=y0(:)'; % colon to make column vector
for i=1:N
y(i+1,:)=y(i,:)+dt*f(t(i),y(i,:)')';
end

201
function xp=Dog(t,x)
% DOG ODE right hand side modeling the dog hunts jogger problem
% xp=Dog(t,x); computes the right hand side of the ODE modeling the
% dog hunts the jogger problem at time t and position x.
w=10;
xi=[8*t; 0];
xp=w/norm(xi-x)*(xi-x);

we obtain with the command

[t,x]=ForwardEuler(@Dog,[0,12],[60; 70],50);

an approximate solution path in the two columns of the variable x at


time values in the vector t. To display the results, one can use the MATLAB
commands

plot(x(:,1),x(:,2),'-',8*t, 0*t,'--');
hold on
plot(x(end,1),x(end,2),'k+','MarkerSize',20,'Linewidth',3);
hold off
axis([0 100 -10 70]);
legend('dog','jogger');
xlabel('x');
ylabel('y');

We show the results of this first experiment in Figure 5.4 on the top left.
On the top right, we show using similar commands in Matlab a jogger that
notices the dog and tries to run back, on the bottom left a jogger running
on a circular track, and on the right the same situation, but with an old and
slow dog.
As we have seen in the example with the dog and the jogger, it is easy
to obtain approximate solutions, but how accurate are they when compared
with the exact solution? Intuitively, making the time steps smaller should
improve the accuracy of the approximation in Euler’s method. Let us per-
form the following experiment in MATLAB to investigate this issue, using
the programs developed above:

%fig10_5a
N=[5 10 20 40 80];
for i=1:length(N)

202
80
dog
60
60 jogger
dog
40 40
jogger
y

y
20 20
0
0
0 50 100
x -20
0 20 40 60
x

60 60

dog
40 40 dog
jogger
jogger
y

y
20 20

0 0

0 50 100 0 50 100
x x

Figura 5.4: Câteva traiectorii pentru jogger şi traiectoriile calculate numeric


ale cânelui care urmăreşte jogger-ul.

[t,x]=ForwardEuler(@Dog,[0,10],[60; 70],N(i));
plot(x(:,1),x(:,2),'-');
hold on
end;
plot(8*t, 0*t,'--');
hold off
axis([0 100 -10 70]);
legend('5 Euler steps','10 Euler steps','20 Euler steps', ...
'40 Euler steps','80 Euler steps','jogger');
xlabel('x');
ylabel('y');

The result is shown in the graph on the left of Figure 5.5. One can see that
the more one refines the time step, the more accurate the trajectory becomes,
and it seems to converge to a limiting trajectory. To better understand this
convergence, we calculate the limiting trajectory using a highly refined Euler
approximation with 8000 steps, and compute the difference between the end
point of this trajectory and those of the various approximations. The result is
shown on the right of Figure 5.5. From this plot, we can see that apparently

203
the Euler approximation of the solution of the ODE is of order ∆t.

70 102
5 Euler steps Difference at endpoints
10 Euler steps O( t)
60
20 Euler steps
40 Euler steps
50 80 Euler steps
jogger
101
40

30
y

20
100
10

-10
0 10 20 30 40 50 60 70 80 90 100 101 102
x

Figura 5.5: Computing the trajectory of the dog with Forward Euler using
5, 10, 20, 40 and 80 time steps on the left, and difference at the end of the
dog path between these different approximations and one with a very small
time step on the right.

To do so, we compare one step of Euler’s method (5.18) to the Taylor


expansion of the exact solution of the system of ODEs (5.17) about the
initial point t0 . We obtain

y(t0 + ∆t) − y1 = y(t0 ) + ∆ty ′ (t0 ) + O(∆t2 ) − y0 − ∆tf (t0 , y0 ) = O(∆t2 ),


(5.19)
where we have used the differential equation (5.17), which implies y ′ (t0 ) =
f (t0 , y0 ), and the fact that the initial condition states y(t0 ) = y0 . Hence the
difference between the Euler approximation and the exact solution is O(∆t2 )
over one step, whereas at the end after many steps, the approximation is
only of O(∆t), as we measured in Figure 5.5. In this figure, we can also see
that using 80 Euler steps leads to an error of about 21 , and we can estimate
that for a standard precision of 1e − 6, one would need to double the number
of steps n times, where n satisfies the equation

1 1 log (2e − 6)
 n
= 1e − 6 =⇒ n = ≈ 18.93,
2 2 log (0.5)

which gives approximately 80×218.93 ≈ 40000000 time steps. Euler’s method


is therefore of limited practical interest, and one needs higher order methods,
which we will develop later in this chapter.

204
5.2.6 Autonomous ODE, Reduction to First Order System
To simplify the Taylor expansions in the error analysis, we may assume
without loss of generality that the right hand side in the system of ordinary
differential equations (5.17) is autonomous, i.e. f (t, y) = f (y). If not, the
explicit dependence on the time variable t can be removed by introducing
an additional variable: letting z = t, we obtain
! !
y y0
ỹ(t) = , ỹ(t0 ) = ,
z t0

and the differential system y′ = f (t, y) becomes autonomous,


!
′ f (z, y)
ỹ = f̃ (ỹ) = .
1

Numerical algorithms require as input a first-order system y ′ = f (t, y) with


initial condition y(t0 ) = y0 , where

y1 (t) f1 (t, y)
   

y =  ...  , f (t, y) =  ..
. .
   

yn (t) fn (t, y)

Differential equations of higher order are transformed into a first-order sys-


tem by introducing additional unknowns, as we now show with the following
example. Consider

y ′′′ + 5y ′′ + 8y ′ + 6y = 10e−t , y(0) = 2, y ′ (0) = y ′′ (0) = 0,

a linear inhomogeneous third-order differential equation with constant coe-


fficients. To transform this equation to a first order system, we perform the
following steps:

1. Solve the differential equation for the highest derivative,

y ′′′ = −5y ′′ − 8y ′ − 6y + 10e−t .

2. Introduce new functions

z1 = y, z2 = y ′ , z3 = y ′′ .

205
3. Differentiate the new functions, replace the y functions and write the
new system

z1′ = y ′ = z2
z2′ = y ′′ = z3
z3′ = y ′′′ = −5y ′′ − 8y ′ − 6y + 10e−t .

Since the differential equation is linear, we can use matrix-vector no-


tation
0 0 1 0 2
     

z ′ = Az +  0  , cu A =  0 0 1  , z(0) =  0  .
     
10e−t −6 −8 −5 0

Note that MuPAD can often solve such linear differential equations ana-
lytically without requiring the user to transform it into a first-order system.
Here, the statements
ed:=ode({diff(y(t),t$3)+5*diff(y(t),t$2)+8*diff(y(t),t)+6*y(t)=10*exp(-t),
y(0)=2, D(y)(0)=0, (D@@2)(y)=0},y(t)):
solve(ed) assuming y''=0;

e− 3 t 25 e2 t − 14 e2 t cos (t) + 8 e2 t sin (t) − 1


( )

5.3 Runge-Kutta Methods


The Forward Euler method presented in Subsection 5.2.5 can be interpre-
ted as an approximation of an integral. Integrating the differential equation
(5.17) in time, we obtain
Z t0 +∆t
y (t0 + ∆t) − y (t0 ) = f (τ, y (τ )) d τ ,
t0

and Forward Euler is a simple approximation of the area under the curve
by a rectangle, like in a Riemann sum with one term,
Z t0 +∆t
f (τ, y (τ )) d τ ≈ ∆tf (t0 y(t0 )) ,
t0

as shown in Figure 5.6. Runge-Kutta methods are based on the same idea,
except one uses another (and generally better) approximation of this area.

206
Figura 5.6: Aproximarea integralei

5.3.1 Explicit Runge-Kutta Methods


Clearly, a better approximation would be to use the midpoint rule to
approximate the integral, also indicated in Figure 5.6,
∆t ∆t
Z t0 +∆t   
f (τ, y(τ )) d τ ≈ ∆tf t0 + , y t0 + .
t0 2 2
 
Unfortunately, the midpoint value y t0 + ∆t
2 is unknown; nonetheless, it
can be approximated by an Euler step over half the interval,
∆t ∆t
 
y t0 + ≈ y0 + f (t0 , y0 ) ,
2 2
which leads to the new method
∆t ∆t
 
y1 = y0 + ∆tf t0 + , y0 + f (t0 , y0 ) .
2 2
This is known as Runge’s method (sau metoda lui Euler modificată). Like
Euler’s method, one step is performed using only data from the previous
step, but now two function evaluations are needed per step. In general, a
one-step method is of the form
yk+1 = yk + ∆tk+1 φf (tk , yk , ∆ttk+1 ) (5.20)

207
together with an initial condition y0 at time t0 , for example

φf (t0 , y0 , ∆t) = f (t0 , y0 ) =⇒ Euler’s method


∆t ∆t
 
φf (t0 , y0 , ∆t) = f t0 + , y0 + f (t0 , y0 ) =⇒ Runge’s method
2 2
A systematic generalization of Runge’s second order method yields the
Runge-Kutta methods: An explicit s-stage Runge-Kutta method is given
by
k1 = f (t0 , y0 )
k2 = f (t0 + ∆tc2 , y0 + ∆ta21 k1 )
k3 = f (t0 + ∆tc3 , y0 + ∆t (a31 k1 + a32 k2 ))
.. (5.21)
.
ks = f (t0 + ∆tcs , y0 + ∆t (as1 k1 + as2 k2 + · · · + as,s−1 ks−1 ))
y1 = y0 + ∆t (b1 k1 + b2 k2 + · · · + bs ks ) ,
where kj are called the stage values, and the coefficients ci , aij and bj are
chosen to obtain a good method. J. C. Butcher, during his investigation
into higher order Runge-Kutta methods, introduced the following compact
notation to represent these coefficients. This notation, which first appeared
in [?], is now known as a Butcher tableau:

0
c2 a21
c3 a31 a32
.. .. ..
. . .
cs as1 as2 · · · as,s−1
b1 b2 · · · bs−1 bs
So far we have only considered aij = 0 for j ≥ i; the associated Runge
Kutta methods are called explicit methods, since each stage value kj can
be evaluated explicitly from the previously calculated values. The Butcher
tableau, however, suggests that one could also consider aij ̸= 0 for j ≥ i,
and then the stage values kj would be coupled by a system of equations.
Such Runge-Kutta methods are called implicit methods and are useful for
stiff problems, as we will show in Section ??.
The Forward Euler method is a one-stage explicit Runge-Kutta method,

k1 = f (t0 , y0 ) 0
y1 = y0 + ∆tk1 1

208
and Runge’s second order method is a two-stage explicit Runge-Kutta
method,

k1 = f (t
 0 , y0 )  0
k2 = f t0 + 12 ∆t, y0 + 2 f (t0 , y0 )
∆t 1
2
1
2
y1 = y0 + ∆tk2 0 1

5.3.2 Local Truncation Error


In order to compare these new methods, we have to analyze their appro-
ximation qualities.

Definit, ia 5.1 (Eroarea locală de trunchiere). The local truncation error τ


for a one-step method of the form (5.20) approximating the system of ODEs
() is defined by the difference between the exact solution and the numerical
approximation after one step, i.e.

τ := y(t0 + ∆t) − (y0 + ∆tφf (y0 , ∆t)) .

We have already seen in (5.19) that the local truncation error for Euler’s
method is O(∆t2 ). To find the local truncation error for Runge’s method,
we also use Taylor expansions, but this time both for the exact solution and
the numerical method,

(∆t)2 ′′  
y(t0 + ∆t) = y (t0 ) + ∆ty ′ (t0 ) + y (t0 ) + O ∆t3
2
(∆t)2  
y1 = y0 + ∆tf (t0 , y0 ) + ft (t0 , y0 ) + fy (t0 , y0 ) y ′ (t0 ) + O ∆t3 .

2
As for Euler’s method, we can identify the first two terms in the two ex-
pansions because of the initial condition y(t0 ) = y0 and the differential
equation y ′ (t0 ) = f (t0 , y0 ). For the third term, we need to differentiate the
differential equation (5.17) to obtain

d
y ′′ (t0 ) = f (t0 , y0 ) = ft (t0 , y0 ) + fy (t0 , y0 ) y ′ (t0 ),
dt
and hence the third term is also identical in both expansions. Therefore, the
local truncation error of Runge’s method is τ = y(t0 + ∆t) − y1 = O(∆t3 ),
which is better than for Euler’s method.
An implementation of Runge’s method in MATLAB is given in MATLAB
source 5.2.

209
Sursa MATLAB 5.2 Metoda lui Runge pentru EDO
function [t,y]=Runge(f,tspan,y0,n)
% RUNGE solves system of ODEs using Runge's method
% [t,y]=Runge(f,tspan,y0,n) solves dy/dt=f(t,y) with initial
% value y0 on the time interval tspan doing n steps of Runge's method.
dt=(tspan(2)-tspan(1))/n;
t=tspan(1):dt:tspan(2);
y(:,1)=y0(:); % colon to make column vector
for i=1:n
y(:,i+1)=y(:,i)+dt*f(t(i)+dt/2,y(:,i)+dt/2*f(t(i),y(:,i)));
end
t=t';y=y';

Applying Runge’s method to the dog-and-jogger problem, also using 5,


10, 20, 40 and 80 steps, we obtain the results in Figure 5.7. One can see on
the left that the trajectories converge more rapidly than for Euler’s method,
and on the right that the error at the end of the dog trajectory is O(∆t2 ).
This method is hence known as Runge’s second order method. With 80 steps,
the approximation error is now only about 100 1
, and to reach a standard
precision of 1e − 6, one would need to double the number of steps n times,
where n satisfies the equation

1 1 log (100e − 6)
 n
= 1e − 6 =⇒ n = ≈ 6.64,
100 4 log 0.25

which gives approximately 80 × 26.64 = 8000 time steps. Even though each
step of Runge’s second order method is about twice as costly as an Euler
step, since one needs to evaluate the function twice, this number of steps
compares very favorably with the 40 000 000 steps needed by Euler’s method
for the same precision. It is therefore of great interest to construct even
higher order methods.

5.3.3 Order Conditions


To find more Runge-Kutta methods, we need to introduce the concept
of order for a one-step method.

Definit, ia 5.2 (Ordin). The one-step method (5.20) approximating the sys-
tem of ODEs (5.17) is of order p if, for all sufficiently differentiable functions

210
70 102
5 Runge steps Difference at endpoints
60 10 Runge steps O( t2 )
20 Runge steps
40 Runge steps 101
50 80 Runge steps
jogger

40
100

30
y

20 10-1

10

10-2
0

-10
0 10 20 30 40 50 60 70 80 90 100 101 102
x

Figura 5.7: Computing the trajectory of the dog with Runge using 5, 10, 20,
40 and 80 time steps on the left, and difference at the end of the dog path
between these different approximations and one with a very small time step
on the right.

f in (5.17), the local truncation error satisfies


 
τ = O ∆tp+1 , când ∆t → 0.

Before justifying this definition with a convergence analysis, we investi-


gate whether a different choice of coefficients in the general two-stage explicit
Runge-Kutta method can yield a better method than Runge’s. We assume
in what follows that
i−1
c1 = 0, ci = i = 2, . . . , s, (5.22)
X
aij ,
j=1

which implies that all stage values ki are at least second order approxima-
tions of the time derivative of the solution at the corresponding time point
t0 + ci ∆t.

211
This can be seen from
 
i−1
ki = f t0 + ci ∆t, y0 + ∆t
X
aij kj 
j=1
i−1
= f (t0 , y0 ) + ft (t0 , y0 ) ci ∆t + fy (t0 , y0 ) aij kj ∆t
X

j=1
 
i−1
= f (t0 , y0 ) + ft (t0 , y0 ) ci + fy (t0 , y0 ) aij y′ (t0 ) + O (∆t)  ∆t
X 

j=1
   
= y′ (t0 ) + ci ∆ty′′ (t0 , y0 ) + O ∆t2 = y(t0 + ci ∆t) + O ∆t2 .

The conditions (5.22) are not necessary, but they greatly simplify the deri-
vation of higher order methods, and they do not have a significant influence
on the quality of the method. The Butcher tableau of a two-stage explicit
Runge-Kutta method then becomes

0
a21 a21
b1 b2

To simplify the Taylor expansions in the analysis of the local truncation


error, we use Maple:

212
Anexa A

Anexa

The appendix fragment is used only once. Subsequent appendices can


be created using the Chapter Section/Body Tag.You can create numbered,
bulleted, and description lists using the Item Tag popup list on the Tag
toolbar.

213
Bibliografie

[1] Å. Björk, Numerical Methods for Least Squares Problem, SIAM, Phila-
delphia, 1996.

[2] J. C. Butcher, The Numerical Analysis of Ordinary Differential Equ-


ations: Runge-Kutta and General Linear Methods, Wiley-Interscience
Publ., Wiley, Chichester, 1987.

[3] Carl deBoor, Splinefunktionen, Birkhäuser, 1990.

[4] , A Practical Guide to Splines, revised ed., Springer, New York,


2001.

[5] W. Gander, M. Gander, and F. Kwok, Scientific Computing. An Intro-


duction using Maple and MATLAB, Springer, 2014.

[6] D. Goldberg, What every computer scientist should know about floating-
point arithmetic, Computing Surveys 23 (1991), no. 1, 5–48.

[7] H. H. Goldstine and J. von Neumann, Numerical inverting of matrices


of high order, Amer. Math. Soc. Bull. 53 (1947), 1021–1099.

[8] Nicholas J. Higham, Accuracy and Stability of Numerical Algorithms,


SIAM, Philadelphia, 1996.

[9] M.L. Overton, Numerical computing with ieee floating point arithmetic,
SIAM, Philadelphia, PA, 2001.

[10] J. Stoer and R. Burlisch, Introduction to Numerical Analysis, 2nd ed.,


Springer Verlag, 1992.

214
Index

algoritm absolută, 19
instabil, 36 relativă, 20
progresiv stabil, 35 eroarea locală de trunchiere, 201
regresiv stabil, 39 Extrapolare, 137
algoritmul
lui Thomas, 99 factor de creştere, 73
anulare, 20 formula
aritmetică de precizie finită, 12 lui Heron, 56
lui Miller, 188
bază polinomială Shermann-Morrison-Woodbury, 154
baza Lagrange, 126
baza Newton, 126 interpolare
monomială, 126 formula baricentrică, 117
polinoame ortogonale, 126 spline, 141

Condiţionarea unei probleme, 25 matrice


bandă, 96
descompunere de capacitanţă, 154
Cholesky, 89 pozitiv definită, 86
LU, 69 triunghiulară superior, 61
diferenţe divizate, 120 metoda
lui Euler progresivă, 192
ec10.17, 201 metoda lui Euler modificată, 199
ecuaţie diferenţială metoda lui Runge, Vezi metoda lui
ordinară, 178 Euler modificata
ecuaţii diferenţiale metodă Runge-Kutta explicită, 200
problema stiff, 175 model standard al aritmeticii, 20
eliminare gaussiană, Vezi metoda eli-
minării a lui Gauss normă
epsilonul maşinii, 13 matricială, 26
eroare de rotunjire vectorială, 25

215
număr de condiţionare, 30
număr în virgulă flotantă, 12
exponent, 12
mantisă, Vezi semnificant
semnificant, 12
număr maşină, 12

pivotare, 66
parţială, 66
totală, 76
polinom
de interpolare Lagrange, 111
fundamental Lagrange, 111
Hermite cubic, 143
Newton, 118
principiul lui Wilkinson, 20
problemă
bine pusă, 34
incorect pusă, 34
problemă bine condiţionată, 30
problemă prost condiţionată, 30

schema
Aitken-Neville, 134
spline
condiţii pe frontieră
complete, 150
deBoor, 151
naturale, 146, 149
periodice, 147, 152
cu deficienţă, 147
cubic, 144
stabilitate
progresivă, 35
substituţie inversă, 61

tabela Butcher, 200

216

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