Ohjelmointi ja numeeriset menetelmät, luento 7, 1.3.

Numeerinen integrointi

Analyyttisesti derivointi triviaalia, integrointi vaikeaa. Numeerisesti laskettaessa tilanne on päinvastainen.

Integrointi on yhteenlaskua, joka on tasoittava operaatio: lähtötietojen satunnaiset virheet kumoavat toisensa.

Derivointiin liittyy lähes yhtäsuurten suureiden vähennyslasku, joka on virheitä vahvistava operaatio.

Jos käsitellään havaintodataa, se voi olla syytä tasoittaa tai esittää aineistoon sovitettavalla funktiolla. Ei useinkaan tarpeen integroitaessa, välttämätöntä derivoitaessa.

Funktio f on integroituva välillä [x1=a, xn=b], jos Riemannin summalla

R = \sumi=1n-1 f (zi) hi,

missä

hi = xi+1 - xi, xi <= zi <= xi+1,

on raja-arvo, kun jaon silmä h = maxi { hi } -> 0.

Muuttamalla jakovälejä ja pisteiden zi valintaa saadaan erilaisia integrointimenetelmiä.

Jaetaan integroimisväli yhtä leveisiin viipaleisiin. Olkoon kunkin leveys h.

1) Lasketaan integroitava kunkin välin alkupisteessä:

\intx0xn f (x) dx = h( f (x0) + f (x0 + h) + ... + f (x0 + (n - 1) h) ).

Esimerkki:

I = \int01 x2 d x.

Oikea arvo on 1/3. Lasketaan nyt integraalin likiarvo jakamalla integroimisväli neljään osaan.

I4 = (1 / 4) (0 + (1 / 16) + (1 / 4) + (9 / 16)) = (14 / 64) \approx 0.219.

Koska integroitava funktio on koko välillä kasvava ja funktio lasketaan välin alkupäässä, saadaan liian pieni arvo.

2) Lasketaan arvo välin keskikohdalla

\intx0xn f (x) d x = h (f (x0 + h/2) + f (x0 + 3 h / 2) + ... ).

I4 = (1 / 4) ( (1 / 64) + (9 / 64) + (25 / 64) + (49 / 64) ) = (21 / 64) \approx 0.328.

Puolisuunnikasmenetelmä

Integroitava alue jaetaan puolisuunnikkaan muotoisiin viipaleisiin.

\int f (x ),d x
= h [ (f0 + f1)/2 + (f1 + f2)/2 + ... (fn-1 + fn)/2 ]  
= (h / 2) (f0 + 2f1 + 2f2 + ... + 2fn-1 + fn)
= (h / 2) [f (x0 ) + 2 f (x0 + h ) + 2 f (x0 + 2h ) + ... 2 f (x0 + (n-1)h ) + f (x0 + nh) ]

Esimerkkitapaus

I4
= (1 / 8) [ 0 + 2 (1 / 16) + 2 (4 / 16) + 2 (9 / 16) + 1 ]
= (1 / 8) (44 / 16) \approx 0.344.

Simpsonin menetelmä

Käytetään mutkikkaampia käyriä, jotka kuvaavat alkuperäistä funktiota vielä paremmin kuin suorat. Luonnollinen parannus on toisen asteen käyrä.

Lasketaan ensin integraali yhden osavälin yli. Newtonin-Gregoryn interpolointikaavan mukaan on

f (x) \approx f0 + s \Delta f0 + (s (s-1) / 2) \Delta2 f0.

\intx0 x2 f (x ) d x
\approx \intx0 x2 (f0 + s\Delta f0 + (s(s-1)/ 2) \Delta2 f0) dx
= h \int02 (f0 + s\Delta f0 + (s(s-1)/ 2) \Delta2 f0) d s
= h (2 f0 + 2 \Delta f0 + (1 / 3) \Delta2f0)
= (h / 3) (6 f0 + 6 \Delta f0 + \Delta2 f0 )

Sijoitetaan tähän

\Delta f0 = f1 - f0
\Delta2 f0 = \Delta f1-\Delta f0 = (f2 - f1) - (f1 - f0)
= f0 - 2 f1 + f_2.

Integraali kahden jakovälin yli on

\intx0 x2 f (x ) d x \approx (h / 3) (f0 + 4 f1 + f2).

