Nightscreen

Computerastronomie in Euregio.

door Berdi Bos.

Zelf programmeren van sterrenkundige software.

Even voorstellen: Mijn naam is Berdi Bos, een collega van Jürgen Morawietz, en ook geintresseerd in sterrenkunde. Hoewel ik ook wel eens 's nachts buiten waarneem (met een 15 [cm] Newton, of een 80 [mm] lenzentelescoop ), gaat het onderstaande verhaal over de astronomie binnen, eventueel overdag bij de kachel, achter de computer. Gaat dit de nieuwe amateursterrenkundige worden? De verrekijker of telescoop in de kast, en op een zolderkamer naar simulaties op het beeldscherm kijken. Binnen in huis kijken hoe de hemel er buiten uitziet... Dit alles lijkt op het vervangen van de werkelijkheid door de schijnwereld van de computer. Kennelijk kan de moderne mens niet meer het geduld opbrengen om 's nachts, in de kou, te wachten op dat moment dat de weergoden, in hun genadige goedheid, een straal vanuit het sterrengewelf op aarde doen neerdalen.

Echter, het gaat mij er niet om dat de computer het waarnemen van de 'realtime' sterrenhemel gaat vervangen, maar dat het meer een hulpmiddel is dat men kan gebruiken voor het waarnemen van de sterrenpracht.

Tijdens mijn opleiding leerde ik hoe men in Pascal computerprogramma's kan schrijven. Toen heb ik voor het eerst een programma geschreven dat de positie's van planeten berekend.

Echter omdat ik thuis geen computer had, ( het is inmiddels al 10 jaar geleden), heb ik dit planetenprogramma omgeschreven in 'rekenmachinetaal'. Dit is gewoon een rekenschema gebaseerd op de functies van een rekenmachine.

