Ohjelmointi ja numeeriset menetelmät, luento 10, 29.3.

Ohjelman kokonaisrakenne

Fortran 77

        program p      
        ! paaohjelma
        ...
        call sub
        end

        subroutine sub 
        ! aliohjelma
        ..
        end

Pääohjelma ja aliohjelmat toisistaan riippumattomia. Voivat olla peräkkäin samassa tiedostossa tai erillisissä tiedostoissa.

Pääohjelma ja aliohjelmat käännetään erikseen ja linkitetään yhteen.

Erillisiä aliohjelmia helppo linkittää yhteen.

Aliohjelmakirjasto on vain aliohjelmia sisältävä tiedosto.

Parametrit (viiteparametreja!) ovat vain osoitteita. Käännösaikana ei yleensä mahdollista tarkistaa, että todelliset parametrit ovat oikeaa tyyppiä tai että niitä on oikea määrä. Suoritus voi kaatua hämäräperäiseen ilmoitukseen (segmentation fault tms.)

Globaalit muuttujat on kerrottava erikseen jokaiselle aliohjelmalle common-alueen avulla.

Aliohjelmien työtilan varaaminen hankalaa. Tavallinen ratkaisu on varata työtilat kutsuvassa ohjelmassa ja välittää parametreina alihohjelmalle. Aliohjelmakutsut usein hyvin mutkikkaita.

Fortran 90

Tiedostossa voi olla:

1) Pääohjelma ja proseduureja

        program p      
        ! paaohjelma
        call sub
        ..
        end

        contains
        subroutine sub 
        ! aliohjelma

        end
        end program

Sisäiset proseduurit näkevät pääohjelman globaalit muuttujat automaattisesti.

Parametrien oikeellisuus tarkistettavissa.

2) Ulkoinen proseduuri

Erillisillä proseduureilla voi myös olla omia sisäisiä proseduureja:

        subroutine sub 
        ...
        call inner
        ...
        contains
          subroutine inner
          ...
          end
        end subroutine

Ei useita sisäkkäisiä tasoja, kuten Pascalissa.

3) Moduuli

        module m
        ! tyyppien ja muuttujien maarittelyt                
        ...
        contains
        subroutine sub 
        ! aliohjelma

        end
        ...
        end module

Myös moduulin proseduureilla voi olla omia sisäisiä proseduureja.

        module m2
        ...
        contains
        subroutine sub 
          ..
          contains
          subroutine inner
            ..
          end subroutine inner
        end subroutine sub
        ...
        end module

4) Mitä tahansa ohjelmatekstiä

Esimerkiksi usein toistuva osa voidaan kirjoittaa erilliseen tiedostoon ja ottaa mukaan include-lauseella:

        include 'fyle.f'

Erittäin tarpeellinen f77:ssa esimerkiksi globaalien muuttujien (common-alueiden) määrittelyssä. F90:ssä ei vastaavaa ongelmaa.


Paikallisten muuttujien säilyminen

Jos proseduurin paikalliselle muuttujalle on annettu tt save-attribuutti, sen arvo ei tuhoudu proseduurista poistuttaessa, vaan säilyy seuraavaan kutsukertaan.

Jos paikallinen muuttuja alustetaan määrittelyn yhteydessä, sillä on automaattisesti tämä ominaisuus. Sitä EI alusteta uudestaan joka kerta aliohjelmaan tultaessa:

    program savetest
      write(*,*) f(1.0)
      write(*,*) f(1.0)
    contains
    real function f(x)
      real, intent(in) :: x
      real :: y=0.0
      y=y+1
      f=x+y
   end function
   end program
  
   2.000000    
   3.000000    

Jos tällaista sivuvaikutusta ei haluta, muuttujat on alustettava sijoituslauseilla:

    real function f(x)
      real, intent(in) :: x
      real :: y
      y=0.0
      ...
 


Muuttujien attribuutit

Seuraava on täydellinen luettelo kaikista muuttujan attribuuteista.

dimension: määrittelee taulukon koon

parameter: muuttuja on vakio, jota ei saa muuttaa

save: muuttuja varataan staattisesti ja sen arvo säilyy aliohjelmakutsujen välillä

allocatable: dynaamisesti varattava taulukko

pointer: osoitin

target: muuttujaan saatetaan viitata osoittimen avulla

