4 Epälineaarisen yhtälön ratkaisu 4.1 Johdanto Tässä luvussa tarkastellaan epälineaarisen yhtälön tai epälieaarisen yhtälöryhmän ratkaisemista. Ongelma voidaan kirjoittaa muotoon: Ratkaise x R n siten, että f(x) = 0, (4.1) missä f : R n R n. Tällöin lukua r R n, joka toteuttaa yhtälön (4.1), kutsutaan yhtälön juureksi tai funktion f nollakohdaksi. Kun n = 1, niin yleinen tehtävä redusoituu funktion f : R R arvojen x hakemiseksi, joille pätee f(x) = 0. Epälineaarisen yhtälön juuren etsimisen ongelma on ollut tutkimuksen aiheena jo kauan. Tutkimuksen juuret ylettyvät aikaan 1700 B.C., jolta ajalta on löydetty epälineaaristen yhtälöiden ratkaisumenetelmillä laskettuja 2:n approksimaatioita jopa 10 5 : tarkuudella. Miksi sitten juurien paikantaminen on tärkeää? Usein ratkaisu tieteelliseen ongelmaan on luku, josta emme tiedä muuta kuin, että se toteuttaa jonkin tietyn yhtälön. Esimerkiksi, planeetan paikaa x kiertoradalla voidaan kuvata ns. Keplerin yhtälön: x asinx = b, avulla, joillekin a ja b. Koska jokainen yhtälö voidaan kirjoittaa siten, että funktio on toisella puolella yhtälöä ja nolla toisella, halutun luvun täytyy olla funktion nollakohta. Joten, jos osaamme ratkaista funktion nollakohdan, niin voimme ratkaista kyseisen ongelman. Kun tietokoneella approksimoidaan funktion nollakohtaa, niin saatetaan löytää useita likiratkaisuja vaikka nollakohta olisikin yksikäsitteinen. Tämä nähdään havainnollisesti kuvasta 1, missä on esitettynä Sun Fire V1280 (OY, lehmus) koneella yksinkertaisella tarkkuudella laskettuna funktion f(x) = (x 1) 6 = x 6 6x 5 +15x 4 20x 3 +15x 2 6x+1 arvoja eo. auki kehiteystä lausekkeesta. Kuvasta havaitaan, että pahimmassa tapauksessa saataisiin vain nollan merkitsevän numeron tarkkuus. Syy tarkkuuden häviämiseen on nyt tavassa, jolla polynomi on kehitetty, tietokoneen laskentatarkkuudessa ja pyöristysvirheissä. Yleinen tekniikka juuren löytämiseksi on approksimoida alkuperäistä funktiota jonolla yksinkertaisempia funktioita, joiden nollakohta on helppo laskea. Tietenkin yksinkertaisempien funktioiden ratkaisujonon tulee supeta kohti alkuperäisen funktion ratkaisua. Joskus voi olla, että alkuperäisellä ongelmalla ei ole ratkaisua, joten sitä ei ole syytä myöskään etsiä numeerisesti. Ratkaisuja voi olla myös useita tai juuret moninkertaisia tai niin lähellä toisiaan, että niiden numeerinen ratkaiseminen on algoritmeille vaikeaa. Näiden seikkojen lisäksi on kiinnitettävä huomiota algoritmin suppenemiseen ja iteraatioiden määrään. 35
143.1 108.7 ( )=( 6-6 5 +15 4-20 3 +15 2-6 +1) 10 7 74.4 f(x) 40.1 5.7-28.6 0.85 0.88 0.91 0.94 0.97 1.00 1.03 1.06 1.09 1.12 1.15 y Kuva 1: Funktion nollakohdan approksimointi yksinkertaisella tarkkuudella lehmus tietokoneessa 4.1.1 Iteratiivisten algoritmien konvergenssianalyysistä Ennen kuin tarkastelemme mitään menetelmää, on hyvä tietää mitä tarkoitetaan menetelmän konvergenssilla. Täydellinen konvergenssianalyysi iteratiivisessa ratkaisemisesa käsittää: Konvergenssitodistuksen x n r, missä r on haettu juuri. Konvergenssivälin määräämisen, eli sen välin määräämisen, mistäx 0 (alkuarvaus) on valittava, jotta menetelmä konvergoi. Konvergenssinopeuden määräämisen. Määritelmä 4.1. Olkoon nyt {x n } n=0 Rm jollain menetelmällä generoitu jono, jolle lim n x n = α. Jos on olemassa luku p ja vakio C > 0 siten että x n+1 α lim n x n α = C p niin p:tä sanotaan jonon {x n } konvergenssin kertaluvuksi ja C:tä sanotaan asymptoottiseksi virhevakioksi. Määritelmä 4.2. Jos on olemassa vakio c [0,1) ja kokonaisluku N 1 siten, että kaikilla n N pätee x n+1 α c x n α sanotaan jonon {x n } suppenevan lineaarisesti. Huomautus 4.1. Useille konvergoiville menetelmile voidaan osoittaa vain, että x n α C n x 0 α, C < 1 Tällöin sanotaan että jonon {x n } konvergenssi on lineaarista keskimääräisellä nopeudella C. 36
Määritelmä 4.3. Jos puolestaan jollain nollaan suppenevalla jonolla {c n } pätee x n+1 α c n x n α sanotaan jonon {x n } suppenevan superlineaarisesti. 4.2 Regula Falsi-menetelmä Olkoon välillä [a,b] voimassa f(a)f(b) < 0. Approksimoidaan nyt käyrää f(x) välillä [a,b] pisteitä (a,f(a)) ja (b,f(b)) yhdistävällä suoralla ja käytetään tämän suoran nollakohtaa c juuren α uutena arviona. Nollakohta c lasketaan seuraavalla kaavalla: b a c = b f(b) f(b) f(a) Soveltamalla kuvattua menetelmää iteratiivisesti saadaan arvio juurelle (halutulla tarkkuudella), olettaen että funktio f on jatkuva. c = b - f(b) 1 b - a f(b)-f(a) f(b) a c 1 c 2 b f(a) Kuva 2: Regula-Falsi menetelmän toiminta Huomautus 4.2. Regula Falsi menetelmän yhteydessä suppeneminen on taattu merkkiehdon ja algoritmin konstruktion perusteella. Voidaan osoittaa, että menetelmä suppenee lineaarisesti nopeudella 0 < C(f, α) < 1. 37
4.2.1 Pseudokoodi procedure RegulaF alsi(f, a, b, root, ǫ, max) integer max real a,b,c,root,ǫ,pastc pastc 2b a for i = 0 to max do c b f(b) (b a)/(f(b) f(a)) if (sign(f(b)) sign(f(c)) 0) then a c else b c end if if ( c pastc ǫ) then root c return else pastc c end if end for end procedure RegulaF alsi 4.3 Puolitusmenetelmä Yksinkertaisin juurenhakumenetelmä on puolitusmenetelmä tai ns. binäärihaku. Menetelmä antaa yhtälön f(x) = 0 ratkaisun, missä f on välillä [a,b] jatkuva funktio siten, että se saa välin päätepisteissä vastakkaismerkkiset arvot, ts. f(a)f(b) < 0. Jatkuvien funktioiden väliarvolauseen nojalla funktiolla f on välillä (a, b) juuri (nollakohta), r, mille pätee f(r) = 0. 4.3.1 Algoritmin toiminta Asetetaan aluksi a 1 = a ja b 1 = b ja lasketaan välin [a,b] keskikohta (kuva 3): r 1 = a 1 + b 1 a 1. 2 Jos f(r 1 ) ε, niin juuri r = r 1 ; jos f(r 1 ) > ε, niin f(r 1 ) on samanmerkkinen joko f(a 1 ):n tai f(b 1 ):n kanssa. Jos sign(f(r 1 )) = sign(f(a 1 )), niin juuri r on välillä (r 1,b 1 ), ja asetetaan a 2 = r 1 ja b 2 = b 1. Muutoin sign(f(r 1 )) sign(f(a 1 )) ja juuri r on välillä (a 1,r 1 ), ja asetetaan a 2 = a 1 ja b 2 = r 1. 38
f(b) y=f(x) r 2 r 3 r 1 a = a r 1 b = b 1 f(a) a r b 1 1 1 a 2 r 2 b 2 a 3 r 3 b 3 Kuva 3: Puolitusmenetelmän toiminta Prosessi toistetaan välillä[a 2,b 2 ] ja sitä jatketaan edelleen, jolloin saadaan[a 3,b 3 ],[a 4,b 4 ],. Jokainen uusi väli sisältää juuren r ja on pituudeltaan puolet edellisestä. 4.3.2 Pseudokoodi Ohjelmalle annetaan syötteenä funktio f, väli (a, b), iteraatioiden maksimi määrä, nmax ja toleranssi error. procedure Bisection(f, a, b, nmax, error) integer n, nmax real a, b, c, fa, fb, fc,error fa f(a) fb f(b) if sign(f a) sign(f b) > 0 then stop "funktio ei leikkaa x-akselia" error b a for n = 0 to nmax do error error/2 c (a+b)/2 fc f(c) output n, c, w if error < ε then exit "convergence" end if if sign(fc) sign(fa) 0 then b c fb fc else a c 39
fa fc end if end for end procedure Bisection Huomautus 4.3. Kun ohjelmassa määrätään väliä [a n,b n ], millä juuri sijaitsee, niin käytetään sign funktiota: 1, jos x < 0, sign(x) = 0, jos x = 0, 1, jos x > 0. (4.2) Testi: sign(fa) sign(fb) > 0 antaa saman tuloksen kuin testi fa fb > 0, mutta välttää kertolskussa mahdollisuutta ylivotoon tai alivuotoon. Yleisenä ohjeena tehtäessä juuren paikantavia ohjelmia, on myös välttää funktion saman arvon laskemista toistamiseen, sillä funktio voi olla monimutkainen ja siten laskennallisesti työläs (eli aikaavievä). Täten jokainen funktion laskettu arvo jota voidaan käyttää myöhemmin on syytä tallentaa. 4.3.3 Konvergenssi analyysi Puolitusmenetelmässä, jokaisella askeleella juuren r sisältävä väli jaetaan kahtia. Ensimmäinen keskipiste r 1 on korkeintaan (b a)/2:n päässä juuresta r. Kun menetelmää jatketaan, saadaan: kuten kuvasta 3 näkee. r r n b n a n 2 Koska jokaisella iteraatiolla väli jaetaan kahtia, voidaan päätellä: r r n b a 2 n (n 1). (4.3) Jos on sovittu joku virhetoleranssi, voidaan laskea tarvittavien iteraatioiden määrä jolla sopiva arvio juurelle saavutetaan. Oletetaan että haluamme r r n < ǫ. Silloin saadaan iteraatioiden lukumäärä ratkaisemalla seuraava yhtälö n:n suhteen: Ottamalla logaritmit, saadaan Erityisesti 2-kantaiselle logaritmille pätee: b a 2 n < ǫ n > log(b a) log(ǫ) log(2) n > log 2 (b a ǫ 40 )
Esimerkki 4.1. Kuinka monta askelta tarvitaan puolitusmenetelmässä laskettaessa funktion f juuri 32-bittisessä konearkkitehtuurissa mahdollisimman tarkasti, kun väli [a,b] = [16,17]? Ratkaisu. Koska juuri on binäärilukujen a = (10000.0) 2 ja b = (10001.0) 2 välissä, niin vastauksesta tiedetään jo 5 bittiä. Koska mantissan pituus on 24 bittiä, niin tarvitsee ratkaista 19 tuntematonta bittiä. Halutaan että viimeinen (vähiten merkitsevä) bitti tulee oikein, ts. virhe < 2 19. Ylläolevasta kaavasta saadaan: 1 2 n < 2 19 n 20. Esimerkki 4.2. Seuraavaksi muutama esimerkki siitä miten puolitusmenetelmä toimii käytännössä. f(x) = x 3 3x+1 välillä [0,1] Seuraavassa taulukossa on tietokoneen laskemat iteraatit funktiolle f(x): n r n f(r n ) virhe 0 0.5-0.375 0.5 1 0.25 0.266 0.25 2 0.375-7.23 * 10 2 0.125 3 0.3125 9.30 * 10 2 6.25 10 2 4 0.34375 9.37 * 10 3 3.125 10 2. 19 0.3472967-9.54 10 7 9.54 10 7 20 0.3472962 3.58 10 7 4.77 10 7 Tarkastellaan myös toista funktiota g(x): g(x) = x 3 2sin(x) välillä [0.5,2] Tällöin 20 ensimmäistä iteraatiota tuottavat seuraavat tulokset: n r n f(r n ) virhe 0 1.25 5.52 * 10 2 0.75 1 0.875-0.865 0.375 2 1.0625-0.548 0.188 3 1.15625-0.285 9.38 10 2 4 1.203125-0.125 4.69 10 2. 19 1.2361827-4.88 * 10 6 1.43 10 6 20 1.2361834-2.15 * 10 6 7.15 10 7 Huomautus 4.4. Kaavasta (4.3) nähdään, että puolitusmenetelmä suppenee lineaarisesti, keskimääräisellä nopeudella 1 2. 41
4.4 Newtonin menetelmä Newtonin menetelmä on tärkeimpiä proseduureja numeerisessa analyysissa, ja sitä voidaan soveltaa, useissa eri tilanteissa, kuten epälineaaristen yhtälöiden (yhtälöryhmien), differentiaaliyhtälöiden ja integraaliyhtälöiden numeeriseen ratkaisemiseen. Erityisesti, kun sitä sovelletaan reaaliarvoisen funktion nollakohdan hakuun, sitä kutsutaan myös Newton-Raphson iteraatioksi. Newtonin menetelmä on nopeampi kuin puolitusmenetelmä tai sekanttimenetelmä, koska sen suppeneminen on kvadraattista (neliöllistä). Kuitenkin, iteraation arvon täytyy olla jo aika lähellä yhtälön juurta kun kvadraattinen konvergenssi tulee voimaan. 4.4.1 Newtonin menetelmän johtaminen Newtonin menetelmässä oletetaan, että funktio f on differentioituva. Tämä tarkoittaa sitä, että funktion jokaisessa pisteessä on yksikäsitteinen tangenttilinja, toisin sanoen derivaatta on olemassa. Tarkastellaan seuraavaksi yksinkertaista ideaa. Geometrinen tulkinta idealle on esitetty kuvassa 4. Suora y = l(x) on tangentti käyrälle y = f(x). Se leikkaa x-akselin pisteessä x 1. Suoran l(x) kulmakerroin on f (x 0 ). y=l(x) y=f(x) r x 2 x 0 x 1 Kuva 4: Newtonin menetelmän toiminta Tietyssä pisteessä(x 0,f(x 0 )) funktionf tangentti on sangen hyvä approksimaatio funktiolle f pisteen x 0 läheisyydessä. Analyyttisesti tämä tarkoittaa, että lineaarinen funktio l(x) = f (x 0 )(x x 0 )+f(x 0 ) on lähellä funktiota f pisteen x 0 ympäristössä. Pisteessä x 0 funktiot f ja l ovat samat. Tällöin funktion l juuri on funktion f juuren approksimaatio. Funktion l juuri löytyy helposti: x 1 = x 0 f(x 0) f (x 0 ) 42
Siten, aloitettaessa pisteestä x 0, samme uuden arvon x 1 eo. kaavasta. Luonnollisesti iterointia voidaan jatkaa, tuottaen jonon pisteitä: x 2 = x 1 f(x 1) f (x 1 ) x 3 = x 2 f(x 2) f (x 2 ). Mikäli iteraatio suppenee x n lähestyy funktion f nollakohtaa r. Toinen tapa tulkita Newtonin menetelmää on käyttää Taylorin sarjaa. Mikäli x 0 on riittävän lähellä funktion nollakohtaa, voimme kysyä: Millainen korjaus h tulee lisätä arvoon x 0, jotta saadaan "tarkka"juuri? Ts. halutaan, että f(x 0 +h) = 0 Jos funktio f on riittävän hyvin käyttäytyvä, niin se voidaan kirjoittaa Taylor sarjan avulla: f(x 0 )+hf (x 0 )+ h2 2! f (x 0 )+... = 0 Askeleen h määrääminen yo yhtälöstä ei ole helppoa, joten luovutaan tavoitteesta päästä yhdellä askella "tarkkaan"ratkaisuun. Otetaan sarjasta käyttöön vain kaksi ensimmäistä termiä: f(x 0 )+hf (x 0 ) = 0 Ratkaisemalla h, saadaan: ja uusi approksimaatio on: h = f(x 0) f (x 0 ) x 1 = x 0 +h Kun Newtonin menetelmää kuvataan iteraatiojonolla x 0,x 1,x 3,..., niin seuraava kaava pätee jonon alkioille: x n+1 = x n f(x n) (4.4) f (x n ) 4.4.2 Pseudokoodi Pseudokoodi Newtonin menetelmälle voidaan kirjoittaa seuraavasti: procedure Newton(f,f,x,nmax,ǫ,δ) integer n, nmax real x, fx, fp, ǫ, δ interface external function f, f fx f(x) 43
output 0, x, fx for n = 1 to nmax do fp f (x) if fp < δ then output "Hajaantuminen" return end if d fx/fp x x d fx f(x) output n,x,fx if d < ǫ then output "Konvergenssi" return end if end for end procedure N ewton Käyttäen muuttujan x alkuarvoa aloituspisteenä, menetelmä käy läpi maksimäärän nmax iteraatioita. Proseduurille täytyy antaa syötteenä ulkopuoliset funktiot f(x) ja f (x). Parametrit ǫ ja δ kontrolloivat poseduurin suppenemista (ja ne liittyvät käytetyn tietokoneen laskentatarkkuuteen). 4.4.3 Menetelmän havainnollistaminen Seuraavassa sovellamme menetelmää funktioon f(x) = x 3 2x 2 + x 3, aloittaen pisteestä x 0 = 4. Nyt, f (x) = 3x 2 4x + 1, ja nämä funktiot on syytä asettaa ns. sisäkkäismuotoon (nested form) tehokkuuden vuoksi: f(x) = ((x 2)x+1)x 3 f (x) = (3x 4)x+1 Todetaksemme Newtonin menetelmän nopean konvergenssin, käytämme Lehmuksessa vähintään 24 desimaalin tarkkuutta liukulukulaskennassa ja saamme seuraavat tulokset: ite x fx x-xo 1 3.000000000000000000000000 0.90E+01 0.1000E+01 2 2.437500000000000000000000 0.20E+01 0.5625E+00 3 2.213032716315109771846750 0.26E+00 0.2245E+00 4 2.175554938721488266705989 0.65E-02 0.3748E-01 5 2.174560100666445745931704 0.45E-05 0.9948E-03 6 2.174559410293312394020825 0.22E-11 0.6904E-06 7 2.174559410292980074202319 0.50E-24 0.3323E-12 8 2.174559410292980074202319 0.39E-33 0.7700E-25 44
Tuloksesta nähdään tarkkuuden tuplaantuminen funktion f(x) ja myös x:n arvoissa kunnes tietokoneen maksimaalinen laskentatarkkuus on saavutettu. 4.4.4 Konvergenssi analyysi Soveltamalla Newtonin menetelmää käytännön ongelmiin huomataan helposti että menetelmä konvergoi nopeasti lähelle juuren tarkkaa arvoa. Tämä selviää myös tarkastelemalla aiempaa esimerkkiä. Itse-asiassa, oikeiden numeroiden määrä lähes tuplaantuu joka iteraatiolla. Usein kuusi tai viisi iteraatiota on tarpeeksi jotta saadaan riittävän tarkka arvio juurelle. Tälle väitteelle on olemassa myös teoreettista tukea, kuten seuraavassa osoitetaan. Olkoon funktiolla f jatkuvat derivaatat f ja f, ja olkoon r etsitty juuri. Oletetaan myös, että r on yksinkertainen juuri; eli f (r) 0. Tällöin Newtonin menetelmä, aloitettuna tarpeeksi läheltä juurta r, konvergoi neliöllisesti juureen r. Tämä tarkoittaa sitä että virheet peräkkäisissä askelissa toteuttavat seuraavan epäyhtälön: r x n+1 c r x n 2 (4.5) Todistamme tämän tuloksen, mutta ensin epäformaali tarkastelu voi olla havainnollistava. Oletetaan yksinkertaisuuden vuoksi, että c = 1. Oletetaan myös että x n on estimaatti juurelle r joka eroaa juuresta enintään yhdellä yksiköllä k:ssa desimaalissa. Tämä tarkoittaa sitä että r x n 10 k Epäyhtälö (4.5) antaa ymmärtää että r x n+1 10 2k Toisin sanoen, x n+1 eroaa juuresta r enintään yhdellä yksiköllä desimaalipaikassa 2k. Täten muuttujassax n+1 on suurinpiirtein kaksi kertaa niin monta merkitsevää numeroa kuin muuttujassa x n. Lause 4.1. Olkoot f(x),f (x) ja f (x) jatkuvia funktion f juuren r ympäristössä ja f (r) 0, silloin on olemassa δ > 0 siten, että jos Newtonin menetelmän alkupiste toteuttaa r x 0 δ, niin x n toteuttaa saman epäyhtälön ja {x n } suppenee kvadraattisesti kohti juurta r; ts. r x n+1 c(δ) r x n 2 missä c(δ) on määritelty yhtälöllä (4.7). Todistus. Merkitään aluksi e n = r x n. Tällöin pätee: e n+1 = r x n+1 = r x n + f(x n) f (x n ) = e n + f(x) f (x) = e nf (x n )+f(x n ) f (x n ) Taylorin lauseen nojalla on olemassa piste α n pisteiden x n ja r välissä, jolle pätee: 0 = f(r) = f(x n +e n ) = f(x n )+e n f (x n )+ 1 2 e2 nf (α n ) 45
Viimeinen yhtälö voidaan järjestellä uudelleen seuraavasti e n f (x n )+f(x n ) = 1 2 e2 nf (α n ) Jos tätä nyt sovelletaan edellä olevaan e n+1 :n lausekkeeseen, niin saadaan Seuraavaksi määrittelemme funktion e n+1 = 1 2 ( f (α n ) ) e 2 f n (4.6) (x n ) c(δ) = 1 2 max f (x) x r δ min f (x) x r δ (δ > 0) (4.7) Tämän määritelmän johdosta voimme sanoa, että mille tahansa kahdelle pisteelle x ja α jotka ovat korkeintaan etäisyydenδ päässä juurestar, pätee epäyhtälö 1 2 f (α)/f (x) c(δ). Valitaan nyt δ niin pieneksi että δc(δ) < 1. Tämä on mahdollista sillä kun δ lähestyy nollaa, c(δ) konvergoi lukuun 1 2 f (r)/f (r), ja siten δc(δ) konvergoi nollaan. Tässä vaiheessa on hyvä muistaa, että oletimme f (r) 0. Olkoon β = δc(δ). Oletamme nyt, että δ, c(δ) ja β ovat kiinnitetty siten, että pätee β < 1. Oletetaan edelleen, että joku iteraatti x n on etäisyyden δ sisällä juuresta r. Tällöin e n = r x n δ ja α n r δ. Funktion c(δ) määritelmän mukaan, saadaan että 1 2 f (α n ) / f (x n ) c(δ). Yhtälöstä (4.6) saamme e n+1 = 1 f (α n ) e 2 2 f n c(δ)e 2 n δc(δ) e n = β e n. (x n ) Tästä seuraa, että myös x n+1 on etäisyydellä δ juuresta r koska r x n+1 = e n+1 β e n e n δ. Jos aloituspiste x 0 valitaan etäisyyden δ sisällä juuresta r, niin e n β e n 1 β 2 e n 2 β n e 0 Koska 0 < β < 1, lim n β n = 0 ja lim n e n = 0. Toisin sanoen Tässä prosessissa, e n+1 c(δ)e 2 n. lim x n = r. n 46
Kuten edellisestäkin voidaan päätellä, on Newtonin menetelmässä käytettävä harkintaa sen suhteen, mistä pisteestä juuren etsintä aloitetaan. Usein tässä harkinassa riittää kun tiedetään funktion kuvaaja karkeasti. Usein puolitusmenetelmää käytetään aluksi, jotta löydettäisiin piste tarpeeksi läheltä juurta, ja Newtonin menetelmää käytetään juuren tarkkuuden parantamiseen. Vaikka Newtonin menetelmä onkin loistava keksintö, sen konvergenssi riippuu vaatimuksista joita on usein vaikea tietää etukäteen. On olemassa tilanteita, joissa menetelmä ei konvergoi. Seuraavissa kuvissa esitellään tällaisia tilanteita. x 2 x 1 x 0 r Kuva 5: Newtonin menetelmä, huono alkupiste Tässä kuvassa nähdään miten voi käydä jos aloituspiste x 0 valitaan liian kaukaa juuresta r. Kuten kuvasta näkyy, voi tällöin menetelmä ajautua vain kauemmaksi juuresta. x 2 x 1 r x 0 Kuva 6: Newtonin menetelmä, siksak Tässä tapauksessa syntyy menetelmässä sykli pisteiden x 0 ja x 1 välillä. Tietokoneella laskiessa voi pyöristysvirheiden ja rajallisen tarkkuuden takia menetelmä kuitenkin lopulta päästä eroon syklistä. r x 0 Kuva 7: Newtonin menetelmä, gradientti nolla Joskus voi myös valitun aloituspisteen x 0 tangentti olla yhdensuuntainen x-akselin kanssa, jolloin x 1 = ±. 47
Esimerkki 4.3. Lasketaan a:n arvo Newtonin menetelmällä. Arvon a laskeminen on ekvivalenttia yhtälön f(x) = x 2 a = 0 ratkaisemisen kanssa. Newtonin menetelmä antaa: x n+1 = x n f(x n) f (x n ) = x n x2 n a 2x n = 1 2 (x n + a x n ) (4.8) Lause 4.2. Kaikilla 0 < x 0 < kaava (4.8) generoi vähenevän jonon x 1 x 2 x 3... a, mikä konvergoi a:han. Todistus. x n+1 a = 1 2 (x n + a x n ) a = 1 2x n (x 2 n +a 2 ax n ) = 1 2x n (x n a) 2 0 x n+1 a, n (jono on rajoitettu alhaalta). x n x n+1 x n x x+1 = x n 1 2 x n 1 a = 1 (x 2 n a) 0 2x n 2x n n (jono on vähenevä). Jokainen vähenevä, rajoitettu jono konvergoi x = lim n x n (x ) x = 1 2 (x + a x ) (x ) 2 = 1 2 (x ) 2 + 1 2 a x = a Huomautus 4.5. Edellä oleva analyysi osoitti, että neliöllisen suppenemisen toteutuminen vaatii oletuksen f (r) 0 voimassaolon. Jos f (r) = 0, niin r on sekä funktion f että funktion f juuri. Juurta sanotaan silloin funktion f moninkertaiseksi juureksi - tässä tapauksessa kaksinkertaiseksi juureksi. Newtonin menetelmä moninkertaiselle juurelle konvergoi lineaarisesti nopeudella (m 1)/m, missä m on juuren kertaluku. Jos tiedetään etukäteen, että juuren kertaluku 1 on m > 1, niin Newtonin menetelmän kvadraattinen konvergenssi säilyy jos iterointikaavaa muutetaan seuraavasti: x n+1 = x n m f(x n) f (x n ). 1 Juuren kertaluku on pienin luku m siten, että f (k) (r) = 0 kaikille 0 k < m, mutta f (m) (r) 0. 48
Esimerkki 4.4. Lasketaan Newtonin menetelmällä funktion f(x) =(x 1.1) 3 (x 2.1) =2.7951+x( 8.954+x(10.56+x( 5.4+x))) kolminkertainen juuri α = 1.1 lehmus-tietokoneen yksinkertaisella tarkkuudella. Saadaan iteraatiojono ite x fx r-x suhde 1 0.892856 0.03510 0.207144 0.690 2 0.958167 0.01073 0.141833 0.685 3 1.003566 0.00326 0.096434 0.680 4 1.034795 0.00098 0.065205 0.676 5 1.056101 0.00030 0.043899 0.673 6 1.070516 0.00009 0.029484 0.672 7 1.080193 0.00003 0.019807 0.672 8 1.086508 0.00001 0.013492 0.681 9 1.090797 0.00000 0.009203 0.682 Viimeiseen sarakkeeseen on kirjattu suhde: α x n α x n 1 x n+1 x n x n x n 1 2 3 Teoriasta tiedetään, että Newtonin menetelmä suppenee m-kertaiselle juurelle lineaarisesti nopeudella m 1 m, ts. x n+1 x n m 1 m x n x n 1 Laskemalla muutama Newtonin iteraatio, voidaan juuren kertaluku m ratkaista yhtälöstä 2 3 = m 1 m = 3 m Huomautus 4.6. Jos juuren kertaluku m 2, niin puolitusmenetelmä konvergoi vähintään yhtä nopeasti. Taulukosta nähdään myös, että kun f(x) = 0, niin juuri x on vielä aika kaukana tarkasta arvostaan α = 1.1. Tämä selittyy tietysti f(x):n laskennassa tapahtuneilla pyöristysvirheillä. Ainoa tapa saada tarkkoja tuloksia moninkertaiselle juurelle onkin analyyttisesti alentaa juuren kertalukua muodostamalla uusi funktio, jolle α on yksinkertainen juuri. Kun juuren kertaluku m on selvitetty, voidaan laskea analyyttisesti F(x) = f (m 1) (x) minkä yksinketainen juuri α on. Kun sovelletaan ideaa edelliseen tehtävään, saadaan f (x) = 21.12 32.4x+12x 2 = 0 49
ite x fx r-x 1 1.018182 2.88000 0.081818 2 1.089913 0.57124 0.010087 3 1.099804 0.06175 0.000196 4 1.100000 0.00117 0.000000 5 1.100000-0.00000 0.000000 Newtonin menetelmä konvergoi nopeasti tarkkaan ratkaisuun, kuten taulukosta nähdään. 4.5 Algoritmien lopetustesteistä epälineaarisen yhtälön ratkaisussa Yleisesti käytetty kriteeri on tutkia, onko f(x n ) ε Tässä on kuitenkin oma vaaransa, sillä väliarvolauseen nojalla f(x n ) = f(x n ) f(α) = f (ξ n )(x n α), missä ξ n [α,x n ] tai ξ n [x n,α], eli α x n = f(x n) f (ξ n ). Jos nyt, f (α) 1 α x n f(x n ). Testi antaa hyvän tuloksen. f (α) << 1 α x n >> ε. Ei olla lähelläkään juurta. f (α) >> 1 α x n << ε. Ollaan laskettu "turhan tarkasti". Tapauksia on havainnollistettu kuvassa (8) f(x) f(x) a x n x n a a - x << f(x ) n n a - x >> f(x ) n n Kuva 8: Erilaisia lopetustestejä Toinen tapa lopettaa iterointi on tutkia, milloin x n+1 x n ε 50
Myös tämä testi sopii hyvin Newtonin menetelmälle, sillä jos x n on lähellä α:aa niin pätee, että f (x n ) f (ξ n ) ja saadaan: Siis x n+1 x n = f(x n) f (x n ) f(x n) f (ξ n ) = α x n. x n+1 x n ε α x n ε Testin huono puoli on että, jos menetelmä konvergoi hitaasti niin x n+1 x n voi tulla pieneksi vaikka ei olla lähelläkään juurta. Tuloksen oikeellisuuden varmistamiseksi kannattaa ohjelmaan laittaa molemmat lopetustestit. Hyvissä kirjasto-ohjelmissa on myös testejä, joilla tutkitaan onko käyttäjän antama tarkkuusvaatimus realistinen koneen laskentatarkkuuteen nähden. 4.6 Epälineaarisen yhtälöryhmän ratkaisu Newtonin menetelmä epälineaarisen yhtälöryhmän ratkaisussa käyttää samaa periaatetta kuin yhden yhtälönkin ratkaisemisessa, toisin sanoen: linearisoidaan ja ratkaistaan ja toistetaan askelia tarpeellinen määrä. Tarkastellaan menetelmää kolmen yhtälön ja kolmen tuntemattoman tapauksessa. f 1 (x 1,x 2,x 3 ) = 0 f 2 (x 1,x 2,x 3 ) = 0 (4.9) f 3 (x 1,x 2,x 3 ) = 0 Olkoon (x 1,x 2,x 3 ) yhtälön (4.9) likiratkaisu. Määrätään korjaus (h 1,h 2,h 3 ) siten, että (x 1 +h 1,x 2 +h 2,x 3 +h 3 ) on parempi likiratkaisu. Linearisoimalla funktioden Taylorkehitelmät, saadaan f 1 f 1 f 1 0 = f 1 (x 1 +h 1,x 2 +h 2,x 3 +h 3 ) f 1 (x 1,x 2,x 3 )+h 1 +h 2 +h 3 x 1 x 2 x 3 f 2 f 2 f 2 0 = f 2 (x 1 +h 1,x 2 +h 2,x 3 +h 3 ) f 2 (x 1,x 2,x 3 )+h 1 +h 2 +h 3 x 1 x 2 x 3 f 3 f 3 f 3 0 = f 3 (x 1 +h 1,x 2 +h 2,x 3 +h 3 ) f 3 (x 1,x 2,x 3 )+h 1 +h 2 +h 3 x 1 x 2 x 3(4.10) missä osittaisderivaatat lasketaan pisteessä (x 1,x 2,x 3 ). Yhtälö (4.10) on lineaarinen yhtälöryhmä muuttujan h = (h 1,h 2,h 3 ) suhteen. Kerroinmatriisi on funktion f = 51
(f 1,f 2,f 3 ) Jacobin matriisi: f 1 f 1 f 1 x 1 x 2 x 3 f 2 f 2 f 2 J = x 1 x 2 x 3 f 3 f 3 f 3 x 1 x 2 x 3 (4.11) Jos J on ei-singulaarinen, niin yhtälöryhmän (4.10) ratkaisu on: h 1 f 1 (x 1,x 2,x 3 ) h 2 = J 1 f 2 (x 1,x 2,x 3 ) h 3 f 3 (x 1,x 2,x 3 ) Newtonin menetelmä voidaan nyt kirjoittaa 3 3 epälineaariselle yhtälöryhmälle seuraavasti: x (k+1) 1 x (k+1) 2 x (k+1) 3 = x (k) 1 x (k) 2 x (k) 3 + h (k) 1 h (k) 2 h (k) 3 missä h on ratkaistu lineaarisesta yhtälöryhmästä: h 1 f 1 (x 1,x 2,x 3 ) J h 2 = f 2 (x 1,x 2,x 3 ) h 3 f 3 (x 1,x 2,x 3 ) Mikäli J on lähellä singulaarista, yhtälöryhmän ratkaiseminen on vaikeaa. Yleisessä tapauksessa n:n yhtälön ja n:n tuntemattoman epälineaarinen yhtälöryhmä voidaan esittää vektorimuodossa seuraavasti: missä sarakevektorit f(x) = 0. f = [f 1,f 2,,f n ] T, x = [x 1,x 2,,x n ] T. Tällöin Newtonin menetelmä yhtälöryhmälle on: missä f (x (n) ) on Jacobin matriisi. x (n+1) = x (n) f (x (n) ) 1 f(x (n) ), 4.7 Kiintopistemenetelmä Newtonin menetelmä on eräs esimerkki proseduurista, missä jono ratkaisun likiarvoja lasketaan muodosta: x n+1 = F(x n ) (n 0) (4.12) 52
Algoritmia kutsutaan funktionaaliseksi iteraatioksi (functional iteration). Newtonin menetelmässä F on F(x) = x f(x) f (x). Iteraatiokaava 4.12 ei välttämättä suppene (esim. F(x) = 3x), mutta me olemme kiinnostuneita tapauksista, missä lim x n = s. n Mikä on silloin s:n ja F:n välinen yhteys? Jos F on jatkuva, niin F(s) = F ( lim n x n ) = lim n F(x n ) = lim n x n+1 = s. Siis, F(s) = s, ja lukua s kutsutaan funktion F kiintopisteeksi. (Kiintopiste on siis arvo, mihin funktio "lukittuu"iteratiivisessa prosessissa.) Useat matemaattiset ongelmat, esim. optimoinnin tai DY:n saralla, voidaan muuttaa kiintopisteongelmaksi. Analysoidaan jatkossa tapausta, missä F kuvaa jonkin suljetun joukon C R itselleen. Lause 4.3 käsittelee ns. kutistavaa kuvausta. Kuvausta F sanotaan kutistavaksi (contractive), mikäli on olemassa 0 < γ < 1, siten, että F(x) F(y) γ x y kaikille x,y C (4.13) Lause 4.3. Olkoon g : [a,b] [a,b] kutistava funktio. Tällöin sillä on täsmälleen yksi kiintopiste x = g(x ). Lisäksi iteraatio x k+1 = g(x k ) suppenee kiintopisteeseen kaikilla x 0 [a,b]. Todistus. Todistus tehdään kahdessa vaiheessa: 1. Osoitetaan, että iteraation antama jono x k suppenee: x k+1 x k = g(x k ) g(x k 1 ) γ x k x k 1... γ k x 1 x 0. Olkoon p > k. Tällöin x p x k x p x p 1 + x p 1 x p 2 +...+ x k+1 x k (γ p 1 +γ p 2 +...+γ k ) x 1 x 0 = γ k1 γp k 1 γ x 1 x 0 γk 1 γ x 1 x 0. Täten x p x k < ε kaikilla p > k, kun k riittävän suuri. Täten {x k } on Cauchyjono 2 ja on olemassa raja-arvo x = lim k x k. 2 Jono {x k } on Cauchy jono, jos jostakin indeksistä k > p alkaen erotukset x p x k < ε 53
2. Osoitetaan, että x on kiintopiste: x g(x ) x g(x k 1 ) + x k g(x ) = x x k + g(x k 1 ) g(x ) Siis x = g(x ). x x k +γ x k 1 x 0, kun k. Esimerkki 4.5. Lasketaan esimerkkinä kiintopistemenetelmää käyttäen 2. Neliöjuuri saadaan ratkaisemalla epälineaarinen yhtälö Yhtälö voidaan kirjoittaa muotoon x 2 2 = 0. x = 1 2 x+ 1 x =: g(x). Nyt funktio g : [1, 2] [1, 2] on kutistava, sillä g(x) g(y) = g (ξ) x y 1 x y, ξ ]x,y[, 2 joten sillä on yksikäsitteinen kiintopiste x [1,2]. Iteraatio suppenee nopeasti: x 0 =1 x 1 = 1 2 1+ 1 1 = 1.5 x 2 = 1 2 1.5+ 1 1.5 = 1.416666666666666 x 3 =1.4142156862745096 x 4 =1.4142135623746898 x 5 =1.414213562373095 x 6 =1.414213562373095. Koska oikeiden numeroiden määrä noin kaksinkertaistuu joka iteraatiolla voidaan tässä tapauksessa epäillä kvadraattista konvergenssia. Huomautus 4.7. Funktion g(x) nopea suppeneminen edellä ei ole mikää vahinko, sillä jos iteraatiofunktiolle g pätee g (α) = 0 ja g (α) 0, niin konvergenssin kertaluku on kaksi: α x k+1 =g(α) g(x k ) =g (α)(α x k )+ 1 2 g (ξ k )(α x k ) 2 c(x k α) 2, kun k on riittävän iso. Yleisemminkin voidaan osoittaa, että kiintopistemenetelmän x n+1 = g(x n ) konvergenssiaste on ensimmäinen kokonaisluku q siten, että g (q) 0. 54
Huomautus 4.8. Kutistuvuuden nojalla kiintopisteiteraation suppeneminen on aina vähintään lineaarista, sillä α x k+1 = g(α) g(x k ) L α x k, missä 0 < L < 1. Esimerkki 4.6. Osoita, että jono {x n }: { x 0 = 15 konvergoi. x n+1 = 3 1 2 x n (n 0) Ratkaisu. Funktio F(x) = 3 1 2 x n on kutistava kuvaus, koska F(x) F(y) = 1 3 2 x 3+ 1 2 y 1 = y x 1 y x 2 2 kolmioepäyhtälön nojalla. Lauseen 4.3 nojalla jono konvergoi kohti kiintopistettä, mikä on 2. 4.8 Sekanttimenetelmä Eräs Newtonin menetelmän huonoista puolista on, että siinä tarvitaan funktion f derivaattaa. Sekanttimenetelmä muistuttaa Newtonin menetelmää sillä erolla, että siinä derivaatta f (x n ) on korvattu lausekkeella f(x n ) f(x n 1 ) x n x n 1. Lisäksi menetelmä suppenee lähes yhtä nopeasti kuin Newtonin menetelmäkin. Derivaatan korvaaminen eo. lausekkeella perustuu tietoon, että Nyt kun h on pieni voidaan olettaa että f (x) = lim h f(x+h) f(x) h f (x) f(x+h) f(x) h Erityisesti kun x = x n ja h = x n 1 x n, saamme f (x n ) f(x n 1) f(x n ) x n 1 x n Kun tämä sijoitetaan Newtonin iteraatiokaavaan (4.4) saadaan sekanttimenetelmä ( x n+1 = x n x n x n 1 f(x n ) f(x n 1 ) ) f(x n ) (4.14) 55
x 3 x 2 x1 x 0 Kuva 9: Sekanttimenetelmä Sekanttimenetelmää voidaan Newtonin menetelmän tavoin soveltaa myös epälineaarisen yhtälöryhmän ratkaisemiseen. Sekanttimenetelmän nimi tulee siitä tosiseikasta, että lauseke f(x n 1 ) f(x n ) x n 1 x n on funktion f kuvaajan sekanttilinjan kulmakerroin. Huomautus 4.9. Sekanttimenetelmässä x n+1 riippuu kahdesta edellisestä iteraatiopisteestä. Täten myös menetelmää aloitettaessa tarvitaan kaksi pistettä, x 0 ja x 1. Huomattavaa on myös, että laskettaessaf(x n ) f(x n 1 ) voi tuloksena olla lähes nolla, mikä voi johtaa ylivuotoon suoritettaessa jakoa. Itse-asiassa f(x n ) f(x n 1 ) lähestyy nollaa aina kun menetelmä konvergoi. Mikäli f(x n ) ja f(x n+1 ) ovat samanmerkkisiä voidaan vähennyslaskussa menettää merkitseviä numeroita. Tämän vuoksi on syytä lopettaa iterointi kun lauseke f(x n ) f(x n 1 ) δ f(x n ), δ 1 2 10 6. 4.8.1 Algoritmi Seuraava sekanttimenetelmän algoritmi etsii funktion f juuren annetulta väliltä [a,b], iteroiden korkeintaan nmax kertaa. procedure Secant(f, a, b, nmax, ǫ) integer n, nmax real a, b, fa, fb, ǫ, d interface external function f fa f(a) fb f(b) if fa > fb then a b fa fb end if output 0,a,fa output 1,b,fb for n = 2 to nmax do if fa > fb then 56
a b fa fb end if d (b a)/(fb fa) b a fb fa d d fa if d < ǫ then output "Convergence" return end if a a d fa f(a) output n,a,fa end for end procedure Secant Edellä tarkoittaa muuttujien arvojen vaihtamista keskenään. Päätepisteet [a, b] vaihdetaan tarvittaessa, jotta aina pätisi f(a) f(b). Tästä seuraa, että funktion itseisarvoista muodostuva jono on vähenevä; ts. f(x n ) f(x n+1 ) kun n 1. Seuraavassa taulukossa on laskettuna iteraatteja funktiolle f(x) = x 5 + x 3 + 3 kun alkuarvoina ovat x 0 = 1 ja x 1 = 1. n x n f(x n ) 0 1.0 1.0 1 1.0 5.0 2 1.5 7.99 3 1.05575 0.512 4 1.11416 9.991 10 2 5 1.10462 7.593 10 3 6 1.10529 1.010 10 4 7 1.10530 4.768 10 7 8 1.10530 4.768 10 7 4.8.2 Konvergenssi analyysi Sekanttimenetelmän etu verrattuna Newtonin menetelmään on, että ensimmäisen askeleen jälkeen tarvitsee laskea funktion arvo vain kerran jokaisella iteraatiolla. Menetelmä on myös melkeinpä yhtä nopeasti konvergoiva kuin Newtonin menetelmä. Konvergenssille pätee seuraava lause. Lause 4.4. Olkoon f(x),f (x) ja f (x) jatkuvia välillä I ε = [r ε,r+ε],ε > 0. Olkoon f (x) 0, x I ε. Silloin, jos alkupisteet x 0 ja x 1 on valittu riittävän läheltä juurta r, niin (4.14):n määräämä iteraatiojon {x n } suppenee kohti r:ää. Konvergensille pätee e n+1 A e n (1+ 5)/2 57
missä A = f (r) 0.62. 2f (r) Todistus. Sekanttimenetelmän määritelmästä saadaan: e n+1 = x n+1 r = f(x n)x n 1 f(x n 1 )x n f(x n ) f(x n 1 ) r = f(x n)e n 1 f(x n 1 )e n f(x n ) f(x n 1 ) Ottamalla edellä tekijäksie n e n 1 ja kertomalla luvulla(x n x n 1 )/(x n x n 1 ) saadaan: [ e n+1 = Taylorin lauseen nojalla Koska f(r) = 0, saadaan: x n x n 1 f(x n ) f(x n 1 ) ][ f(xn )/e n f(x n 1 )/e ] n 1 e n e n 1 (4.15) x n x n 1 f(x n ) = f(r+e n ) = f(r)+e n f (r)+ 1 2 e2 nf (r)+o(e 3 n) f(x n ) e n = f (r)+ 1 2 e nf (r)+o(e 2 n) Vaihtamalla indeksointi n n 1, saadaan f(x n 1 ) e n 1 Vähentämällä yhtälöt toisistaan, sadaan: = f (r)+ 1 2 e n 1f (r)+o(e 2 n 1) f(x n )/e n f(x n 1 )/e n 1 = 1 2 (e n e n 1 )f (r)+o(e 2 n 1). Koska x n x n 1 = e n e n 1, saadaan f(x n )/e n f(x n 1 )/e n 1 x n x n 1 1 2 f (r). Ensimmäinen hakasulkulauseke yhtälössä (4.15) voidaan kirjoittaa muotoon: Nyt, yhtälö (4.15) saadaan muotoon: x n x n 1 f(x n ) f(x n 1 ) 1 f (r). e n+1 1 f (r) 2 f (r) e ne n 1 = Ce n e n 1. (4.16) Lauseke on samantyyppinen kuin Newtonin menetelmän todistuksessa lauseke (4.6) (konvergenssin osoittaminen menisi myös samaan tyyliin, mutta ohitetaan se). Oletetaan, että menetelmä konvergoi Konvergenssiasteen määräämiseksi oletetaan, että seuraava asymptoottinen relaatio pätee: e n+1 A e n α, (4.17) 58
missä A on positiivinen vakio. Tämä tarkoittaa, että e n+1 /(A e n α ) n 1, eli konvergenssin aste on α. Nyt e n A e n 1 α ja e n 1 (A 1 e n ) 1/α. (4.18) Sijoitetaan yhtälöön (4.16) asymptoottiset arvot yhtälöistä (4.17) ja (4.18) niin saadaan: A e n α C e n A 1/α e n 1/α, mikä voidaan edelleen kirjoittaa muotoon: A 1+1/α C 1 e n 1 α+1/α. (4.19) Koska relaation vasen puoli 0 ja e n 0, niin voidaan päätellä, että 1 α+1/α = 0. Yhtälön positiivinen juuri on α = 1 + 5/2 1.62. Siis, sekanttimenetelmä suppenee superlineaarisesti. Asymptoottinen virhevakio A voidaan määrätä yhtälöstä (4.19) koska siinä oikea puoli on 1, saadaan: A = C 1/(1+1/α) = C 1/α = C α 1 = C 0.62 = f (r) 0.62. 2f (r) A:n avulla saadaan sekanttimenetelmälle e n+1 A e n (1+ 5)/2. Huomautus 4.10. Koska konvergenssin aste 1.62 < 2, niin sekanttimenetelmä konvergoi nopeammin kuin puolitusmenetelmä mutta hitaammin kuin Newtonin menetelmä. Kuitenkin sekanttimenetelmässä tarvitaan vain yksi funktion kehittäminen joka askeleella kun taas Nevtonin menetelmä vaatii kaksi: f ja f. Koska algoritmissa suurin aika menee yleensä funktion arvon laskemiseen, niin kaksi sekanttimenetelmän askelta on ajallisesti verrannollinen yhteen Newtonin menetelmän askeleeseen. Kahdelle sekanttimenetelmän askeleelle pätee: e n+2 A e n+1 α A 1+α e n α2 = A 1+α e n (3+ 5)/2 Tupla-askeleen konvergenssi on (3 + 5)/2 = 2.62, mikä on parempi kuin Newtonin menetelmän konvergenssi yhdellä askeleella. 4.9 Polynomin juuren laskeminen Mikä tahansa edellä esitetyistä menetelmistä - erityisesti Newtonin menetelmää - voidaan soveltaa polynomin juuren hakuun kun halutaan löytää tietty juuri, minkä alkuarvaus on annettu. Kuitenkin algebran peruslauseen nojalla polynomilla p(z) = a n z n +a n 1 z n 1 +...+a 2 z 2 +a 1 z 1 +a 0, a n 0,a k,z C, k = 0,...,n (4.20) on tarkalleen n reaalista tai kompleksista juurta kun juurien kertaluku otetaan huomioon. 59
Määritelmä 4.4. Funktiolla f(z) on kertalukua p oleva juuri α, jos f(z) = (z α) p h(z), missä h(α) 0 ja h(z) on jatkuva pisteessä z = α. Esimerkki 4.7. Korkean kertaluvun funktiot käyttäytyvät hankalasti. Tarkastellaan esimerkkinä polynomiyhtälön x n ratkaisemista. Selvästi ratkaisu on x = 0, mutta yhtälön x n = ε ratkaisulle saadaan arvio x = ε 1/n. Jos { n = 10, ε = 10 10 = x = (10 10 ) 1/10 = 0.1, eli virhe on kasvanut kertoimella 10 9. 4.9.1 Hornerin algoritmi Polynomin arvo pisteessä z voidaan kehittää tehokkaasti Hornerin algoritmin avulla. Algoritmi tunnetaan myös nimillä sisäkkäinen kertominen (nested multiplication) tai synteettinen jako (synthetic division). Hornerin kaavan avulla polynomi (4.20) voidaan kirjoittaa muotoon: p(z) = a 0 +z(a 1 +z(a 2 +z(a 3...+z(a n 1 +a n z))...)) Kun polynomi kehitetään tästä muodosta, niin tarvitaan n yhteenlaskua ja n kertolaskua. Muoto (4.20) vaatii n yhteenlaskua ja 2n 1 kertolaskua. Kun polynomi p(z) ja luku z 0 on annettu, niin Hornerin algoritmi tuottaa luvun p(z 0 ) ja polynomin q(z) = p(z) p(z 0) z z 0. Polynomin q asteluku on yhtä astetta alempi kuin polynomin p asteluku. Edellisestä yhtälöstä saadaan: p(z) = (z z 0 )q(z)+p(z 0 ) (4.21) Olkoon tuntematon polynomi q(z) esitetty muodossa: q(z) = b 0 +b 1 z +...+b n 1 z n 1 Kun tämä q(z):n muoto ja vastaava p(z) muoto sijoitetaan yhtälöön (4.21) niin saadaan: p(z 0 )+(z z 0 )q(z) = p(z 0 )+(z z 0 )(b 0 b 1 z +...+b n 1 z n 1 ) =(p(z 0 ) b 0 z 0 )+(b 0 +b 1 z 0 )z +...+(b n 2 b n 1 z 0 )z n 1 +b n 1 z n =a 0 +a 1 z +...+a n z n 60
Samanasteisten termien kertoimia vertaamalla voidaan Hornerin kaava kirjoittaa rekurssion muotoon: { b n 1 = a n, b k 1 = a k +z 0 b k, k = n 1,n 2,...,0 jolloin b 1 = p(z 0 ). Hornerin algoritmi voidaan kirjoittaa seuraavasti: input n, (a i : 0 i n), z 0 b n 1 a n for k = n 1 to 0 do b k 1 a k +z 0 b k end do output (b i : 1 i n 1) Jos Hornerin algoritmia ratkaistaan kynällä ja paperilla, niin kannattaa käyttää seuraavanlaista taulukkomuotoa apuna. a n a n 1 a n 2... a 0 z 0 z 0 b n 1 z 0 b n 2... z 0 b 0 b n 1 b n 2 b n 3... b 1 Esimerkki 4.8. Ratkaise Hornerin algoritmilla arvo p(3), kun p(z) = z 4 4z 3 +7z 2 5z 2 Järjestetään luvut taulukon mukaisesti, saadaan: 1 4 7 5 2 3 3 3 12 21 1 1 4 7 19 Siten, p(3) = 19, ja voidaan kirjoittaa p(z) = (z 3)(z 3 z 2 +4z +7)+19 Hornerin algoritmia voidaan käyttää myös polynomin asteen alentamiseen (deflation). Nimittäin, jos z 0 on polynomin juuri, niin z z 0 on polynomin p eräs tekijä (myös käänteinen pätee). Polynomin p muut juuret ovat n 1 -asteisen polynomin p(z)/(z z 0 ):lla juuria. Esimerkki 4.9. Alenna edellisen esimerkin polynomin p asteluku, kun sen eräs juuri on 2. Käytetään jälleen taulukkoa apuna, saadaan: 61
1 4 7 5 2 2 2 4 6 2 1 2 3 1 0 Siten, p(z) = z 4 4z 3 +7z 2 5z 2 = (z 2)(z 3 2z 2 +3z +1) Hornerin algoritmin avulla voidaan löytää myös helposti polynomin Taylorin kehitelmä mv. pisteessä. Olkoon p(z) n-asteinen polynomi ja haetaan kertoimia c k seuraavasta muodosta: p(z) = a n z n +a n 1 z n 1 +...+a 2 z 2 +a 1 z 1 +a 0 = c n (z z 0 ) n +c n 1 (z z 0 ) n 1 +...+c 0 [ Tiedetään, että kertoimet ovat c k = p (k) (z 0 )/k!, mutta haetaan tehokasta tapaa kehittää niiden arvot.] Koska p(z 0 ) = c 0, niin se saadaan kehittämällä polynomin arvo pisteessä z 0. Algoritmi tuottaa myös polynomin q(z) = p(z) p(z 0) z z 0 = c n (z z 0 ) n 1 +c n 1 (z z 0 ) n 2 +...+c 1. Tästä nähdään, että seuraava kerroin saadaan soveltamalla Hornerin kaavaa polynomiin q pisteessä z 0, koska c 1 = q(z 0 ). Posessia jatketaan kunnes kaikki kertoimet on saatu laskettua. Esimerkki 4.10. Tarkastellaa edelleen esimerkin (4.8) polynomia pisteessä z 0 = 3. Saadaan 1 4 7 5 2 3 3 3 12 21 1 1 4 7 19 3 3 6 30 1 2 10 37 3 3 15 1 5 25 3 3 1 8 Polynomi voidaan kirjoittaa pisteen 3 ympäristössä Taylorin kehitelmänä muotoon: p(z) = (z 3) 4 +8(z 3) 3 +25(z 3) 2 +37(z 3)+19 Algoritmissa ("täydellinen Hornerin algoritmi") voidaan tallettaa luvut c k lukujen a k päälle: input n, (a i : 0 i n), z 0 for k = 0 to n 1 do for j = n 1 to k do 62
a j a j +z 0 a j+1 end do end do output (a i : 0 i n) Sovelletaan nyt Newtonin menetelmää polynomin juurien laskemiseen. Newtonin menetelmä on z k+1 = z k p(z k) p (z k ) Tarvitaan tehokas menetelmä polynomin arvojen p(z k ),p (z k ) laskemiseksi. Elellä esitetyn nojalla p(z 0 ) = c 0 ja p (z 0 ) = c 1 kun polynomia kehitetään pisteessä z 0 Taylor kehitelmäksi. Pseudokoodi lukujen α = p(z 0 ) ja β = p (z 0 ) laskemiseksi kun x 0 on annettu on seuraava: input n, (a i : 0 i n), z 0 α a n β 0 for k = n 1 to 0 do β = α+z 0 β α = a k +z 0 α end do output α,β Jos horner(n, (a i : 0 i n), z 0,α,β) viitaa edelliseen pseudokoodiin, niin pseudokoodi Newtonin menetelmälle polynomin juuren hakemiseksi voidaan kirjoittaa seuraavasti: input n, (a i : 0 i n), z 0,M,ε for j = 1 to M do call horner(n, (a i : 0 i n), z 0,α,β) z 1 z 0 α/β output α,β,z 1 if z 1 z 0 < ε stop z 0 z 1 end do Huomautus 4.11. Polynomien juuret ovat tunnetusti polynomin kertoimien jatkuvia funktioita. Siinä mielessä juuren etsimisen ongelma on hyvin asetettu. Sen sijaan ongelman ehtoluku sattaa olla iso ja tehtävä on silloin vaikea ratkaista numeerisesti. Moninkertaiset juuret ovat hankalia ratkaista, mutta on myös polynomeja, joilla on selvästi separoituvat juuret, mutta ne ovat herkkiä pienille häiriöille polynomin kertoimissa. Olkoon α polynomin p(x) yksinkertainen reaalijuuri, ts. p(α) = 0. Tarkastellaan häirittyä polynomia p ε (x) := p(x) + εq(x), missä ε > 0 on "pieni"häiriö. Olkoon α(ε) häirityn polynomin juuri, ts. p(α(ε))+εq(α(ε)) = 0. 63
Derivoimalla puolittain ε:n suhteen, saadaan ja edelleen p (α(ε))α (ε)+q(α(ε))+εq (α(ε))α (ε) = 0, α q(α(ε)) (ε) = p (α(ε))+εq (α(ε)). Jos ε on riittävän pieni, niin on voimassa kehitelmä α(ε) = α+α (0)ε+O(ε 2 ). Sijoittamalla tähän edellä laskettuα (ε):n lauseke, saadaan häirityn polynomin juurelle arvio α(ε) = α ε q(α) p (α) +O(ε2 ). Esimerkki 4.11. Olkoon p(x) = (x 7) 2 (x 8), q(x) = x 3 ja ε = 10 4.Tarkastellaan yksinkertaista juurta α = α(0) = 8. Häiritylle juurelle saadaan arvio α(ε) 8 ε 83 1 2 7.949 Tässä tapauksessa juuri on varsin herkkä korkeimman potenssin kertoimen häiriölle. Esimerkki 4.12. Tarkastellaan polynomin f(x) =(x 1)(x 2)(x 3)(x 4)(x 5)(x 6)(x 7) =x 7 28x 6 +322x 5 1960x 4 +6769x 3 13132x 2 +13068x 5040 (4.22) juuren stabiilisuutta. Selvästikin polynomilla on separoituvat juuret {1,2,3,4,5,6,7}. Muutetaan x 6 :n kerrointa 28 28.002 ja lasketaan näin saadun häirityn polynomin f ε (x) = f(x) 0.002x 6 (4.23) neljä ensimmäistä juurta Newtonin menetelmällä. Lakennasa on käytetty lehmus tietonetta ja yksinkertaista tarkkuutta. Lähtötiedossa oleva suhteellinen virhe on 0.002/28 = 7.14 10 5. Saadaan juuret: tarkka juuri häiritty juuri erotus 1 1.0000024-0.238E-05 2 1.9989333 0.107E-02 3 3.0332289-0.332E-01 4 3.8194211 0.181E+00 Havaitaan, että 4. juuressa on noin 5%:n virhe. Virhe kasvoi noin 1000-kertaiseksi. 64
Esimerkki 4.13. Tarkastelaan kaavan (4.22) polynomia ja lasketaan arvio häirityn polynomin (4.23) juurelle kun tarkka f(x):n juuri on α(0) = 4. f (4) = (4 1)(4 2)(4 3)(4 5)(4 6)(4 7) = 36 g(4) = 4 6 = 4069 α (0) = 4069 36 114 α(ε) 4+114 ( 0.002) = 3.772 Arvo on hyvin lähellä tietokoneella laskettua juuren approksimaatiota. 65