You are on page 1of 24

Numerička matematika, 2.

predavanje

Pina Milišić, Ana Žgaljić Keko

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

Na taj način smo dobili formulu konačne diferencije unatrag

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) 2 f (v) (x) 4


f ′ (x) = + h + h ...
2h 3! 5!
f (x + h) − f (x − h)
= + O(h2 )
2h
čime dobivamo formulu centralne diferencije

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

sin sin x2n+3


| sin x − T2n+1 (x)| = |R2n+3 (x)| ≤
(2n + 3)!

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

Pomoću funkcije powersin(x) izračunajte vrijednosti funkcije sin x u točkama


π/2, 11π/2, 21π/2, 31π/2, ispiǐte koliko je članova reda bilo uzeto u obzir prilikom
dobivanja rezultata, te odredite po apsolutnoj vrijednosti najveći član reda uzet
u obzir prilikom računanja. Dobivamo sljedeće rezultate:

• 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

Milišić, Žgaljić Keko 18. ožujka 2016.


8 Uvod

Objasnite kriterij zaustavljanja while petlje. Koliko su uopće točni dobiveni


rezultati?
Iz Matematike 1 znamo da je aproksimacija funkcije Taylorovim polinomom u
nekoj točki dalje od ishodišta bolja uzmemo li veći broj članova reda. No na pri-
mjeru funkcije powersin(x) smo vidjeli da, radi konačne aritmetike i pogrešaka
zaokruživanja, prilikom aproksimacije vrijednosti sin(31π/2) polinomom stupnja
188 nismo bili u mogućnosti dobiti precizniji rezultat.
Da bismo mogli podrobnije govoriti o pogreškama aritmetike računala,
podsjetimo se najprije osnovnih pojmova vezanih uz reprezentaciju realnih bro-
jeva u računalu.

1.2 Prikaz realnih brojeva u računalu