intent: aliohjelman argumentin käyttötapa

optional: valinnainen argumentti; voi puuttua proseduurin kutsusta

external: muuttuja on proseduurin nimi

intrinsic: muuttuja on varusfunktion nimi

private: moduulin yksityinen muuttuja

public: moduulin julkinen muuttuja


Osittaisdifferentiaaliyhtälöt

Seuraavassa \pd tarkoittaa osittaisderivaatan merkkiä.

Kaikki edellä esiintyneet yhtälöt ovat tavallisia differentiaaliyhtälöitä. Kahden tai useamman muuttujan yhtälö, joka sisältää osittaisderivaattoja, on osittaisdifferentiaaliyhtälö.

Hyvin monia ilmiöitä voidaan kuvata toisen kertaluvun lineaarisilla yhtälöillä

a (\pd2u / \pd2x) + b (\pd2u / \pd x \pd y) + c (\pd2u / \pd2y) + d (\pd u \pd x) + e (\pd u \pd y) + fu + g = 0.

Tällainen yhtälö on jotakin kolmesta tyypistä riippuen toisten derivaattojen kertoimista:

  1. Elliptinen, jos b2-4ac < 0.
  2. Parabolinen, jos b2-4ac = 0.
  3. Hyperbolinen, jos b2-4ac > 0.

Jaottelulla ei sinänsä suurta merkitystä numeriikan kannalta, mutta:

Tärkeimmät ratkaisumenetelmät:

Yksinkertainen osittaisdifferentiaaliyhtälö on esimerkiksi Laplacen yhtälö, joka suorakulmaisessa koordinaatistossa on

\pd2u / \pd2x + \pd2u / \pd2y = 0.

Laplacen yhtälössä a=c=1 ja b=0, joten b2-4ac = -4, ja kyseessä on siis elliptinen yhtälö.

Jos oikea puoli ei ole nolla, saadaan Poissonin yhtälö

\pd2u / \pd2x + \pd2u / \pd2y = f(x,y).

Esimerkiksi gravitaatiopotentiaali V toteuttaa Poissonin yhtälön

\pd2V / \pd2x + \pd2V / \pd2y + \pd2V / \pd2z = \nabla2 V = -4\pi G\rho(x,y,z),

missä \rho on tiheys ja G gravitaatiovakio.

Elliptiset yhtälöt kuvaavat usein ajasta riippumatonta potentiaalia tai tasapainossa olevaa systeemiä.

Differenssimenetelmä / elliptiset yhtälöt

Korvataan osittaisderivaatat äärellisillä differensseillä:
  \pd u(xi,yj) / \pd x = (u(xi+1,yj)-u(xi-1,yj)) / 2\Delta x,
  \pd u(xi,yj) / \pd y = (u(xi,yj+1)-u(xi,yj-1)) / 2\Delta y,
  \pd2 u(xi,yj) / \pd2 x = (u(xi+1,yj)-2u(xi,yj)+u(xi-1,yj)) / (\Delta x)2,
  \pd2 u(xi,yj) / \pd2 y = (u(xi,yj+1)-2u(xi,yj)+u(xi,yj-1)) / (\Delta y)2.

Merkitään ui,j=u(xi,yj) ja valitaan askel samaksi molemmissa suunnissa, h=\Delta x=\Delta y, jolloin
  \pd2  ui,j / \pd2 x = (ui+1,j-2ui,j+ui-1,j) / h2,
  \pd2 ui,j / \pd2 y = (ui,j+1-2ui,j+ui,j-1) / h2.

Laplacen yhtälö on nyt

\nabla2 ui,j = (ui+1,j-2ui,j+ui-1,j) / h2 + (ui,j+1-2ui,j+ui,j-1) / h2 = 0

eli

(1 / h2)(ui+1,j+ui-1,j+ui,j+1+ui,j-1-4ui,j) = 0.

Laplacen operaattori voidaan esittää kaaviona

            1             1
 \nabla2 = ---        1  -4   1
           h2             1
Yhdeksän pisteen menetelmä:
            1        1     4    1
 \nabla2 = ---       4    -20   4
           6h2       1     4    1
Kolmiulotteisessa tapauksessa esimerkiksi:

            1              1    1
 \nabla2 = ---       1    -6   1
            h2       1     1

