マイコン宇宙講座-惑星の位置計算Ⅰ

惑星の位置を表す赤経・赤緯(1950.0分点)を求めます。惑星の位置計算は、小惑星や彗星の位置計算にも役に立てることができますので計算方法を覚えておくとよいでしょう。ただし、彗星は基本的に楕円軌道となりますので、計算方法が少し異なります。なお、このプログラムで求められる位置は、1950年分点ですので現在に照らし合わせると合いません。あくまでも書籍の出版時のデータに基づいた計算になります。ただ、計算方法は今も昔も変わりません。もし厳密に計算するのであれば、惑星光行差、歳差、章動、最新の軌道要素などを含めて計算する必要があります。

サブルーチン eph_const

※サブルーチンはlib.pyに記述してください。

# EPH CONST
def eph_const(pe, nd, ic, K):
    f = [0, 0, 0, 0]
    q = [0, 0, 0, 0]

    r1 = math.sin(pe)
    r2 = math.sin(nd)
    r3 = math.sin(ic)
    r4 = math.cos(pe)
    r5 = math.cos(nd)
    r6 = math.cos(ic)

    f[1] = r5 * r4 - r1 * r6 * r2
    q[1] = -r1 * r5 - r4 * r6 * r2
    r7 = r6 * r5 * K[4]
    r8 = r2 * K[4]
    r9 = r3 * K[5]
    f[2] = r1 * r7 + r4 * r8 - r1 * r9
    q[2] = r4 * r7 - r1 * r8 - r4 * r9
    r7 = r3 * K[4]
    r8 = r6 * r5 * K[5]
    r9 = r2 * K[5]
    f[3] = r1 * r7 + r1 * r8 + r4 * r9
    q[3] = r4 * r7 + r4 * r8 - r1 * r9

    return f, q

メインルーチン m35.py

# m35.py
# マイコン宇宙講座
# 3-5 惑星の位置計算プログラム
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.  (1950.0)  Decl.         Distance')
print(' ------------------------------------------------------')
print('                h   m            。  ,              AU')

t1 = jd - 33281.92334
t1 = t1 * (2.737909288e-5 + 1.260132857e-17 * t1)
t2 = t1 * t1

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)
    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.  (1950.0)  Decl.         Distance
 ------------------------------------------------------
                h   m            。  ,              AU
 MERCURY      18  05.45       -24  25.9        1.41559
 VENUS        15  56.85       -18  19.1        1.13782
 Sun          18  42.23       -23  05.1        0.98331
 MARS         21  59.48       -13  24.9        1.84970
 JUPITER      01  33.40       +08  23.8        4.62280
 SATURN       02  31.39       +12  18.6        8.63005
 URANUS       21  10.05       -17  01.0       20.69341
 NEPTUNE      20  15.89       -19  30.7       30.96644
 PLUTO        16  45.80       -11  34.0       31.20937
 ------------------------------------------------------

「マイコン宇宙講座」の出力結果と較べると、天王星から冥王星までのDistance値に最大±0.00004の差が出ています。N-BASICとPythonの計算精度の差によるものかなと思っています。