1 2 3 4 5 6 7 8 9 10 11 puhe
Matemaattisen tarkkaa kaaosta
-----------------------------

Petri Keckman


Luulisi, ettei mikään ole niin tarkkaa kuin matemaattinen tarkkuus,  mutta  jon-
kinlainen kaaos voi tulla vastaan lukujenkin maailmassa.  Osaltaan  tämä  johtuu
siitä, että tietokoneella voidaan laskea vain äärellisellä tarkkuudella  varsin-
kin systeemeissä, jotka ovat hyvin herkkiä alkuarvojen suhteen.  Tällaisia  ovat
monet luonnontieteen matemaattiset mallit, joissa lasketaan planeettojen  ratoja
tai säätä. Kyllä, planeettojenkin liikkeissä on samanlaisia pienestä  sattumasta
kiinni olevia heilahteluja kuin sääilmiöissä. Viimeksi mainituista  yksi  tunne-
tuimmista on perhosefekti: jos jotakin perhosen  siiven  iskua  ei  olisi  viime
vuonna tapahtunut, niin jokin hirmumyrsky olisi vältetty tänä  vuonna  tai  toi-
sinpäin. Vuosituhansien saatossa saattavat pienet ja kaukaiset tekijät vaikuttaa
planeettojen kiertoratoihinkin. Kun tähän lisätään vielä kvanttimekaniikan tuoma
sattumallisuus mikromaailman ilmiöihin, niin ainakaan niitä ei voida ennustaa.

Tietokoneella on helppo tutkia numeerisesti sellaisia käsitteitä kuin  jaksolli-
suus, kaaos ja tasapainotila.  Esimerkiksi  hyvin  yksinkertainen  rekursiivinen
kaava x:=1-q*x*x, missä x:lle lasketaan arvo x:n  edellisen  arvon  perusteella.
Valitaan q väliltä nollasta kahteen. Jos q on nolla, niin sarja saa  heti  arvon
yksi ja pysyy siinä, sillä 1=1-0*x*x, vaikka x olisi mikä tahansa  luku.  Tutki-
taan E-kielisellä ohjelmalla, miten käy kun q=0.1. On selvää, että jos sarja saa
missä tahansa vaiheessa saman arvon kuin joskus aikaisemmin, niin se  ei  kehity
vaan toistaa itseään. Seuraavassa ohjelman  pätkässä  lasketaan  kymmenen  lukua
kerralla taulukkoon ja tutkitaan, onko niiden joukossa samoja.  E-kielessä  ovat
desimaaliluvut aivan  tavallisia  LONG-tyyppisiä  32-bittisiä  (kokonais)lukuja,
joille vain on omat laskutoimitukset. Muuttujan ja laskutoimituksen  tulkitsemi-
nen reaalityyppiseksi merkitään huutomerkillä,  samoin  muunnokset  lukutyyppien
välillä. Lukuarvo tulkitaan desimaaliluvuksi (tai float, real - mikä se onkaan),
jos siinä on desimaalipiste. 

PROC main()
  DEF x[10]: ARRAY OF LONG,
      s[20]:STRING,  /* apumuuttuja reaalilukujen tulostukseen */
      x0=0.0,  /* alkuarvo  Huom! desimaalipiste on oltava nollassakin*/
      ind=0,   /* sarjan alkion indeksi (tämä on 16-bit kokonaisluku) */
      i, j,    /* taulukkojen käsittelyyn */
      q=0.1,   /* samoin tässä on oltava "." (vaikka arvo olisi 1.0) */
      samoja,  /* totuusarvo samojen löytymiselle 10 joukosta */
      pot=10   /* apumuuttuja tulostuksen hallintaan */

  WriteF('Rekursiokaava x:=1-qxx, missä x[0]=\s ',RealF(s,!x0,8))
  WriteF('ja q=\s\n',RealF(s,!q,8))

  REPEAT
    FOR i:=0 TO 9         /* lasketaan kymmenen kerralla */
      x[i]:=!1.0-(!q*x0*x0)
      x0:=x[i]
      INC ind
    ENDFOR
    i:=0                  /* tarkastetaan löytyikö niiden joukosta */
    REPEAT                /* samoja */
      j:=i+1
      REPEAT
         samoja:=(!x[i]=x[j])
         INC j
      UNTIL (j=9) OR samoja
      INC i
    UNTIL (i=8) OR samoja
                          /* tulostetaan jos samoja löytyi tai */
                          /* ind-10 on jaollinen 10
ot:lla */
    IF samoja OR (Mod(ind-10,pot)=0)
      FOR i:=0 TO 9
        WriteF('x[\d] =  \s\n',ind+i-9,RealF(s,x[i],8))
      ENDFOR
      pot:=10*pot
    ENDIF
    x0:=x[9]   /* asetetaan uusi x0 ja jos ei paineta hiirtä, niin */
  UNTIL (ind>650000) OR samoja OR (Mouse()=1) /* toistetaan kunnes...*/
  WriteF('Ohjelma päättyi.')
