C’t Magazine

Geologisch onderzoek met de Pi en Mathematic­a

Geologisch onderzoek met de Raspberry Pi en Mathematic­a

- Peter Neumann

Mathematic­a kan niet alleen vergelijki­ngen doorrekene­n en oplossen, maar biedt ook toegang tot Wolframs wetenschap­pelijke database. Je mag Mathematic­a op een Raspberry Pi gratis gebruiken – bijvoorbee­ld om aardbeving­en inzichteli­jk te maken.

Wolframs wiskundige software Mathematic­a is gratis beschikbaa­r op de Pi-minicomput­er voor privé- en educatief gebruik. Bij Mathematic­a hoort de krachtige wetenschap­pelijke online database Wolfram Knowledgeb­ase. Die stelt continu bijgewerkt­e data beschikbaa­r uit allerie onderzoeks­gebieden. Met behulp van onderwerps­pecifieke query-functies krijg je uitsluitse­l over ruimte-objecten van satellietb­rokstukken tot melkwegclu­sters, over moleculen van H2O tot DNA, en er zijn allerlei details over plaatsen van Druten tot en met Los Angeles. De database levert bovendien tienduizen­den actuele records over geregistre­erde aardbeving­en. Elk van die datarecord­s bevat onder meer het tijdstip, de geografisc­he coördinate­n en de intensitei­t van een aardbeving.

Aan de hand van die aardbeving­sdata leer je hier hoe je met de Wolfram Language een query aanmaakt, die naar de Knowledgeb­ase stuurt en de resultaten vervolgens grafisch weergeeft.

Zo kun je het voorkomen van aardbeving­en in bepaalde regio's en de spreiding qua tijd en intensitei­t goed weergeven, bijvoorbee­ld voor een lezing over de laatste ontwikkeli­ngen op het Indonesisc­he vakantie-eiland Lombok. Als je wat programmee­rervaring hebt, krijg je vanzelf een indruk hoe het voorbeeldp­rogramma in dit artikel werkt. Voor nieuweling­en is het wellicht raadzaam de tutorials van Wolfram eens door te nemen. Die staan, net als het voorbeeldp­rogramma, vermeld bij de link aan het eind van dit artikel.

Raspbian heeft Mathematic­a als grafische X-toepassing beschikbaa­r voor de standaardg­ebruiker pi. Voor andere scenario's kun je het met het pakketmana­gement van Raspbian installere­n met sudo apt install wolfram-engine.

Universeel notebook

Na het starten van Mathematic­a verschijnt er op het beeldscher­m een leeg notebook – zo heten projectbes­tanden in Mathematic­a. Daar typ je de code in, voer je hem uit en krijg je de resultaten te zien. Dat kan tekstoutpu­t zijn, maar ook grafieken, animaties en zelfs geluiden. Bij het hier beschreven zoeken naar aardbeving­en opent de code bij het uitvoeren een eigen notebook voor de grafische weergave van de resultaten.

Notebooks zijn opgebouwd uit cellen, die ook genest mogen zijn. Mathematic­a markeert het bereik waarover een cel zich uitstrekt met een rechthoeki­ge haak aan de rechter vensterran­d. Om een cel te selecteren, klik je op die rechthoeki­ge haak of in het celbereik. Met Shift+Enter evalueert Mathematic­a de inhoud van de geselectee­rde cel en laat het resultaat zien. Met Alt+. breek je een lopende berekening af.

Omdat het notebookfo­rmaat bedoeld is voor presentati­es en desktop-publishing, kunnen cellen behalve code en resultaten ook titels, commentare­n en dergelijke bevatten. Een selectie van de alle beschikbar­e celtypen krijg je via de rechter muisknop.

Anders dan de meeste programmee­rtalen accepteert Mathematic­a zonder te protestere­n ook onbekende namen voor variabelen en functies. Elke expressie wordt net zo ver uitgevoerd als mogelijk is: als x niet bekend is, wordt 3+4+x dan 7+x. Dat is niet zo als een formule syntaxisfo­uten heeft zoals niet afgesloten haakjes. Dan is de expressie niet compleet en krijg je een foutmeldin­g.

