In Fortran zijn subprogramma's en subroutines essentiële bouwstenen voor het efficiënt organiseren van code en het uitvoeren van herhaalde berekeningen. Het gebruik van subprogramma’s maakt het mogelijk om complexe taken op te splitsen in kleinere, beter beheersbare eenheden. Dit maakt de code niet alleen overzichtelijker, maar verhoogt ook de herbruikbaarheid van functies. In dit hoofdstuk wordt uitgelegd hoe subprogramma’s en subroutines werken, aan de hand van praktische voorbeelden zoals combinatoriek, stringconcatenatie en statistische berekeningen.
Een veelvoorkomend voorbeeld van het gebruik van een subprogramma is het berekenen van de combinatoriekwaarde , wat het aantal manieren aangeeft waarop je objecten kunt kiezen uit een totaal van . Dit wordt vaak gebruikt in probabiliteit en statistiek. Het voorbeeld in de tekst laat zien hoe je deze berekening kunt uitvoeren door het gebruik van een functie voor het berekenen van faculteiten.
In het Fortran-programma voor berekenen we eerst de faculteiten van , en met behulp van de functie IFACT. Vervolgens gebruiken we de formule om de combinatoriekwaarde te berekenen. Deze aanpak is eenvoudig maar krachtig, en laat zien hoe een subprogramma het proces van herhaalde berekeningen kan vereenvoudigen. Het gebruik van de subfunctie IFACT maakt de hoofdcode overzichtelijker en zorgt ervoor dat de logica voor het berekenen van faculteiten niet herhaald hoeft te worden in de hoofdprogramma.
Daarnaast toont het programma de kracht van stringconcatenatie in Fortran. Het combineren van meerdere strings kan worden bereikt met de // operator, die eenvoudig meerdere strings aan elkaar plakt. Dit kan bijzonder handig zijn wanneer je met grote hoeveelheden tekst werkt, zoals het genereren van dynamische bestandsnamen of het samenstellen van complexe data-uitvoer.
In een ander voorbeeld wordt het Pearson-correlatiecoëfficiënt berekend, wat een statistische maat is voor de lineaire relatie tussen twee variabelen. Dit is een van de meest gebruikte methoden in de statistiek om de mate van samenhang tussen twee datasets te bepalen. De formule voor de Pearson-correlatie is als volgt:
In dit programma worden twee subprogramma’s (AM en SIG) gebruikt: AM berekent het gemiddelde van de dataset, terwijl SIG de covariantie berekent. Door deze subprogramma's aan te roepen, wordt de berekening van de Pearson-coëfficiënt gestructureerd en herbruikbaar gemaakt.
De subroutine in Fortran verschilt van een functie in die zin dat het meerdere waarden kan retourneren (of helemaal geen), in tegenstelling tot een functie die altijd één waarde retourneert. De subroutine biedt meer flexibiliteit in het omgaan met gegevens en maakt het mogelijk om een reeks acties uit te voeren zonder dat een waarde teruggegeven hoeft te worden. Een subroutine kan ook meerdere keren in een programma worden aangeroepen, wat handig is voor herhalende taken zoals het berekenen van faculteiten in het voorbeeld voor .
Bijvoorbeeld, in het Fortran-programma voor de berekening van wordt een subroutine FACTORIAL gebruikt om de faculteit van een getal te berekenen. Door de subroutine FACTORIAL aan te roepen, hoeven we geen herhaalde code voor de faculteitsberekening te schrijven, wat de leesbaarheid van het programma vergroot.
Naast het berekenen van combinatoriek en statistische coëfficiënten, komt het idee van het sorteren van gegevens naar voren. Hoewel er verschillende sorteermethoden beschikbaar zijn, wordt in dit hoofdstuk de 'bubble sort' methode besproken. Deze eenvoudige methode vergelijkt elk paar van naburige elementen in een lijst en verwisselt ze als ze in de verkeerde volgorde staan. Dit proces wordt herhaald totdat de lijst volledig gesorteerd is. Hoewel bubble sort niet de meest efficiënte methode is voor grote datasets, is het wel een goed voorbeeld van het gebruik van lussen en conditionele statements in Fortran.
In de praktijk moeten programmeurs altijd de keuze maken tussen verschillende sorteermethoden op basis van de grootte van de data en de vereiste snelheid. De bubble sort is goed te begrijpen, maar voor grotere datasets is het belangrijk om meer geavanceerde technieken te overwegen, zoals quicksort of mergesort, die veel efficiënter zijn in termen van tijdcomplexiteit.
Het gebruik van subprogramma's en subroutines is dus cruciaal voor het organiseren van Fortran-code. Ze stellen de programmeur in staat om complexe berekeningen en logica op te splitsen in kleinere, beter beheersbare eenheden die gemakkelijk kunnen worden hergebruikt en onderhouden. Dit maakt Fortran een krachtig hulpmiddel voor wetenschappelijke en technische toepassingen.
Naast de voorbeelden die hierboven worden besproken, kunnen lezers overwegen om deze technieken toe te passen in andere contexten, zoals het verwerken van grote hoeveelheden data, het simuleren van wetenschappelijke experimenten of het optimaliseren van algoritmes voor specifieke toepassingen. De kracht van Fortran ligt niet alleen in zijn syntaxis, maar ook in de flexibiliteit van het gebruik van subprogramma’s en subroutines om complexe taken eenvoudiger en sneller uit te voeren.
Hoe kunnen we een reeks van pseudo-willekeurige getallen genereren?
Het concept van willekeurigheid is een van de fundamentele bouwstenen in de wetenschap en technologie. Echte willekeurige getallen zijn onvoorspelbaar en kunnen niet worden gereproduceerd. Dit geldt bijvoorbeeld voor de uitkomst van een muntworp, de verval van een radioactieve kern of de aankomsttijden van kosmische stralen. Deze processen worden als werkelijk willekeurig beschouwd, tenminste volgens de huidige wetenschappelijke theorieën. Echter, met de opkomst van computers is het mogelijk geworden om willekeurige getallen te genereren door middel van systematische rekenprocessen. Deze gegenereerde getallen bevatten altijd onderlinge correlaties, waardoor ze in technische termen niet als "echte" willekeurige getallen worden beschouwd. Dergelijke getallen worden "pseudo-willekeurige getallen" genoemd. Het succes van willekeurige getalgenerators hangt dus af van hun vermogen om deze correlaties te verbergen, zodat ze zich in de praktijk als willekeurig gedragen.
Er zijn verschillende methoden ontwikkeld voor het genereren van pseudo-willekeurige getallen. Een van de vroegste en eenvoudigste methoden is de zogenaamde "mid-square"-methode. Deze werd voorgesteld door John von Neumann in 1951 en is een van de eerste algoritmes voor het genereren van pseudo-willekeurige getallen. Het principe is relatief simpel: het begint met een zaadgetal (bijvoorbeeld een getal met vier cijfers), dat wordt gekwadrateerd. Daarna worden de eerste twee en de laatste twee cijfers van het resultaat verwijderd, en het overgebleven getal wordt opnieuw als zaad gebruikt. Dit proces wordt herhaald om een reeks pseudo-willekeurige getallen te genereren, die vervolgens worden genormaliseerd naar een bereik tussen 0 en 1 door ze te delen door 10.000.
Bijvoorbeeld, met het zaadgetal 7643 wordt het gekwadrateerd tot 58415449. De eerste twee en laatste twee cijfers (respectievelijk 58 en 49) worden verwijderd, waarna het overgebleven getal 4154 als nieuw zaad dient. Dit proces wordt telkens herhaald om nieuwe getallen te genereren. Als we deze getallen vervolgens delen door 10.000, krijgen we waarden zoals 0.4154, 0.2557, 0.5382, enzovoort.
Er is echter een belangrijk nadeel aan deze methode: bij bepaalde zaden kan het proces uiteindelijk leiden tot een reeks van herhalende getallen, waardoor de willekeurigheid verloren gaat. Dit gebeurde bijvoorbeeld bij het zaadgetal 7643, waar na ongeveer 70 getallen de reeks begon te herhalen. Dit probleem kan zich voordoen bij lange reeksen en moet zorgvuldig worden gecontroleerd.
Naast de mid-square-methode is er een andere veelgebruikte methode voor het genereren van pseudo-willekeurige getallen, namelijk de lineair congruente generator. Dit algoritme is gebaseerd op een wiskundige formule: een zaad wordt vermenigvuldigd met een constante , en er wordt een constante bij opgeteld. Het resultaat wordt gedeeld door een andere constante , en de rest van de deling wordt als willekeurig getal gebruikt. Dit nieuwe getal wordt vervolgens als het volgende zaad gebruikt. Deze methode wordt vaak gebruikt in tal van toepassingen, van simulaties tot cryptografie, vanwege zijn eenvoud en snelheid.
Bijvoorbeeld, als we het zaadgetal 19 nemen, en de constante is 57, dan krijgen we het getal 1083. Als we daar 1 bij optellen (de constante ), krijgen we 1084. Dit getal delen we vervolgens door , waarbij we de rest nemen (60). Het willekeurige getal wordt dan verkregen door de rest te delen door 256, wat resulteert in 0.234. Dit nieuwe getal wordt dan opnieuw vermenigvuldigd met 256 om het volgende zaad te verkrijgen.
De lineaire congruentiemethode heeft een aantal voordelen: het is relatief eenvoudig te implementeren en snel in gebruik. Desondanks heeft het ook zijn beperkingen. Bij langere reeksen kan het optreden van patronen of correlaties het effect van willekeur verminderen. Het is daarom belangrijk om de gegenereerde reeksen te testen op willekeurigheid en distributie om te controleren of de gegenereerde getallen inderdaad statistisch onafhankelijk zijn en goed verdeeld zijn over het gewenste bereik.
Naast het gebruik van willekeurige getallen voor simulaties en rekenkundige toepassingen, speelt de distributie van de gegenereerde getallen een belangrijke rol. Wanneer willekeurige getallen worden gegenereerd, is het essentieel om te controleren of ze gelijkmatig zijn verdeeld over het gewenste interval. Bijvoorbeeld, als we willekeurige getallen genereren in het interval [0, 1], dan moeten we ervoor zorgen dat de getallen gelijkmatig zijn verspreid over de vier kwartielen: van 0 tot 0,25, van 0,25 tot 0,5, van 0,5 tot 0,75 en van 0,75 tot 1. Dit kan bijvoorbeeld worden gecontroleerd door de gegenereerde getallen te tellen in de verschillende klassen, zoals getoond in het voorbeeld met de mid-square generator en de lineaire congruentie.
Het is belangrijk te begrijpen dat zelfs met de meest geavanceerde pseudo-willekeurige getalgenerators, de gegenereerde getallen altijd een zekere mate van voorspelbaarheid en correlatie bevatten. Daarom wordt er vaak gebruikgemaakt van technieken zoals de Monte Carlo-methode, waarbij deze "willekeurige" getallen worden gebruikt om numerieke integralen te benaderen of om complexe systemen te simuleren. Dit toont aan dat, hoewel pseudo-willekeurige getallen nuttig zijn voor veel toepassingen, het altijd belangrijk is om de methoden die we gebruiken om ze te genereren zorgvuldig te overwegen en te testen.
Hoe ondersteunen geavanceerde technologieën zoals gedistribueerde AI, compressieve sensing en blockchain de 6G-ontwikkelingen voor IoT?
Hoe beïnvloeden geavanceerde walsprocessen de prestaties van metalen composieten?
Hoe kan schuld bekennen samengaan met onschuld?
Hoe werkt doelgerichte radio-immunotherapie (RIT) bij de behandeling van tumoren?
Wat zijn de risico's en milieugevolgen van nanodeeltjes?

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский