マイコン宇宙講座-月の出・月の入り時刻計算
彗星や星雲などの淡い天体を観測する方々にとっては、月は観測の妨げになります。月が天空にあることによって見える星の数が減少し、月の光によって淡い天体が見えにくくなるからです。現在は大気汚染の影響もあって、なおさら大変です。筆者の幼少期においては、市街地であっても空はよく澄んでおり、特に冬においては青黒いという表現が適切な空だったことを覚えています。満月であっても、よく星が見えていました。残念ながら、現在は都会を離れ、空気の澄んだ高いところへ行かないと同じようにはならないのではないでしょうか。
観測者は天体によって、月の出や月の入時刻によって計画を立てることがあると思います。写真観測が主流ともいえる現在、月が出ているかどうかが重要になっていますね。したがって、前もって月の出や月の入り時刻を調べておいて、観測する時刻を決定したり、天体の位置によっても計画の実行を決定したりすると思います。
さて、当時、この計算がどれだけ大変だったかが「マイコン宇宙講座」に記載されています。使用された機種はPC-8001という8ビットコンピュータでした。16ビットのPC-9801が発売されるのは、このずっとあとのことです。1回の月の出・月の入り時刻計算に48秒かかり、31日分の計算に48分かかっていたそうです。
「マイコン宇宙講座」を読んで、はじめて購入したコンピュータがPC-8001でした。本書のプログラムを入力してエラーでブレークすることはないものの、計算結果がおかしい場合、リストと見較べて、直して実行と繰り返して時間をかけて見直すということをやったものです。今思えば大変なことをやっていたなあと感じますが、当時は夢中でしたし、あまり大変だとは思っていませんでした。
メインルーチン m53.py
# m53.py
# マイコン宇宙講座
# 5-3 月の出入り時刻計算プログラム
import lib
lg = 139.745 / lib.K[3]
la = 35.654 / lib.K[3]
obs = 'Tokyo'
std = input('\nDATE AND TIME(JST) ? ')
dy, dt = std.split(',')
dy = float(dy)
dt = float(dt)
jd, yy, mm, dd, hh, ms, ss = lib.mjd(dy, dt)
ia = 0
ha = 0
hd = 0
sg = 0
ii = 0
ta = 0
td = 0
ta1 = 0
td1 = 0
print()
print('%-s (経度:%5.3f 緯度:%3.3f)' % (obs, lg * lib.K[3], la * lib.K[3]))
print(' (JST) 月の出 月の入り 方位')
print('-----------------------------------------------------(北からの角度)-')
print(' 年 月 日 時 分 時 分 。')
# 出没時刻の近似
while True:
if hd == 0:
ha = ta1
if hd == 1:
ha = td1
# L400:
while True:
sg = 0
if ha > 15:
sg = -1
t0 = (jd - 15019.5 + sg + ha / 24.0) / 36525.0
a, b, c, d, e, g, j, l, m, n, v, w = lib.argument(t0)
mx, my, mz = lib.moon(t0, a, b, d, e, n, g, w)
r0 = c
r1 = mx
r2 = my
r3 = mz
ra, dc, dl = lib.positions(r0, r1, r2, r3)
ds = dl / 23454.706
rd = 0
result = lib.appear(jd, lg, la, ra, dc, ds, rd, sg, hd, lib.K)
flags = False
while True:
if hd == 1:
break
ta = result[0]
if abs(ta - ha) < 2.0e-3:
break
if ia == 5:
break
ha = ta
ia = ia + 1
flags = True
if flags:
continue # 400
flags = False
td = result[0]
al = result[1]
if hd == 0:
hd = 1
id = 0
ha = 0
flags = True
if flags:
break
if abs(td - ha) < 2.0e-3:
break
if id == 5:
break
ha = td
id = id + 1
continue # 400
if flags:
continue # 300
# L570:
ta1 = ta
ta = ta + 9
if ta > 24:
ta = ta - 24
td1 = td
td = td + 9
if td > 24:
td = td - 24
h1 = int(ta)
m1 = 60.0 * (ta - h1)
h2 = int(td)
m2 = 60.0 * (td - h2)
al = al * lib.K[3]
yy, mm, dd = lib.jdate(jd, lib.T)
sfmt = ' %4d %2d %2d %2d %4.1f %2d %4.1f %6.1f' % (yy, mm, dd, h1, m1, h2, m2, al)
if ia == 5:
sfmt = ' %4d %2d %2d -- --.- %2d %4.1f %6.1f' % (yy, mm, dd, h2, m2, al)
if id == 5:
sfmt = ' %4d %2d %2d %2d %4.1f -- --.- %6.1f' % (yy, mm, dd, h1, m1, al)
print(sfmt)
ii = ii + 1
if ii < 32:
jd = jd + 1.0
ia = 0
id = 0
ha = 0
hd = 0
else:
break
print('--------------------------------------------------------------------')
print()
例題 1981年9月1日から1ヶ月の月の出・月の入り時刻を求めてみよう。
DATE AND TIME(JST) ? 19810901,090000 Tokyo (経度:139.745 緯度:35.654) (JST) 月の出 月の入り 方位 -----------------------------------------------------(北からの角度)- 年 月 日 時 分 時 分 。 1981 9 1 7 26.5 19 49.5 90.5 1981 9 2 8 23.8 20 19.4 96.0 1981 9 3 9 20.1 20 49.7 101.2 1981 9 4 10 15.7 21 21.3 106.0 1981 9 5 11 11.0 21 55.4 110.0 1981 9 6 12 6.0 22 32.9 113.3 1981 9 7 13 0.3 23 14.7 115.5 1981 9 8 13 53.4 -- --.- 115.5 1981 9 9 14 44.4 0 1.5 116.4 1981 9 10 15 32.6 0 53.6 116.0 1981 9 11 16 17.4 1 50.6 114.2 1981 9 12 16 59.0 2 51.6 110.8 1981 9 13 17 37.7 3 55.6 106.2 1981 9 14 18 14.4 5 1.5 100.5 1981 9 15 18 50.3 6 8.6 94.1 1981 9 16 19 26.3 7 16.5 87.4 1981 9 17 20 4.0 8 25.2 80.7 1981 9 18 20 44.5 9 34.3 74.6 1981 9 19 21 29.0 10 43.0 69.5 1981 9 20 22 18.5 11 50.1 65.8 1981 9 21 23 12.9 12 53.7 63.8 1981 9 22 -- --.- 13 52.0 63.5 1981 9 23 0 11.5 14 44.2 65.1 1981 9 24 1 12.8 15 30.0 68.1 1981 9 25 2 14.9 16 10.3 72.2 1981 9 26 3 16.6 16 46.1 77.2 1981 9 27 4 17.0 17 18.9 82.7 1981 9 28 5 16.0 17 49.6 88.3 1981 9 29 6 13.6 18 19.4 94.0 1981 9 30 7 10.3 18 49.3 99.4 1981 10 1 8 6.4 19 20.3 104.4 1981 10 2 9 2.0 19 53.2 108.8 --------------------------------------------------------------------