Realni brojevi implementiraju se u računalu u unaprijed zadanom formatu
koji propisuje koliko se binarnih znamenaka (bitova) koristi za prikaz broja, kako
se one interpretiraju te na koji način se s njima računa. Dugo je postojala potreba
za definiranjem standarda koji bi bio neovisan o pojedinom računalu. Godine
1985. IEEE Standards Board i American National Standards Institute usvojili su
ANSI/IEEE Standard 754–1985 za binarnu aritmetiku pomičnog zareza (eng. bi-
nary floating– point arithmetic).
Binarni zapis realnog broja x 6= 0 pohranjuje se u sljedećem formatu:
x = ±(1 + f ) × 2e ,
pri čemu je f ∈ [0, 1i. Broj S = 1 + f nazivamo mantisa realnog broja, dok je e
pripadni eksponent. Binarni prikaz mantise je
S = (b0 .b1 b2 b3 . . .)2 pri čemu je b0 = 1.
Kažemo da je ovakav prikaz broja normaliziran. Vidimo da binarna točka pliva
(eng. float) u binarnom zapisu promatranog broja do mjesta poslije prvog bita
koji nije nula, što dovodi do odgovarajuće promjene eksponenta. Odatle dolazi
naziv (sintagma) pomični zarez (eng. floating point). U daljnjem tekstu koristit
ćemo skraćenicu fp.
Za pohranu mantise i eksponenta rezervirano je konačno mnogo bitova:
• 32 bita (single precision)
• 64 bita (double precision)
• 80 bitova (extended precision),
što ima za posljedicu da je prikaziv samo neki raspon realnih brojeva. Nadalje,
niti svi brojevi unutar navedenog raspona nisu prikazivi. Naime, ukoliko je man-
tisa predugačka nužno dolazi do (neželjenog) zaokruživanja. Brojeve koji se mogu

Radna verzija
1.2 Prikaz realnih brojeva u računalu 9

egzaktno spremiti u računalo zovemo brojevi s pomičnim zarezom (eng. floating


point numbers). U daljnjem tekstu koristit ćemo skraćenicu fp–brojevi. Bro-
jevi koji nisu fp–brojevi podliježu zaokruživanju prije nego se mogu spremiti u
računalo.
Promotrimo sada malo detaljnije format jednostruke preciznosti. Raspoloživa
32 bita dijelimo na sljedeći način:
1 bit za predznak, 8 bitova za eksponent i 23 bita za mantisu.
Pri tome vrijedi:
• bit koji odreduje predznak je 0 za pozitivne brojeve, 1 za negativne
• eksponent može biti izmedu -126 i 127.
• mantisu simbolički možemo zapisati u obliku
(b0 .b1 b2 b3 . . . b23 )2 ,
pri čemu je b0 = 1. Bit b0 zovemo skrivenim bitom. Naime, kako je u
normaliziranom prikazu uvijek b0 = 1, taj bit ne moramo posebno spremati,
dok b1 b2 . . . b23 spremamo u preostala 23 bita.
Uočimo da nisu svi realni brojevi prikazivi u ovom formatu. Može se naprimjer
dogoditi da eksponent ispada iz segmenta [−126, 127] ili da znamenke b24 b25 , . . .
iz binarnog prikaza nisu sve jednake nula.
Tablica 1.1 prikazuje IEEE format jednostruke preciznosti.

Pogledajmo naprimjer kako brojeve 1, 11/2 i 1/10 pohranjujemo u jednostrukoj


preciznosti.
1 = (1.000 . . . 0)2 × 20

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

Milišić, Žgaljić Keko 18. ožujka 2016.


10 Uvod

± 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

Tablica 1.1: IEEE format jednostruke preciznosti

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.

Vrijednosti xmin i xmax za format dvostruke preciznosti navedene u tablici 1.3


dobivamo u Matlabu naredbama realmin i realmax.

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

a1 a2 a3 . . . a11 Prikazani fp–broj


(00000000000)2 = (0)10 ±(0.b1 b2 b3 . . . b52 )2 × 2−1022
(00000000001)2 = (1)10 ±(1.b1 b2 b3 . . . b52 )2 × 2−1022
(00000000010)2 = (2)10 ±(1.b1 b2 b3 . . . b52 )2 × 2−1021
(00000000011)2 = (3)10 ±(1.b1 b2 b3 . . . b52 )2 × 2−1020
.. ..
. .
(01111111111)2 = (1023)10 ±(1.b1 b2 b3 . . . b52 )2 × 20
(10000000000)2 = (1024)10 ±(1.b1 b2 b3 . . . b52 )2 × 21
.. ..
. .
(11111111100)2 = (2044)10 ±(1.b1 b2 b3 . . . b52 )2 × 21021
(11111111101)2 = (2045)10 ±(1.b1 b2 b3 . . . b52 )2 × 21022
(11111111110)2 = (2046)10 ±(1.b1 b2 b3 . . . b52 )2 × 21023
(11111111111)2 = (2047)10 ±∞ ako b1 = · · · = b52 = 0, NaN inače

Tablica 1.2: IEEE format dvostruke preciznosti

Format emin emax xmin xmax


128
Single −126 127 2 −126
≈ 1.2 × 10−38 ≈2 ≈ 3.4 × 1038
Double −1022 1023 2 −1022
≈ 2.2 × 10−308 ≈ 21024 ≈ 1.8 × 10308

Tablica 1.3: Doseg IEEE fp–formata

Milišić, Žgaljić Keko 18. ožujka 2016.


12 Uvod

(i) Odredite vrijednost najvećeg pozitivnog IEEE fp–broja dvostruke preciznosti


(prvi koji je ”manji” od +Inf).

(ii) Nadite vrijednost prvog fp-broja koji je veći od 50.

(iii) Koliko ima fp–brojeva?

Rješenje. (i) 21024 − 2971 , (ii) 50 + 2−47 , (iii) 264 − 254 .


Pored formata jednostruke i dvostruke preciznosti koristi se još i format
proširene preciznosti koji fp–brojeve sprema u 80 bitova: 1 za predznak, 15 za
eksponent i 64 za mantisu. Taj format nećemo ovdje posebno razmatrati. Matlab
uglavnom koristi format dvostruke preciznosti.
Promotrimo još kako se prikazuje nula, beskonačna vrijednost te što su to
nedefinirane vrijednosti u IEEE standardu.
Prikaz nule. Nula se prema IEEE standardu prikazuje samim nulama u ekspo-
nentu i mantisi. Time se dobiva pozitivna i negativna nula što može biti korisno
u računima s višeznačnim funkcijama. Standard zahtijeva da u svim logičkim iz-
razima bude −0 = +0, tj. da izrazi oblika if (x = 0) . . . ne ovise o predznaku
nule. Nadalje, nula s predznakom u aritmetičkim operacijama mora se ponašati
isto kao i svaki drugi broj s predznakom; naprimjer +0/ − 5 = −0.
Beskonačne vrijednosti. U IEEE formatu fp–broj koji se sastoji od samih
jedinica u eksponentu i samih nula u mantisi predstavlja beskonačnu vrijednost.
Ovisno o predznaku imamo +∞ i −∞. Mi ćemo te vrijednosti označavati s +Inf
i -Inf.
Osnovna uloga +Inf i -Inf je da signaliziraju pretek (eng. overflow). Pretek
se dogada kada je rezultat aritmetričke operacije suviše velik da bi mogao biti
prikazan kao fp–broj. Standard propisuje da u takvim situacijama rezultat mora
biti +Inf ili -Inf, ovisno o predznaku. Nadalje, dijeljenje s nulom generira ±Inf,
poštujući uobičajena pravila o predznacima: +1/ + 0 =+Inf, +1/ − 0 =-Inf, itd.
Dijeljenje s ±Inf daje ±0 tako da će za x = ±Inf vrijediti 1/(1/x) = x i neće
doći do gubitka predznaka varijable. Nadalje vrijedi 1/Inf = 0 i Inf + Inf =
Inf.
Nedefinirane vrijednosti. Računske operacije koje nisu dobro definirane
kao što su to 0/0, Inf/Inf, Inf · 0, (+Inf)+(-Inf) itd., prema IEEE standardu
generiraju posebne vrijednosti koje se skraćeno nazivaju NaN-ovi (eng. Not a
Number). Takve se vrijednosti prikazuju na ovaj način: u eksponentu imaju
same jedinice, a mantisa im je različita od nule. Pravila za rad s NaN-ovima su
sljedeća: svaka aritmetička operacija kojoj je jedan od operanada NaN daje kao
rezultat NaN. Ukoliko se NaN nade u logičkom izrazu rezultat će biti laž. Tako će
naprimjer test if (x == x) dati neistinu za x = NaN.

Primjer 1.3 Pogledajmo što će biti ispis sljedećeg niza naredbi.

>> format long

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

1.2.1 Preciznost, strojni epsilon i greška zaokruživanja


Neka je za pohranu mantise (uključujući i skriveni bit) rezervirano p, a za
pohranu eksponenta s bitova. Uvedimo oznaku R(p, s) za skup svih realnih bro-
jeva prikazivih u računalu. Preciznost p fp–sustava definiramo kao broj bitova
u mantisi (uključujući i skriveni bit). Dakle, normalizirani fp–broj preciznosti p
može se zapisati u obliku

±(1.b1 b2 . . . bp−2 bp−1 )2 × 2e .

Strojnu preciznost (strojni epsilon) promatranog fp–sustava označavamo sa ǫ i


definiramo definiramo kao
ǫ = 2−(p−1) .
Prema navedenoj definiciji ǫ interpretiramo kao udaljenost izmedu 1 i prvog većeg
fp–broja. Naime, najmanji fp–broj veći od 1 je

y = (1. 00 . . 01})2 = 1 + 2−(p−1) .


