In dit hoofdstuk houden we ons bezig met modellering en simulatie. Deze begrippen komen op zeer veel plaatsen in de informatica en de toepassingen daarvan voor, onder andere in toepassingen op het gebied van wetenschap en techniek.
Ook buiten de informatica komt modellering komt zeer veel voor; hier beperken we ons tot modellering waarbij het rekenen aan de hand van modellen een grote rol speelt.
Een algemene inleiding in de genoende begrippen kun je onder ander vinden in Wikipedia: model (wetenschap) (http://nl.wikipedia.org/wiki/Model_(wetenschap)), modelvorming (http://nl.wikipedia.org/wiki/Modelvorming) en simulatie (http://nl.wikipedia.org/wiki/Simulatie).
Voor "model" bestaan vele definities; voor ons gebruik is de beschrijving van Wikipedia geschikt:
Een model in de wetenschap is een vereenvoudigde afbeelding van de werkelijkheid voor een bepaald gebruiksdoel gemaakt.
In ons geval is een aspect van het gebruiksdoel dat we kunnen rekenen aan het model, bijvoorbeeld door middel van simulatie. Op basis van het model kunnen we dan de gevolgen voor bepaalde situaties en scenario's doorrekenen en voorspellingen doen. In eerste instantie gebruiken we deze voorspellingen om het model te valideren: als de voorspellingen voldoende overeen komen met het gedrag van het overeenkomstige systeem in de werkelijkheid, nemen we na "voldoende" experimenten aan dat het model bruikbaar is voor ons doel, ook voor de situaties die we niet gevalideerd hebben.
Opgave: geef voorbeelden waar voorspellen op grond van een modelberekening of simulatie een grote rol speelt.
Zoals gezegd, wordt een model altijd gemaakt met een bepaald doel. Vaak omvat dit doel het verkrijgen van een beter begrip van het systeem, op een manier die we mogelijk niet eenvoudig kunnen bereiken door met het systeem zelf te experimenteren.
Opgave: Met sommige systemen kun je niet experimenteren; soms zijn de kosten van experimenteren erg hoog; met andere wil je liever niet experimenteren. Geeft voorbeelden van dergelijke systemen.
Vereenvoudiging, het weglaten van irrelevante details, ofwel abstractie, speelt een grote rol bij modelvorming. Het gebruiksdoel van het model helpt in grote mate om te bepalen welke details relevant zijn. Daarnaast is er vaak een iteratief proces van modelvorming nodig, om door middel van experimenten (simulaties) en validatie van de resultaten te bepalen wat de invloed van bepaalde details is. Uiteindelijk proberen we een model te vinden dat enerzijds voldoende eenvoudig is, en anderzijds voldoende representatief is voor de werkelijkheid: de modellering-cyclus.
Opgave: In zekere zin vormt een landkaart een vereenvoudigd model van de werkelijkheid. Een kaart wordt altijd gemaakt met een bepaald doel - zodat je weet welke aspecten van de werkelijkheid je kunt weglaten.
Geef voorbeelden van verschillende soorten kaarten, geef aan wat het doel van elke soort is, en van details die weggelaten of juist opgenomen worden (en soms zelfs aangedikt).
Opgave: Een voorbeeld van een model in de natuurkunde is het gebruik van puntmassa's, en van wrijvingloze beweging. Geef voorbeelden waar deze vereenvoudiging terecht is, en waar deze mogelijk problemen kan geven.
Het maken van een model is vaak onderdeel van wetenschappelijke theorievorming. Op basis van een initieel begrip van het systeem dat we willen modelleren wordt een eerste model gemaakt. Vervolgens gaan we met dit model experimenteren: we doen door middel van bijvoorbeeld simulatie een voorspelling over het gedrag van het systeem, bij een bepaalde input. Vervolgens moeten we controleren of de voorspelling (voldoende) overeenkomt met het gedrag van het systeem in de werkelijkheid: de validatie van het model. Op basis van deze validatie moeten we mogelijk het model bijstellen; vaak betekent dit het aanpassen van bepaalde parameters, of het toevoegen van bepaalde details die toch relevanter blijken te zijn dan we in eerste instantie dachten: het verfijnen van het model. In sommige gevallen blijkt mogelijk dat we er compleet naast zitten.
Figuur: (initiele theorie, concepten ->) model -> simulatie -> validatie -> bijstelling model
Als we na een reeks experimenten voldoende vertrouwen in het model gekregen hebben, kunnen we dit gebruiken voor andere soorten voorspellingen. We moeten daarbij steeds voor ogen houden dat we met een model werken, dat niet in alle omstandigheden met de werkelijkheid overeen hoeft te komen.
Zoals gezegd gaat onze interesse uit naar modellen waar we aan kunnen rekenen. Bij voorkeur gebruiken we een eenvoudig analytisch rekenmodel - bijvoorbeeld zoals in de natuurkunde gebruikt voor het bepalen van een kogelbaan van een kogel zonder luchtweerstand (en wind).
Maar in veel gevallen is het model zo ingewikkeld dat we onze toevlucht moeten nemen tot simulatie: we rekenen het gedrag van het systeem in de tijd stap voor stap door, van toestand naar toestand. Het model bepaalt dan hoe we op grond van de huidige toestand, op een bepaald tijdstip, en mogelijke inputs in deze toestand, de volgende toestand (op een volgend tijdstip) kunnen berekenen.
Discrete tijd
Bovenstaande betekent dat we werken met een discreet begrip van tijd: we beschouwen alleen de toestand van het model op bepaalde momenten, vaak met een constante periode: t=0, 1*deltaT, ... (n-1)*deltaT, n*deltaT, ...
De keuze van de periode (deltaT) is niet willekeurig, en maakt vaak deel uit van de modelvorming. Enerzijds betekent een kleine deltaT meestal een grotere nauwkeurigheid, ten koste van extra rekentijd; een grotere deltaT betekent minder rekentijd, ten koste van de nauwkeurigheid van de simulatie.
Het is niet altijd nodig om het systeem voor elke periode in de reeks uit te rekenen: als we zeker weten dat er niets verandert gedurende een aantal periodes, kunnen we in de simulatie een grotere stap in de tijd nemen. Dit speelt vooral bij zogenaamde discrete event simulaties - zie Over discrete event simulatie.
<<nog uit te werken>>
Analytische modellen, dat wil zeggen modellen waar we de uitkomst direct kunnen uitrekenen, zijn erg beperkt in hun mogelijkheden. We kunnen bijvoorbeeld de interactie tussen twee vrij bewegende deeltjes (bijvoorbeeld op grond van de zwaartekracht) wel analytisch bepalen, maar voor drie deeltjes lukt dat al niet meer, laat staan voor een planetenstelsel.
Modellen en games
Modellen spelen een grote rol in computergames: voor het simuleren van de fysische realiteit, voor de realistische weergave van water, voor de realistische bewegingen van een auto of vliegtuig, enz. Veel van het realisme van de huidige games en films is te danken aan geavanceerde modellen, die ook mogelijk gemaakt worden door de grote rekencapaciteit van de moderne computers en grafische systemen.
Ook bij games als The Sims en Simcity spelen modellen een grote rol; als je het spel goed wilt spelen, moet je het onderliggende model begrijpen.
Ook in het dagelijks leven gebruik je soms zo'n aanpak, al dan niet bewust; je probeert een mentaal model te maken van delen van je omgeving.
Als we een systeem willen modelleren waarin fysica (of scheikunde of biologie) een belangrijke rol speelt. hebben we vaak te maken met continue waarden, bijvoorbeeld elektrische spanning of stroom; snelheid van deeltjes; stroming van vloesitof; hoeveelheid glucose in het bloed. Veelal worden dit soort systemen beschreven door middel van differentiaalvergelijkingen. Om van dergelijke systemen een model te maken waaraan we op een computer kunnen rekenen en simuleren, moeten we zowel deze waarden zowel in de tijd als in het waardenbereik benaderen door middel van discretisatie, maar in het model blijven we ons bewust van het continue karakter van het gemodelleerde systeem. In het simulatiemodel werken we dan meestal met differentievergelijkingen in plaats van de oorspronkelijke differentiaalvergelijkingen. (Zie http://nl.wikipedia.org/wiki/Differentiaalvergelijking, http://nl.wikipedia.org/wiki/Differentievergelijking.)
Voorbeelden van modellen en simulaties die in deze klasse vallen zijn onder andere klimaatmodellen, weermodellen, een model van de luchtstroming rond een vliegtuig, een model van een sterrenstelsel (een groot aantal deeltjes die onderling krachten uitoefenen).
In andere gevallen zijn we voornamelijk geinteresseerd in gebeurtenissen die een discreet karakter hebben, zowel in de aard van de gebeurtenissen, als in de tijd. Een voorbeeld hiervan is een model van een verkeerslicht (stoplicht). In dit geval zijn we voornamelijk geinteresseerd in de lengte van de wachtrijen, de duur van de wachtperiodes, en de doorstroming van de auto's. We beschouwen de aankomst van een auto bij het verkeerslicht op een bepaalde rijstrook als een discrete gebeurtenis, evenals het vertrekken van een auto (doorrijden, bij groen licht). We zijn niet geinteresseerd in het precieze gedrag in de tijd van een auto, noch in wat er bij het kruispunt gebeurt tussen de tijdstippen waarop auto's aankomen, vertrekken, of waarop een licht verspringt van kleur. Dit soort systemen kunnen we modelleren door middel van een zogenaamde discrete-event benadering, resulterend in een discrete-event simulatie. (Zie Wikipedia, http://en.wikipedia.org/wiki/Discrete_event_simulation)
Deze vorm van modellering en simulatie wordt veel gebruikt voor allerlei logistieke systemen, waar bijvoorbeeld wachtrijen een belangrijke rol spelen. Dit kan een wachtrij voor een kassa in een supermarkt zijn, maar ook een wachtrij voor een staalpers in een autofabriek. (Zie: http://nl.wikipedia.org/wiki/Wachtrijtheorie).
Naast bovenstaande modellen, die in veel gevallen "puur" gebruikt kunnen worden, zijn ook mengvormen mogelijk, waarbij een deel van het model een continu systeem modelleert, en een ander deel een discrete-event model vormt.
In veel gevallen van modellering hebben we te maken met hoeveelheden, en de toename of afname daarvan. Voorbeelden zijn: hoeveelheid geld op een spaarrekening; hoeveelheid water in een bak; hoeveelheid medicijnen, of glucose in het bloed. In deze gevallen verandert de hoeveelheid in de loop van de tijd, mogelijk door verschillende factoren: bijvoorbeeld een bak met water kan leeglopen door een lek en een bestuurbaar tappunt, en gevuld worden vanuit een kraan.
In sommige gevallen is de groei constant, en dus niet afhankelijk van de momentane hoeveelheid. Een voorbeeld hiervan is de toename van de hoeveelheid water in een bak die van boven gevuld wordt met een constante waterstroom. Een ander voorbeeld is de groei van een plant: deze groeit in de lengte met een constante groeisnelheid (mits er voldoende voeding aanwezig is). Als de toename constant is, is er sprake van lineaire groei; de toename hangt alleen af van de tijd:
H(t+deltaT) = H(t) + K*deltaT
In woorden: de hoeveelheid H op tijdstip T+deltaT is gelijk aan de hoeveelheid H op tijdstip T vermeerderd met een constante maal de duur van de (groei)periode deltaT.
In andere gevallen hangt de toename af van de aanwezige hoeveelheid. Een voorbeeld is een lekkende waterbak: de lekstroom hangt af van de druk bij het lek, die weer bepaald wordt door de hoogte van het water boven het lek. Een ander voorbeeld is een spaarrekening, waar de toename door rente afhangt van het momentane kapitaal; door jaarlijkse groei van rente neemt dit kapitaal exponentieel toe (rente op rente):
H(t+deltaT) = H(t) + K*H(t)*deltaT
De hoeveelheid H op tijdstip t+deltaT is gelijk aan de hoeveelheid H op tijdstip t, vermeerderd met de groei in de periode (interval) t..t+deltaT, die evenredig is met de hoeveelheid op tijdstip t.
Nota bene: In deze formule gaan we ervan uit dat de groei in de periode t..t+deltaT constant is; dit is een benadering die we alleen kunnen gebruiken als we deltaT voldoende klein kiezen. We komen later terug op de keuze van deltaT.
In veel gevallen is de groei (of krimp) ook afhankelijk van andere factoren dan de hoeveelheid; vaak is er sprake van een combinatie van groei- en krimpfactoren. Bijvoorbeeld in het geval van een spaarrekening is de groei of krimp niet alleen afhankelijk van het kapitaal, maar ook van de actuele rentestand, die door andere factoren bepaald wordt, en van eventuele bijstortingen en opnames. In veel gevallen van biologische groei is deze afhankelijk van de aanwezigheid van voedingstoffen, of van de aanwezigheid van ruimte om te groeien. Een ander voorbeeld is een lekke waterbak die bijgevuld wordt door een kraan: we hebben te maken met een toename door de stroom uit de kraan, en een afname door het lek.
H(t+deltaT) = H(t) + (G(t) – K(t))*deltaT
In deze algemene formule is de hoeveelheid H op tijdstip t+deltaT gelijk aan de hoeveelheid op tijdstip t, vermeerderd met de groei in de periode t..t+deltaT, en verminderd met de krimp in de periode t..t+deltaT.
In veel van de genoemde gevallen is de hoeveelheid groei of krimp afhankelijk van de tijd (dit is eigenlijk alleen bij constante groei niet het geval). In die gevallen is het belangrijk dat we deltaT op de juiste manier kiezen; in elk geval zal deltaT voldoende klein moeten zijn om de veranderingen in de groei of krimp te kunnen volgen. Immers, in een formule als
H(t+deltaT) = H(t) + K*H(t)*deltaT
beschouwen we de groei in de periode deltaT constant.
In de praktijk moeten we voor de keuze van deltaT een afweging maken tussen een deltaT die klein genoeg is om alle veranderingen in het model, of eigenlijk in het systeem dat we modelleren, te kunnen volgen, en anderzijds een deltaT die groot genoeg is om voldoende snel te kunnen rekenen. Anders gezegd: met een grotere deltaT kunnen we meer situaties doorrekenen in dezelfde tijd.
Voorbeeld. Stel dat we een waterbak bijvullen door een kraan die we regelmatig open en dicht doen: we zetten de kraan 5 minuten open, en daarna 10 minuten dicht. In de periode dat de kraan open staat is er sprake van lineaire groei; in de periode dat de kraan dicht staat, is er geen groei. Je kunt dit gedrag redelijk volgen als je deltaT gelijk neemt aan een minuut; als je deltaT groter neemt dan 15 minuten klopt je model beslist niet meer met het systeem dat je wilt modelleren.