ENDPROC

Tuloste:

Rekursiokaava x:=1-qxx, missä x[0]=0.00000000 ja q=0.10000001
x[1] =  1.0
x[2] =  0.90000000
x[3] =  0.91900000
x[4] =  0.91554392
x[5] =  0.91617792
x[6] =  0.91606184
x[7] =  0.91608312
x[8] =  0.91607920
x[9] =  0.91607984
x[10] =  0.91607976
x[11] =  0.91607976
x[12] =  0.91607976
x[13] =  0.91607976
x[14] =  0.91607976
x[15] =  0.91607976
x[16] =  0.91607976
x[17] =  0.91607976
x[18] =  0.91607976
x[19] =  0.91607976
x[20] =  0.91607976
Ohjelma päättyi.

Eli sarja lähestyy hyvin nopeasti arvoa 0.91607976.

Voidaan todeta, ettei raja-arvo (tässä tapauksessa kun q=0.1) riipu sarjan
ensimmäisestä jäsenestä x[0], vaan esim. jos lähdemme arvosta x[0]=-5.0,
niin saamme saman raja-arvon:

Rekursiokaava x:=1-qxx, missä x[0]=-5.0 ja q=0.10000001
x[1] = -1.50000000
x[2] = 0.77500000
x[3] = 0.93993744
x[4] = 0.91165176
x[5] = 0.91688912
x[6] = 0.91593144
x[7] = 0.91610696
x[8] = 0.91607480
x[9] = 0.91608072
x[10] = 0.91607960
x[11] = 0.91607984
x[12] = 0.91607976
x[13] = 0.91607976
x[14] = 0.91607976
x[15] = 0.91607976
x[16] = 0.91607976
x[17] = 0.91607976
x[18] = 0.91607976
x[19] = 0.91607976
x[20] = 0.91607976
Ohjelma päättyi.

Näin käy ainakin niin kauan kuin x[0] ei ole pienempi kuin noin -10.916.
Alkuarvosta -10.917 raja-arvoksi yhtäkkiä tulee 0 (en tiedä miksi). Mutta
annetaan nyt x[0]:n olla aluksi nolla ja tutkitaan raja-arvon määräytymistä
pelkästään q:sta. Olkoon esim. q=0.7:

Rekursiokaava x:=1-qxx, missä x[0]=0.00000000 ja q=0.70000000
x[1] = 1.0
x[2] = 0.30000002
x[3] = 0.93700000
x[4] = 0.38542168
x[5] = 0.89601512
x[6] = 0.43800984
x[7] = 0.86570320
x[8] = 0.47539060
x[9] = 0.84180264
x[10] = 0.50395780
x[101] = 0.67937728
x[102] = 0.67691248
x[103] = 0.67925264
x[104] = 0.67703112
x[105] = 0.67914024
x[106] = 0.67713800
x[107] = 0.67903888
x[108] = 0.67723432
x[109] = 0.67894760
x[110] = 0.67732112
x[261] = 0.67811376
x[262] = 0.67811320
x[263] = 0.67811368
x[264] = 0.67811328
x[265] = 0.67811360
x[266] = 0.67811336
x[267] = 0.67811360
x[268] = 0.67811336
x[269] = 0.67811360
x[270] = 0.67811336
Ohjelma päättyi.

Huomataan, että sarja näyttää kyllä lähestyvän jotain raja-arvoa, mutta ei
tarkasti saavuta sitä, vaan parilliset ja parittomat jäsenet saavuttavat
omansa (vaikkakin hyvin läheiset). Kasvatetaan vielä hieman q:ta: q=0.74:

Rekursiokaava x:=1-qxx, missä x[0]=0.00000000 ja q=0.74000000
x[1] = 1.0
x[2] = 0.26000000
x[3] = 0.94997600
x[4] = 0.33218372
x[5] = 0.91834400
x[6] = 0.37591684
x[7] = 0.89542800
x[8] = 0.40667444
x[9] = 0.87761576
x[10] = 0.43004508
x[1121] = 0.66890328
x[1122] = 0.66890060
x[1123] = 0.66890324
x[1124] = 0.66890060
x[1125] = 0.66890324
x[1126] = 0.66890060
x[1127] = 0.66890324
x[1128] = 0.66890060
x[1129] = 0.66890324
x[1130] = 0.66890060