| .{z
p−1

pa njegova udaljenost od broja 1 iznosi

|1 − y| = (0.00 . . . 01)2 = 2−(p−1) ,

što je upravo vrijednost strojnog epsilona.


Neka je x realan broj koji se nalazi u području koje prekrivaju fp–brojevi1 ,
ali nije egzaktno prikaziv u računalu. Očito je da postoji eksponent e, emin ≤ e ≤
emax takav da je x ∈ [2e , 2e+1 i. Kako je x oblika

(1.b1 b2 b3 . . . bp−1 bp bp+1 . . .)2 × 2e


1
U ovom tekstu radimo sa normaliziranim fp-brojevima

Milišić, Žgaljić Keko 18. ožujka 2016.


14 Uvod

prilikom njegovog spremanja u računalo trebat će napraviti odredeno zaokruživanje.


Promotrimo kolika je pritom napravljena relativna greška. Najćešće se radi za-
okruživanje na najbliži fp–broj. Sa x− označimo prvi fp–broj manji od x, a sa
x+ prvi fp–broj veći od x. Očito vrijedi
x− = (1.b1 b2 b3 . . . bp−1 )2 × 2e , . . . 1})2 × 2e .
x+ = (1.b1 b2 b3 . . . bp−1 + 0. |000{z
p−1

Broj x možemo spremiti u računalo zaokruživanjem nadolje, na gore ili prema


najbližem. Uzmimo da smo x aproksimirali s njemu najbližim fp–brojem kojeg
smo označili sa x̂. Budući se broj x nalazi izmedu x− i x+ , zaključujemo da je
njegova udaljenost do najbližeg fp–broja manja ili jednaka
1 
· · 01} × 2e .
0. |0 · {z
2 2
p−1

Time lako dobivamo ocjenu apsolutne greške:


1 1 1
|x − x̂| ≤ (0.00 . . . 1)2 × 2e = 2−p+1 × 2e = 2e−p+1 = 2e−p . (1.3)
2 2 2
Kako je x ≥ 2e , iz (1.3) direktno slijedi ocjena relativne greške zaokruživanja
realnog broja x na njemu najbliži fp–broj:
|x̂ − x| 2e−p ǫ
≤ e = 2−p = . (1.4)
|x| 2 2
Konačno, iz ocjene relativne greške (1.4) slijedi:
ako je x ∈ R unutar raspona brojeva prikazivih u računalu, a nije egzaktno
prikaziv, umjesto njega se u računalo sprema zaokruženi broj f l(x) ∈ R(p, s) tako
da vrijedi
f l(x) = (1 + δ)x, |δ| ≤ ǫ/2,
gdje je δ relativna greška napravljena zaokruživanjem.
U IEEE standardu su pored prikaza brojeva u računalu propisana i svojstva
aritmetike. Očito je da rezultat aritmetičke operacije izmedu dva fp–broja ne
mora nužno biti fp–broj. Neka su +, −, × i / osnovne aritmetičke operacije,
a ⊕, ⊖, ⊗ i ⊘ aritmetičke operacije implementirane u računalu. Za računsku
operaciju nad fp–brojevima kažemo da je ispravno zaokružena ako je njen rezultat
jednak onom kojeg bismo dobili da smo operaciju izvršili u beskonačnoj točnosti
i zatim rezultat zaokružili na najbliži fp–broj. Iz relativne ocjene greške (1.4)
koju smo napravili zaokruživanjem na najbliži fp–broj slijedi
f l(x ◦ y) = (1 + δ)(x ◦ y), |δ| ≤ ǫ/2, (1.5)
za sve x, y ∈ R(p, s) za koje je x ◦ y u dozvoljenom rasponu. Oznaka ◦ predstavlja
jednu od osnovnih aritmetičkih operacija implementiranu u računalo. Dobiveni
rezultat je tada prikaziv, odnosno vrijedi f l(x ◦ y) ∈ R(p, s). Oznaka f l(x ◦ y)
sad ima značenje rezultata dobivenog računalom za operaciju x ◦ y.

Radna verzija
1.2 Prikaz realnih brojeva u računalu 15

1.2.2 Propagiranje grešaka kroz aritmetičke operacije


Operandi koji ulaze u aritmetičku operaciju takoder nose u sebi odredenu
grešku. Postavlja se stoga pitanje na koji način greška rezultata aritmetičke ope-
racije ovisi o greškama u operandima. Od takozvanih opasnih računskih operacija
ovdje spominjemo:
• oduzimanje bliskih brojeva
• zbrajanje (oduzimanje) brojeva različitog reda veličine

Dokidanje značajnih znamenki. Vratimo se na trenutak na relaciju (1.5).


Desnu stranu tog izraza možemo interpretirati i kao egzaktno izvedenu operaciju
◦ na malo perturbiranim podacima. Neka je operacija ◦ zbrajanje, aritmetika
egzaktna, a podaci x i y malo perturbirani, tj. xp = x(1 + δx ), yp = y(1 + δy ), pri
čemu je |δx | ≤ ǫ/2 i |δy | ≤ ǫ/2. Za zbrajanje (oduzimanje) vrijedi
 xδx + yδy 
x(1 + δx ) + y(1 + δy ) = x + y + xδx + yδy = (x + y) 1 + ,
x+y
uz pretpostavku da je x + y 6= 0. Definiramo
x y
δ̃ = δx + δy .
x+y x+y
Dakle, ako su brojevi x i y istog predznaka, onda je
x y

≤ 1, ≤ 1, (1.6)
x+y x+y

pa je |δ̃| ≤ ǫ. S druge strane, ako su x i y brojevi različitih predznaka, kvocijenti


u (1.6) mogu biti proizvoljno veliki kad je |x + y| << |x|, |y|. Zaključujemo da
opasnost nastupa ako je rezultat zbrajanja brojeva suprotnog predznaka po ap-
solutnoj vrijednosti značajno manji od polaznih podataka. U tom slučaju dolazi
do tzv. dokidanja značajnih znamenaka. Promotrimo detaljnije efekt dokidanja
značajnih znamenaka na jednostavnom primjeru.

Primjer 1.4 Zamislimo da raspolažemo sa računalom koje računa u bazi 10.


Pretpostavimo da je mantisa duga pet, eksponent dvije dekadske znamenke, a
format u kojem brojeve spremamo u računalo je oblika (0.d1 d2 d3 d4 )10 ×10e . Neka
su zadani brojevi

x = 0.99977 × 100 , y = 0.99933 × 100 .

U naše zamišljeno računalo se, umjesto navedenih egzaktnih vrijednosti x i y


spremaju najbliži prikazivi brojevi

f l(x) = 0.9998 × 100 , f l(y) = 0.9993 × 100 ,

Milišić, Žgaljić Keko 18. ožujka 2016.


16 Uvod

čime smo napravili malu relativnu grešku. Imamo

f l(x) − f l(y) = 0.0005 × 100 = 0.5??? × 10−3 .

Znakovi upitnika predstavljaju izgubljene znamenke koje više ne možemo rekons-


truirati. Računalo na ta mjesta upisuje 0. Egzaktni rezultat je 0.44 × 10−3 .
Dakle, već prva značajna znamenka rezultata je pogrešna. Učinjena greška se
dalje propagira kroz eventualne naredne operacije. Ako se pritom skrati petica,
gubimo svaku kontrolu nad daljnjim rezultatom.
Ponekad nije evidentno koja je od dvije ekvivalentne formule bolja u odnosu
na dokidanje značajnih znamenaka. Tu nam pomaže analiza pripadne relativne
greške. U tom smislu proučimo sljedeći primjer.

Primjer 1.5 Promotrimo ekvivalentne izraze x2 −y 2 i (x−y)(x+y). Zanima nas


koja od navedene dvije formule je bolja za računanje. Ukoliko su sve operacije
ispravno zaokružene znamo da je

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,

gdje su a, b i c zadani i a 6= 0. Kvadratna jednadžba ima dva rješenja koja se


računaju prema formuli
√ √
−b + b2 − 4ac −b − b2 − 4ac
x1 = , x2 = . (1.9)
2a 2a
Vidimo da problem može nastati u slučaju kada je b2 >> 4ac. Tada je, naime,

b2 − 4ac ≈ |b|. pa kod izračunavanja rješenja x1 dolazi do oduzimanja bliskih

Radna verzija
1.2 Prikaz realnih brojeva u računalu 17

brojeva. Nastali problem može se riješiti tako da se najprije izračuna rješenje


koje je po apsolutnoj vrijednosti veće, a zatim se drugo rješenje izračuna ko-
c
risteći Viétinu formulu x1 x2 = . Na taj način smo otklonili opasno kraćenje.
a
Pogledajmo sada gore opisanu situaciju na jednom konkretnom primjeru.

Primjer 1.6 Kvadratnu jednadžbu

(x − 108 ) · (x − 10−8 ) = 0,

zapišimo u obliku ax2 + bx + c = 0. Odredimo korijene zadane jednadžbe upo-


trebom Matlabove funkcije roots. Dobivamo sljedeći rezultat:
>> a = 1; c = 1;
>> b = -(1.e+8 + 1.e-8)
b = -1.000000000000000e+08
>> r = roots([a b c]);
r(1) = 100000000
r(2) = 1.000000000000000e-08
Izračunamo li pak korijene zadane kvadratne jednadžbe pomoću standardne for-
mule (1.9) za rješavanje kvadratne jednadžbe dobivamo
>> x1 = (-b + sqrt(b^2 - 4 * a * c))/(2*a)
x1 = 100000000
>> x2 = (-b - sqrt(b^2 - 4 * a * c))/(2*a)
x2 = 1.490116119384766e-08

U ovom primjeru je b2 >> 4ac te je prilikom računanja izraza −b − b2 − 4ac
došlo do dokidanja značajnih znamenaka radi oduzimanja bliskih brojeva. Opasno
oduzimanje možemo izbjeći korištenjem Viétine formule:
>> x2 = c/(a*x1)
<< x2 = 1.000000000000000e-08
U dosadašnjim primjerima upoznali smo se sa opasnostima koje sa sobom nosi
oduzimanje bliskih brojeva. Promotrimo sada pobliže što se dogada zbrajamo li
(ili oduzimamo) brojeve različitog reda veličine. Pogledajmo u tu svrhu primjer
rekurzivne formule za sumaciju n brojeva.

Primjer 1.7 Promotrimo računanje sume n pozitivnih realnih brojeva. Sumi-


ranje se vrši u jednoj petlji u kojoj se prethodno sumiranim brojevima dodaje
novi sumand (rekurzivna sumacija). Problem može nastati ako zbrajamo brojeve
jako različitih veličina. Tada naime dolazi do gubitka znamenki manjeg broja
(zbog poravnavanja eksponenata). Zaključujemo da će suma pozitivnih članova
biti točnija ako sumande najprije poredamo po veličini, a zatim ih sumiramo od
najmanjeg prema najvećem. Taj zaključak možemo opravdati analizom grešaka.

Milišić, Žgaljić Keko 18. ožujka 2016.


18 Uvod

Sa s označimo egzaktnu vrijednost sume a1 + a2 · · · + an . Nadalje, neka je sn


suma dobivena korištenjem rekurzivne formule na način da se vrijednost novog
sumanda doda prethodnoj parcijalnoj sumi. Stoga imamo: s1 = a1 , s2 = s1 ⊕ a2
te općenito za i = 2, 3, . . . , n si = si−1 ⊕ ai . Ako je operacija zbrajanja ispravno
zaokružena vrijedi
si = (si−1 + ai )(1 + δi ), |δi | ≤ ε/2.
Sada indukcijom dobivamo
sn = (sn−1 + an )(1 + δn )
= sn−2 (1 + δn−1 )(1 + δn ) + an−1 (1 + δn−1 )(1 + δn ) + an (1 + δn )
n
Y Y n
= a1 (1 + δi ) + a2 (1 + δi ) + · · · + an (1 + δn ).
i=1 i=2

Zanemarujući članove reda ε2 dobivamo


sn − s ≈ a1 (δ1 + δ2 + · · · + δn ) + a2 (δ2 + · · · + δn ) + · · · + an δn .
Odavde vidimo da je greška najmanja ukoliko sumande poredamo tako da vrijedi
a1 ≤ a2 ≤ · · · ≤ an .
Pogledajmo na kraju još neke jednostavne primjere u kojima greške zaokruživanja
utječu na rezultate.

Primjer 1.8 Računamo li na prste rezultat niza sljedećih jednostavnih naredbi


format long
a = 4/3
b = a-1
c = 3*b
e = 1-c
dobivamo e = 0. No, u fp–aritmetici rezultat je
>> a = 1.333333333333333
>> b = 0.333333333333333
>> c = 1.000000000000000
>> e = 2.220446049250313e-16
Zaokruživanje se javlja u dijeljenju 4/3. Naime, taj kvocijent ne može biti egzak-
tno prikazan u računalu. Vrijednost koja je pohranjena u varijablu a je blizu, ali
nije jednaka 4/3. Nadalje, oduzimanje b = a − 1 rezultira varijablom b čiji zadnji
bit je jednak nuli. Stoga množenje 3 ∗ b može biti izvršeno bez zaokruživanja.
Konačno, vrijednost pohranjena u varijablu c nije jednaka 1 što rezultira time da
niti vrijednost varijable e onda nije jednaka nula.

Radna verzija
1.2 Prikaz realnih brojeva u računalu 19

Na sljedećem primjeru pogledajmo kako greške zaokruživanja mogu utjecati


na rješavanje linearnog sustava.

Primjer 1.9

17x1 + 5x2 = 22,


(1.10)
1.7x1 + 0.5x2 = 2.2.

Jedno rješenje je očito x1 = 1, x2 = 1. Uočimo najprije da je matrica


 
17 5
A=
1.7 0.5

zadanog sustava (1.10) singularna i sustav Ax = b ima beskonačno mnogo rješenja


oblika
22 − 17t
x1 = t, x2 = , t ∈ R.
5
Riješimo dani sustav korištenjem Matlabove naredbe \. Dobivamo sljedeći rezul-
tat:
>> A = [17 5; 1.7 0.5];
>> b = [22, 2.2]’;
>> x = A\b
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 3.265362e-18.

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:

Milišić, Žgaljić Keko 18. ožujka 2016.


20 Uvod

>> x(2) = b(2)/A(2,2);


>> x(1) = (22 - 5*x(2))/17;
>> x =
-1.058823529411765
8.000000000000000

Vidimo da je Matlab izračunao samo jedno rješenje zadanog sustava!

Primjer 1.10 Nacrtajmo u Matlabu graf zadanog polinoma p(x) = (x − 1)7 na


dva načina:

• pomoću binomne formule


7  
7
X 7 k
(x − 1) = x · (−1)7−k
k
k=0

• translacijom, koristeći (x − 1)7

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.

1.3 Stvarne katastrofe uzrokovane greškom


Nažalost postoje primjeri kada su radi numeričke greške stradali ljudi ili je
počinjena velika materijalna šteta. Bez ulaženja u detalje ovdje spominjemo dva
takva slučaja. Detaljniji opis katastrofa može se naći npr. u [?], [?] ili [?].

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)

Promašaj raketa Patriot


U Zaljevskom ratu, 25. veljače 1991. godine, Patriot rakete iznad Dhahrana
u Saudijskoj Arabiji nisu uspjele pronaći i oboriti iračku Scud raketu. Projektil
je slučajno pao na američku vojnu bazu usmrtivši 28 i raniši stotinjak ljudi. U
računalu koje je upravljalo Patriot raketama vrijeme se mjerilo u desetinkama
sekunde koje su protekle od trenutka uključivanja računala. U prethodnoj sekciji
vidjeli smo da realan broj 0.1 nije egzaktno prikaziv u računalu. Naime, sprema-
njem broja 0.1 u registar Patriot računala napravljena apsolutna greška približno
jednaka 9.5 · 10−8 . Zbog stalne opasnosti od napada Scud raketama, računalo je
bilo u pogonu 100 sati, što je 100 · 60 · 60 · 10 desetinski sekunde. Ukupna greška
nastala radi zaokruživanja iznosila je

100 · 60 · 60 · 10 · 9.5 · 10−8 = 0.34 s.

Uzmemo li u obzir da je raketa Scud putovala brzinom 1676 m/s, zaključujemo


da je Patriot promašio Scud za oko 570 metara, što je više od pola kilometra
daleko od njegovog stvarnog položaja.

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.

Milišić, Žgaljić Keko 18. ožujka 2016.


22 Uvod

Radna verzija
2

Dodatak

2.1 Neki važni pojmovi iz matematičke analize


2.2 ”Veliko” O i ”malo” o notacija
Često je potrebno usporedivati asimptotsko ponašanje zadanih realnih funk-
cija f (x) i g(x) kada varijabla x teži ka x0 . U tu svrhu koristimo notaciju ”veliko”
i ”malo” O1 s kojom smo se upoznali u Matematici 2. Ponovimo ovdje, radi pot-
punosti, definiciju spomenutih simbola O i o. Neka su f , g : X 7→ R, X ⊂ R
te x0 točka gomilišta skupa X (x0 može biti jednako ∞). Simbole O(·) i o(·)
definiramo na sljedeći način. Kažemo da se funkcija f ponaša kao O(g) kada
x → x0 i pišemo
f (x) = O(g(x)), x → x0
ako vrijedi
f (x)

lim sup <∞ (2.1)
x→x0 g(x)

Nadalje, kažemo da se funkcija f ponaša kao o(g) i pišemo

f (x) = o(g(x)) x → x0

ako vrijedi

f (x)
lim = 0. (2.2)
x→x0 g(x)

Uočimo najprije da je izraz (2.1) ekvivalentan tvrdnji da postoji konstanta C > 0


f (x)

takva da vrijedi < C, za svako x iz neke okoline točke x0 . Nadalje, važno
g(x)
1
Landauova notacija

23
24 Dodatak

je naglasiti da se znak jednakosti u izrazima (2.1), (2.2) koristi u simboličkom


smislu. Tako naprimjer iz tvrdnji f1 (x) = o(g(x)) i f2 (x) = o(g(x)) ne slijedi
nužno da je f1 = f2 . Ono što u tom slučaju možemo zaključiti je naprimjer da
vrijedi f1 (x) − f2 (x) = o(g(x)), odnosno f1 (x) + f2 (x) = o(g(x)).

Primjer 2.1 Uvjerite se da vrijede sljedeće tvrdnje:

• f (x) = 7x + 6x2 , g(x) = x2 . Vrijedi: f = O(g), x → 1

• f (x) = x ln(1 + x), g(x) = x. Vrijedi: f = o(g), x → 0


x2
• ex = 1 + x + + O(x3 ), x → 0
2
f (x + h) − f (x)
• f ′ (x) = + O(h), h → 0
h
• e−x = o(x−n ), x → ∞ (za sve n ∈ N)

• ln(x) = o(xα ), x → ∞, α > 0

Radna verzija

You might also like