Luento 5: Suurten lineaaristen yhtälöryhmien ratkaiseminen iteratiivisilla menetelmillä Matriisit voivat olla kooltaan niin suuria, että LU-hajotelman laskeminen ei ole järkevä tapa ratkaista lineaarista yhtälöryhmää Ax = b, (1) missä A R n n on kääntyvä matriisi. Yksi syy on se, että noin 2 3 n3 floppia on kestämättömän paljon, kun n = 10 5 tai enemmän. Myös muistin määrä asettaa rajoituksia sille, kuinka suuria matriiseja voidaan säilyttää tietokoneen muistissa. Matriisi, jonka koko on n n edellyttää siis, että n 2 lukua voidaan säilyttää muistissa. Tosin usein suuret matriisit ovat harvoja, eli niissä on huomattavan vähän nollasta poikkeavia alkioita. Tällöin matriisista säilötään muistiin vain nollasta poikkeavat alkiot (sekä tietenkin niiden sijainti matriisissa). Tällöin n voi olla valtavan paljon suurempi kuin mitä ennalta arvioiden tuntui mahdolliselta. Esimerkki 1 Matriisia kutsutaan tridiagonaaliseksi, jos siinä esiintyy nollasta poikkeavia alkioita vain päädiagonaalilla sekä ensimmäisillä ala-ja ylädiagonaaleilla. Tällöin muistin tarve on vain 3n lukua verrattuna n 2 :een, jos nollatkin säilytettäisiin muistissa. (Esimerkiksi, jos n = 10 4, niin n 2 = 10 8. Mutta harvuus huomiomalla matriisin koko n voisikin olla yli 30 miljoonaa.) Seuraavaksi tarkastelemme niin sanottuja iteratiivisia menetelmiä, joiden avulla yhtälöryhmän (1) ratkaisua x = A 1 b pyritään approksimoimaan ilman, että matriisista lasketaan hajotelmaa. Lähestymistapa on tällöin täysin erilainen. Lähtökohdaksi voidaan mieltää sarjaoppi. Sarjoista muistamme, että laskemalla summien s k = 1 + x + x 2 + k k ja xs k = x+x 2 + x k+1 erotuksen saamme s k = 1 xk+1 1 x, kun x 1. Erityisesti, kun x < 1, pätee (1 x) 1 = x j. kunhan annamme k:n kasvaa rajatta. Siis saamme luvun 1 x käänteisluvun ottamalla (periaattessa äärettömän) summan x:n potensseista. Sama kaava pätee myös matriiseille, kunhan itseisarvoehto x < 1 korvataan sopivasti. Tähän tarvitaan matriisinormia mittaamaan annetun matrisin B R n n suuruutta. Tavallisin matriisinormi on määritelty siten, että B = max Bv. (2) v =1 1
Tällöin siis B mielletään funktioksi R n :ltä R n :lle siten, että v Bv, toisin sanoen vektori v kuvautuu vektoriksi Bv. Siten (2) ilmaisee kuinka pitkäksi enintään B kuvaa yksikkövektoreita. Tämän perusteella on helppo osoittaa, matriisinormi toteuttaa tulon suhteen epäyhtälön AB A B sekä yhteenlaskun suhteen kolmioepäyhtälön A+B A + B. Näiden avulla voidaan suoraan päätellä, että käänteismatriiskaava (I B) 1 = B j (3) pätee kunhan matriisi B R n n toteuttaa riittävän ehdon B < 1 sarjan suppenemiselle. Sarjaa (3) kutsutaan B:n Neumannin sarjaksi. Se, että (3) pätee on helppo todentaa suoralla laskulla (I B) Bj = I. Se, että sarja suppenee seuraa samalla perusteella kuin s k :n tapauksessa. Neumannin sarjaa ei tietenkään kannata käyttää käänteismatriisin laskemiseen, sillä LU-hajotelma on paljon edullisempi tapa ratkaista (kohtuullisen kokoinen) lineaarinen yhtälöryhmä. Neumannin sarja on vain tietyn tyyppinen apuväline, joka mahdollistaa iteratiivisten kehittämisen. Ei ole realistista olettaa että yhtälöryhmä (1) olisi suoraan sellainen että se voitaisiin esittää muodossa A = I (I A) = I B jossa B < 1 pätisi. Yritetään kiertää tätä ongelmaa pilkkomalla eli splittaamalla A siten, että asetetaan A = M N jossa M:llä on helppo ratkaista lineaarisia yhtälöryhmiä. Jos siis tämä on mahdollista, niin yhtälöryhmä (1) muuntuu M 1 :llä kertomalla vasemmalta ekvivalenttiin muotoon (I M 1 N)x = M 1 b. (4) Tähän Neumannin sarjaa voidaan sitten yrittää käyttää, jos M 1 N < 1 pätee. Se, että M:llä on helppo ratkaista lineaarisia yhtälöryhmiä tarkoittaa, että M 1 ei siis esiinny sellaisenaan (siis matriisituloa M 1 N ei konkreettisesti muodosteta!). Oletuksena on, että funktio v M 1 v voidaan edullisesti toteuttaa. Tällöin matriisitulo v M 1 Nv (5) 2
on sallittu operaatio. Seuraavat kaksi esimerkkiä ovat tärkeimmät perustapaukset siitä, miten M voidaan yrittää valita. Esimerkki 2 Jacobi-splittauksella tarkoitetaan splittausta A = M N = D (D A), jossa D on A:n diagonaaliosa, eli se diagonaalimatriisi, joka saadaan, kun otetaan A:n diagonaali. Jotta M olisi kääntyvä, pitää tietenkin olettaa, että a jj 0 kaikilla j = 1,...,n. Esimerkki 3 Gauss-Seidel-splittauksella tarkoitetaan splittausta A = M N = L (L A), jossa L on A:n alakolmio-osa, eli se alakolmiomatriisi joka saadaan, kun otetaan A:n alakolmio ja yläkolmion elementit diagonaalin yläpuolella on korvattu nollilla. (Vastaavasti voitaisiin valita M:ksi A:n yläkolmio-osa.) Tällöin L:llä voidaan eteenpäin sijoittamalla ratkoa lineaarisia yhtälöryhmiä nopeasti. Kun sopiva A:n splittaus on valittu, asetetaan B = M 1 N Neumannin sarjaan (3). Siten yhtälöryhmän (4) ratkaisee x = (M 1 N) j M 1 b. Laskennallisesti tämä kannattaa toteuttaa rekursiona x k = M 1 b+m 1 Nx k 1 (6) missä x 0 = M 1 b. Tällöin askeleella k olemme laskeneet approksimaation x k = k (M 1 N) j M 1 b yhtälöryhmän (1) ratkaisulle x. Rekursiokaavaa (6) kutsutaan yksinkertaiseksi iteraatioksi. Esimerkin 2 tapauksessa puhutaan Jacobin iteraatiosta ja Esimerkin 3 Gauss-Seidelin iteraatiosta. Rekursioaskel (6) toteutetaan siten, että c = M 1 b on laskettu ja kirjattu muistiin koko iteraation ajaksi. Siten askeleella k lasketaan ensin x k 1 Nx k 1 (7) (Huomaa, että koska x k 1 :tä ei enää tarvita, laskettu Nx k 1 voitaisiin kirjoittaa muistiin x k 1 :n päälle.) Sen jälkeen lasketaan Nx k 1 M 1 (Nx k 1 ) (8) joka lasketaan yhteen c:n kanssa. Näin on tuotettu x k rekursion (6) mukaisesti. Muistin tarve on kaksi vektoria, jos vektoreita joita ei enää laskennassa tarvita poistetaan heti muistista. Laskennan kompleksisuus per iteraatioaskel (ts. kuinka nopeasti yksi iteraatioaskel voidaan tehdä) riippuu siitä, kuinka 3
paljon (7) ja (8) kuluttavat floppeja. Perussääntö on, että suuruluokka on syytä olla O(n). Laskennan tarkkuutta arviodaan virheen sekä residuaalin e k = x x k = A 1 b x k r k = Ax k b avulla. Näiden erona on, että yleensä residuaali on helpommin saatavilla (sillä emme tietenkään tunnea 1 b:tä). Iteraation (6) yhteydessä voimme kuitenkin approksimoida virhettä, sillä e k = k (M 1 N) j M 1 b (M 1 N) j M 1 b = (M 1 N) j M 1 b. j=k+1 Siten matriisinormin ominaisuuksien perusteella saamme e k j=k+1 M 1 N j M 1 b = M 1 N k+1 1 M 1 N M 1 b. Siten jos M 1 N < 1, niin virhe pienenee joka askeleella vähintäänkin tämän estimaatin mukaisesti. Tässä yhteydessä on hyvä painottaa, että lineaarisen yhtälöryhmän tarkkaa ratkaisua ei läheskään aina tarvita. (Numeerisesti laskettu ratkaisu tietenkin poikkeaa aina x:stä pyöristysvirheiden takia, oli käytetty menetelmä mikä tahansa.) Yleensä vaadittu tarkkuus ilmaistaan suhteellisen residuaalin normin r k = Ax k b b b avulla, josta voidaan vaatia että esimerkiksi tarkkuus 10 6 on riittävä. (Vertaa konetarkkuuteen, joka oli siis noin 10 16.) Jos splittauksemme ei toteuta M 1 N < 1, niin yksinkertainen iteraatio (6) tuskin toimii, ts. virheet ja residuaalit eivät pienene vaikka k kasvaa. Koska johdettu iteraatio perustui pelkästään Neumannin sarjan (3) suoraviivaiseen käyttöön, sitä voidaan kehittää paremmaksi. Kuvataan seuraavaksi joitain ideoita mitä tässä yhteydessä voidaan yrittää. Pyritään siis käyttämään Neumannin sarjaa (3) tarkoituksena ratkaista yhtälöryhmä Ax = (I B)x = b, missä B = I A. Tehdään näin välittämättä siitä päteekö ehto B < 1. Iteraatioaskelta (6) muokkaamalla saamme x k = b+bx k 1 = x k 1 +b (I B)x k 1 = x k 1 +(b Ax k 1 ) = x k 1 r k 1 (9) 4
Tosin sanoen residuaali toteuttaa r k = Ax k b = Ax k 1 Ar k 1 b = r k 1 Ar k 1. (10) Tavoite tietenkin on, että r k olisi pienempi kuin r k 1. Tämän perusteella voimme saada aikaan paremman iteratiivisen menetelmän seuraavasti. Korvataan iteraatioaskel (9) iteraatioaskeleella x k = x k 1 a k 1 r k 1, (11) valitsemalla jotenkin järkevästi a k 1 R sen sijaan, että a k 1 = 1. Tällä yritteellä x k saamme (10):n sijaan residuaalille r k = Ax k b = r k 1 a k 1 Ar k 1. Tätä tarkastelemalla huomaamme, että (muista Gram-Schmidtin ortogonalisointi prosessi!) a k 1 kannattaa valita siten, että projisoimme r k 1 :stä vektorin Ar k 1 suuntaisen komponentin pois. Siis asetamme a k 1 = (r k 1,Ar k 1 ) Ar k 1 2. Vaikka muutos saattaa tuntua pieneltä, tämä takaa sen, että jokaisella askeleella k pätee r k r k 1 (12) riippumatta siitä oliko oletukset Neumannin sarjan käytölle voimassa B:lle vai ei. Näin määriteltyä iteratiivista menetelmää (11) kutsutaan nimellä Orthomin(1). Muistitarpeeltaan ja työmäärältään tämä on samaa luokkaa kuin suoraviivainen Neumannin sarjaan pertustuva iteraatio (6). Käytännössä Orthomin(1) menetelmä ei kuitenkaan ole riittävän nopea iteratiivinen menetelmä. Toisin sanoen, vaikka (12) päteekin, residuaali ei pienene riittävän nopeasti. Peukalosääntö on, että aivan ehdottomasti k < n on maksimi iteraatiomäärä joka kaytännössä voidaan hyväksyä. Jos riittävää tarkkuutta ei siihen mennessä ole saavutettu, menetelmä on epäonnistunut ja on syytä yrittää jotain muutta Oikeasti käytösssä olevat menetelmät tekevät vieläkin fiksumpia päivityksiä kuin Orthomin(1). Näitä ovat konjugaattigradientti menetelmä CG (silloin kun A on positiividefiniitti) ja GMRES menetelmä. Nämä algoritmit päivittävät approximaatiota muodossa (11) siten, että optimaalisuus (12) yhä pätee mutta residuaalin pienemisnopeus on (toivottavasti merkittävästi) suurempi kuin Orthomin(1) menetelmällä. Lopuksi todettakoon, että iteratiivisia menetelmiä käytetään muihinkin ongelmiin, kuin pelkästään lineaaristen yhtälöryhmien ratkaisemiseen. Epälineaariset yhtälöt pitää ratkaista iteratiivisesti aina, oli n sitten suuri tai pieni. Ominaisarvoja lasketaan iteratiivisilla menetelmillä. 5