Integraali koko välin yli on

\intx0 xn f (x ) d x
\approx (h / 3) (f (x0) + 4 f (x0+h ) + 2 f (x0+2h ) + 4 f (x0+3h ) + 2 f (x0+4h ) + ... 4f (x0+(n-1)h) + f (x0+nh).

Jakovälejä oltava parillinen määrä.

Esimerkkitapaus:

I4 = (1 / 12) [0 + 4 (1 / 16) + 2 (1 / 4) + 4 (9 / 16) + 1]
= 16 / (12 x 4) = 1 / 3.

Tässä integroitavaa approksimoitiin toisen asteen polynomilla. Koska integroitava itse on toista astetta, tulos on tarkka.


program simpson
  implicit none
  integer i
  do i=4,10
    write(*,*) i, simpsonint(0.0, 1.0, i)
  end do
contains
  
real function f(x) 
  ! integroitava funktio
  real, intent(in) :: x
  f=x**4
end function

real function simpsonint(a, b, n)
  ! integroidaan funktio f(x) valin [a, b] yli Simpsonin
  ! menetelmalla kayttamalla n jakovalia (n oltava parillinen)
  real, intent(in) :: a, b
  integer, intent(in) :: n

  real :: h, &    ! askelpituus
          s2, s4  ! osasummat
  integer i

  if (2*(n/2) /= n) then
     write(*,*) 'jakovalien maaran oltava parillinen:',n
     simpsonint=0.0
     return
  end if

  h = (b-a)/n
  s2=0.0
  s4=0.0
  do i=1,n-1,2
     s4=s4+f(a+i*h)
  end do
  do i=2,n-2,2
     s2=s2+f(a+i*h)
  end do
  simpsonint = (h/3)*(f(a)+f(b)+2*s2+4*s4)
end function

end program



Virhearvio

Interpolointipolynomin virhe on korkeintaan samaa luokkaa kuin ensimmäinen poisjätetty termi.

\Delta f0 = f1 - f0 \approx h (df / d x)
\Delta2 f0 = \Delta f1 - \Delta f0 \approx h2 (d2 f / dx2)
...

Lineaarinen interpolaatio: virhe luokkaa h2 f" (x ).

Kun tämä integroidaan yhden osavälin yli saadaan lokaali virhe. Välin leveys on h, joten integraali on luokkaa h3 f" (z ), missä z on jokin välin piste.

Välejä on 1/h kappaletta, joten globaali virhe on luokkaa h2 f" (z ).

Simpsonin menetelmässä lokaali virhe on kertalukua h3 ja globaali virhe h4.


Rombergin menetelmä

Lasketaan integraali jollakin yksinkertaisella menetelmällä kahdella eri askelpituudella. Näiden arvojen avulla ekstrapoloidaan uusi tarkempi arvo.

Olkoon I on integraalin tarkka arvo. Voidaan osoittaa, että puolisuunnikasmenetelmän arvo askelpituuden funktiona R0(h) on

R0 (h ) = I + C2h2 + C4h4 + ...,

missä kertoimet Ci eivät riipu askelesta h.

R0 (h / 2) = I + C2 h2 / 4 + C4 h4 / 16 + ... ,

Lasketaan näistä lineaarikombinaatio

R1 (h ) = (1 / 3) ( 4 R0 (h / 2) - R0 (h ) )
= I + C'4h4 + ... ,

Alkuperäinen menetelmä on kertalukua h2, mutta nistä muodostettu kombinaatio kertalukua h4.

Jos aineistona askelpituudella h taulukoituja arvoja, lasketaan integraalit askelilla 2h ja h.

Menetelmää voidaan jatkaa edelleen korkeampiin kertalukuihin.

Newtonin-Cotesin menetelmät

Kaikki edellä olleet integrointimenetelmät voidaan esittää muodossa

I = \sum wi f( xi),

missä (xi), i = 0, ... , n on jokin sopivasti valittu pistejoukko.

Jos pisteet xi valitaan tasavälisesti, saadaan Newtonin-Cotesin menetelminä tunnetut integrointimenetelmät.

Kaikki edellä esiintyneet menetelmät kuuluvat tähän ryhmään.

Edellä esitetyt menetelmät ovat yksinkertaisia ja helposti ohjelmoitavia. Moniin tarkoituksiin ne ovat täysin käyttökelpoisia. Suuri tarkkuus vaatii lyhyttä jakoväliä, mikä tekee menetelmistä melko hitaita.

Gaussin kvadratuuri

Tilannetta voidaan parantaa valitsemalla jakopisteet xi jollakin muulla tavoin kuin tasavälisesti.

Oletetaan, että funktio on korkeintaan n-asteinen polynomi. Yritetään löytää sellaiset pisteet xi ja kertoimet wi,että

\sum wi f ( xi)

antaa polynomien integraaleille täsmälleen oikean arvon.

Esimerkki: käytetään vain kahta pistettä. Valitaan vielä integroimisväli symmetriseksi, [-1, 1].

Jotta kaava toimisi oikein kaikille astetta n astetta oleville polynomeille, sen on annettava oikeat arvot myös funktioiden 1, x, x2, ... , xn integraaleille:

\int-11 1 dx = 2 = w1 + w2,
\int-11 x dx = 0 = w1x1 + w2x2,
\int-11 x2 d x = (2 / 3) = w1x12 + w2x22,
\int-11 x3 d x = 0 = w1x13 + w2x23.

Tässä on neljä yhtälöä ja neljä tuntematonta, w1, w2, x1 ja x2. Toinen ja neljäs yhtälö toteutuvat, jos valitaan x2 = -x1 ja w1 = w2. Silloin ensimmäisen yhtälön perusteella on w1 = w2 = 1, ja kolmannesta yhtälöstä saadaan x1 = -x2=1/\sqrt 3.

Yleiset kolmannen asteen polynomit saadaan edellä esiintyneiden funktioiden lineaarikombinaatioina. Siten mielivaltaiselle korkeintaan kolmatta astetta olevalle polynomille p3 pätee

\int-11 p3(x ) d x = p3(1 / \sqrt 3) + p3(- 1 / \sqrt 3).

Kokeillaan

\int-11 (x3 + 2x2 + 1) d x =
\subst-11 x4 / 4 + 2x3 / 3 + x =
= (1 / 4) + (2 / 3) + 1 - ( (1 / 4) - (2 / 3) - 1)
= 10 / 3.

Sama Gaussin kahden pisteen kvadratuurilla:

\int-11 (x3 + 2x2 + 1) d x =
= 1 / (3 \sqrt 3) + (2 / 3) + 1 - ( 1 / (3 \sqrt 3) - (2 / 3) - 1)
= 10 / 3.

Korkeampaa astetta oleville polynomeille saadaan vastaavat yhtälöt, joiden ratkaiseminen on työlästä. Pisteiden xi ratkaiseminen suoraan yhtälöryhmistä ei ole kovin käytännöllistä. Siksi polynomit esitetäänkin ensin jonkin ortogonaalin kantafunktiojoukon avulla.

Jos pisteitä on n kappaletta, niiden paikat ovat Legendren polynomin Pn (x) nollakohtia.

P0 (x ) = 1,
P1 (x ) = x,
P2 (x ) = (1 / 2) ( 3x2 - 1),
P3 (x ) = (1 / 2) ( 5x3 - 3x),
...
(2n+1) x Pn (x ) = (n+1) Pn+1(x ) + n Pn-1 (x ).

Esim. kolmen pisteen menetelmän pisteet saadaan yhtälöstä 5x3-3x=0, josta x1=-\sqrt(3/5)=-0.7746, x2=0, x1=\sqrt(3/5)=0.7746$.

Näitä ei kannata ratkaista joka kerta uudestaan, vaan käytetään valmiiksi taulukoituja arvoja.

Pistettä xi vastaava paino on

wi = [2 / (1-xi2) (P' (xi )) 2 ].

Polynomien derivaatat saadaan kaavoista

P'0 (x ) = 0,
P'1 (x ) = 1,
P'2 (x ) = 3 x,
P'3 (x ) = (1 / 2) (15 x2 - 3),
...
P'n+1 (x ) = P'n-1 (x ) + (2n + 1) Pn (x ).

Mielivaltainen integroimisväli voidaan muuntaa väliksi [-1, 1] sijoituksella

y = (b - a) t / 2 + (b + a) / 2,

d y = (b - a)/2 d t,

jolloin integraali on

\intab f (y ) d y = (b - a)/2 \sum wi f( yi),

missä

yi = ((b - a)/2) xi + (b + a)/2.

Esimerkki:

\int0\pi/2 sin x d x

Lasketaan tämä Gaussin kolmen pisteen menetelmällä. Integroimisvälin muunnos on

yi = (\pi / 4) xi + \pi / 4.

Integraalin laskemiseen tarvitaan seuraavat suureet:

   i w_i            x_i            y_i            w_i sin y_i
  -1 0.55555 55556 -0.77459 66692  0.17703 13620  0.09783 78406
   0 0.88888 88889  0.00000 00000  0.78539 81634  0.62853 93611
   1 0.55555 55556  0.77459 66692  1.39376 49648  0.54687 26838
 \sum                                             1.27324 98855
Integraalin arvo on (\pi /4) 1.27324 98855 \approx 1.000008. Integraalin tarkka arvo on 1. Kolmen pisteen integrointikaavalla saatiin tulos, jonka suhteellinen virhe on alle 10-5.


 n    x_i                 w_i
 2 
    0.57735 02691 89626   1.00000 00000 00000

 3 
    0.00000 00000 00000   0.88888 88888 88889
    0.77459 66692 41484   0.55555 55555 55556

 4 		       
    0.33998 10435 84856   0.65214 51548 62546
    0.86113 63115 94053   0.34785 48451 37453

 5 
    0.00000 00000 00000   0.56888 88888 88889
    0.53846 93101 05684   0.47862 86704 99366    
    0.90617 98459 38664   0.23692 68850 56189

 6 
    0.23861 91860 83197   0.46791 39345 72691
    0.66120 93864 66265   0.36076 15730 48138    
    0.93246 95142 03152   0.17132 44923 79171

 7 
    0.00000 00000 00000   0.41795 91836 73469
    0.40584 51513 77398   0.38183 00505 05118   
    0.74153 11855 99395   0.27970 53914 89277  
    0.94910 79123 42759   0.12948 49661 68868

 8 
    0.18343 46424 95650   0.36268 37833 78362
    0.52553 24099 16329   0.31370 66458 77887
    0.79666 64774 13627   0.22238 10344 53375
    0.96028 98564 97536   0.10122 85362 90376

 9 		       
    0.00000 00000 00000   0.33023 93550 01260
    0.32425 34234 03809   0.31234 70770 40003    
    0.61337 14327 00590   0.26061 06964 02935    
    0.83603 11073 26636   0.18064 81606 94857    
    0.96816 02395 07626   0.08127 43883 61575


Useampiulotteiset integraalit

Voidaan laskea soveltamalla yksiulotteista integrointia erikseen kuhunkin dimensioon.

Esimerkiksi kaksiulotteinen integraali:

\intab \intcd f( x, y) d x dy
= \sum wi (\intcd f (xi, y) d y)
= \sum wi \sum w'j f (xi, yj )

Painoista ja pisteistä riippuen menetelmä voi tässä olla Gauss tai jokin Newton-Cotes.

Kun dimensio suurempi kuin noin 5, kannattaa käyttää Monte Carlo -menetelmää.


Monte Carlo -menetelmä

Integraalin

I = \int01 f (x ) dx

suorakaidemenetelmällä laskettu arvo on

\sumi=0n-1 f (xi ) / n.

Tämä on funktion keskiarvo välillä [0,1]. Yleisessä tapauksessa integraali on funktion keskiarvo kerrottuna välin pituudella.

Periaatteessa sama tulos saadaan, jos integraali lasketaan satunnaisissa pisteissä ti, jotka jakautuvat tasaisesti integrointivälille:

I' = \sumi=0n-1 f (ti ) / n.

Tämä on satunnaismuuttuja, jonka odotusarvo on integraalin oikea arvo. Kun N kasvaa rajatta I' lähestyy integraalin todellista arvoa.

Jos on laskettava integraali

\intA f dV

jonkin mutkikkaan alueen A yli, lasketaan

\intB g d V,

missä B on jokin yksinkertainen alue, joka sisältää A :n ja g (x ) = f (x ), jos x on alueen A sisällä, ja 0 muuten. Integraalin likiarvo on

I = \sum g (xi ),

missä satunnaisluvut xi ovat jakautuneet tasaisesti alueeseen B.

Esimerkiksi n-ulotteisen pallon tilavuuden laskeminen. Tuotetaan kuution sisälle tasaisesti jakautuneita pisteitä

ri = (X1, X2, ... , Xn ).

Nyt g(ri ) = 1, jos | ri | on pienempi kuin pallon säde ja 0 muuten. Summa \sum g (ri ) lähenee pallon ja ympäröivän kuution tilavuuksien suhdetta.

Tuloksen virhe on verrannollinen lausekkeeseen 1 / \sqrt N. Laskentaa voidaan jatkaa tarpeen mukaan. Jos käytetään tavallista kiinteän laskentahilan menetelmää, koko homma on uusittava, jos tarkkuutta halutaan parantaa.

Tarkkuus paranee hitaasti, joten menetelmä ei sovellu kaikkiin tehtäviin.

Virhe ei riipu avaruuden dimensiosta, joten menetelmää kannattaa käyttää, kun on laskettava moniulotteisia integraaleja.


Havaintodatan integrointi

Jos tasavälinen aineisto, voidaan käyttää mitä tahansa Newton-Cotes -tyyppistä menetelmää.

Jos aineisto ei tasavälistä, korjataan menetelmiä niin, että askelpituus muuttuu; esimerkiksi puolisuunnikassääntö:

\int f(x)dx = (1/2) ( (x1-x0)f(x0) + (x2-x1)f(x1) + ... + (xn-xn-1)f(xn))

Toinen mahdollisuus: sovitetaan aineistoon jokin funktio, jolloin voidaan käyttää mitä tahansa menetelmää tai laskea integraali analyyttisesti.

Jos aineisto saadaan esimerkiksi simuloinnista tai on muuten raskas lakea, mutta voidaan laskea mielivaltaiselle pisteelle, kannattaa käyttää Gaussin menetelmää.


Numeerinen derivointi

Esim. Newtonin-Gregoryn -interpolointipolynomi:

f(xs) \approx Pn(xs) = f0 + s \Delta f0 + ( s\choose 2 ) \Delta2f0 + ... + (s \choose n ) \Deltan f0.

Tämän avulla saadaan

f'(xs) \approx P'n(xs) = (d/ds) Pn(xs) (ds/dx) = (d/ds) Pn(xs) (1/h)
= (1/h) ( \Delta f0 + ((2s -1)/2) \Delta2f0 + ... )

Kun s=0, saadaan

f'(x0) = (1/h) ( \Delta f0 - (1/2) \Delta2f0 + (1/3) \Delta3f0 - ... +- (1/n) \Deltan f0 ) $$

Tämän virhe on luokkaa

1/(n+1) hn f(n+1)(\xi).

Symmetrisempiä versioita:

f'(x0) = (1/2h) (f1 - f-1).

f'(x0) = (1/12h) (f-2 - 8f-1 + 8f1 - f2).

Jos kyseessä mittausdata, jossa kohinaa, se on ensin tasoitettava esimerkiksi sovittamalla siihen pienimmän neliösumman käyrä.


Satunnaisluvuista

Kankaala (1993): Monte Carlo Simulations, CSC Research Reports R03/93, CSC.

Press, Teukolsky, Vetterling, Flannery: Numerical Recipes, Cambridge University Press.

"We guarantee that each number is random individually, but we don't guarantee that more than one of them is random."

Satunnaislukujen (oikeammin pseudosatunnaislukujen) jono on deterministinen. Samoilla alkuarvoilla saadaan aina sama lukujono. Alkuarvo voidaan yleensä valita.

Lineaarinen kongruenssimenetelmä

Xi+1 = aXi + b mod m,

missä a, b ja m ovat luonnollisia lukuja.

Luvut toistuvat viimeistään m numeron kuluttua. Jos vakiot on valittu huonosti, jakso voi olla paljon lyhempi.

Peräkkäisten lukujen korrelaatio: Jos valitaan n lukua kerrallaan esittämään pisteen paikkaa n-ulotteisessa avaruudessa, pisteet eivät täytä koko avaruutta, vaan sijoittuvat n-1 -ulotteisille hypertasoille, joita on korkeintaan m1/k kappaletta, usein paljon vähemmän.

Satunnaisluvun vähiten merkitsevät bitit ovat vähiten satunnaisia.

Satunnaislukua ei pidä paloitella osiin; osat eivät ole yhtä satunnaisia.

Fortran 90:ssä satunnaislukuja voi tuottaa aliohjelmalla

        call random_number (v)
Tässä v on taulukko, joka täytetään satunnaisluvuilla. Luvut jakautuvat tasaisesti välille [0, 1).

Satunnaislukugeneraattori voidaan alustaa kutsulla

        call random_seed (n)
missä n on kokonaisluku. Lukujen jakaumaa voidaan testata esim. seuraavasti. Muodostetaan satunnaislukuvektorista x kokonaislukujen jono int(K*x).

Muut jakaumat

Kertymäfunktio F(x) ilmoittaa todennäköisyyden, että satunnaismuuttujan X arvo on korkeintaan x:

F(x) = P(X <= x).

Kertymäfunktio on kasvava funktio (ei välttämättä aidosti kasvava).

Jos X on tasaisesti jakautunut välille [0, 1] ja Y ratkaistaan yhtälöstä

F(Y) = X,

saadaan muuttuja Y, joka noudattaa annettua jakaumaa:

Y = F-1 (X).

Jos kertymäfunktion käänteisfunktio on helposti laskettavissa, sen avulla saadaan haluttua jakaumaa noudattavia satunnaislukuja.

Normaalijakauma

(0,1)-normaalijakauman tiheysfunktio

f(x) = (1 / \sqrt(2\pi)) exp(-x2 /2).

Normaalijakautuneiden satunnaislukujen tuottamiseen on useita keinoja:

1) Ratkaistaan numeerisesti kertymäfunktion käänteisfunktio. Hieman työlästä.

2) Satunnaismuuttujien summa lähenee normaalijakaumaa, joten normaalijakautuneita satunnaislukuja saadaan laskemalla yhteen muutamia tasaisesti jakautuneita satunnaislukuja.

3) Box-Mullerin menetelmä: Olkoot x1 ja x2 jakautuneet tasaisesti välille [0, 1]. Silloin

