Simo K. Kivelä, 14.7.2004

Partikkelit pallon pinnalla

Tehtävänä on sijoittaa annettu määrä keskenään identtisiä partikkeleita mahdollisimman tasaisesti pallon pinnalle ja piirtää kuvio syntyvästä partikkelikonfiguraatiosta.

Tehtävä ei sellaisenaan ole hyvin määritelty: on täsmennettävä, mitä tarkoitetaan tasaisella sijoittamisella. Yksi — mutta ei ainoa — mahdollisuus on ajatella partikkeleiden olevan identtisiä sähkövarauksia, jotka kitkatta liikkuvat pallon pinnalla. Koska identtiset sähkövaraukset hylkivät toisiaan, ne pyrkivät sijoittumaan toisistaan niin kauas kuin mahdollista.

Sijoittuminen mahdollisimman kauas toisistaan voidaan luonnehtia fysikaalisesti siten, että systeemin potentiaalienergia pyrkii hakeutumaan minimiarvoon. Kahden partikkelin tapauksessa potentiaali on oleellisesti 1/r, missä r on partikkeleiden välinen etäisyys. Useamman partikkelin tapauksessa kokonaispotentiaali on summa kaikista partikkeliparien potentiaaleista:

V= (∑_(i ≠ j)) (1/(Subscript[r, ij])),

missä (Subscript[r, ij]) on i:nnen ja j:nnen partikkelin välinen etäisyys.

Jos partikkeleita on kaksi, ne sijoittuvat ilmeisestikin pallon vastakkaisille puolille.

Jos partikkeleita on kolme, ne joka tapauksessa määräävät erään tason, ja partikkelit siis sijaitsevat tämän tason ja pallon leikkausympyrällä. Jotta partikkelit pääsisivät mahdolisimman kauas toisistaan, tason tulee ilmeisestikin kulkea pallon keskipisteen kautta ja partikkeleiden sijaita ympyrällä 120 asteen välein.

Jos partikkeleita on enemmän, tulos ei ole yhtä selvä. Neljän partikkelin voisi arvata sijoittuvan tetraedrin kärkipisteisiin, mikä onkin oikea arvaus. Tämän jälkeen voisi arvella, että jos partikeleita on yhtä paljon kuin jossakin Platonin kappaleessa (tetraedri, oktaedri, kuutio, dodekaedri, ikosaedri) on kärkiä, niin partikkelit sijoittuisivat juuri kyseisen Platonin kappaleen kärkiin. Tämä on kuitenkin väärä arvaus.

Seuraavassa esityksessä ongelma ratkaistaan minimoimalla partikkelisysteemin kokonaispotentiaali.

Ratkaisu

Partikkeleiden lukumäärä olkoon

n = 5

Partikkelit sidotaan yksikkösäteisen pallon pinnalle ilmoittamalla niiden sijainti pallokoordinaattien avulla. Pallokoordinaattien avulla lasketaan vastaavat suorakulmaiset koordinaatit ja kukin partikkeli ilmaistaan kolmialkioisena suorakulmaisten koordinaattien muodostamana listana. Partikkelin sijainnin ilmoittavat pallokoordinaatit ovat probleeman tuntemattomat.

Aluksi muodostetaan — hieman teknisesti — pallokoordinaattien nimet, so. probleeman muuttujat:

theta = Table[Symbol["theta" <> ToString[k]], {k, 1, n}]

fi = Table[Symbol["fi" <> ToString[k]], {k, 1, n}]

muuttujat = {Table[theta[[k]], {k, 1, n}], 
        Table[fi[[k]], {k, 1, n}]}

Partikkelit voidaan nyt ilmaista listana, jossa kukin partikkeli on esitetty sen suorakulmaisten koordinaattien avulla:

partikkelit = 
      Table[{Cos[theta[[k]]]*Cos[fi[[k]]], 
          Cos[theta[[k]]]*Sin[fi[[k]]], Sin[theta[[k]]]}, {k, 1, 
          n}]

Systeemin potentiaalifunktio voidaan muodostaa tämän jälkeen. Osapotentiaali on partikkeliparin aiheuttama potentiaali ja kokonaispotentiaali partikkeliparien potentiaaleista muodostettu summa. Summeerauksessa käytetyt indeksiarvot 1 ≤ j ≤ n - 1, j + 1 ≤ k ≤ n merkitsevät, että jokainen partikkelipari tulee otetuksi huomioon.

osaPotentiaali[p_, q_] := 
      1/Sqrt[Sum[(p[[k]] - q[[k]])^2, {k, 1, 3}]]

potentiaali = 
      Sum[osaPotentiaali[partikkelit[[j]], partikkelit[[k]]], {j, 1, 
          n - 1}, {k, j + 1, n}]

Potentiaalifunktion lauseke on pitkähkö. Kun partikkeleita on n kappaletta, kyseessä on 2 n muuttujan funktio. Tavoitteena on funktion minimiarvon löytäminen. Minimiarvoa vastaavat muuttujien arvot, so. pallokoordinaattien arvot antavat etsityn partikkelikonfiguraation.