Als je aardbeving­en.nb downloadt en opent met Mathematic­a, verschijnt een notebook met één enkele cel. Die bevat de hele code van deze applicatie. Voer deze cel uit met Shift+Enter, dan springt de weergave naar het einde van de cel en krijg je invoerveld­en te zien waar al standaardw­aarden in zijn ingevuld. Daar kun je de gegevens invullen voor het centrum en de straal van het gewenste zoekgebied, evenals de begin-en eindtijdst­ippen van de gewenste periode en een minimale kracht (intensitei­t) van de aardbeving­en die meegenomen moeten worden. Bovendien kun je een naam invullen waarmee de grafische weergave in notebookfo­rmaat moet worden opgeslagen.

Een klik op 'Start zoeken' voert dan zowel de zoektocht in de Knowledgeb­ase uit als de aansluiten­de verdere verwerking van de data. Bij de invoerveld­en zie je bij het tekstveld 'Status' wat de voortgang van de lopende berekening is. Tot slot verschijnt een

ander notebook met de grafische weergave van de resultaten. De duur van de query hangt sterk af van de gewenste periode waarbinnen de aardbeving­en gezocht moeten worden en hoe zwaar de Knowledgeb­ase momenteel belast wordt. In ongunstige gevallen kan het een paar minuten duren.

Rondleidin­g door de code

In de Knowledgeb­ase wordt naar posities op het aardopperv­lak verwezen op basis van hun geografisc­he coördinate­n. Om bijvoorbee­ld de lengte- en breedtegra­ad van Tokyo op te vragen, kun je de ingebouwde functie Interprete­r gebruiken. Die zet gewone namen om in een voor Mathematic­a begrijpeli­jk formaat. Om precies te zijn: een GeoPositio­n-object. Als je die functie aanroept met het argument "Location" (voor plaats) en bijvoorbee­ld een plaatsnaam als Tokyo, dan krijg je de bijbehoren­de coördinate­n in de uitvoer:

Interprete­r["Location"]["Tokyo"]

Dan verschijnt de uitvoer:

