Documente Academic
Documente Profesional
Documente Cultură
Radu Trîmbiţaş
26 iunie 2023
Rezumat
Cuprins 1
1
1.8.2 Testarea aproximaţiilor succesive . . . . . . . . . . . . 57
1.8.3 Verificarea reziduului . . . . . . . . . . . . . . . . . . . 58
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
A Anexa 213
Bibliografie 214
Index 215
3
Lista surselor MATLAB
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ţă
7
Capitolul 1
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ă.
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).
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
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.
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
e+ = 1.000000000 × 10−99 .
a
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.
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ă).
• 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.
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
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.
• 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.
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.
>> 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:
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
18
spunem că a apărut depăşire inferioară (underflow). Deoarece un astfel
de rezultat nu poate fi reprezentat, i se atribuie valoarea zero.
>> res=pi*realmin/123456789101112
res =
5.681754927174335e-322
>> res2=res*123456789101112/realmin
res2 =
3.152485105545972
>> pi
ans =
3.141592653589793
e = 1.2345678 şi e
a b = 1.1111111,
c = 1.37174198628258 şi ce = 1.3717420.
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
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
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
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
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
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.
i=1
25
Definit, ia 1.2. O normă matricială este o funcţie A : Rm×n → R astfel
încât
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ă::
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 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
27
Definit, ia 1.3 (O (omicron) mare, o mic). Fie f (x) şi g(x) două funcţii.
Pentru L ∈ R ∪ {±∞}, fixat, scriem
|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.
Î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ă
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ă.
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
29
h2 f ′′′ (x)
f ′ (x) + + O h4
6
subs(p3,[f=sin,x=0]);
h2
1− + O h4
6
unde o(ε) reprezintă termeni care sunt asimptotic mai mici decât ε.
obţinem
x̂1 x̂2 − x1 x2
= (1 + ε1 ) (1 + ε2 ) − 1 = ε1 ε2 + ε1 + ε2 ,
x x
1 2
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∥∞
A−1
,
∥Ax∥∞ ∞
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
bm = vpa(b, 16)
bm = 0.000000000000001999999999999992
am = vpa(a, 16)
am = 0.000000000000001999999999999996
c16 = am - bm
c16 = 0.00000000000000000000000000000400000000092936389566133030885
cf16 = 4.000000000929364e − 30
32
care este în concordanţă cu modelul standard.
format long
a=1/500000000000001
a = 1.999999999999996e-15
b=1/500000000000002
b = 1.999999999999992e-15
c=a-b
c = 3.944304526105059e-30
format hex
a=1/500000000000001
a = 3ce203af9ee7560b
b=1/500000000000002
b = 3ce203af9ee75601
c=a-b
c = 39d4000000000000
33
care modelează efectul erorii de rotunjire pe o maşină cu precizia ε. Numărul
de condiţionarea devine
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.
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 :
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
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
f2 (y + ε) − f2 (y) 1
= ε + O ε2 .
f2 (y) 2(1 + x)
4−4
C≈ ≈ 1,
κ (P)
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
Ax = b =⇒ QAx = Qb
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
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
menii ai > 0 sunt monoton descrescători, i.e., a1 > a2 > · · · > an . Concret,
considerăm seria armonică
N
1
S=
X
.
i=1
i
reset();
DIGITS:=20:
s:=0:
for i from 1 to 1000000 do
s:=s+1.0/i:
end_for:
s;
14.392726722865723631
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
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.
N=1e6;
x=1./(1:N);
sKahan=KahanSummation(x)
sKahan =
1.439272672286572e+01
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
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)
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
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
function y = mynorm(x)
%MYNORM - compute Euclidean norm of x
% avoid overflow
m=max(abs(x));
y = m*sqrt(sum((x/m).^2));
end
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.
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ă):
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
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ă!
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
x=100*ones(100,1)+1e-5*(rand(100,1)-0.5)
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)]
means =
99.999999783073690 99.999999783073690
variances =
1.0e-11 *
0.909494701772928 0.837713116055967
standarddev =
1.0e-05 *
0.301578298584784 0.289432741073979
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
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
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
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:
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;
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 (??).
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
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
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.
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
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(:);
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
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
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
εx1 + x2 = 1,
(2.4)
x1 + x2 = 2.
ε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
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ă.
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
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
L2 L1 Ax = L2 L1 b, (2.9)
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
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)
P A = LU, (2.17)
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.
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.
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 ,
(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)
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.
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
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 )
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
Soluţia exactă este x = (1, 20, 3)T . Dacă înmulţim prima ecuaţie cu 1014
obţinem sistemul echivalent By = c,
3 −4 5 y = −62 . (2.27)
40 −60 0 −1160
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
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.
Definim matricele n
Aj = A1 = A.
X
ℓ:k uk: ,
k=j
ş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).
[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);
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ă.
∥x̂ − x∥ κ(A)
≤ (εA + εb ) , (2.29)
∥x∥ 1 − εA κ(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∥) .
şi astfel
∥x̂ − x∥ (1 − εA κ(A)) ≤ κ(A) ∥x∥ (εA + εb ) ,
ceea ce încheie demonstraţia.
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
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
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∥
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ă
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∥
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 .
relativă satisface
∥E∥2 1
≤ .
∥A∥2 κ2 (A)
xT Ax > 0 ∀ x ̸= 0. (2.31)
(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.
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).
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ă.
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
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 .
j=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
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.
(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
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
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
αk ≤ αk−1 (1 + 3eps) .
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
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
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
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.
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
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
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
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
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
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;
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);
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
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
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
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
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
d1 e1 d1 e1 c1
.. .. ..
c1 d2 e2 . . .
.. .. .. .. ..
A= . . . 7→ R = . . cn−2
.. .. ..
. . en−1 . en−1
cn−1 dn dn
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.
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
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.
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
syms t
fa = vpaintegral(exp(sin(t)), t, sym(0), vpa('0.66'))
fa = 0.921698
err = 0.0073107103
clear a b
syms a b
g(x) = a*x+b;
se obţin coeficienţii
−0.442881 1.1443474
109
g(x)=subs(g(x), [a,b],[s.a,s.b]);
g(vpa('0.66'))
ans = 0.85204589
err = 0.069651995
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ă.
j=0
j=0
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
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
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
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
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
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
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
i=1
x − xi
Pn (x) == n . (3.11)
X wi
i=1
x − xi
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
j=0
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
Totuşi, există un algoritm mai simplu care calculează aceşti coeficienţi bazat
pe diferenţe divizate. Definiţia este recursivă:
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
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.
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)
k=0
(n + 1)! k=0
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
k=0
k!
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
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
i=0 i=0
αk+1 = n şi βk = n .
p2k (xi ) p2k−1 (xi )
X X
i=0 i=0
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 ).
125
Dacă calculăm lungimea
Coeficienţii bk se calculează cu
pTk y
bk =
∥pk ∥2
m(x) = [1, x, x2 , . . . , xn ]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).
Hp (x0 ) = xp0
k
H1 (x0 , . . . , xk ) =
X
xj
j=0
p
Hp (x0 , x1 ) = xj0 x1p−j .
X
j=0
128
Dar,
s−1
xs0 − xsk X q q+1−s
= x0 xk = Hs−1 (x0 , xk ) .
x0 − xk q=0
s=0
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
j=k+1
Deci, teorema are loc pentru a doua coloană. Presupunem că are loc pentru
primele k − 1 coloane. Atunci
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
1
H1 (x0 ) 1
L= H2 (x0 ) H1 (x0 , x1 ) 1
.
.. .. .. ..
. . . .
Hn (x0 ) Hn−1 (x0 , x1 ) · · · H1 (x0 , . . . , xn−1 ) 1
aT m = dT π = aT Lπ =⇒ Lπ(x) = m(x).
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
131
v=sym('x',[4,1]);
V=fliplr(vander(v));
VT=V.';
[L,U]=lu(VT);
L=simplify(L);
U=simplify(U);
L
U
b = D−2 P T f .
132
Trebuie să existe o matrice triunghiulară inferior G care transformă po-
linoamele ortogonale în monoame
Gp(x) = m(x).
GT a = b.
1. Q = P D−1 şi R = D−1 P T V .
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
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
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.
ş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.
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
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.
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
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
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
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).
14
12
10
-2
-4
0 2 4 6 8 10 12 14 16 18 20
x 1 2.5 3 5 13 18 20
(3.43)
y 2 3 4 5 7 6 3
140
8
1
0 2 4 6 8 10 12 14 16 18 20
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ă.
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:
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]]);
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
′
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
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:
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
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))];
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.
-2
-4
-6
-8
0 2 4 6 8 10 12 14 16 18 20
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
147
Dacă derivăm Qi în (3.49) obţinem
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
′ ′ ′
Ay′ = c (3.57)
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)
149
Demonstraţie. Fie s(x) care minimizează xx1n (s′′ (x))2 d x. Orice func-
R
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
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ă:
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.
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
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)
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:
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.
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
(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
s s1 s2 . . . sn
pentru x(s)
x x1 x2 . . . xn
s s1 s2 . . . sn
pentru y(s).
y y1 y2 . . . yn
156
8
1
0 1 2 3 4 5 6 7
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
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
2. Este funcţia reconstruită p(t) identică cu f (t), şi dacă nu, cât de mare
este eroarea |p(t) − f (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
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
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
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
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
Aceasta ne arată că
(
∗ n, dacă k = l
[V V ]kl =
0, dacă k ̸= l,
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.
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
162
Figura 3.7: Exemplul 3.9
2πj
pn = yj , j = 0, . . . , n − 1,
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
k=−∞
j∈Z
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
j∈Z
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
j∈Z
j̸=0
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
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
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
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.
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
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
b = Fn y and z
1. Utilizează FFT pentru a calcula y b = Fn z.
b = n (y
2. Calculează w b).
b⊙z
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
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].
2.539300cm14.447200cm
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
173
4.973200cm7.117100cm
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
yt+n +an−1 yt+n−1 +· · ·+a0 yt ≈ bn−1 ut+n−1 +bn−2 ut+n−2 +· · ·+b0 ut . (4.5)
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
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
P + λt = Q + µs. (4.7)
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
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 = 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
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).
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.
5.186200cm7.169800cm
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.
Ax ≈ b ⇐⇒ BAx ≈ Bb if B is orthogonal,
181
Capitolul 5
Rezolvarea numerică a
ecuaţiilor diferenţiale
ordinare
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.
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.
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,
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?
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 [?, ?].
186
is valid for all t.
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.
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.
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.
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:
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.
ecd:=ode({diff(y(t),t)=sqrt(abs(y(t))),y(2)=-1},y(t)):
solve(ecd);
2
t2 (t − 4)
( )
− ,−
4 4
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
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ă.
y ′ = t2 + y 2 , y(0) = 1. (5.8)
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 ′′′ .
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
>> a=DEQseries(0,1,7)
a =
1.0000 1.0000 1.0000 1.3333 1.1667 1.2000 1.2333
194
This formula reminds us very much of back substitution! Indeed, if we
connect a power series
p(t) = p0 + p1 t + · · ·
r = p ± q ⇐⇒ R = P ± Q
r = pq ⇐⇒ R = P Q
r = p/q ⇐⇒ R = Q−1 P ⇐⇒ QR = P
195
so comparing coefficients gives
i
(i + 1)ri+1 = (j + 1)pj+1 ri−j .
X
j=0
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
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(%);
The coefficients of the series for cos(p(t)) and sin(p(t)) can thus be
computed by running these two recurrences simultaneously.
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
+ ··· .
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 + · · ·
Exemplul 5.4.
2 3 2 3
e(e ) = e1+t+ 2! + 3! +··· = e1 et+ 2! + 3! +··· .
t t t t t
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)
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
200
Figura 5.3: The Forward Euler (FE) method applied to the dog-jogger pro-
blem.
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);
[t,x]=ForwardEuler(@Dog,[0,12],[60; 70],50);
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
[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.
1 1 log (2e − 6)
n
= 1e − 6 =⇒ n = ≈ 18.93,
2 2 log (0.5)
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
y1 (t) f1 (t, y)
y = ... , f (t, y) = ..
. .
yn (t) fn (t, y)
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 .
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;
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
207
together with an initial condition y0 at time t0 , for example
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
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';
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.
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.
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
212
Anexa A
Anexa
213
Bibliografie
[1] Å. Björk, Numerical Methods for Least Squares Problem, SIAM, Phila-
delphia, 1996.
[6] D. Goldberg, What every computer scientist should know about floating-
point arithmetic, Computing Surveys 23 (1991), no. 1, 5–48.
[9] M.L. Overton, Numerical computing with ieee floating point arithmetic,
SIAM, Philadelphia, PA, 2001.
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
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
216