Edelleen parittomat ja parilliset jäsenet saavuttavat raja-arvonsa erikseen,
mutta nyt hieman myöhemmin. Itse asiassa sarjan pitäisi saavuttaa
yksikäsitteinen raja-arvo, jota ei tietokoneella saavuteta. Raja-arvo on
helppo laskea: onhan se kiintopiste eli piste, jossa x=1-q*x*x, jolla on
toisen asteen yhtälön (q*x*x+x-1=0) ratkaisu, kun x=(-1+-Sqrt(1+4q))/(2*q)
eli edellisellä sarjalla olisi pitänyt olla raja-arvo:
(-1+Sqrt(1+4*0.74))/(2*0.74)=0.668901942...

Tutkitaan vielä arvoa q=0.75:

Rekursiokaava x:=1-qxx, missä x[0]=0.00000000 ja q=0.75000000
x[1] =  1.0
x[2] =  0.25000000
x[3] =  0.95312504
x[4] =  0.31866456
x[5] =  0.92383968
x[6] =  0.35989016
x[7] =  0.90285928
x[8] =  0.38863384
x[9] =  0.88672280
x[10] =  0.41029204
x[101] =  0.75357712
x[102] =  0.57409112
x[103] =  0.75281456
x[104] =  0.57495272
x[105] =  0.75207200
x[106] =  0.57579076
x[107] =  0.75134872
x[108] =  0.57660628
x[109] =  0.75064392
x[110] =  0.57740028
x[1001] =  0.69596128
x[1002] =  0.63672840
x[1003] =  0.69593272
x[1004] =  0.63675828
x[1005] =  0.69590416
x[1006] =  0.63678800   Tietokoneella on helppo tehdä monisivuisia
x[1007] =  0.69587576   numeroita käsitteleviä artikkeleita.
x[1008] =  0.63681764
x[1009] =  0.69584744
x[1010] =  0.63684724
x[10001] =  0.67605248
x[10002] =  0.65721476
x[10003] =  0.67605152
x[10004] =  0.65721572
x[10005] =  0.67605064
x[10006] =  0.65721668
x[10007] =  0.67604968
x[10008] =  0.65721764
x[10009] =  0.67604872
x[10010] =  0.65721852
x[52601] =  0.67077388
x[52602] =  0.66254676
x[52603] =  0.67077388
x[52604] =  0.66254676
x[52605] =  0.67077388
x[52606] =  0.66254676
x[52607] =  0.67077388
x[52608] =  0.66254676
x[52609] =  0.67077388
x[52610] =  0.66254676
Ohjelma päättyi.

Kestää yhä kauemmin, ennen kuin sarja saavuttaa raja-arvonsa. Itse asiassa
0.75 on "katastrofipiste", jonka jälkeen sarjan ei matemaattisestikaan
pitäisi saavuttaa yksikäsitteistä raja-arvoa vaan kaksi erillistä. Esim.
q=0.76:

Rekursiokaava x:=1-qxx, missä x[0]=0.00000000 ja q=0.76000000
x[1] =  1.0
x[2] =  0.24000000
x[3] =  0.95622400
x[4] =  0.30508310
x[5] =  0.92926248
x[6] =  0.34371816
x[7] =  0.91021192

jne..., kunnes sarja saavuttaa melko nopeasti kaksi raja-arvoansa:

x[511] =  0.78947528
x[512] =  0.52631384
x[513] =  0.78947528
x[514] =  0.52631384
x[515] =  0.78947528
x[516] =  0.52631384
x[517] =  0.78947528
x[518] =  0.52631384
x[519] =  0.78947528
x[520] =  0.52631384
Ohjelma päättyi.

q:n arvolla 1 sarja saavuttaa heti kaksi raja-arvoaan: 0 ja 1:

1-1*0*0=1 ja 1-1*1*1=0.

Mutta saavuttaako se ne kaikilla x[0]:n lähtöarvoilla?

Rekursiokaava x:=1-qxx, missä x[0] = 0.12300001 ja q=1.0
x[1] = 0.98487096
x[2] = 0.03002918
x[3] = 0.99909824
x[4] = 0.00180268
x[5] = 0.99999672
x[6] = 0.00000656
x[7] = 1.0
x[8] = 0.00000000
x[9] = 1.0
x[10] = 0.00000000
Ohjelma päättyi.

Saavuttaa, ja melko nopeasti. Paitsi: on olemassa arvo x[0]=0.618033988,
joka on kiintopiste:

Rekursiokaava x:=1-qxx, missä x[0]=0.61803400 ja q=1.0
x[1] = 0.61803396
x[2] = 0.61803400
x[3] = 0.61803396
x[10001] = 0.61803396
x[10002] = 0.61803400
x[10003] = 0.61803396
x[10004] = 0.61803400
x[10005] = 0.61803396
x[10006] = 0.61803400
x[10007] = 0.61803396
x[10008] = 0.61803400
x[10009] = 0.61803396
x[10010] = 0.61803400

