Professional Documents
Culture Documents
Numeri Cka Matematika, 2. Predavanje: Pina Mili Si C, Ana Zgalji C Keko Skripta
Numeri Cka Matematika, 2. Predavanje: Pina Mili Si C, Ana Zgalji C Keko Skripta
predavanje
Skripta
2
Radna verzija
Sadržaj
1 Uvod 5
1.1 Pogreške . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.1 Pogreške diskretizacije i pogreške odbacivanja . . . . . . . 5
1.2 Prikaz realnih brojeva u računalu . . . . . . . . . . . . . . . . . . 8
1.2.1 Preciznost, strojni epsilon i greška zaokruživanja . . . . . . 13
1.2.2 Propagiranje grešaka kroz aritmetičke operacije . . . . . . 15
1.3 Stvarne katastrofe uzrokovane greškom . . . . . . . . . . . . . . . 20
2 Dodatak 23
2.1 Neki važni pojmovi iz matematičke analize . . . . . . . . . . . . . 23
2.2 ”Veliko” O i ”malo” o notacija . . . . . . . . . . . . . . . . . . . . 23
3
4 SADRŽAJ
Radna verzija
1
Uvod
1.1 Pogreške
1.1.1 Pogreške diskretizacije i pogreške odbacivanja
Primjer 1.1 Konačne diferencije
Klasičan primjer u kojem se javljaju pogreške diskretizacije jesu formule konačnih
diferencija. Za zadanu glatku funkciju f : R → R. želimo aproksimirati njenu
prvu i drugu derivaciju u točki x. U tu svrhu promotrimo Taylorove razvoje
funkcije f oko točke x:
f ′ (x) f ′′ (x) 2 f ′′′ (x) 3
f (x + h) = f (x) + h+ h + h + ... (1.1a)
1! 2! 3!
f ′ (x) f ′′ (x) 2 f ′′′ (x) 3
f (x − h) = f (x) − h+ h − h + ... (1.1b)
1! 2! 3!
Izrazimo li f ′ (x) iz razvoja (1.1a) imamo
f (x + h) − f (x) f ′′ (x) f ′′′ (x) 2
f ′ (x) = − h− h −···
h 2! 3!
f (x + h) − f (x)
= + O(h).
h
Na taj način smo dobili formulu konačne diferencije unaprijed
f (x + h) − f (x)
f ′ (x) ≈
h
za aproksimaciju derivacije funkcije f u točki x prvog reda točnosti. Slično,
izrazimo li f ′ (x) iz razvoja (1.1b) imamo
f (x) − f (x − h) f ′′ (x) f ′′′ (x) 2
f ′ (x) = + h+ h ···
h 2! 3!
f (x) − f (x − h)
= + O(h).
h
5
6 Uvod
f (x) − f (x − h)
f ′ (x) ≈
h
za aproksimaciju derivacije funkcije f u točki x koja je takoder prvog reda
točnosti. Konačno, oduzmemo li razvoje (1.1a) i (1.1b) imamo
f (x + h) − f (x − h)
f ′ (x) ≈
2h
za aproksimaciju derivacije funkcije f u točki x koja je drugog reda točnosti.
Nadalje, drugu derivaciju funkcije f u točki x možemo aproksimirati formulom
drugog reda točnosti, odnosno zbrajanjem razvoja danih u (1.1) pokazuje se da
vrijedi
f (x + h) − 2f (x) + f (x − h)
f ′′ (x) = 2
+ O(h2 ).
h
Greške odbacivanja nastaju kada rezanjem beskonačnog niza ili reda na konačan
broj članova odbacujemo ostatak. Pri tome nam je posebno važno da možemo,
na neki način, kontrolirati pogrešku. Sljedeći primjer ilustrira opisanu situaciju.
Primjer 1.2 Vrijednost funkcije sin x u zadanoj točki želimo aproksimirati Taylo-
rovim polinomom. Podsjetimo se da Taylorov red dovoljno glatke funkcije f
možemo aproksimirati Taylorovim polinomom
n
X f (k) (0) f (n+1) (ξ) n+1
f (x) = xk + Rn+1 (x), Rn+1 (x) = x ,
k=0
k! (n + 1)!
pri čemu je ξ neki broj izmedu 0 i x. Promotrimo razvoj u Taylorov red oko nule
funkcije sin x:
∞
X (−1)k x2k+1
sin x = . (1.2)
k=0
(2k + 1)!
Znamo da Taylorov red (1.2) konvergira za proizvoljno x ∈ R. Odaberimo n ∈ N
i aproksimirajmo funkciju sin x odgovarajućim Taylorovim polinomom
n
sin
X (−1)k x2k+1
T2n+1 (x) = ,
k=0
(2k + 1)!
Radna verzija
1.1 Pogreške 7
sin
a pripadnu pogrešku odbacivanja označimo sa R2n+3 (x). Očito je da vrijedi
pri čemu smo iskoristili činjenicu da formula za n-tu derivaciju funkcije sin x glasi
nπ
(n)
(sin x) = sin x + .
2
Nadalje, radi jednostavnosti, pretpostavili smo da je x > 0 te ξ ≤ x. Dakle,
zbrojimo li članove pripadnog Taylorovog reda (1.2) sve dok apsolutna vrijednost
prvog odbačenog člana ne padne ispod zadane točnosti ǫ > 0, napravili smo
pogrešku odbacivanja E za koju vrijedi |E| ≤ ǫ.
Promotrimo funkciju powersin(x) koja računa vrijednosti sin x pomoću Taylo-
rovog razvoja.
function s = powersin(x)
% POWERSIN Taylorov red za sin(x)
% POWERSIN(x) racuna aproksimativno sin(x)
s = 0;
t = x;
n = 1;
while s+t ~= s
s = s+t;
t = -x^2/((n+1)*(n+2))*t;
n = n+2;
end
• powersin(pi/2) = 1.000000000000000
12 članova, najveći član 1.570796326794897
• powersin(11*pi/2) = -1.000000000212873
38 članova, najveći član 3.066514637383812e+06
• powersin(21*pi/2) = 0.999866764041849
61 član, najveći član 1.467259672825497e+13
• powersin(31*pi/2) = -5.822018527024010e+03
79 članova, najveći član 7.988994169819993e+19
Radna verzija
1.2 Prikaz realnih brojeva u računalu 9
0 01111111 00000000000000000000000
Primijetimo da je eksponent 0 prikazan kao binarna reprezentacija broja 0 + 127.
Nadalje, imamo
11
= (1.011)2 × 22 .
2
0 10000001 01100000000000000000000
Promotrimo konačno i zapis broja 1/10 u formatu jednostruke preciznosti. Zapis
broja 1/10 u binarnom sustavu nema konačno mnogo znamenaka i kao takav ne
može se egzaktno spremiti u računalo. Vrijedi naime
1
= (1.100110011 . . .)2 × 2−4 .
10
Nakon odbacivanja odredenog broja znamenki, dobivamo zapis
± a1 a2 a3 . . . a8 b1 b2 b3 . . . b23
a1 a2 a3 . . . a8 Prikazani fp-broj
(00000000)2 = (0)10 ±(0.b1 b2 b3 . . . b23 )2 × 2−126
(00000001)2 = (1)10 ±(1.b1 b2 b3 . . . b23 )2 × 2−126
(00000010)2 = (2)10 ±(1.b1 b2 b3 . . . b23 )2 × 2−125
(00000011)2 = (3)10 ±(1.b1 b2 b3 . . . b23 )2 × 2−124
.. ..
. .
(01111111)2 = (127)10 ±(1.b1 b2 b3 . . . b23 )2 × 20
(10000000)2 = (128)10 ±(1.b1 b2 b3 . . . b23 )2 × 21
.. ..
. .
(11111100)2 = (252)10 ±(1.b1 b2 b3 . . . b23 )2 × 2125
(11111101)2 = (253)10 ±(1.b1 b2 b3 . . . b23 )2 × 2126
(11111110)2 = (254)10 ±(1.b1 b2 b3 . . . b23 )2 × 2127
(11111111)2 = (255)10 ±∞ ako b1 = · · · = b23 = 0, NaN inače
0 01111011 10011001100110011001100
Format jednostruke preciznosti često u praksi ne zadovoljava radi zahtjeva za
većom preciznošću. Stoga se uglavnom koristi format dvostruke preciznosti (eng.
double precision format). Realni brojevi poput 1/10 i π čiji binarni zapis nije
konačan točnije su prikazani u formatu dvostruke preciznosti. Tablica 1.2 prika-
zuje IEEE format dvostruke preciznosti.
Tablica 1.3 prikazuje koji se najmanji i najveći pozitivni brojevi mogu prikazati
u formatu jednostruke odnosno dvostruke preciznosti. Eksponent smo označili s
e, dok je broj koji se prikazuje označen kao x.
Zadatak 1.1 Ponovimo, standardni IEEE fp–broj (koji nije nula) u formatu dvos-
truke preciznosti prikazuje se u obliku
x = ±(1 + f ) × 2e ,
pri čemu je
52
X
−1022 ≤ e ≤ 1023, f ∈ [0, 1i, f = βi 2−i , βi ∈ {0, 1}.
i=1
Radna verzija
1.2 Prikaz realnih brojeva u računalu 11
± a1 a2 a3 . . . a11 b1 b2 b3 . . . b52
Primjer 1.3 Pogledajmo što će biti ispis sljedećeg niza naredbi.
Radna verzija
1.2 Prikaz realnih brojeva u računalu 13
a = 1/0
b = 1.e1000
c = 2^(2000)
d = exp(1000)
f = log(0)
e = Inf-Inf
a = Inf
b = Inf
c = Inf
d = Inf
f = -Inf
e = NaN
Radna verzija
1.2 Prikaz realnih brojeva u računalu 15
x ⊖ y = (x − y)(1 + δ1 ), x ⊕ y = (x + y)(1 + δ2 ),
x ⊗ x = x2 (1 + δ3 ), y ⊗ y = y 2 (1 + δ4 ).
pri čemu je |δi | ≤ ǫ/2, gdje je ǫ strojni epsilon. Označimo ǫ̃ = ǫ/2. Direktni račun
za pojedinu formulu daje sljedeće ocjene relativne greške:
|(x ⊖ y) ⊗ (x ⊕ y)|
≤ 3ǫ̃(1 + ǫ̃ + ǫ˜2 ) ≈ 3ǫ̃(1 + ǫ̃), (1.7)
|x2 − y 2 |
|(x ⊗ x) ⊖ (y ⊗ y) − (x2 − y 2)| 2
y 2
2 2
= ǫ̃ 1 + 2 2 2
. (1.8)
|x − y | x −y
Uočimo da u slučaju kada je x blisko y član y 2 /(x2 − y 2) može biti jako velik pa
zaključujemo da se izraz (x − y)(x + y) ponaša bolje od izraza x2 − y 2 u odnosu
na dokidanje značajnih znamenaka.
Problem dokidanja značajnih znamenaka često se može ukloniti jednostav-
nom reformulacijom izraza. U tu svrhu promotrimo pojavu opasnog oduzimanja
bliskih brojeva na primjeru rješavanja kvadratne jednadžbe
ax2 + bx + c = 0,
Radna verzija
1.2 Prikaz realnih brojeva u računalu 17
(x − 108 ) · (x − 10−8 ) = 0,
Radna verzija
1.2 Prikaz realnih brojeva u računalu 19
Primjer 1.9
x =
-1.058823529411765
8.000000000000000
Pokušajmo odgovoriti na pitanje zašto je računalo došlo baš do ovog rješenja?
Uočimo najprije da fp–reprezentacija matrice A nije singularna matrica jer ele-
ment a21 = 17/10 nije egzaktno prikaziv u računalu. U prvom koraku rješavanja
prva jednadžba se pomnoži sa µ = 1.7/17 i oduzme od druge jednadžbe. Već
ovdje dolazi do greške zaokruživanja radi konačne fp–aritmetikom računala.
>> mu = 1.7/17;
>> A(2,:) = A(2,:) - mu*A(1,:);
>> b(2) = b(2) - mu*b(1);
>> A(2,2) = 5.551115123125783e-17
>> b(2) = 4.440892098500626e-16
U egzaktnom računu je A(2, 2) = 0 i b(2) = 0. S druge strane, u fp-aritmetici
dobivamo A(2, 2) = (1/4) · ǫ, b(2) = 2 · ǫ. Prilikom računanja rješenja x2 =
b(2)/A(2, 2) doći će do dijeljenja brojeva koji su kontaminirani greškama za-
okruživanja. Dobivamo:
Naredbe
>> x = 0.988:.0001:1.012;
>> y = x.^7-7*x.^6+21*x.^5-35*x.^4+35*x.^3-21*x.^2+7*x-1;
>> plot(x,y)
odnosno
>> x = 0.988:.0001:1.012;
>> y = (x-1).^7;
>> plot(x,y)
sljedeći zanimljivi rezultat prikazan na slici 1.1. Graf dobiven korištenjem bi-
nomne formule ne izgleda kao polinom (nije uopće gladak!). Što se ovdje do-
godilo? U okolini točke 1 vrijednost (x − 1)7 je mali broj. Primijetimo da su
vrijednosti na y-skali reda veličine svega 10−14 . Prilikom računanja vrijednosti
varijable y pomoću binomne formule dolazi do oduzimanja bliskih brojeva.
Radna verzija
1.3 Stvarne katastrofe uzrokovane greškom 21
−14 −14
x 10 x 10
5 4
4
3
3
2
2
1
1
f(x)
f(x)
0 0
−1
−1
−2
−2
−3
−3
−4
−5 −4
0.985 0.99 0.995 1 1.005 1.01 1.015 0.985 0.99 0.995 1 1.005 1.01 1.015
x x
Slika 1.1: Graf polinoma p(x) dobiven korištenjem: binomne formule (lijevo),
direktne formule (x − 1)7 (desno)
Eksplozija Ariane 5
Raketa Ariane 5 lansirana je 4. lipnja 1995. iz Kouroua, Francuska Gvajana.
Nosila je u putanju oko Zemlje komunikacijske satelite vrijedne oko 500 milijuna
USD. Samo 37 sekundi nakon lansiranja došlo je do samouništenja. Problem je
bila kontrolna varijabla koja je u programu vodenja rakete mjerila horizontalnu
brzinu rakete. Greška je nastupila kad je program pokušao pretvoriti preveliki
64-bitni realni broj u 16-bitni cijeli broj. Računalo je javilo grešku, što je dovelo
do samouništenja rakete.
Radna verzija
2
Dodatak
f (x) = o(g(x)) x → x0
ako vrijedi
f (x)
lim = 0. (2.2)
x→x0 g(x)
23
24 Dodatak
Radna verzija