Numeerinen analyysi Harjoitus 3 / Kevät 2017 Palautus viimeistään perjantaina 17.3. Tehtävä 1: Tarkastellaan funktion f(x) = x evaluoimista välillä x [2.0, 2.3]. Muodosta interpoloiva polynomi p 3 (x), kun y i = f(x i ), missä x i = 2.0 + 0.1i ja i {0, 1, 2, 3}. Laske virhearvio ja piirrä (esimerkiksi Matlabilla) virhefunktio R(x) = f(x) p 3 (x). Mikä on virhe pisteissä 2.05 ja 2.25? Ratkaisu 1: Aloitetaan kokoamalla funktion f(x) arvot datapisteissä taulukoksi: x 2.0 2.1 2.2 2.3 f(x) 1.414... 1.449... 1.483... 1.516... Lasketaan interpolaatiopolynomi vaikkapa Newtonin muodossa. Jaetut erotukset ovat: f[x 0 ] = 1.414... f[x 1 ] = 1.449... f[x 0, x 1 ] = 0.349... f[x 2 ] = 1.483... f[x 1, x 2 ] = 0.341... f[x 0, x 1, x 2 ] = 0.041... f[x 3 ] = 1.516... f[x 2, x 3 ] = 0.333... f[x 1, x 2, x 3 ] = 0.038... f[x 0, x 1, x 2, x 3 ] = 0.009... Taulukon ensimmäinen sarake on tiedossa. Loput alkiot voidaan laskea näistä rekursiivisesti. Alkio d ij saadaan kaavasta Newtonin polynomi on nyt d ij = d i,j 1 d i 1,j 1 x i 1 x i j. p(x) = a 0 + a 1 (x x 0 ) + a 2 (x x 0 )(x x 1 ) + a 3 (x x 0 )(x x 1 )(x x 2 ), missä kertoimet a 0, a 1, a 2 ja a 4 ovat taulukon diagonaalialkiot. Sijoittamalla lukuarvot ja sieventämällä saadaan p(x) = 0.457687157... + 0.639961999... x 0.099335410... x 2 + 0.009243006... x 3 Interpolaatiovirhe on R(x) = f(x) p 3 (x) = f (3+1) (ξ) (3 + 1)! 3 (x x j ) j=0 = f (4) (ξ) (x 2.0)(x 2.1)(x 2.2)(x 2.3). 24 Tiedostoa viimeksi muokattu: 11. maaliskuuta 2017 1/5
Tässä f (4) (ξ) = 15 16 x 7 15 2 16 2.3 7 2 0.082864, kun x [2.0, 2.3]. Saadaan siis virhearvio R(x) 4 10 3 (x 2.0)(x 2.1)(x 2.2)(x 2.3). Piirretään nyt Matlabilla todellinen virhe ja virhearvio samaan kuvaan >> f = @(x) sqrt(x); >> p3 = @(x) 0.457687157 + 0.639961999*x - 0.099335410*x^2 + 0.009243006*x^3; >> virhearvio = @(x) 4*10^(-3)*abs((x - 2.0)*(x - 2.1)*(x - 2.2)*(x - 2.3)); >> x=2.0:0.01:2.3; >> virhe = x; >> arvio = x; >> for i=1:length(x);... virhe(i) = abs(f(x(i))-p3(x(i))); arvio(i) = virhearvio(x(i));... end; >> plot(x,virhe,x,arvio) ja saadaan oheinen kuva, josta nähdään että virhearvio pitää paikkansa. Virhe pisteissä 2.05 ja 2.25 on R(2.05) 2.6 10 7 ja R(2.25) 2.4 10 7. 4 10-7 3.5 3 2.5 2 1.5 1 0.5 0 2 2.05 2.1 2.15 2.2 2.25 2.3 Kuva 1: Kuva keskipistesäännöllä laskettavasta pinta-alasta. Tehtävä 2 (Greenbaum & Chartier 8.8, teht. 3): a) Kirjoita jaetut erotukset ja Newtonin interpolaatiopolynomi seuraavalle datapisteistölle: Tiedostoa viimeksi muokattu: 11. maaliskuuta 2017 2/5
x 1 3/2 0 2 f(x) 2 6 0 14 b) Näytä, miten saamasi polynomin arvo annetussa pisteessä x voidaan evaluoida neljällä askeleella hieman samaan tapaan kuin Hornerin säännöllä. Yleistä menettely n-asteiselle polynomille. a) On annettu neljä pistettä, joten käytetään kolmannen asteen Newtonin polyno- Ratkaisu 2: mia p(x) = a 0 + a 1 (x x 0 ) + a 2 (x x 0 )(x x 1 ) + a 3 (x x 0 )(x x 1 )(x x 2 ). Jaetut erotukset on kätevää koota taulukoksi f[x 0 ] = 2 f[x 1 ] = 6 f[x 2 ] = 0 f[x 3 ] = 14 f[x 0, x 1 ] = 6 2 = 8 3/2 1 f[x 1, x 2 ] = 0 6 = 4 f[x 0 3/2 0, x 1, x 2 ] = 4 8 = 4 0 1 f[x 2, x 3 ] = 14 0 = 7 f[x 2 0 1, x 2, x 3 ] = 7 4 = 6 f[x 2 3/2 0, x 1, x 2, x 3 ] = 6 4 = 2. 2 1 Taulukon ensimmäinen sarake on tiedossa. Loput alkiot voidaan laskea näistä rekursiivisesti. Alkio d ij saadaan kaavasta d ij = d i,j 1 d i 1,j 1 x i 1 x i j. Newtonin interpolaatiopolynomin kertoimet a 0, a 1, a 2 ja a 3 ovat edellisen taulukon diagonaalialkiot. Interpolaatiopolynomi siis on p(x) = 2 + 8(x 1) + 4(x 1)(x 3/2) + 2(x 1)(x 3/2)(x 0) = 2x 3 x 2 + x. On helppo tarkistaa, että saatu polynomi kulkee annettujen pisteiden kautta. b) Polynomin arvo pisteessä x voidaan evaluoida neljällä askeleella käyttäen seuraavaa algoritmia Askel 1: Asetetaan y = a 3. Askel i = 2, 3, 4: Korvataan y arvolla y(x x 4 i ) + a 4 i. Vastaavasti n-asteisen Newtonin muotoa olevan polynomin arvo voidaan evaluoida n askeleella seuraavasti Askel 1: Asetetaan y = a n 1. Askel i = 2, 3,..., n: Korvataan y arvolla y(x x n i ) + a n i. Tiedostoa viimeksi muokattu: 11. maaliskuuta 2017 3/5
Tehtävä 3: Olkoon f(x) = 28 13x 2 + 8x + 4. Muodosta Lagrangen muotoa oleva interpolaatiopolynomi p(x), joka interpoloi funktiota f pisteissä x 0 = 5, x 1 = 1, x 2 = 0 ja x 3 = 1. Näytä, että myös polynomi q(x) = p(x) x 4 5x 3 + x 2 + 5x interpoloi funktiota f annetuissa pisteissä. Miksi tämä ei ole ristiriidassa interpolaatiopolynomin yksikäsitteisyyden kanssa? Ratkaisu 3: Lasketaan interpolaatiopolynomi vaikkapa Lagrangen muodossa. Saadaan ϕ 0 (x) = ϕ 1 (x) = ϕ 2 (x) = ϕ 3 (x) = joten kysytty polynomi on (x + 1)(x 0)(x 1) ( 5 + 1)( 5 0)( 5 1) = 1 120 (x x3 ) (x + 5)(x 0)(x 1) ( 1 + 5)( 1 0)( 1 1) = 1 8 ( 5x + 4x2 + x 3 ) (x + 5)(x + 1)(x 1) (0 + 5)(0 + 1)(0 1) = 1 5 (5 + x 5x2 x 3 ), (x + 5)(x + 1)(x 0) (1 + 5)(1 + 1)(1 0) = 1 12 (5x + 6x2 + x 3 ), p(x) = f( 5)ϕ 0 (x) + f( 1)ϕ 1 (x) + f(0)ϕ 2 (x) + f(1)ϕ 3 (x) = 476 120 (x x3 ) + 84 8 ( 5x + 4x2 + x 3 ) + 56 5 (5 + x 5x2 x 3 ) + 140 12 (5x + 6x2 + x 3 ) = 7x 3 + 56x 2 + 21x + 56. Olkoot nyt q(x) = p(x) x 4 5x 3 + x 2 + 5x = x 4 + 2x 3 + 57x 2 + 26x + 56. Nähdään että q( 5) = 476, q( 1) = 84, q(0) = 56 ja q(1) = 140 eli myös q interpoloi funktiota f annetuissa pisteissä. Teorian mukaan mille tahansa pistejoukolle (x i, y i ), i = 0, 1,... n on olemassa yksikäsittäinen polynomi p astetta n siten että y i = p(x i ). Nyt kuitenkin n = 3 ja polynomi q on astetta n + 1, joten tehtävä ei ole ristiriidassa interpolaatiopolynomin yksikäsitteisyyden kanssa. Tehtävä 4 ( ): Funktio f(x) = cos(x) taulukoidaan arvoilla x k = k m 45, k = 0, 1,..., m. Taulukkoa käytettäessä muodostetaan toisen asteen interpolaatiopolynomi argumenttia x lähinnä olevista taulukkopisteistä ja käytetään polynomin arvoa f(x):n approximaationa. Miten suuri m on valittava, jos halutaan, että interpolaatiovirheelle pätee f(x) p(x) 10 5. Ratkaisu 4: Interpolaatiovirheen kaava on R(x) = f(x) p(x) = f (n+1) (ξ) (n + 1)! n (x x j ), missä n on interpolaatiopolynomin aste, x j :t ovat interpolaatiopisteitä ja ξ on jokin tuntematon piste interpolointivälillä. Tehtävän tapauksessa n = 2, joten lasketaan f (ξ) = sin(ξ). On helppo todeta että funktion sin(ξ) suurin arvo taulukointivälillä ξ [0, π] on 1 4 2. Toisin sanoen f (ξ) 1 2 ja saadaan siis R(x) 1 n 6 x x j. 2 Tiedostoa viimeksi muokattu: 11. maaliskuuta 2017 4/5 j=0 j=0
Olkoot nyt x lähimpänä taulukointipistettä x k eli x x k < h, missä h = π. Tällöin etäisyydet 2 4m lähimpään kolmeen taulukointipisteeseen ovat x x k, x x k + h ja x x k h ja siten R(x) 1 6 2 (x x k)(x x k + h)(x x k h). Merkitään u = x x k ja g(u) = u(u + h)(u h) = u 3 h 2 u. Jälleen on helppo todeta että funktion g(u) suurin arvo välillä u [ h, h 3h3 ] on. Sjoittamalla tämä virhekaavaan saadaan 2 2 8 R(x) 1 6 2 3h3 8 0.0442 h3. Jos halutaan että R(x) 10 5, on valittava h 0.0609 (rad) 3.49. Siis valinta m = 13 on riittävä. Matlab-tehtävä 2 (Greenbaum & Chartier 8.8, teht. 4 abc): Tässä tehtävässä voi olla hyötyä Matlabin rutiineista polyfit ja polyval. Ensimmäistä voi käyttää apuna interpolaatiopolynomien muodostamisessa. Jälkimmäistä taas voi käyttää polynomin arvojen evaluoimiseen annetulla välillä ja siten tarvittavien kuvien piirtämiseen. Ohjeita rutiinien käyttämiseen saa komennoilla help polyfit ja help polyval. a) Käytä Matlabia sovittaaksesi 12. asteen polynomi funktiolle f(x) = 1 1 + x 2 siten, että se interpoloi funktiota 13 tasan jakautuneessa pisteessä välillä -5 ja 5. Pisteet saat muodostettua komennolla x = [-5:5/6:5];. Piirrä itse funktio sekä muodostamasi 12. asteen interpolaatiopolynomi samaan kuvaan. b) Toista a-kohta käyttäen 12. asteen polynomia, joka interpoloi funktiota f skaalatuissa Chebyshevin pisteissä ( ) πj x j = 5 cos, j = 0,..., 12. 12 c) Jos annetulle funktiolle yrittää Matlabin polyfit-rutiinilla sovittaa liian korkea-asteista polynomia, saa Matlabilta varoituksen, jonka mukaan tehtävä on huonosti asetettu eivätkä tulokset välttämättä ole tarkkoja. Barysentristä interpolaatiokaavaa voi kuitenkin yhä käyttää ja tässä tapauksessa painot saadaan kaavasta w j = 2n 1 5 n n { ( 1) j /2 jos j = 0 tai j = n ( 1) j muulloin, missä edessä oleva kerroin supistuu itse asiassa pois lopullisesta polynomin lausekkeesta. Muodosta tällä tavoin tarkempi approksimaatio funktiolle f käyttäen interpolaatiopisteinä 21 skaalattua Chebyshevin pistettä ( ) πj x j = 5 cos, j = 0,..., 20. 20 Piirrä kuva interpolaatiopolynomista p 20 (x) ja virheistä f(x) p 20 (x) välillä [ 5, 5]. Tiedostoa viimeksi muokattu: 11. maaliskuuta 2017 5/5
Palauta Matlab-tehtävä kurssin sivuilla annettujen ohjeiden mukaan. Tiedostoa viimeksi muokattu: 11. maaliskuuta 2017 6/5
%*****a-kohta***** %Interpolaatiopisteet x = [-5:5/6:5]; y = 1./(1 + x.^2); plot(x, y, 'ko'); %Piirretään samaan kuvaan hold on; %Tiheämpi jako piirtämistä varten xx = [-5:0.01:5]; %Alkuperäinen funktio fy = 1./(1 + xx.^2); plot(xx, fy); %Interpolaatiopolynomi p = polyfit(x, y, 12); py = polyval(p, xx); plot(xx, py, 'g'); %Otsikko title('tasavälisissä pisteissä laskettu interpolaatiopolynomi') %*****b-kohta***** %Uusi kuva figure(); hold on; %Interpolaatiopisteet j = [0:1:12]; x = 5*cos(pi*j/12); y = 1./(1 + x.^2); plot(x, y, 'ko'); %Alkuperäinen funktio fy = 1./(1 + xx.^2); plot(xx, fy); %Interpolaatiopolynomi p = polyfit(x, y, 12); py = polyval(p, xx); plot(xx, py, 'g'); %Otsikko title('chebyshevin pisteissä laskettu interpolaatiopolynomi') %*****c-kohta***** %Uusi kuva 1
figure(); hold on; %Interpolaatiopisteet j = [0:1:20]; x = 5*cos(pi*j/20); y = 1./(1 + x.^2); plot(x, y, 'ko'); %Barysentrisen interpolaation painot w = (-1).^j; w(1) = w(1)/2; w(21) = w(21)/2; %Alkuperäinen funktio fy = 1./(1 + xx.^2); plot(xx, fy); %Barysentrinen interpolaatiopolynomi p = @(t) sum(w.*y./(t - x)) / sum(w./(t - x)); for i = 1:length(xx) py(i) = p(xx(i)); end %Silmukan sijaan voisi käyttää komentoa py = arrayfun(p, xx) plot(xx, py, 'g'); %Otsikko title('interpolaatio barysentristä muotoa käyttäen') %Virheet figure(); ey = abs(py - fy); plot(xx, ey, 'r'); %Otsikko title('barysentrisen muodon virheet') %HUOM: Barysentrinen interpolaatiokaava ei ole määritelty %interpolaatiopisteissä. Tästä syystä edellä oleva koodi antaa vektorin py %ensimmäiseksi ja viimeiseksi arvoksi NaN (Not a number). Harkitummassa %toteutuksessa barysentristä kaavaa tulisi käyttää vain %interpolaatiopisteiden ulkopuolella. Edellä tämä seikka on jätetty %huomiotta selkeyden säilyttämiseksi. 2
3
4
Published with MATLAB R2013b 5