Sarja on ja pysyy siinä, mutta jos siihen tehdään pieni poikkeama - eli
perhosen siivenisku tai hyttysen aivastus häiritsemässä Jupiterin
kiertorataa - niin:

Rekursiokaava x:=1-qxx, missä x[0]=0.61803300 ja q=1.0
x[1] = 0.61803520
x[2] = 0.61803244
x[3] = 0.61803584
x[4] = 0.61803168
x[5] = 0.61803680
x[6] = 0.61803048
x[7] = 0.61803828
x[8] = 0.61802864
x[9] = 0.61804056
x[10] = 0.61802584
x[101] = 1.0
x[102] = 0.00000000
x[103] = 1.0
x[104] = 0.00000000

Sarja saavuttaa kaksi raja-arvonsa 1 ja 0 taas melko nopeasti.

Jatketaan q:n kasvattamista (ja annetaan x[0]:n olla taas aina 0). Seuraava
katastrofipiste on q=1.25, jossa sarja ei saavuta kahta, vaan neljä
raja-arvoansa:

Rekursiokaava x:=1-qxx, missä x[0]=0.10000001 ja q=1.25000000
x[1] =  0.98750000
x[2] =  -0.21894538
x[3] =  0.94007864
x[4] =  -0.10468484
x[5] =  0.98630136
x[6] =  -0.21598792

jne..., jolloin sarja saavuttaa (tietokoneella kahdeksan desimaalin
tarkkuudella) neljä raja-arvonsa, mutta ei kovin nopeasti:

x[17121] =  0.96672512
x[17122] =  -0.16819692
x[17123] =  0.96463720
x[17124] =  -0.16315615
x[17125] =  0.96672512
x[17126] =  -0.16819692
x[17127] =  0.96463720
x[17128] =  -0.16315615
x[17129] =  0.96672512
x[17130] =  -0.16819692
Ohjelma päättyi.

Kun q:ta kasvatetaan ja annetaan sen lähestyä  1.401:tä,  niin  huomataan,  että
tällä välillä raja-arvojen määrä kaksinkertaistuu yhä  uudestaan  ja  uudestaan,
niin että mitä lähempänä 1.401:tä q on, sitä useampia raja-arvoja se saavuttaa.

Kaikesta   edellä  mainitusta  voidaan  ohjelmalla aikaansaada  kuva:
kuva 1:


Siinä  siis  q  kasvaa  vasemmalta  oikealle 0 < q< 2  ja x  kasvaa  ylhäältä alas
-1 < x < 1.1.  Sarjan  ensimmäiset  arvot  (0 ja 1 jne.)   plotataan  mustilla  pis-
teillä ja sitä valkoisemmilla, mitä suurempi  järjestysnumero  niillä  on.  Sel-
keästi nähdään ne pisteet, joissa raja-arvot kahdentuvat. Kuvasta nähdään, kuin-
ka pisteessä q=0.75 sarja saavuttaa raja-arvon.  Mutta  jos  zoomataan  aluetta,
niin havaitaan, että se on harhaa:
kuva 2
Kuvasta 2 nähdään selvästi ("perseen muodossa"), kuinka sarja  ei  todellisuudessa 
koskaan saavuta raja-arvoa  pisteessä   q=0.75  (vaikka  äärellisen   laskutarkkuuden  
omaavalla tietokoneella sen  myös  numeerisesti edellä saavuttikin).

Kuvasta 1 nähdään myös, kuinka pisteen q=1.401 jälkeen sarja ei saavuta  yleensä
mitään raja-arvoja, vaan heilahtelee  summittaisesti(?)  -  mutta  matemaattisen
tarkasti - tiettyjen arvojen välillä. Kuitenkin tämänkin pisteen jälkeen on  ha-
vaittavissa alue (q>1.75), jossa sarja saavuttaa kolme tarkkaa  raja-arvoa:

Aluetta  1.401:stä  eteenpäin  ei  tunneta kovin tarkkaan.  Mitään selkeätä
matemaattista   mallia   ei   ole   sen  käyttäytymiselle,  vaikka  selkeää
säännönmukaisuutta    sielläkin    on   havaittavissa.    Determinismi   ja
matemaattinen tarkkuus antavat sijaa sattumalle ja kaaokselle.

Tässä  tuli  lähinnä  tutkittua  vain  q:ta,  koska  käsittääkseni  yleensä
alkuarvon  x[0]  valitseminen - ainakin kun pysytään alueella -1 < x[0] < 1, ei
vaikuta raja-arvoon - poikkeuksena kiintopisteet.  Lopuksi kuitenkin 
kuva siitä,  miten  käy kun alkuarvona onkin x[0]=-2 (alueella, jossa q lähestyy
0.75:sta).