Men krijgt een programma in de stijl van:

  • ...
  • Lees (inderdaad, van een papiertje) : Inclinatie
  • * pi / 180 =
  • RAD
  • F Cos (is dus de ArcCos)
  • Wortel
  • ...enz
  • Na 25 minuten typen op je rekenmachine is het resultaat 1 rechteklimming en declinatie.
    Later, heb ik een computer gekocht om verder te gaan met het maken van computerprogramma's voor de sterrenkunde.

    De (mijn) wensen voor een eigengemaakt computer-programma:

    Toen ik mijn eerste programma's begon te schrijven was het idee dat de te maken programmatuur een hulpmiddel zou moeten zijn voor het waarnemen. Je krijgt dan al snel een soort draaibare sterrenkaart, echter er moet meer functionaliteit in zitten, anders zet je er toch de computer niet voor aan. Wat dat betreft zullen computerprogramma's de gewone draaibare sterrenkaart nooit vervangen.

    Het plan is dus te beginnen met een electronische draaibare sterrenkaart waarmee je de sterrenhemel kunt weergeven op elk tijdstip en vanaf elke lokatie op aarde kunt weergeven. Tevens is het de bedoeling om een soort kaart van de horizon op te nemen in de afbeelding van de sterrenhemel, om te kunnen zien of bepaalde objecten aan de hemel zich niet achter bomen of huizen zullen verschuilen.

    Een ander type programma zou een soort van agenda programma kunnen zijn. Het was mij al vaak overkomen dat als er een heldere nacht is, je eigenlijk niet op dat moment weet wat je het beste kunt waarnemen.
    Dus naast een sterrenkaart programma een soort electronische agenda waarin men astronomische gebeurtenissen kan uitlezen. Gegevens uit deze agenda (zoals posities) kan men combineren met de sterrenkaart.

    Keuzes:

    Er zijn verschillende dingen waarover je moet beslissen alvorens een programma te kunnen schrijven:

  • Welke programmeertaal.
  • Windows of MS-Dos.
  • Wat is het doel van mijn berekeningen.
  • Bijv. over het laatste: Je kunt een programma schrijven voor de computer omdat een bepaalde berekening zeer vaak voor komt (bijv een lijst van de positie van een bepaalde komeet over een periode).

    Je kunt ook een programma schrijven omdat de berekening te moelijk is, of te lang duurt met de hand. Men kan een half uur rekenmachine tikken reduceren tot hondersten van seconden.

    Een computer is ook bij uitstek geschikt om data te kunnen filteren. Uit een database van een aantal miljoenen sterren kan men bijvoorbeeld alle sterren selecteren helderder dan magnitude 8.

    En een computer is natuurlijk in staat een hele hoop data te kunnen opslaan.
    Over de andere punten, MS-Dos of windows en welke talen je moet kiezen: Een MS-Dos programma is eenvoudiger te maken als je begint. Zelf ben ik begonnen te schrijven in Pascal, en nu probeer ik eenvoudige programma's te maken in C++, maar dat wil niet zeggen dat andere talen minder zijn. Hier heb ik eenvoudig weg geen ervaringen in.

    De globale opbouw van een programma:

    Heel grof ingedeeld verzorgt een computer programma de:

  • Communicatie
  • Berekening
  • Communicatie

    Dit kan zijn:

  • Met de gebruiker
  • Met de computer (invoer/uitvoer files)
  • Met de gebruiker wordt gecommuniceerd via een menu's, dialogs enz. Hierdoor kan de gebruiker instellingen maken, en getallen ingeven welke van belang zijn voor de berekening.
    Er is ook nog een andere communicatie, namelijk het resultaat. Nadat de gebruiker de moeite heeft ondernomen allerlei gegevens in te typen, is het wenselijk dat hij na een kleine wachttijd in kennis gesteld wordt van enige uitkomsten. Instellingen en berekening moeten resulteren in iets, bijv een sterrenkaart, of een lijst van planeetposities. De beginnende programmeur wil dit wel eens vergeten...

    Een voorbeeld: Sterrenkaartprogramma.

    De programma's die ik geschreven heb, zijn MS-Dos programma's. Windows programma's zijn ook moeilijker om als beginneling meen te beginnen. In de programma's die ik gemaakt heb is het eerste wat men ziet een keuzemenu. Men kan met getallen de opties opgeven. Met het numerieke toetsenbord kan men dan snel alle instellingen ingeven.

    Op een gegeven moment kiest men 'berekenen'en wordt de sterrenkaart gemaakt.

    Om nu de sterren te kunnen berekenen worden de rechte klimming en declinatie van een invoer file gelezen en vervolgens omgerekend naar azimuth en hoogte. Vervolgens afhankelijk van de projectiemethode in een afbeelding weergegeven.

    Men ziet hier de sterrebeelden inclusief een omgevingsachtergrond. Op deze manier kan men meerdere waarnemingslokaties vergelijken. Verder kan men ook hierin hindelijke lichtbronnen (lantaarnpalen) aangeven.
    Alle andere programma's zijn variaties op hetzelfde thema. Een programma voor planeten, voor meteoren, om sterrendatabases te kunnen tonen, enz. Gewoon kopieren en combineren.

    Hoe te beginnen met het schrijven van een programma:

    Het beste is te beginnen met het testen van een heleboel deelproblemen. Dus schrijf een programma dat alleen maar:

  • Getallen van een file kan inlezen.
  • Een tekstregel op het scherm kan zetten.
  • Gegevens naar een file kan wegschrijven.
  • Gegevens die de gebruiker intypt kan verwerken.
  • Een lijn van A naar B op het scherm in grafische modus kan zetten.
  • Een menuprogramma zoals links op de vorige pagina afgebeeld.
  • Dit is meestal de beste methode om het programmeren in een bepaalde taal te leren, omdat als je alles in 1 programma wilt oplossen en er is iets fout, dan kan het wel 10000 oorzaken hebben.

    Indien je van een aantal dingen al zeker weet dat je die foutloos hebt opgelost kan men bij moeilijkheden veel beter het probleem opsporen.

    Nog iets over de methode welke ik gebruikt heb voor de berekening. De methode is gebaseerd op de vergelijking van de hemelbol met de aardbol. Een geografische positie op aarde wordt bepaald door de lengte (ten opzichte van Greenwich) en een breedte. Aan de hemel vindt men iets vergelijkbaars, namelijk de rechte klimming (ten opzichte van het lentepunt) en declinatie. Op aarde heeft men een noord- en zuidpool. Aan de hemel heeft men die ook. En er is een nul-richting, Greenwich. Aan de hemel is dit het lentepunt.

    Wat de berekening inhoudt, en dus wat het programma eigenlijks doet, is een soort bolcoordinaattransformatie. Men kan dit geografisch als volgt vergelijken: Groningen ligt op 634' OL en 5313' NB. Als door een of andere katastrofale ramp de noordpool van de aarde zal verschuiven naar New York, wat zal dan de nieuwe geografische positie van Groningen worden? Vooropgesteld dat Greenwich weer als oorsprong dient voor de nulrichting in lengte (toegegeven: als dit werkelijk zou gebeuren kan ik mij voorstellen dat men eerst enkele andere moelijkheden zal willen oplossen...). Zo ook aan de hemel: Er wordt aan de hand van tijd en positie een zenith punt berekend, en deze dient als nieuwe noordpool voor de bolcoordinaattransformatie van de positie van sterren.

    Iets over de structuur van programmeer-talen:

    Welke mogelijkheden biedt een programmeertaal:

  • Het definieeren van variabelen: Dit kunnen zijn Integers (natuurlijke getallen), reals (getallen met breuken), booleans (True, False), karacters en zo meer. Deze variabelen hebben een naam, en men kan een waarde toekennen. Voorbeeld:
  • int a; (integer variabele met naam a) a=5;
  • Het gebruiken van operands op de variabelen. Voorbeelden zijn +,-,=,/,* en meer (rekenkundig); AND, NOT, OR (logisch);
  • Statement: Dit hebben we zo-even al gezien in de regel a=5; Dit noemt men een statement. Evenzo bijv. b=2*a; of karacter='a'; (het hoeft niet altijd een rekenkundig statement te zijn).
  • Functies: Het onderbrengen van meerdere statements in een geheel. Men kan groepen statements dan overal opnieuw gebruiken.
  • Voorbeeld:
  • De definitie van de functie: real GradRad(real Waarde) { Waarde=Waarde*pi; Waarde=Waarde/180 return Waarde; } Elders in het programma het gebruik van de functie: ... real hoek; hoek=60; hoek=GradRad(hoek);

    Er is een functie met naam 'GradRad'. Deze functie geeft na be-eindiging een real waarde terug. Bij het gebruik van de functie moet een real variabele als gegeven meekomen. Deze krijgt de naam 'Waarde'. De berekening is het omrekenen van hoeken in radialen vanuit graden. Het belang van deze functie is duidelijk. Als men vaak hoeken omrekent, hoeft men alleen maar een functie eenmaal te definieren, en men kan het overal in het programma gebruiken.

    Er is in het programma een real met naam 'hoek', welke de waarde 60 krijgt. Door de functie wordt deze omgerekent naar radialen.

  • Beslissingen: In een programma kan men keuzes gaan maken. Dit wordt ook vaak gekombineerd met het gebruik van logische operatoren. Voorbeeld:
  • if (a<5) { a=a/2; a=a+10; }

    Merk op het gebruik van {}. Dit is bedoeld om statements in blokken te groeperen. Als de waarde a kleiner als 5 is, worden de 2 statements uitgevoerd.

  • Loops: Hierbij wordt een groep van statements steeds herhaald:
  • Een vaststaand aantal keer.
  • Afhankelijk van een bepaalde conditie die getest wordt.
  • Voorbeeld van de loop die een conditie test:

    while (a<5) { a=a/2 a=a+3; }

    De 2 statements worden steeds herhaald totdat de situatie ontstaat dat a groter of gelijk is aan 5.

    Dit zijn in groffe lijnen enkele dingen die men tegenkomt bij het programmeren. Er zijn nog veel meer andere mogelijkheden, maar het voert te ver om dat allemaal te behandelen. Maar met enige inventiviteit kan men met eenvoudige hulpmiddelen veel bereiken.
    Over het algemeen moet men de syntax van de programmeertaal nauwkeurig opvolgen. De syntax is zoiets als de gramatica van een programmeertaal. Ergens een ; of een ( vergeten, en de compiler (het gedeelte dat programma regels omzet in machine code) komt met een foutmelding. Erger: een ( ) of { } vergeten, en het programma doet iets geheel anders dan de bedoeling was.

    Veel succes.

    Tot slot: wat is de zin ervan om nog je telescoop buiten te zetten als je computer sterren toont tot magn. 16 afkomstig van de Hubble Guide Starcatalog? Eén troost: Buiten zie je het licht dat na een reis van duizenden jaren vanuit het heelal op de aarde neerdaalt, binnen zie je een gesimuleerd pixeltje uit een schijnwereld...

    Mijn homepage-adres in de schijnwereld: Terug...