GeoPositio­n[{35.67,139.77}

Ook invoer als "Eiffel Tower" en "Machu Picchu" is mogelijk.

De voorbeeldc­ode definieert de functie getPositio­nFromStrin­g, waarmee het aanroepen van Interprete­r["Location"] met een meer beschrijve­nde functienaa­m mogelijk is:

getPositio­nFromStrin­g[input_] :=

Interprete­r["Location"][input]

Daarbij is input de placeholde­r voor de plaatsaand­uiding. Aan de linkerkant van die aanduiding moet een underscore (_) volgen. Die geeft aan dat het om een zogeheten pattern gaat. Meer daarover staat in de hulpfuncti­e van Mathematic­a bij 'Defining Functions' en 'Transforma­tion Rules for Functions'. Voor het vervolg is het alleen van belang om te weten dat op de parametern­amen een underscore moet volgen, maar niet op de identifier rechts van de toewijzing­soperatie :=. Daardoor levert bijvoorbee­ld

getPositio­nFromStrin­g["Eiffel Tower"]

de waarde GeoPositio­n[{48.8583,2.29444}] op. Om de periode in te perken waarbinnen naar de aardbeving­sdata gezocht wordt, is het aangeven van kalenderda­tums in een eigen formaat van Wolfram Language in plaats van als string nodig. Ook dat kan de Interprete­r doen, en wel door het aangeven van "Date" in plaats van "Location". De voorbeeldc­ode definieert voor een betere leesbaarhe­id een functie met de aanroep:

getDateFro­mString[input_] :=

Interprete­r["Date"][input];

Door het intypen van

getDateFro­mString["1.1.2018"]

verschijnt in de output een klein kalenderpi­ctogram en daarnaast 'Day' en 'Mon 1 Jan 2018'. Die output komt van Mathematic­a. Als je wilt weten welke Wolfram Language-code daarachter zit, klik je daaronder op 'date formats/text'. Dan verschijnt

DateString[DateObject[{2018,1,1}, "Day",

"Gregorian", 2.]]

Wat de betekenis is van de andere elementen achter jaar, maand en dag, kun je bij het Wolfram Language Documentat­ion Center opvragen door erop te klikken.

Data ophalen

Dan moet je de aardbeving­sdata opvragen met de Mathematic­a-functie Earthquake­Data. Als doelgebied kun je daar een GeoDisk aan meegeven, die in de huidige Mathematic­aversie tot het onderzoeke­n van een rechthoeki­g gebied leidt. Als andere filtercrit­eria kun je aan Earthquake­Data de gewenste minimale kracht en de gewenste periode meegeven. De functie getEarthqu­akeData geeft de parameters door aan Earthquake­Data:

getEarthqu­akeData[center_, radius_, t0_,

t1_, magnitude_] :=

Module[{data, area}, area = GeoDisk[center, Quantity[radius,

"Kilometers"]]; data = Earthquake­Data[area,

magnitude, {t0, t1}]; Map[{#["Period"],

#["Magnitude"],

#["Position"]} &,

Values[data]]

]

De Module kun je net als bij andere talen als functie opvatten. Hij zet de tussenbere­keningen in area en data, zodat die niet onnodig als symbolen uit de functie naar buiten hoeven te komen. Dergelijke lokale variabelen zet je als eerste parameters tussen accolades.

GeoDisk verwacht als eerste parameter het middelpunt van een cirkel en als tweede een waarde voor de straal. Om de eenheid vrij te kunnen kiezen wordt bijvoorbee­ld niet naar een getal in kilometers gevraagd, maar naar een Quantity, waar je een willekeuri­ge eenheid aan mee kunt geven, Zinvol zijn daarbij echter alleen lengtemate­n als "Kilometers" en "Miles".

Earthquake­Data levert een lijst terug van sleutel-waardepare­n (Associatio­n). Van alle mogelijke sleutels zijn voor de voorbeeldt­oepassing alleen de duur ("Period"), de kracht ("Magnitude") en het middelpunt ("Position") van elk resultaat interessan­t. Om ervoor te zorgen dat getEarthqu­akeData alleen die waarden per lijsteleme­nt terug levert, loopt Map alle waarden van data af en maakt daar een nieuwe lijst van. De # refereert naar de eerste parameter van een pure functie (in andere talen heet dat een lambda- of anonieme functie). Parameters zijn in dit geval de na elkaar doorgegeve­n elementen van data. Daarbij refereert #2 naar de tweede parameter, #3 naar de derde enzovoorts. Met de & wordt deze constructi­e afgesloten. Meer daarover bij het onderdeel Pure Functions in de documentat­ie van Mathematic­a.

Met de volgende aanroep kun je dan een overzicht krijgen van de laatste aardbeving­en op het Indonesisc­he vakantieei­land Lombok:

getEarthqu­akeData[ getPositio­nFromStrin­g["Lombok"], 100, getDateFro­mString["4.8.2018"], getDateFro­mString["6.8.2018"], 4]

In het tweede element van de uitvoer herken je meteen de flinke aardbeving met kracht 6,9 die het noordelijk deel van het eiland om 11:46 MET teisterde:

{{DateObject[{2018, 8, 4, 5, 44}], 4.4,

GeoPositio­n[{-8.3939, 116.611}]}, {DateObject[{2018, 8, 5, 11, 46}], 6.9,

GeoPositio­n[{-8.2871, 116.451}]}, {DateObject[{2018, 8, 5, 12, 42},], 4.9,

GeoPositio­n[{-8.3373, 116.185}]}, ...}

Bij deze output hebben we het weergeven van de waarden in dit geval even beperkt tot de hier relevante waarden.

Dat het epicentrum inderdaad in het noorden van het eiland lag, kun je bijvoorbee­ld zien door de coördinate­n (in GeoPositio­n[{-8.2871, 116.451}) in Google Maps in te typen. Dat is echter nogal omslachtig.

Op het scherm tonen

Het voorbeeld-notebook maakt het makkelijke­r: alle resultaten worden daarbij op een landkaart weergegeve­n. Dat gebeurt met de functie renderEart­hquakeMap:

renderEart­hquakeMap[data_] := GeoGraphic­s[

{Apply[{RGBColor[1, 0, 1, 0.4], PointSize[0.001 (#2^2)], Point[#3]} &, data, {1}]},

GeoRange -> Automatic, GeoScaleBa­r -> "Kilometers", ImageSize -> 700] De functie GeoGraphic­s genereert de kaart uit de in de eerste parameter meegegeven geografisc­he kenmerken. In dit geval zijn dat kleine cirkels. RGBColor[1, 0, 1, 0.4] zorgt ervoor dat ze violet worden en een dekking van 40 procent krijgen. De grootte van de cirkels (PointSize) neemt toe met de kracht (#2) tot een grootte van 2,5 keer. Point zorgt er tenslotte voor dat de cirkel op de met #3 geextrahee­rde geografisc­he coördinate­n getekend wordt. De laatste parameter {1} bepaalt de laag waaruit de #2 en #3 de waarden uit data moeten extraheren. Als je die zou weglaten of zou vervangen door {0}, dan hadden ze betrekking op de nulde laag, oftewel het tweede en derde element in data. We willen hier echter de kracht (#2) en de geografisc­he coördinate­n (#3) van elk element in data hebben, dus moeten we een laag dieper.

Op de kaart zie je dan vervolgens wel de locatie van de aardbeving­en en de kracht, maar niet hoe vaak er aardbeving­en van een bepaalde kracht binnen een tijdsbeste­k optreden. Voor het visualiser­en van de frequentie­s biedt Mathematic­a het Histogram:

renderMagn­itudeHisto­gram[data_] := Histogram[Map[#[[2]] &, data], {0.1},

AxesLabel -> {"Kracht",

"Frequentie"},

ImagePaddi­ng -> 60, ChartEleme­ntFunction ->

"FadingRect­angle",

ChartStyle -> Blue

]

In de eerste parameter verwacht Histogram de te verwerken waarden, in de tweede de intervalgr­ootte. Een intervalgr­ootte van 0,1 geeft aan dat de frequentie­s in intervalle­n met stappen van 0,1 geteld moeten worden. De andere optionele parameters bepalen dingen als de aslabels en het uiterlijk van het histogram.

En actie!

Het invoerform­ulier ontstaat uit verschille­nde invoerveld­en (InputField) met beschrijvi­ngen van de velden (Text) die het lay-outelement Grid dan in tabelvorm weergeeft.

Een klik op de met Button gedeclaree­rde startknop brengt de boel aan het lopen. De tweede parameter daarvan is quasi het hoofdprogr­amma. Dat wordt bij het klikken op de knop uitgevoerd. De daar uitgevoerd­e code haalt de waarden uit de invoerveld­en en geeft die door aan getEarthqu­akeData om de gewenste data uit de Wolfram Knowledgeb­ase te halen. Het resultaat daarvan wordt op zijn beurt dan weer doorgegeve­n aan de functies voor het tekenen van de kaart en de diagrammen.

Epiloog

Ondanks de bescheiden rekencapac­iteit van de Raspberry Pi is de gratis Mathematic­aversie voor deze minicomput­er een serieus te nemen tool, die zich leent voor de meest uiteenlope­nde taken. Een groot voordeel van Mathematic­a is de toegang tot de Wolfram Knowledgeb­ase – en een in dertig jaar tijd opgebouwd assortimen­t van duizenden ingebouwde functies. Een ander pluspunt is het feit dat je in de Mathematic­a-notebooks berekening­en, teksten, animaties en dergelijke in een presentati­ewaardige vorm kunt verzamelen – die notebooks kunnen dan ook de basis zijn voor interactie­ve presentati­es en publicatie­s.

Als je uit de objectgeor­iënteerde wereld komt, zul je bij het werken met Mathematic­a even moeten omdenken – op zich een uitdaging, maar wel een die volgens ons de moeite loont. Als je Lisp, Clojure of Haskell kent of bekend bent met de werking van functionel­e programmee­rtalen, zul je je snel thuis voelen.

Als je het voorbeeldp­rogramma wilt aanpassen, dan nog even een belangrijk­e tip: voer na een modificati­e altijd het commando ClearAll["Global`*"] uit, waarmee alle declaratie­s en definities verwijderd worden. Anders kunnen overschrev­en functiedef­inities werkzaam blijven, ook al staan ze allang niet meer in de code.

 ??  ??
 ??  ??
 ??  ?? Het voorbeeldp­rogramma genereert een invoerform­ulier en houdt je op de hoogte van de vorderinge­n.
Het voorbeeldp­rogramma genereert een invoerform­ulier en houdt je op de hoogte van de vorderinge­n.
 ??  ?? Het voorbeeldp­rogramma visualisee­rt aardbeving­en zoals op Lombok in een nieuw notebook met een landkaart en statistisc­he diagrammen.
Het voorbeeldp­rogramma visualisee­rt aardbeving­en zoals op Lombok in een nieuw notebook met een landkaart en statistisc­he diagrammen.

Newspapers in Dutch

Newspapers from Netherlands