De gebruikte software
PROGRAMMA BERERA.BAS
' Programma: BERERA.BAS (Calculate Rightassencion) ' Dit is de versie van VINDRA.BAS tbv publicatie op mijn site. ' Dit programma berekent de Rightassencion van een ster die precies ' in het zuiden staat. Dus hier een azimuth van 180 graden heeft. ' Benodigde gegevens zijn de datum en tijd in UTC waarop de ster ' precies in het zuiden staat en de locatie van de waarnemer in ' Noorberbreedte en Oosterlengte ' berekenmethode: ' bereken eerst de mst (mean siderial time) ' Reken de longitude van de waarnemer om in decimale graden ' tel die bij de mean siderial time op. (mst is in graden) ' verander de nieuwe mst in decimale uren door hem door 15 te delen. ' deze tijd is de RA = RightAssencion ' Deze tijd nog even omrekenen in een nette uur:min:sec notatie ' en klaar ' W. Apon 6-8-2008 ' Oftewel: als ik van mijn bron precies bepaal wanneer hij hier ' in het zuiden staat, kan ik de Right Asencion berekenen! ' Dit programma is geschreven in Quick Basic van Microsoft en ' draait in een Microsoft DOS omgeving. ' ter controle: dit programma geeft als output: 17:56:37.6
DEFDBL A-Z CLS ' De input gegevens '=================================================== ' Tijds gegevens: '================ year = 2008 month = 8 day = 5 hour = 20 ' UUR in UTC minute = 30 second = 0 'De locatie van de waarnemer '=========================== ' Eerst Oosterlengte lon$ = "6graden 54minuten 27.67seconden" ' precies deze notatie aanhouden ' Dan Noorderbreedte lat$ = "53graden 16minuten 49.32seconden" ' precies deze notatie aanhouden ' EINDE van in te voeren gegevens '================================ ' ' Start van het hoofdprogramma '============================== ' pi = 3.14159265# GOSUB berekenmeansiderialtime CALL gradenminsecnaargraden(lon$, graadjes) mst = mst + graadjes uur = mst / 15 CALL uurnaaruurminsec(uur, tijdstring$) PRINT "Rightassencion : "; tijdstring$ END ' Einde van het hoofdprogramma '============================== ' Hieronder volgen de subroutines '================================= berekenmeansiderialtime: '=================================================== ' bereken LOCAL MEAN SIDERIAL TIME in graden!!!! ' MST = functie van (UT) IF month = 1 OR month = 2 THEN year = year - 1 month = month + 12 END IF a = INT(year / 100) b = 2 - a + INT(a / 4) c = INT(365.25 * year) d = INT(30.6001 * (month + 1)) 'day since j2000.0 jd = b + c + d - 730550.5 + day + (hour + minute / 60! + second / 3600) / 24! ' julian centuries since J2000.0 jt = jd / 36525! 'mean siderial time mst = 280.46061837# + 360.98564736629# * jd mst = mst + .000387933# * jt * jt - jt * jt * jt / 38710000 + lon ' zorg er nu voor dat deze hoek tussen 0 en 360 graden komt IF mst > 0! THEN DO mst = mst - 360! LOOP WHILE mst > 360! ELSE DO mst = mst + 360! LOOP WHILE mst < 0 END IF RETURN SUB gradenminsecnaargraden (a$, graden) '======================================= 'Deze routine rekent graden, minuten seconden notatie om naar ' decimale graden 'Als het hele aantal graden < 0 is dan trekt hij de min en sec ' ervan af... ipos1 = INSTR(a$, "graden") graden = VAL(MID$(a$, 1, ipos1 - 1)) ipos2 = INSTR(a$, "min") min = VAL(MID$(a$, ipos2 - 2, 2)) ipos3 = INSTR(a$, "sec") sec$ = MID$(a$, ipos2 + 3, ipos3 - (ipos2 + 3)) sec = VAL(sec$) IF graden < 0 THEN graden = graden - min / 60 - sec / 3600 ELSE graden = graden + min / 60 + sec / 3600 END IF END SUB SUB uurnaaruurminsec (uur, tijdstring$) '============================================ ' deze routine maakt van een decimaal uur een stringnotatie als ' 15:10:50.2 uur:min:sec ' bedoeld om mooi te printen uur2 = INT(uur) uur$ = LTRIM$(RTRIM$(STR$(uur2))) IF LEN(uur$) = 1 THEN uur$ = "0" + uur$ END IF min = (uur - uur2) * 60 min2 = INT(min) min$ = LTRIM$(RTRIM$(STR$(min2))) IF LEN(min$) = 1 THEN min$ = "0" + min$ END IF sec = (min - min2) * 60 sec$ = LTRIM$(RTRIM$(STR$(sec))) ' er zijn een aantal vormen waarin sec kan voorkomen. ' sec$ = "0" ' sec$ = "2" ' sec$ = "34" ' sec$ = ".123456767" ' sec$ = "5.1232345456" ' sec$ = "34.98647464" ' Nu al deze mogelijkheden apart behandelen '============================================ 'PRINT 'PRINT "sec$ in subroutine : "; sec$ ' ga eerst kijken het 0 is IF sec$ = "0" THEN sec$ = "00.0" END IF ' als sec uit 1 cijfer bestaat IF LEN(sec$) = 1 THEN sec$ = "0" + sec$ + ".0" END IF ' als sec uit 2 cijfers bestaan, zonder iets achter de komma IF INSTR(sec$, ".") = 0 THEN IF LEN(sec$) = 2 THEN sec$ = sec$ + "0" END IF END IF ' als sec .12345 is IF INSTR(sec$, ".") = 1 THEN sec$ = "00" + sec$ sec$ = LEFT$(sec$, 4) END IF ' als sec 2.12345678 is IF INSTR(sec$, ".") = 2 THEN sec$ = "0" + sec$ sec$ = LEFT$(sec$, 4) END IF ' als sec 12.45667789 is IF INSTR(sec$, ".") = 3 THEN sec$ = LEFT$(sec$, 4) END IF tijdstring$ = uur$ + ":" + LTRIM$(RTRIM$(min$)) + ":" + LTRIM$(RTRIM$(sec$)) END SUB
EINDE VAN HET PROGRAMMA BERERA.BAS
HET PROGRAMMA VINDSTER.BAS
' Dit programma rekent Right ascension en declinatie van een ster ' om in azimuth en elevatie op een locatie en een zeker tijdstip ' Dit programma is geschreven in Quick Basic van Microsoft en draait ' in een Microsoft Dos omgeving. ' W. Apon 3-8-2008 ' Ter controle: dit programma geeft als output een azimuth en elevatie van: ' azimuth = 255.24714476304480 graden ' elevatie= 60.90371409921462 graden DEFDBL A-Z ' De input gegevens '=================================================== ' de locatie van de Ster (Vega in Sterrenbeeld Lier) '======================= RA$ = "18uur 36minutgen 56.3seconden" ' since Epoch J2000 Dec$ = "38graden 47minuten 1.00seconden" ' Tijds gegevens: '================ year = 2008 month = 9 day = 14 hour = 21 ' UUR in UTC minute = 0 second = 0 'De locatie van de waarnemer '=========================== ' Eerst Oosterlengte lon$ = "6graden 54minuten 27.67seconden" ' precies deze notatie aanhouden ' Dan Noorderbreedte lat$ = "53graden 16min 49.32sec" ' precies deze notatie aanhouden ' EINDE van in te voeren gegevens '================================================================= pi = 3.14159265# 'Hier start het hoofdprogramma '=============================== GOSUB berekenazimuthenelevatie ' Nu de in en output mooi op het scherm zetten CLS PRINT PRINT "Geef azimuth en elevatie van een ster programma " PRINT "================================================" PRINT PRINT PRINT "Right ascension van ster : "; RA$ PRINT "Declinatie van de ster : "; Dec$ PRINT PRINT PRINT "Op datum dd-mm-year : "; day; "-"; month; "-"; year PRINT "Tijdstip (UTC) (hh:mm:sec): "; hour; ":"; minute; ":"; second PRINT PRINT PRINT "Op locatie : " PRINT "Longitude (Oosterlengte) : "; lon$ PRINT "Latitude (Noorderbreedte) : "; lat$ PRINT PRINT PRINT "Azimuth : "; PRINT USING "###.##############"; azimuth PRINT "elevatie : "; PRINT USING "###.##############"; elevatie END berekenazimuthenelevatie: ' even de RA omrekenen naar decimale uren CALL uurminsecnaaruur(RA$, RA) RA = 15 * RA ' de ra is nu in graden omgerekend ' 1 uur is precies 15 graden ' even de DEC omrekenen naar decimale graden CALL gradenminsecnaargraden(Dec$, Dec) ' nu lat en lon van de waarnemer precies uitrekenen ' even lon omrekenen naar decimale graden CALL gradenminsecnaargraden(lon$, lon) ' even lat omrekenen naar decimale graden CALL gradenminsecnaargraden(lat$, lat) GOSUB berekenmeansiderialtime ' ----> mst in graden ha = mst - RA IF ha < 0 THEN ha = ha + 360 END IF ' Zet nu graden om in radialen ha = ha * pi / 180 Dec = Dec * pi / 180 lat = lat * pi / 180 ' bereken nu de elevatie in radialen en daarna in graden '======================================================== sinALT = SIN(Dec) * SIN(lat) + COS(Dec) * COS(lat) * COS(ha) ' nu de arcsin van sinalt berekenen. x = sinALT alt = ATN(x / SQR(-x * x + 1))' * 180 / pi alt2 = alt * 180 / pi elevatie = alt2 ' Bereken nu azimuth in radialen en daarna in graden '==================================================== cosaz = (SIN(Dec) - SIN(alt) * SIN(lat)) / (COS(alt) * COS(lat)) 'bereken de arccos van cosaz 'output ===> A3 x = cosaz A3 = (ATN(-x / SQR(-x * x + 1)) + 2 * ATN(1)) * 180 / pi azimuth = A3 IF SIN(ha) > 0 THEN azimuth = 360 - azimuth END IF RETURN berekenmeansiderialtime: '=================================================== ' bereken LOCAL MEAN SIDERIAL TIME in graden!!!! ' MST = functie van (UT) IF month = 1 OR month = 2 THEN year = year - 1 month = month + 12 END IF a = INT(year / 100) b = 2 - a + INT(a / 4) c = INT(365.25 * year) d = INT(30.6001 * (month + 1)) 'day since j2000.0 jd = b + c + d - 730550.5 + day + (hour + minute / 60! + second / 3600) / 24! ' julian centuries since J2000.0 jt = jd / 36525! 'mean siderial time mst = 280.46061837# + 360.98564736629# * jd mst = mst + .000387933# * jt * jt - jt * jt * jt / 38710000 + lon 'PRINT "mst : "; mst; " in graden" ' zorg er nu voor dat deze hoek tussen 0 en 360 komt te liggen IF mst > 0! THEN DO mst = mst - 360! LOOP WHILE mst > 360! ELSE DO mst = mst + 360! LOOP WHILE mst < 0 END IF RETURN SUB gradenminsecnaargraden (a$, graden) '======================================= 'Deze routine rekent graden, minuten seconden notatie om naar ' decimale graden 'Als het hele aantal graden < 0 is dan trekt hij de min en sec ' ervan af... ipos1 = INSTR(a$, "graden") graden = VAL(MID$(a$, 1, ipos1 - 1)) ipos2 = INSTR(a$, "min") min = VAL(MID$(a$, ipos2 - 2, 2)) ipos3 = INSTR(a$, "sec") sec$ = MID$(a$, ipos2 + 3, ipos3 - (ipos2 + 3)) sec = VAL(sec$) IF graden < 0 THEN graden = graden - min / 60 - sec / 3600 ELSE graden = graden + min / 60 + sec / 3600 END IF END SUB SUB uurminsecnaaruur (a$, uur) '============================= ipos1 = INSTR(a$, "uur") uur = VAL(MID$(a$, 1, ipos1 - 1)) ipos2 = INSTR(a$, "min") min = VAL(MID$(a$, ipos2 - 2, 2)) ipos3 = INSTR(a$, "sec") sec$ = MID$(a$, ipos2 + 3, ipos3 - (ipos2 + 3)) sec = VAL(sec$) uur = uur + min / 60 + sec / 3600 END SUBEINDE VAN HET PROGRAMMA VINDSTER.BAS