y1 = \sqrt(-2 ln x1) cos 2\pi x2,
y2 = \sqrt(-2 ln x1) sin 2\pi x2

ovat kumpikin normaalijakautuneita.


Satunnaiskulku (random walk)

Esimerkiksi säteilyn eteneminen väliaineessa.

Tunnetaan keskimääräinen vapaa matka. Säteen kulkema matka ennen sen osumista hiukkaseen noudattaa eksponenttijakaumaa.

Sironneen säteen suuntajakauma saadaan sirontafunktiosta.

Ulostulevan säteilyn karkea jakauma saadaan jo pienehköllä säteiden määrällä. Jakaumaa voidaan tarkentaa tilanteen mukaan.


Dynaaminen muuttujien varaus

Taulukon koko voi riippua syöttötiedoista tai ohjelman laskemista arvoista.

Aliohjelmassa tarvittavan aputaulukon koko tiedetään vasta aliohjelmaa kutsuttaessa.

Fortran 77:
- varataan iso taulukko, joka riittää pahimmassakin tapauksessa, tai
- kutsuva ohjelma välittää aliohjelmille tarvittavat työtilat parametreina

Fortran90: taulukot voidaan varata dynaamisesti suoritusaikana.

Aliohjelman taulukon tila varataan aliohjelmaan tultaessa. Koko voi olla muuttuja:

     subroutine zz(x,n)
     integer, intent(in) :: n
     real, dimension (n) :: x
       ...
     real, dimension(n,n) :: matrix
        ...

Jos taulukon koko saadaan selville vasta suoritusaikana (pääohjelmassa, aliohjelman keskellä), se voidaan varata dynaamisesti:

     real, allocatable, dimension (:,:) :: matrix
       ...
     read(*,*) n
     allocate(matrix(n,n))
       ...

Funktiolla allocated voidan tutkia, onko taulukolle varattu tilaa:

     if (.not. allocated(matrix)) &
        allocate(matrix(1:10, -10:10))

Aliohjelman paikalliset muuttujat katoavat aliohjelman päättyessä. Tila voidaan vapauttaa myös eksplisiittisesti:

     deallocate(matrix)