Tylsä vakioesimerkki: suorakaiteen muotoinen levy, jonka yksi reuna pidetään 100 asteen lämpötilassa ja muut reunat 0 asteessa.

Dirichlet'n reunaehto: ratkaistavan funktion arvo tunnetaan koko ratkaisualueen reunalla.

Käytetään vain kolmea hilapistettä:

          0    0    0 
     0    u1   u2   u3   100 
          0    0    0 
Lasketaan Laplacen operaattori kussakin hilapisteessä:

(1 / h2)(0+0+u2+0-4u1) = 0
(1 / h2)(u1+0+u3+0-4u2) = 0
(1 / h2)(u2+0+100+0-4u3) = 0

eli

  | -4   1   0  |  | u1 |   |   0 |
  |  1  -4   1  |  | u2 | = |   0 |
  |  0   1  -4  |  | u3 |   | 100 |
Tiheämpi hila voisi olla
  u1   u2   u3   u4   u5  u6 
  u7   u8   u9   u10  u11  u12
  u13  u14  u15   u16  u17  u18 

Kun hilapisteitä on paljon, kerroinmatriisi on seuraavantapainen:
      ...           
      1            1 -4   1               1
            1        1   -4   1              1 
               1          1  -4  1              1 
      ...           
Mitä enemmän hilapisteitä on, sitä pienempi osuus kerroinmatriisin alkioista on nollasta poikkeavia.

Eliminoinnissa matriisin vinorivien väliselle alueelle muodostuu nollasta poikkeavia alkioita.

Jos pisteitä on paljon, on edullista käyttää iteratiivisia ratkaisumenetelmiä, jolloin em. tapauksessa tarvitsee tallettaa vain matriisin viisi vinoriviä.

Liebmannin iteraatio

Yhtälöryhmä
  | -4   1   0 |  | u1 |   |   0 |
  |  1  -4   1 |  | u2 | = |   0 |
  |  0   1  -4 |  | u3 |   | 100 |
kirjoitetaan muotoon, jossa vasemmalla puolella ovat alkuperäisen yhtälöryhmän diagonaalialkiot:

u1 = (u2) / 4,
u2 = (8u1+u3) / 4,
u3 = (u2+100) / 4.

Näillä iteraatiokaavoilla päivitetään ratkaisuvektoria u, kunnes ratkaisu ei enää muutu vaadittua tarkkuutta enempää. Iterointi lopetetaan esim., kun suurin u:n alkioiden muutoksista on riittävän pieni.

Laplace-operaattorin kaaviosta saadaan suoraan iteraatioon sopivat kaavat:

                      |      1    |
 \nabla2 u = (1 / h2) | 1   -4   1 |  uij=0,
                      |      1    |

josta

uij = (1/4)(ui,j+1+ui,j-1+ui-1,j+ui+1,j).

Alkuarvo voidaan laskea esimerkiksi ratkaisemalla yhtälö hyvin karkealla hilalla. Ratkaisun avulla interpoloidaan likimääräiset arvot tiheämmän hilan pisteissä.

Liebmannin iteraation suppeneminen voi olla hidasta. Suppenemista voi kiihdyttää ylirelaksaatiomenetelmällä.

Merkitään yläindeksiksi iteraatiokierros, jolla arvo on laskettu:

uijk+1 = (1/4) (ui,j+1k+ui,j-1k+1+ui-1,j k+1+ui+1,jk).

Lisätään ja vähennetään uijk:

uijk+1 = uijk + ( {ui,j+1k+ui,j-1k+1+ui-1,j k+1+ui+1,jk - 4uijk) / 4.

Sulkulauseke on korjaus, jolla uij:tä päivitetään. Kun ratkaisu on löytynyt, sulkulauseke on nolla.

Korjaus on usein liian pieni, joten u:n arvot lähestyvät hitaasti oikeaa ratkaisua. Suppeneminen nopeutuu, jos korjaustermiä suurennetaan sopivasti:

uijk+1 = uijk + \omega ( ui,j+1k+ui,j-1k+1+ui-1,jk+1+ui+1,jk - 4uijk) / 4.

Vakio \omega on välillä [1, 2]. Kun pisteiden määrä kasvaa hyvin suureksi, optimaalinen arvo -> 2.

(Suorakulmaisen hilan ja Dirichlet'n reunaehtojen tapauksessa optimaalinen arvo on

\omega = 4 / (2+\sqrt(4-c2)),

missä

c = cos \pi/n + cos \pi/m,

ja n ja m ovat hilapisteiden määrä x- ja y-suunnissa.)

Differenssimenetelmät/paraboliset yhtälöt

Esimerkki: diffuusioyhtälö

\pd u / \pd t = c \pd2 u / \pd x2

alkuehdolla u(x,t=0)=g(x) ja reunaehdoilla u(x=0,t)=a, u(x=1,t)=b.

\pd2u \pd x2 = (1/h2) (ui+1k - 2uik + ui-1k),
\pd u / \pd t = (1/\Delta t) (uik+1-uik).

Diskretoitu yhtälö

uik+1 = uik + (c \Delta t / h2) (ui+1k - 2uik + ui-1k).

Oikean puolen termi uik häviää, kun 2c\Delta t/ h2 = 1. Voidaan osoittaa, että tästä saadaan raja stabiilisuudelle. Jotta yhtälö olisi stabiili, on oltava 2c\Delta t/h2 < 1. Jos siis pituus\-askelta lyhennetään, on samalla lyhennettävä aika-askelta.

Menetelmä on eksplisiittinen: kullakin aika-askelella tarvitaan vain edellisellä aika-askelella laskettuja arvoja. Virhe on O(\Delta t)+O(h2).

Implisiittiset menetelmät ovat ajan suhteen tarkempia. Esimerkiksi Crank-Nicholsonin menetelmä:

uik+1 = uik + (c\Delta t / 2h2) (ui+1k+1 - 2uik+1+ui-1k+1+ui+1k-2uik + ui-1k).

Virhe on O((\Delta t)2)+O(h2), ja menetelmä on stabiili kaikilla \Delta t.

Haittapuoli on, että kutakin aika-askelta kohti joudutaan ratkaisemaan tridiagonaalinen yhtälöryhmä.

Differenssimenetelmät/hyperboliset yhtälöt

Esimerkiksi aaltoyhtälö

\pd2u / \pd t2 = c2 \pd2u / \pd x2

Diskretoimalla saadaan

(uik+1-2uik+uik-1) / (\Delta t)2 = c2 (ui+1k-2uik+ui-1k\over h2)

eli

uik+1 = 2uik - uik-1 + (c2(\Delta t)2 / h2) (ui+1k-2uik+ui-1k).

Jos aika-askel valitaan siten, että c\Delta t = h, saadaan

uik+1 = -uik-1 + ui+1k+ui-1k.

Yhtälö voi kuvata esimerkiksi värähtelevää kieltä. Alkuarvoina tarvitaan poikkeamat alkuhetkellä, ui0, ja nopeus, josta voidaan laskea ui1.

Elementtimenetelmät

FEM = Finite Element Method

Käytetään erityisesti rakenneanalyysissä ja virtausmekaniikassa.

Elementtien muodot ja koot voidaan valita melko vapaasti tehtävän mukaan. Menetelmää on helppo soveltaa myös tilanteisiin, joiden geometria on mutkikasta.

Elementtien kokoa voidaan helposti pienentää kriittisissä kohdissa.

Kysymyksessä on minimointitehtävä, joka on yleensä aina ratkaistavissa. Menetelmä on stabiilimpi kuin differenssimenetelmät.

Funktionaali

F[v] = \int v(x,y,y') dx

saa ääriarvon, kun v toteuttaa Lagrangen yhtälön

\pd v / \pd y - (d/dx) (\pd v /\pd y') = 0.

Valitaan

v = (y'(x))2 + 2f(x)y(x),

jolloin

\pd v / \pd y = 2f(x),
\pd v / \pd y' = 2y'
(d/dx) (\pd v / \pd y') = 2y''.

Lagrangen yhtälö on siis

2f(x)-2y''(x)=0

eli

y''=f(x).

Differentiaaliyhtälö

y''=f(x)

voidaan siis ratkaista myös variaatiotehtävänä etsimällä minimi funktionaalille

F[v] = \int y'2+2f(x)y dx

Vastaavasti esimerkiksi Poissonin yhtälö

\nabla2 u = f(x,y,z)

voidaan ratkaista minimoimalla funktionaalia

F[u] = \int ( (\pd u/ \pd x)2 + (\pd u/ \pd y)2 + (\pd u/\pd z)2 +2f(x,y,z) u) dx dy dz.

Approksimoidaan ratkaisua kantafunktioiden \phii lineaarikombinaationa:

v = \sumj aj \phij,

jolloin minimoitava funktionaali on

F[v] = \int ( (\sumj aj\phi'j)2+2f(x)\sumj aj \phij) dx.

Minimi saadaan yhtälöistä

\pd F[v] / \pd ai = 0.

\pd F[v] / \pd ai =
\int ( 2\phi'i (\sumj aj\phi'j) + 2f(x) \phii ) dx
= 2 \sumj aj \int \phi'i\phi'j\,dx + 2 \int f(x)\phii dx,

josta

\sumj aj \int\phii'\phij'dx = - \int f(x)\phii.

Saadaan yhtälöryhmä

Fa = b,

missä

Fij = \int\phii'\phij' dx ,
bi = -\int f(x) \phii dx.

Esimerkki: yritetään ratkaista yhtälö y''=x reunaehdoilla y(0)=y(1)=0.

Valitaan kantafunktioiksi

         1+(x-xi)/h, kun xi-1 <= x <= xi
 \phii = 1-(x-xi)/h, kun xi <= x <= xi+1
         0  muuten

Kerroinmatriisin alkiot ovat

                       -1/h, kun i=j +- 1,
 \int \phi'i\phi'j dx = 2/h, kun i=j,
                        0 muuten
 \int01 f\phi1\,dx = 
  \int0h x (1 + (x-h)/h) dx +
  \inth2h x (1 - (x-h)/h) dx 
 = h2/3 + 2h2/3 = h2,
 \int01 f\phi2 dx = 2h2,
 \int01 f\phi3 dx = 3h2.

Valitaan yksinkertaisuuden vuoksi h=0.25, jolloin kantafunktioita on vain kolme.

Minimointitehtävästä saadaan yhtälöryhmä

         |  2  -1   0 | | a1 |           | 1 |
 1/0.25  | -1   2  -1 | | a2 | =  -0.252 | 2 |
         |  0  -1   2 | | a3 |           | 3 |
Tämän ratkaisu on
     | -0.0391 | 
 a = | -0.0625 |
     | -0.0547 |
Esimerkiksi y(0.5)=a2\phi2(0.5)=a2=-0.0625.

Yhtälön tarkka ratkaisu on y=(x3-x)/6, josta y(0.5)=-0.0625.


Ominaisarvot

Olkoon A neliömatriisi. Matriisin ominaisarvo on \lambda ja ominaisvektori x, jos

Ax = \lambda x

eli

(A - \lambda I) x = 0.

Jotta yhtälöllä olisi ei-triviaali ratkaisu, on oltava

det (A - \lambda I) = 0.

Kun determinantti kirjoitetaan auki, saadaan karakteristinen polynomi, josta ominaisarvot voidaan ratkaista.

Jos matriisi on reaaliarvoinen ja symmetrinen, ominaisarvot ovat reaalisia.

Esimerkiksi matriisin

   |  1   4 |
   |  1   1 |
karakteristinen polynomi on
       |  1-\lambda    4 |
   det |                 | =   = \lambda2 - 2\lambda - 3,
       |  1     1-\lambda|
jonka nollakohdista saadaan ominaisarvot \lambda1=3 ja \lambda2=-1. Hyvin työlästä, jos matriisi vähänkään isompi.

QR-hajotelma

Matriisi voidaan hajottaa muotoon

A = QR,

missä Q on ortogonaalimatriisi ja R yläkolmiomatriisi.

Muunnos voidaan tehdä eri tavoilla:

  1. Householderin muunnos
  2. Givensin rotaatiot
  3. Gram-Schmidt-ortogonalisointi
Householderin muunnos
Esimerkki: matriisi
     
      |  3  2  1  |
 A  = |  1  1  2  |
      |  2  1  3  |
Poimitaan tämän ensimmäinen pystyrivi
               | 3 |
 x1 = a(:,1) = | 1 |
               | 2 |
ja lasketaan siitä vektori
              | 1 |   | -0.7416574 |
  u1=x1-||x1|| | 0 | = | 1          |          
              | 0 |   |  2         |
Tämän avulla muodostetaan Householderin muunnosmatriisi
P1=I - 2 (u1u1^T / || u1 ||2) =
  | 0.8017837   0.2672612   0.5345225 |
  | 0.2672612   0.6396433  -0.7207135 |
  | 0.5345225  -0.7207135  -0.4414270 |
Kun alkuperäinen matriisi kerrotaan tällä muunnoksella, ensimmäiseltä sarakkeelta nollautuvat kaikki lävistäjän alapuolella olevat alkiot:
A1= P1 A =
 |  3.7416574   2.4053512    2.9398737 |
 |  0           0.4534522   -0.6155927 |
 |  0          -0.0930955   -2.2311854 |
Sitten poimitaan toiselta sarakkeelta vektori
                 |  0.4534522 |
 x2 = a(2:3,1) = |            |
                 | -0.0930955 |
josta
             |  1  |   | -0.0094578 |
 u2=x2-||x||2 |     | = |            |
             |  0  |   | -0.0930955 |
Tästä saadaan toinen muunnosmatriisi
P2=I - 2u2u2T / || u2 ||2 = 
      |  1   0           0         |
      |  0   0.9795688  -0.2011093 |
      |  0  -0.2011093  -0.9795688 |
Kerrotaan A1 muunnoksella, jolloin toisen sarakkeen lävistäjän alapuoliset alkiot nollautuvat. Samalla tavoin jatketaan, kunnes matriisi on saatu yläkolmiomuotoon.
A2=P2 A1 = 
 | 3.7416574    2.4053512    2.9398737 |
 | 0            0.4629100   -0.1543033 |
 | 0            0            2.3094011 |
Hajotelman matriisit saadaan nyt muunnosmatriisien avulla.
 Q = P1 P2  =
 | 0.8017837    0.1543033  -0.5773503 | 
 | 0.2672612    0.7715167   0.5773503 |
 | 0.5345225   -0.6172134   0.5773503 |
 R = P2 P1 A =
 | 3.7416574    2.4053512   2.9398737 |
 | 0            0.4629100  -0.1543033 |
 | 0            0           2.3094011 |
Tarkistuksen vuoksi voidaan laskea
  
  QR = 
   |  3   2   1  |
   |  1   1   2  |
   |  2   1   3  |
Matriisin Q ortogonaalisuus nähdään laskemalla tulo QQT:
 Q QT = 
   |  1   0   0  |
   |  0   1   0  |
   |  0   0   1  |
Yleisessä tapauksessa hajotelman matriisit ovat
  Q = P1 P2 ... Pn, 
  R = Pn ... P2 P1 A.
Ominaisarvojen laskeminen
Ominaisarvot voidaan ratkaista iteratiivisesti QR-algoritmilla, jossa käytetään edellä ollutta QR-hajotelmaa. mutta tehtävä on laskennallisesti raskas.

Neliömatriisi on lohkokolmiomatriisi, jos se on muotoa

 | T11  T12  T13  ... T1n |
 | 0    T22  T23 ...  T2n |
 |                       |
 | 0    0    0   ... Tnn |
missä alimatriisit Tij ovat neliömatriiseja.

Voidaan osoittaa, että tällaisen matriisin ominaisarvot ovat lävistäjälohkojen Tii ominaisarvot.

=> jos matriisi on lävistäjä- tai kolmiomatriisi, ominaisarvot ovat lävistäjällä olevat alkiot.

Ominaisarvot eivät muutu similariteettimuunnoksissa

A -> S-1 A S.

Muunnetaan matriisi aluksi johonkin yksinkertaisempaan muotoon similariteettimuunnoksilla.

Matriisin muuntaminen Householderin muunnoksilla
Tarkastellaan esimerkkinä symmetristä matriisia
 A  =
 |  4    3    2    1 |
 |  3    4   -1    2 |
 |  2   -1    1   -2 |
 |  1    2   -2    2 |
Muunnetaan tätä Householderin muunnoksilla. Ensimmäiseltä pystyriviltä poimitaan vektoriin x1 lävistäjän alapuoliset alkiot:
      |  3  |
 x1 = |  2  |
      |  1  |
Näistä muodostetaan vektori
                  | 1 |   | -0.7416574 |
  u1 = x1 - ||x1|| | 0 | = | 2          |
                  | 0 |   |  1         |
Tämän avulla saadaan matriisi
  p1 = I - 2u1u1T/ ||u1|| = 
  | 0.8017837    0.5345225    0.2672612 |
  | 0.5345225   -0.4414270   -0.7207135 |
  | 0.2672612   -0.7207135    0.6396433 |
ja tästä edelleen Householderin muunnosmatriisi
 P1  =
 | 1    0           0            0         |
 | 0    0.8017837   0.5345225    0.2672612 |
 | 0    0.5345225  -0.4414270   -0.7207135 |
 | 0    0.2672612  -0.7207135    0.6396433 |
Nyt voidaan suorittaa matriisin A similariteettimuunnos. Muunnosmatriisi on symmetrinen, joten sitä ei tarvitse transponoida.
 A1 = P1 A P1 =
  |  4           3.7416574   0           0         |
  |  3.7416574   2.4285714   1.2977396   2.1188066 |
  |  0           1.2977396   0.0349563   0.2952113 |
  |  0           2.1188066   0.2952113   4.5364723 |
Toinen sarake käsitellään samalla tavalla. Ensin muodostetaan vektori x2
       |  1.2977396 |
 x2  = |            |
       |  2.1188066 |
ja tästä edelleen
                    | -1.1869072 |
  u2 = x2 - ||x2|| = |            |
                    |  2.1188066 |
 p2  =
  |  0.5223034    0.8527597 |
  |  0.8527597   -0.5223034 |
ja varsinainen muunnosmatriisi
  P2 =
  |  1    0    0           0         |
  |  0    1    0           0         |
  |  0    0    0.5223034   0.8527597 |
  |  0    0    0.8527597  -0.5223034 |
 
 A2 = P2 A1  P2 =
 |  4           3.7416574    0            0         |
 |  3.7416574   2.4285714    2.4846467    0         |
 |  0           2.4846467    3.5714286   -1.8708287 |
 |  0           0           -1.8708287    1         |
Symmetrinen matriisi redusoituu siis tridiagonaaliseksi.

Muutetaan sitten alkuperäinen matriisi epäsymmetriseksi:

  A  =
   | 4    2    3    1  |
   | 3    4   -2    1  |
   | 2   -1    1   -2  |
   | 1    2   -2    2  |
Muunnos etenee samalla tavalla kuin edelläkin, ja tulokseksi saadaan:
A2  =
 |  4           3.4743961  -1.3039935  -0.4776738 |
 |  3.7416574   1.7857143   2.9123481   1.1216168 |
 |  0           2.0934787   4.2422252  -1.0307759 |
 |  0           0.         -1.2980371   0.9720605 |
Yleisen matriisin tapauksessa tuloksena on Hessenbergin matriisi, joka on muotoa
H =  
   | x  x  x  x  x |
   | x  x  x  x  x |
   | 0  x  x  x  x |
   | 0  0  x  x  x |
   | 0  0  0  x  x |
QR-algoritmi
Kun matriisi on redusoitu tridiagonaaliseen tai Hessenbergin muotoon, voidaan ruveta iteroimaan sen ominaisarvoja.

Valitaan aluksi A1=H. Sitten toistetaan seuraavia askelia:

-- Lasketaan QR-hajotelma QiRi = Ai.

-- Lasketaan uusi matriisi Ai+1 = Ri Qi.

QR-hajotelman matriisi Q on ortogonaalinen ja A=QR, R=QTA, joten

RQ = QT A Q

on similariteettimuunnos ja säilyttää ominaisarvot.

Matriisien Ai jono suppenee kohti yläkolmio- tai lohkomatriisia, josta ominaisarvot voidaan poimia.

Viimeisen esimerkin tapauksessa raja-arvo on 50 iteraatiokierroksen jälkeen

 | 7.0363389  -0.7523758  -0.7356716  -0.3802631 |
 | 4.265E-08   4.9650342  -0.8892339  -0.4538061 |
 | 0           0          -1.9732687  -1.3234202 |
 | 0           0           0           0.9718955 |
Matriisin ominaisarvot ovat nyt lävistäjällä olevat luvut. Jos ominaisarvot ovat kompleksiarvoisia, matriisi on lohkomatriisi, jonka ominaisarvot ovat lävistäjällä olevien 2x2-alimatriisien ominaisarvoja.