マイコン宇宙講座-惑星の位置計算Ⅱ
歳差を加えた惑星の位置を求めます。全記事の「惑星の位置計算Ⅰ」では位置の分点が1950.0でしたが、歳差を加えることによって指定した日付の惑星の位置を求めることができます。ただ、「マイコン宇宙講座」にも記載されていますが、本書で使われている軌道要素では水星から火星までの精度は5桁、木星から冥王星まで3桁程度です。これは当時の状況を考えれば仕方のないことです。PC-8001という8ビットパソコンであり、現在のように高精度で計算できるほどのスペックではありませんでした。ですから精度がよくないといっても観測に支障はないと思います。
また、本書で用いられている歳差の計算式は1950年分点です。新しい計算式は「天体の位置計算 増補版」(地人書館 1985 長沢 工著)の「9.新しい計算システム」に掲載されています。ただし、与える時刻引数Tは計算する日付の時刻から元期2000年1月1日正午UTを差し引いて、ユリウス世紀(36525日)単位で表したものになります。計算式は以下のようになります。
T = (計算する日付のユリウス日 – 2451545) / 36525
T2 = T * T
T3 = T2 * T
ζ = 2306″.2181 * T+ 0″.30188 * T2 + 0″.017998 * T3
Ζ = 2306″.2181 * T+ 1″.09468 * T2 + 0″.018203 * T3
θ = 2004″.3109 * T – 0″.42665 * T2 – 0″.041833 * T3
その後は、「天体の位置計算 増補版」54頁 式3-13または式3-14用いてL、M、Nを求めて赤経、赤緯を計算します。ただし、プログラムに組み込む場合は、1度電卓を用いて計算してみて問題ないことを確かめてからにしてください。またサブルーチン precessionの式を上記の式に変更したからといって問題ないというわけではありません。
メインルーチン m37.py
# m37.py
# マイコン宇宙講座
# 3-7 惑星の視位置計算プログラム
import math
import lib
M2PI = 2.0 * math.pi
lib.PL[3] = 'Sun'
x = [[0 for i in range(10)] for j in range(4)]
f = [0, 0, 0, 0]
q = [0, 0, 0, 0]
print()
std = input('DATE AND TIME(JST) ? ')
dy, dt = std.split(',')
dy = float(dy)
dt = float(dt)
jd, yy, mm, dd, hh, ms, ss = lib.mjd(dy, dt)
print()
print(' Date= %5d 年 %2d 月 %2d 日 Time= %2d 時 %2d 分 %2.1f 秒\n' % (yy, mm, dd, hh, ms, ss))
print(' MJD=%12.2f ET\n' % (jd))
print(' Planets R.A. (Date) Decl. Distance')
print(' ------------------------------------------------------')
print(' h m 。 , AU')
t1 = jd - 33281.92334
t1 = t1 * (2.737909288e-5 + 1.260132857e-17 * t1)
t2 = t1 * t1
ty = yy + (mm - 1) / 12.0 + dd / 365.0
if yy < 0:
ty = yy - (1 - ((mm - 1) / 12.0 + dd / 365.0))
for pn in range(1, 10):
e, m, p, n, i, a, rd = lib.mean_elements(pn, t1, t2)
f, q = lib.eph_const(p, n, i, lib.K)
ec = e
mo = M2PI * (m / (M2PI) - int(m / (M2PI)))
ss, cc, ff = lib.kepler(mo, ec)
b = a * math.sqrt(1.0 - e * e)
for n in range(1, 4):
f[n] = a * f[n]
q[n] = b * q[n]
# 惑星座標の計算
for n in range(1, 4):
x[n][pn] = ff * f[n] + ss * q[n]
for n in range(1, 4):
x[n][3] = - (x[n][3])
for pn in range(1, 10):
if pn != 3:
for n in range(1, 4):
x[n][pn] = x[n][pn] + x[n][3]
# 惑星の赤経・赤緯の計算
for pn in range(1, 10):
cc = x[1][pn]
ss = x[2][pn]
tt = lib.quadrant(ss, cc)
ra = tt
cc = x[1][pn] / math.cos(ra)
ss = x[3][pn]
dc = math.atan(ss / cc)
r1 = ra
d1 = dc
ra1, dc1 = lib.precession(r1, d1, ty, 0, 0, lib.K)
if ra1 > M2PI:
ra1 = ra1 - M2PI
if ra1 < 0:
ra1 = ra1 + M2PI
ra = ra1
dc = dc1
ra *= lib.K[3] / 15.0
dc *= lib.K[3]
ds = math.sqrt(x[1][pn]**2 + x[2][pn]**2 + x[3][pn]**2)
rh = int(ra)
rm = 60.0 * (ra - rh)
dh = int(abs(dc))
dm = 60.0 * (abs(dc) - dh)
dh = lib.sgn(dc) * dh
print(' %-7s %02d %05.2f %+03d %04.1f %8.5f' % (lib.PL[pn], rh, rm, dh, dm, ds))
print(' ------------------------------------------------------')
print()
例題 2000年1月1日21時30分00秒(JST)における惑星の位置を求めてみよう。
DATE AND TIME(JST) ? 20000101,213000 Date= 2000 年 1 月 1 日 Time= 21 時 30 分 0.0 秒 MJD= 51544.52 ET Planets R.A. (Date) Decl. Distance ------------------------------------------------------ h m 。 , AU MERCURY 18 08.52 -24 25.4 1.41559 VENUS 15 59.73 -18 27.5 1.13782 Sun 18 45.26 -23 01.9 0.98331 MARS 22 02.17 -13 10.4 1.84970 JUPITER 01 36.03 +08 39.1 4.62280 SATURN 02 34.11 +12 31.8 8.63005 URANUS 21 12.84 -16 48.7 20.69341 NEPTUNE 20 18.78 -19 21.3 30.96644 PLUTO 16 48.58 -11 39.2 31.20937 ------------------------------------------------------