Ge­o­lo­gisch on­der­zoek met de Pi en Ma­the­ma­ti­ca

Ge­o­lo­gisch on­der­zoek met de Rasp­ber­ry Pi en Ma­the­ma­ti­ca

C’t Magazine - - Inhoud 11/2018 - Pe­ter Ne­u­mann

Ma­the­ma­ti­ca kan niet al­leen ver­ge­lij­kin­gen door­re­ke­nen en op­los­sen, maar biedt ook toe­gang tot Wol­frams we­ten­schap­pe­lij­ke da­ta­ba­se. Je mag Ma­the­ma­ti­ca op een Rasp­ber­ry Pi gra­tis ge­brui­ken – bij­voor­beeld om aard­be­vin­gen in­zich­te­lijk te ma­ken.

Wol­frams wis­kun­di­ge soft­wa­re Ma­the­ma­ti­ca is gra­tis be­schik­baar op de Pi-mi­ni­com­pu­ter voor pri­vé- en edu­ca­tief ge­bruik. Bij Ma­the­ma­ti­ca hoort de krach­ti­ge we­ten­schap­pe­lij­ke on­li­ne da­ta­ba­se Wol­fram Know­led­ge­ba­se. Die stelt con­ti­nu bij­ge­werk­te da­ta be­schik­baar uit al­le­rie on­der­zoeks­ge­bie­den. Met be­hulp van on­der­werp­spe­ci­fie­ke query-func­ties krijg je uit­sluit­sel over ruim­te-ob­jec­ten van sa­tel­liet­brok­stuk­ken tot melk­weg­clus­ters, over mo­le­cu­len van H2O tot DNA, en er zijn al­ler­lei de­tails over plaat­sen van Dru­ten tot en met Los An­ge­les. De da­ta­ba­se le­vert bo­ven­dien tien­dui­zen­den ac­tu­e­le re­cords over ge­re­gi­streer­de aard­be­vin­gen. Elk van die da­ta­re­cords be­vat on­der meer het tijd­stip, de ge­o­gra­fi­sche co­ör­di­na­ten en de in­ten­si­teit van een aard­be­ving.

Aan de hand van die aard­be­vings­da­ta leer je hier hoe je met de Wol­fram Lan­gu­a­ge een query aan­maakt, die naar de Know­led­ge­ba­se stuurt en de re­sul­ta­ten ver­vol­gens gra­fisch weer­geeft.

Zo kun je het voor­ko­men van aard­be­vin­gen in be­paal­de re­gio's en de sprei­ding qua tijd en in­ten­si­teit goed weer­ge­ven, bij­voor­beeld voor een le­zing over de laat­ste ont­wik­ke­lin­gen op het In­do­ne­si­sche va­kan­tie-ei­land Lom­bok. Als je wat pro­gram­mee­r­er­va­ring hebt, krijg je van­zelf een in­druk hoe het voor­beeld­pro­gram­ma in dit ar­ti­kel werkt. Voor nieu­we­lin­gen is het wel­licht raad­zaam de tu­to­ri­als van Wol­fram eens door te ne­men. Die staan, net als het voor­beeld­pro­gram­ma, ver­meld bij de link aan het eind van dit ar­ti­kel.

Rasp­bi­an heeft Ma­the­ma­ti­ca als gra­fi­sche X-toe­pas­sing be­schik­baar voor de stan­daard­ge­brui­ker pi. Voor an­de­re sce­na­rio's kun je het met het pak­ket­ma­na­ge­ment van Rasp­bi­an in­stal­le­ren met su­do apt in­stall wol­fram-en­gi­ne.

Uni­ver­seel no­te­book

Na het star­ten van Ma­the­ma­ti­ca ver­schijnt er op het beeld­scherm een leeg no­te­book – zo he­ten pro­ject­be­stan­den in Ma­the­ma­ti­ca. Daar typ je de co­de in, voer je hem uit en krijg je de re­sul­ta­ten te zien. Dat kan tek­stout­put zijn, maar ook gra­fie­ken, ani­ma­ties en zelfs ge­lui­den. Bij het hier be­schre­ven zoe­ken naar aard­be­vin­gen opent de co­de bij het uit­voe­ren een ei­gen no­te­book voor de gra­fi­sche weer­ga­ve van de re­sul­ta­ten.

