Numeerinen analyysi Harjoitus 1 / Kevät 2017 Palautus viimeistään perjantaina 3.3. Tehtävä 1: Oheinen MATLAB-funktio toteuttaa eksponenttifunktion evaluoinnin. 1 function y = seriesexp ( x ) 2 oldsum = 0; 3 newsum = 1; 4 term = 1; 5 n = 0; 6 7 while newsum ~= oldsum 8 n = n + 1; 9 term = term x / n ; 10 oldsum = newsum ; 11 newsum = newsum + term ; 12 end ; 13 y = newsum ; 14 end a) Tutki kokeellisesti virhettä eri x:n arvoilla välillä x [ 20, 20]. (Oletus: exp(x) on tarkka.) Mitä voit sanoa rutiinin tarkkuudesta, kun todellinen vastaus on suuruudeltaan 10 9? b) Laske absoluuttinen ja suhteellinen häiriöalttius funktiolle f(x) = exp(x). Onko tehtävä häiriöaltis vai onko algoritmi epästabiili? Ratkaisu 1: a) Kokeilemalla näyttäisi siltä että vihe on suurimmillaan luokkaa 10 9. Esimerkiksi pisteessä x = 20 saadaan >> tarkka=exp(-20) tarkka = 2.0612e-09 >> rutiini=seriesexp(-20) rutiini = Tiedostoa viimeksi muokattu: 6. maaliskuuta 2017 1/2
5.6219e-09 >> virhe=abs(tarkka-rutiini) virhe = 3.5607e-09 >> suhteellinen=virhe/tarkka suhteellinen = 1.7275 Rutiinin suhteellinen virhe on siis yli 170 %. b) Funktion absoluuttinen häiriöalttius on C(x) = lim f(ˆx) f(x) ˆx x ˆx x = f (x) = exp(x) ja suhteellinen häiriöalttius K(x) = lim f(ˆx) f(x) ˆx x f(x) x ˆx x = xf (x) f(x) = x. Annetussa alueessa K(x) < 20, joten tehtävä on suhteellisesti stabiili. Tehtävä on myös absoluuttisesti stabiili kun x < 0, sillä tällöin C(x) < 1. Vika ei siis ole tehtävässä vaan siinä että algoritmi on epästabiili. Tehtävä 2: Olkoon y = z 1 + z 2, missä z 1 = (x 2 + 1) 1/2, z 2 = 200 x, x = 100 ± 1. Selvästi luvuille z 1 ja z 2 saadaan virhearviot z 1 = 100 ± 1 ja z 2 = 100 ± 1. Voisimme siis tyytyä arvioon y = 200±2. Todellisuudessa y saadaan kuitenkin yllä annetuilla tiedoilla lasketuksi paljon tarkemmin, sillä virheet luvuissa z 1 ja z 2 kumoavat toisensa. a) Laske luku y virhearvioineen mahdollisimman tarkasti. Virhettä voit arvioida derivaatan avulla: y x dy dx. b) Miten voisit laskea y:n ilman tarvetta evaluoida neliöjuurta tarkasti? Tiedostoa viimeksi muokattu: 6. maaliskuuta 2017 2/2
Ratkaisu 2: Lasketaan y x dy dx = dz 1 dx + dz 2 dx = x(x2 + 1) 1/2 1 = x x 2 + 1 x2 + 1 = x 2 (x 2 + 1) x2 + 1(x + x 2 + 1) 1 2x. 2 Sijoittamalla tehtävän lukuarvot saadaan virhearvio y 1 2 10 4. Toisaalta annetuilla arvoilla y 200.0050. Vastaus virhearvioineen on siis y = 200.0050 ± 1 2 10 4. Ongelmana tässä laskutavassa on että tarkan vastauksen saamiseksi on luku z 1 tiedettävä vähintään neljän desimaalin tarkkuudella. Jos y kuitenkin kirjoitetaan muotoon y = ( x 2 + 1 x) + 200 = x2 + 1 x 2 x2 + 1 + x + 200 = 1 x + x 2 + 1 + 200, niin vastaus saadaan tarkasti vaikka neliöjuuren approksimaatio olisikin epätarkka. Tehtävä 3 ( ): Liukulukuoperaatioille on voimassa virhekaava fl(x op y) = (x op y)(1 + δ), missä op kuvaa jotakin peruslaskutoimituksista (+,,, /) ja δ < ε (kone-epsilon). Tästä seuraa että liukulukujen x 1, x 2,..., x n tulolle on voimassa fl(x 1 x 2... x n ) = x 1 x 2 (1 + δ 2 )x 3 (1 + δ 3 )... x n (1 + δ n ), missä δ i ε, i = 2, 3,..., n. Oletetaan (varsin realistisesti) että (n 1) ε < 0.1 ja määritellään suhteellinen virhe γ > 0 siten että fl(x 1 x 2... x n ) x 1 x 2... x n = γ x 1 x 2... x n. Laske yläraja luvulle γ eli etsi C siten että γ < C (n 1) ɛ. Ratkaisu 3: Tehtävän tiedoilla joten γ = (1 + δ 2 )(1 + δ 3 )... (1 + δ n ) 1, γ (1 + ε) n 1 1. Tämän arvioimiseksi merkitään j = n 1 ja kirjoitetaan ln(1 + ε) j = j ln(1 + ε) < jε. Eksponenttifunktion sarjakehitelmää ja geometrisen sarjan summaa hyödyntämällä saadaan (1 + ε) j < e jε (1 + ε) j 1 < (jε) + (jε)2 + (jε)3 +... ( 2! 3! ( ) ( ) 2 ( ) 3 jε jε jε (1 + ε) j 1 < jε 1 + + + +...) 2 2 2 ( (1 + ε) j 1 < jε 1 + 0.05 ) < 1.06jε. 1 0.05 Tiedostoa viimeksi muokattu: 6. maaliskuuta 2017 3/2
Siispä γ < 1.06(n 1)ε. Tehtävä 4 ( ): [Greenbaum & Chartier 6.3, teht. 5] Oletetaan, että a 0 euroa on talletettu pankkiin, joka maksaa korkoa korolle 5 neljännesvuosittain. Vuoden kuluttua alkuperäisen talletuksen arvo on siis a 0 (1 + 0.05/4) 4. Yleinen kaava, kun korkokertojen lukumäärä on n ja korkoprosentti x, on ( a 0 I n (x), missä I n (x) = 1 + n) x n. a) Määritä I n (x):n suhteellinen häiriöalttius. Onko tehtävä häiriöaltis, kun x = 0.05? b) Määritä lim n I n (x) ja laske funktion I n (x) arvoja, kun x = 0.05 ja n = 1, 10, 100..., 10 k. Kuinka suuri k:n pitää olla, ennen kuin tulokset eivät enää vastaa odotuksia? c) Oletetaan nyt että n on mielekäs ja merkitään z = (1 + x/n). Mikä on tehtävän f(z) = z n suhteellinen häiriöalttius? Jos z:n evaluoinnin virhe on suuruudeltaan 10 16, niin mikä on virheen suuruusluokka z n :lle? Ratkaisu 4: a) Tekijän I n (x) suhteellinen häiriöalttius on K(x) = xi n(x) I n (x) = x ( 1 + ) x n 1 ( n x ) 1 + x n = ( ) n 1 + x. n Saadaan 0.05 K(0.05) = ( ) 1 + 0.05 < 0.05 n Tehtävä ei siis ole ainakaan suhteellisesti häiriöaltis. b) Raja-arvo osoittautuu eksponenttifunktion määritelmäksi: lim I n(x) = lim (1 + x ) n = exp(x). n n n Matlabilla laskien saadaan >> format long >> x=0.05; >> exp(x) ans = 1.051271096376024 >> I=@(n) (1+x/n)^n; Tiedostoa viimeksi muokattu: 6. maaliskuuta 2017 4/2
>> vals=[1:15] ; for k=1:15; vals(k)=i(10^k); end; vals vals = 1.051140132040790 1.051257959948043 1.051269782331887 1.051270964967927 1.051271083242487 1.051271094975911 1.051271095925162 1.051271100712011 1.051271100723838 1.051271100725021 1.051275769317030 1.051229084331091 1.052396831174442 1.045409757483308 1.000000000000000 Funktion arvot näyttäisivät aluksi suppenevan kohti lukua exp(x) kuten pitääkin. Kuitenkin noin indeksistä k = 11 eteenpäin pyöristysvirhe alkaa dominoida, eivätkä funktion arvot enää käyttäydy odotetusti. c) Tehtävän suhteellinen häiriöalttius on K(z) = zf (z) f(z) = nz n z n = n. Jos siis z:n evaluoinnin virhe on luokkaa 10 16 (kone-epsilon), niin z n :n virhe on luokkaa n 10 16. Kun esimerkiksi n = 15 niin saadaan z n :n virheeksi 10 1. Matlab-koodin antamat tulokset selittyvät siis sillä että lukua z ei lasketa tarkasti. Tiedostoa viimeksi muokattu: 6. maaliskuuta 2017 5/2