Minimiarvo ja vastaava minimikohta voidaan laskea Mathematican funktiolla FindMinimum. Tämä käyttää iteratiivista algoritmia, jolle on annettava jotkin alkuarvot ja joka antaa tulokseksi alkuarvoista riippuen jonkin paikallisen minimin. Absoluuttista minimiä ei siten välttämättä löydetä. Kokeilemalla useita kertoja erilaisilla alkarvoilla tilanne saadaan kuitenkin melko luotettavasti kartoitetuksi.

Alkuarvot voidaan syöttää käsin, mutta koska niitä on suhteellisen paljon eikä ole aivan helppoa mieltää, millaiset olisivat sopivia, voidaan alkuarvot generoida satunnaisesti pallokordinaattien vaihteluväleiltä (-π/
          2 ≤ ϑ ≤ π/2, \(TraditionalForm\`\(-π\) ≤ φ ≤ π\)).

alkuarvot = {Table[Random[Real, {-Pi/2, Pi/2}], {k, 1, n}], 
        Table[Random[Real, {-Pi, Pi}], {k, 1, n}]}

Funktiossa FindMinimum tarvittava alkuasetus on tallöin muotoa

alkuasetus = 
      Transpose[{Flatten[muuttujat], Flatten[alkuarvot]}]

Funktion kutsu tapahtuu teknisesti hieman mutkikkaalla tavalla, jotta voidaan helposti hyödyntää aiemmin muodostetut muuttujat. Optiolla MaxIterations säädellään iteratiivisen laskennan pituutta. Jos ratkaisua ei löydy, ts. iteraatio ei suppene, arvoa voi suurentaa. Vaihtoehtona on vaihtaa alkuarvoja.

rtk = 
      Apply[FindMinimum, 
        Flatten[{potentiaali, alkuasetus, MaxIterations -> 15}, 
          1]]

Jos iteraatio suppenee, tuloksena saadaan jokin paikallinen minimiarvo ja sitä vastaavat muuttujien, ts. pallokoordinaattien arvot. Eri alkuarvoista lähdettäessä saatetaan saada erilaisia paikallisia minimejä. Kyseessä ei siten välttämättä ole absoluuttinen minimi, mutta toistamalla laskenta ja vertailemalla saatuja minimiarvoja saadaan jonkinlainen käsitys siitä, onko löydetty absoluuttinen minimi.

minimiarvo = rtk[[1]]

Partikkelien suorakulmaiset koordinaatit saadaan tämän jälkeen helposti:

konfiguraatio = partikkelit /. rtk[[2]]

Tulokset graafisessa muodossa

Tieto partikkelien suorakulmaisista koordinaateista ei helposti anna mielikuvaa konfiguraatiosta. Graafinen tulostus on hyödyllisempi. Tällöin on luontevaa esittää myös pallopinta, jolla partikkelit sijaitsevat.

pallo = 
        First[ParametricPlot3D[
              0.95*{Cos[t] Cos[f], Cos[t] Sin[f], Sin[t]}, {t, -Pi/2, 
                Pi/2}, {f, -Pi, Pi}, PlotPoints -> {13, 25}, 
              DisplayFunction -> Identity]] /. 
          Polygon :> Line;

pisteet = Map[Point, konfiguraatio];

kuvio = 
      Show[Graphics3D[{{GrayLevel[0.8], Thickness[0.008], 
              pallo}, {GrayLevel[0], PointSize[0.05], pisteet}}], 
        Shading -> False, Boxed -> False, 
        ViewPoint -> {100, 100, 50}]

Animaatio auttaa vielä paremmin hahmottamaan pisteiden sijainnin:

Needs["Graphics`Animation`"]

SpinShow[kuvio, Frames -> 72]

Harjoitustehtäviä

1) Tutki tapauksia, missä pisteitä on 6, 7 tai 8. Vastaako kuutta pistettä oktaedri ja kahdeksaa pistettä kuutio? Kokeile useita erilaisia alkuarvoja.

2) Partikkeleiden tasaisen sijoittamisen kriteeri voidaan valita monella eri tavalla. Yhtenä mahdollisuutena on minimoida lauseketta, jossa osapotentiaali on muotoa 1/(r^2), vaikkei tämä fysikaalinen potentiaali olekaan. Tutki, ovatko konfiguraatiot tällöin erilaisia.

3) Potentiaalin minimoimisen sijasta voidaan maksimoida partikkeliparien etäisyyksien minimiarvoa, ts. vaatia, että lähinnä toisiaan olevien partikkeleiden välinen etäisyys on mahdollisimman suuri. Etäisyys voidaan tällöin mitata joko suoraviivaisesti tai pallon pintaa pitkin. Muunna laskenta tätä tapausta vastaavaksi. (Tarvittava funktio on tällöinkin FindMinimum; funktion f maksimin hakeminen on nimittäin sama asia kuin funktion -f minimin hakeminen. Maksimoitava funktio ei ole tässä tapauksessa differentioituva, koska se on etäisyyksien minimiarvo, ts. muotoa Min[...]. Tällöin FindMinimum tarvitsee kaksi alkuarvoa kutakin muuttujaa kohden; ks. Mathematican dokumentaatiota. Iteraation suppeneminen on usein ongelmallista.)