No­te­books zijn op­ge­bouwd uit cel­len, die ook ge­nest mo­gen zijn. Ma­the­ma­ti­ca mar­keert het be­reik waar­over een cel zich uit­strekt met een recht­hoe­ki­ge haak aan de rech­ter ven­ster­rand. Om een cel te se­lec­te­ren, klik je op die recht­hoe­ki­ge haak of in het cel­be­reik. Met Shift+En­ter eva­lu­eert Ma­the­ma­ti­ca de in­houd van de ge­se­lec­teer­de cel en laat het re­sul­taat zien. Met Alt+. breek je een lo­pen­de be­re­ke­ning af.

Om­dat het no­te­book­for­maat be­doeld is voor pre­sen­ta­ties en desktop-pu­blis­hing, kun­nen cel­len be­hal­ve co­de en re­sul­ta­ten ook ti­tels, com­men­ta­ren en der­ge­lij­ke be­vat­ten. Een se­lec­tie van de al­le be­schik­ba­re cel­ty­pen krijg je via de rech­ter muis­knop.

An­ders dan de mees­te pro­gram­meer­ta­len ac­cep­teert Ma­the­ma­ti­ca zon­der te pro­tes­te­ren ook on­be­ken­de na­men voor va­ri­a­be­len en func­ties. El­ke ex­pres­sie wordt net zo ver uit­ge­voerd als mo­ge­lijk is: als x niet be­kend is, wordt 3+4+x dan 7+x. Dat is niet zo als een for­mu­le syn­taxisfou­ten heeft zo­als niet af­ge­slo­ten haak­jes. Dan is de ex­pres­sie niet com­pleet en krijg je een fout­mel­ding.

Als je aard­be­vin­gen.nb down­lo­adt en opent met Ma­the­ma­ti­ca, ver­schijnt een no­te­book met één en­ke­le cel. Die be­vat de he­le co­de van de­ze ap­pli­ca­tie. Voer de­ze cel uit met Shift+En­ter, dan springt de weer­ga­ve naar het ein­de van de cel en krijg je in­voer­vel­den te zien waar al stan­daard­waar­den in zijn in­ge­vuld. Daar kun je de ge­ge­vens in­vul­len voor het cen­trum en de straal van het ge­wens­te zoek­ge­bied, even­als de be­gin-en eind­tijd­stip­pen van de ge­wens­te pe­ri­o­de en een mi­ni­ma­le kracht (in­ten­si­teit) van de aard­be­vin­gen die mee­ge­no­men moe­ten wor­den. Bo­ven­dien kun je een naam in­vul­len waar­mee de gra­fi­sche weer­ga­ve in no­te­book­for­maat moet wor­den op­ge­sla­gen.

Een klik op 'Start zoe­ken' voert dan zo­wel de zoek­tocht in de Know­led­ge­ba­se uit als de aan­slui­ten­de ver­de­re ver­wer­king van de da­ta. Bij de in­voer­vel­den zie je bij het tekst­veld 'Sta­tus' wat de voort­gang van de lo­pen­de be­re­ke­ning is. Tot slot ver­schijnt een

an­der no­te­book met de gra­fi­sche weer­ga­ve van de re­sul­ta­ten. De duur van de query hangt sterk af van de ge­wens­te pe­ri­o­de waar­bin­nen de aard­be­vin­gen ge­zocht moe­ten wor­den en hoe zwaar de Know­led­ge­ba­se mo­men­teel be­last wordt. In on­gun­sti­ge ge­val­len kan het een paar mi­nu­ten du­ren.

Rond­lei­ding door de co­de

In de Know­led­ge­ba­se wordt naar po­si­ties op het aard­op­per­vlak ver­we­zen op ba­sis van hun ge­o­gra­fi­sche co­ör­di­na­ten. Om bij­voor­beeld de leng­te- en breed­te­graad van Tokyo op te vra­gen, kun je de in­ge­bouw­de func­tie In­ter­pre­ter ge­brui­ken. Die zet ge­wo­ne na­men om in een voor Ma­the­ma­ti­ca be­grij­pe­lijk for­maat. Om pre­cies te zijn: een Ge­oPo­si­ti­on-ob­ject. Als je die func­tie aan­roept met het ar­gu­ment "Lo­ca­ti­on" (voor plaats) en bij­voor­beeld een plaats­naam als Tokyo, dan krijg je de bij­be­ho­ren­de co­ör­di­na­ten in de uit­voer:

In­ter­pre­ter["Lo­ca­ti­on"]["Tokyo"]

Dan ver­schijnt de uit­voer:

Ge­oPo­si­ti­on[{35.67,139.77}

Ook in­voer als "Eif­fel To­wer" en "Ma­chu Pic­chu" is mo­ge­lijk.

De voor­beeld­co­de de­fi­ni­eert de func­tie getPo­si­ti­onFromString, waar­mee het aan­roe­pen van In­ter­pre­ter["Lo­ca­ti­on"] met een meer be­schrij­ven­de func­tie­naam mo­ge­lijk is:

getPo­si­ti­onFromString[in­put_] :=

In­ter­pre­ter["Lo­ca­ti­on"][in­put]

Daar­bij is in­put de pla­ce­hol­der voor de plaats­aan­dui­ding. Aan de lin­ker­kant van die aan­dui­ding moet een un­der­sco­re (_) vol­gen. Die geeft aan dat het om een zo­ge­he­ten pat­tern gaat. Meer daar­over staat in de hulp­func­tie van Ma­the­ma­ti­ca bij 'De­fi­ning Func­ti­ons' en 'Trans­for­ma­ti­on Ru­les for Func­ti­ons'. Voor het ver­volg is het al­leen van be­lang om te we­ten dat op de pa­ra­me­ter­na­men een un­der­sco­re moet vol­gen, maar niet op de iden­ti­fier rechts van de toe­wij­zings­ope­ra­tie :=. Daar­door le­vert bij­voor­beeld

getPo­si­ti­onFromString["Eif­fel To­wer"]

de waar­de Ge­oPo­si­ti­on[{48.8583,2.29444}] op. Om de pe­ri­o­de in te per­ken waar­bin­nen naar de aard­be­vings­da­ta ge­zocht wordt, is het aan­ge­ven van ka­len­der­da­tums in een ei­gen for­maat van Wol­fram Lan­gu­a­ge in plaats van als string no­dig. Ook dat kan de In­ter­pre­ter doen, en wel door het aan­ge­ven van "Da­te" in plaats van "Lo­ca­ti­on". De voor­beeld­co­de de­fi­ni­eert voor een be­te­re lees­baar­heid een func­tie met de aan­roep:

getDa­teFromString[in­put_] :=

In­ter­pre­ter["Da­te"][in­put];

Door het in­ty­pen van

getDa­teFromString["1.1.2018"]

ver­schijnt in de out­put een klein ka­len­der­pic­to­gram en daar­naast 'Day' en 'Mon 1 Jan 2018'. Die out­put komt van Ma­the­ma­ti­ca. Als je wilt we­ten wel­ke Wol­fram Lan­gu­a­ge-co­de daar­ach­ter zit, klik je daar­on­der op 'da­te for­mats/text'. Dan ver­schijnt

Da­teString[Da­teOb­ject[{2018,1,1}, "Day",

"Gre­go­ri­an", 2.]]

Wat de be­te­ke­nis is van de an­de­re ele­men­ten ach­ter jaar, maand en dag, kun je bij het Wol­fram Lan­gu­a­ge Do­cu­men­ta­ti­on Cen­ter op­vra­gen door er­op te klik­ken.

Da­ta op­ha­len

Dan moet je de aard­be­vings­da­ta op­vra­gen met de Ma­the­ma­ti­ca-func­tie Earth­qua­keDa­ta. Als doel­ge­bied kun je daar een Ge­oDisk aan mee­ge­ven, die in de hui­di­ge Ma­the­ma­ti­ca­ver­sie tot het on­der­zoe­ken van een recht­hoe­kig ge­bied leidt. Als an­de­re fil­ter­cri­te­ria kun je aan Earth­qua­keDa­ta de ge­wens­te mi­ni­ma­le kracht en de ge­wens­te pe­ri­o­de mee­ge­ven. De func­tie getEarth­qua­keDa­ta geeft de pa­ra­me­ters door aan Earth­qua­keDa­ta:

getEarth­qua­keDa­ta[cen­ter_, ra­di­us_, t0_,

t1_, mag­ni­tu­de_] :=

Mo­du­le[{da­ta, area}, area = Ge­oDisk[cen­ter, Qu­an­ti­ty[ra­di­us,

"Ki­lo­me­ters"]]; da­ta = Earth­qua­keDa­ta[area,

mag­ni­tu­de, {t0, t1}]; Map[{#["Pe­ri­od"],

#["Mag­ni­tu­de"],

#["Po­si­ti­on"]} &,

Va­lues[da­ta]]

]

De Mo­du­le kun je net als bij an­de­re ta­len als func­tie op­vat­ten. Hij zet de tus­sen­be­re­ke­nin­gen in area en da­ta, zo­dat die niet on­no­dig als sym­bo­len uit de func­tie naar bui­ten hoe­ven te ko­men. Der­ge­lij­ke lo­ka­le va­ri­a­be­len zet je als eerste pa­ra­me­ters tus­sen ac­co­la­des.

Ge­oDisk ver­wacht als eerste pa­ra­me­ter het mid­del­punt van een cir­kel en als twee­de een waar­de voor de straal. Om de een­heid vrij te kun­nen kie­zen wordt bij­voor­beeld niet naar een ge­tal in ki­lo­me­ters ge­vraagd, maar naar een Qu­an­ti­ty, waar je een wil­le­keu­ri­ge een­heid aan mee kunt ge­ven, Zin­vol zijn daar­bij ech­ter al­leen leng­te­ma­ten als "Ki­lo­me­ters" en "Mi­les".

Earth­qua­keDa­ta le­vert een lijst te­rug van sleu­tel-waar­de­pa­ren (As­so­ci­a­ti­on). Van al­le mo­ge­lij­ke sleu­tels zijn voor de voor­beeld­toe­pas­sing al­leen de duur ("Pe­ri­od"), de kracht ("Mag­ni­tu­de") en het mid­del­punt ("Po­si­ti­on") van elk re­sul­taat in­te­res­sant. Om er­voor te zor­gen dat getEarth­qua­keDa­ta al­leen die waar­den per lij­st­ele­ment te­rug le­vert, loopt Map al­le waar­den van da­ta af en maakt daar een nieu­we lijst van. De # re­fe­reert naar de eerste pa­ra­me­ter van een pu­re func­tie (in an­de­re ta­len heet dat een lamb­da- of ano­nie­me func­tie). Pa­ra­me­ters zijn in dit ge­val de na el­kaar door­ge­ge­ven ele­men­ten van da­ta. Daar­bij re­fe­reert #2 naar de twee­de pa­ra­me­ter, #3 naar de der­de en­zo­voorts. Met de & wordt de­ze con­struc­tie af­ge­slo­ten. Meer daar­over bij het on­der­deel Pu­re Func­ti­ons in de do­cu­men­ta­tie van Ma­the­ma­ti­ca.

Met de vol­gen­de aan­roep kun je dan een over­zicht krij­gen van de laat­ste aard­be­vin­gen op het In­do­ne­si­sche va­kan­ti­eei­land Lom­bok:

getEarth­qua­keDa­ta[ getPo­si­ti­onFromString["Lom­bok"], 100, getDa­teFromString["4.8.2018"], getDa­teFromString["6.8.2018"], 4]

In het twee­de ele­ment van de uit­voer her­ken je met­een de flin­ke aard­be­ving met kracht 6,9 die het noor­de­lijk deel van het ei­land om 11:46 MET teis­ter­de:

{{Da­teOb­ject[{2018, 8, 4, 5, 44}], 4.4,

Ge­oPo­si­ti­on[{-8.3939, 116.611}]}, {Da­teOb­ject[{2018, 8, 5, 11, 46}], 6.9,

Ge­oPo­si­ti­on[{-8.2871, 116.451}]}, {Da­teOb­ject[{2018, 8, 5, 12, 42},], 4.9,

Ge­oPo­si­ti­on[{-8.3373, 116.185}]}, ...}

Bij de­ze out­put heb­ben we het weer­ge­ven van de waar­den in dit ge­val even be­perkt tot de hier re­le­van­te waar­den.

Dat het epi­cen­trum in­der­daad in het noor­den van het ei­land lag, kun je bij­voor­beeld zien door de co­ör­di­na­ten (in Ge­oPo­si­ti­on[{-8.2871, 116.451}) in Goog­le Maps in te ty­pen. Dat is ech­ter nog­al om­slach­tig.

Op het scherm to­nen

Het voor­beeld-no­te­book maakt het mak­ke­lij­ker: al­le re­sul­ta­ten wor­den daar­bij op een land­kaart weer­ge­ge­ven. Dat ge­beurt met de func­tie ren­derEarth­qua­keMap:

ren­derEarth­qua­keMap[da­ta_] := Ge­oGrap­hics[

{Ap­ply[{RGBCo­lor[1, 0, 1, 0.4], PointSi­ze[0.001 (#2^2)], Point[#3]} &, da­ta, {1}]},

Ge­oRan­ge -> Au­to­ma­tic, Ge­oS­ca­leBar -> "Ki­lo­me­ters", Ima­geSi­ze -> 700] De func­tie Ge­oGrap­hics ge­ne­reert de kaart uit de in de eerste pa­ra­me­ter mee­ge­ge­ven ge­o­gra­fi­sche ken­mer­ken. In dit ge­val zijn dat klei­ne cir­kels. RGBCo­lor[1, 0, 1, 0.4] zorgt er­voor dat ze vi­o­let wor­den en een dek­king van 40 pro­cent krij­gen. De groot­te van de cir­kels (PointSi­ze) neemt toe met de kracht (#2) tot een groot­te van 2,5 keer. Point zorgt er ten­slot­te voor dat de cir­kel op de met #3 geex­tra­heer­de ge­o­gra­fi­sche co­ör­di­na­ten ge­te­kend wordt. De laat­ste pa­ra­me­ter {1} be­paalt de laag waar­uit de #2 en #3 de waar­den uit da­ta moe­ten ex­tra­he­ren. Als je die zou weg­la­ten of zou ver­van­gen door {0}, dan had­den ze be­trek­king op de nul­de laag, of­te­wel het twee­de en der­de ele­ment in da­ta. We wil­len hier ech­ter de kracht (#2) en de ge­o­gra­fi­sche co­ör­di­na­ten (#3) van elk ele­ment in da­ta heb­ben, dus moe­ten we een laag die­per.

Op de kaart zie je dan ver­vol­gens wel de lo­ca­tie van de aard­be­vin­gen en de kracht, maar niet hoe vaak er aard­be­vin­gen van een be­paal­de kracht bin­nen een tijds­be­stek op­tre­den. Voor het vi­su­a­li­se­ren van de fre­quen­ties biedt Ma­the­ma­ti­ca het His­to­gram:

ren­derMag­ni­tu­deHis­to­gram[da­ta_] := His­to­gram[Map[#[[2]] &, da­ta], {0.1},

AxesLa­bel -> {"Kracht",

"Fre­quen­tie"},

Ima­gePad­ding -> 60, ChartEle­mentFunc­ti­on ->

"Fa­dingRec­tan­g­le",

ChartS­ty­le -> Blue

]

In de eerste pa­ra­me­ter ver­wacht His­to­gram de te ver­wer­ken waar­den, in de twee­de de in­ter­val­groot­te. Een in­ter­val­groot­te van 0,1 geeft aan dat de fre­quen­ties in in­ter­val­len met stap­pen van 0,1 ge­teld moe­ten wor­den. De an­de­re op­ti­o­ne­le pa­ra­me­ters be­pa­len din­gen als de as­la­bels en het ui­ter­lijk van het his­to­gram.

En ac­tie!

Het in­voer­for­mu­lier ont­staat uit ver­schil­len­de in­voer­vel­den (In­putField) met be­schrij­vin­gen van de vel­den (Text) die het lay-ou­tele­ment Grid dan in ta­bel­vorm weer­geeft.

Een klik op de met But­ton ge­de­cla­reer­de start­knop brengt de boel aan het lo­pen. De twee­de pa­ra­me­ter daar­van is qua­si het hoofd­pro­gram­ma. Dat wordt bij het klik­ken op de knop uit­ge­voerd. De daar uit­ge­voer­de co­de haalt de waar­den uit de in­voer­vel­den en geeft die door aan getEarth­qua­keDa­ta om de ge­wens­te da­ta uit de Wol­fram Know­led­ge­ba­se te ha­len. Het re­sul­taat daar­van wordt op zijn beurt dan weer door­ge­ge­ven aan de func­ties voor het te­ke­nen van de kaart en de dia­gram­men.

Epi­loog

On­danks de be­schei­den re­ken­ca­pa­ci­teit van de Rasp­ber­ry Pi is de gra­tis Ma­the­ma­ti­ca­ver­sie voor de­ze mi­ni­com­pu­ter een se­ri­eus te ne­men tool, die zich leent voor de meest uit­een­lo­pen­de ta­ken. Een groot voor­deel van Ma­the­ma­ti­ca is de toe­gang tot de Wol­fram Know­led­ge­ba­se – en een in der­tig jaar tijd op­ge­bouwd as­sor­ti­ment van dui­zen­den in­ge­bouw­de func­ties. Een an­der plus­punt is het feit dat je in de Ma­the­ma­ti­ca-no­te­books be­re­ke­nin­gen, tek­sten, ani­ma­ties en der­ge­lij­ke in een pre­sen­ta­tie­waar­di­ge vorm kunt ver­za­me­len – die no­te­books kun­nen dan ook de ba­sis zijn voor in­ter­ac­tie­ve pre­sen­ta­ties en pu­bli­ca­ties.

Als je uit de ob­ject­ge­o­ri­ën­teer­de we­reld komt, zul je bij het wer­ken met Ma­the­ma­ti­ca even moe­ten om­den­ken – op zich een uit­da­ging, maar wel een die vol­gens ons de moei­te loont. Als je Lisp, Clo­ju­re of Has­kell kent of be­kend bent met de wer­king van func­ti­o­ne­le pro­gram­meer­ta­len, zul je je snel thuis voe­len.

Als je het voor­beeld­pro­gram­ma wilt aan­pas­sen, dan nog even een be­lang­rij­ke tip: voer na een mo­di­fi­ca­tie al­tijd het com­man­do ClearAll["Glo­bal`*"] uit, waar­mee al­le de­cla­ra­ties en de­fi­ni­ties ver­wij­derd wor­den. An­ders kun­nen over­schre­ven func­tie­de­fi­ni­ties werk­zaam blij­ven, ook al staan ze al­lang niet meer in de co­de.

Het voor­beeld­pro­gram­ma ge­ne­reert een in­voer­for­mu­lier en houdt je op de hoog­te van de vor­de­rin­gen.

Het voor­beeld­pro­gram­ma vi­su­a­li­seert aard­be­vin­gen zo­als op Lom­bok in een nieuw no­te­book met een land­kaart en sta­tis­ti­sche dia­gram­men.

Newspapers in Dutch

Newspapers from Netherlands

© PressReader. All rights reserved.