天体の位置計算 – 続・グリニッジ平均恒星時の計算
前記事「天体の位置計算-グリニッジ平均恒星時の計算」では、「天体の位置計算 増補版」235頁にあるJ2000.0の式を紹介しましたが、国立天文台天文情報センター暦計算室の歴表年表の値と較べると、0s.002〜3ほどの差がでます。この値でも構わないのですが、もう少し精度を上げるために、「シリーズ現代の天文学13 天体の位置と運動 第2版」(日本評論社 2017 福島登志夫[編])66頁に紹介されている式を使って求めることにします。解説については本書を参照してください。
計算式
\[ \begin{array}{l} ERA = 2\pi(0.7790572732640 + 1.00273781191135448(JD\,-\,2451545.0)\\ GMST = ERA + 0^{″}.014506 + 4612^{″}.156534T+1^{″}.3915817T^{2}\\ \hspace{32pt}\,-\,0^{″}.00000044T^{3}\,-\,0^{″}.000029956T^{4}\,-\,0^{″}.0000000368T^{5}\\ \\ JD : ユリウス日\\ T : (JD\,-\,2451545.0)/36525.0 \end{array} \]
計算は、ERAを計算したら、GMSTを計算しますが、このときERAの値は加算しません。別々に求めた後にERAとGMSTを加算します。最初、この式を見たときにどうすればよいかわからず、長い間放置していましたが、計算方法が「マイコン天文学Ⅰ」(恒星社 1983 中野主一著)の49頁にある地方恒星時の計算にありました。コードはN88-BASICで書かれたものですが、これが解決方法になりました。
ERAとGMSTの2つの式の違いは単位がERAはラジアン値、GMSTは秒だということです。ですからGMSTの計算結果を角度に変換し、加算するときにERAを角度に変換しています。
▶ サブルーチン MeanSDT
function MeanSDT(julian, t) result(gmst)
! グリニッジ平均恒星時
! t = (JD - 2451545.0) / 36525.0
double precision, parameter :: PI = 3.141592653589793238462643d0
double precision, parameter :: PI2 = 6.283185307179586476925287d0
double precision, parameter :: RAD = 180d0 / PI
double precision, intent(in) :: julian, t
double precision :: gmst, era
era = 0.7790572732640d0 + 1.00273781191135448d0 * (julian - 2451545.0d0)
era = PI2 * (era - int(era))
gmst = 0.014506d0 + 4612.156534d0 * t + 1.3915817d0 * t**2 - 0.00000044d0 * t**3 &
- 0.000029956d0 * t**4 - 0.0000000368d0 * t**5
gmst = gmst / 3600d0
gmst = ((era * RAD) + gmst) / 15d0
end function MeanSDT
Fortranによるコード
▶ メインルーチン pcc_msdt_2.f90
program pcc_msdt_2
use pcclib
implicit none
double precision, parameter :: PI = 3.141592653589793d0
double precision, parameter :: RAD = 180.0d0 / PI
double precision :: julian, dy, dt
double precision :: year, month, day, hour, minute, second
double precision :: sdt_hour, sdt_minute, sdt_second
double precision :: msdt(3), dtime(3)
double precision :: t
character(255) :: dfmt
write(*,*)
write(*, fmt='(a)', advance='no') 'DATE AND TIME(JST) ? '
read(*,*) dy, dt
year = int(dy / 10000.0d0)
month = mod(int(dy / 100.0d0), 100)
day = mod(dy, 100.0d0)
hour = int(dt / 10000.0d0)
minute = mod(int(dt / 100.0d0), 100)
second = mod(dt, 100.0d0)
! ユリウス日の計算
julian = julianDay(year, month, day)
julian = julian + (hour / 24d0 + minute / 1440d0 + second / 86400d0)
julian = julian - 0.375
! ユリウス日から年月日を求める
dtime = Julian2date(julian)
year = dtime(1)
month = dtime(2)
day = dtime(3)
! 時刻引数の計算
t = (julian - 2451545d0) / 36525d0
! グリニッジ平均恒星時の計算
msdt = deg2dms(MeanSDT(julian, t))
sdt_hour = msdt(1)
sdt_minute = msdt(2)
sdt_second = msdt(3)
! 恒星時が範囲を超えたときの処理
if (sdt_hour > 24d0) then
sdt_hour = sdt_hour - 24d0
end if
if (sdt_second >= 60d0) then
sdt_second = sdt_second - 60d0
sdt_minute = sdt_minute + 1d0
end if
if (sdt_minute == 60d0) then
sdt_minute = 0d0
sdt_hour = sdt_hour + 1d0
end if
if (sdt_hour == 24d0) then
sdt_hour = 0d0
end if
! 出力
dfmt = '(" ", i4, " ", i2, " ", f8.5, " ", f14.5, " ", i2, " ", i2, " ", f6.3)'
write(*, *)
write(*, *) 'Date / 0h UTC Julian Date Mean Sidereal Time'
write(*, *) '-------------------------------------------------------------'
write(*, *) ' h m s'
write(*, dfmt) int(year), int(month), day, julian, int(sdt_hour), int(sdt_minute), sdt_second
write(*, *)
stop
end program pcc_msdt_2
コンパイル
gfortran pcc_lib.f90 pcc_msdt_2.f90
実行
./a.out
実行結果
DATE AND TIME(JST) ? 20221023,090000 Date / 0h UTC Julian Date Mean Sidereal Time ------------------------------------------------------------- h m s 2022 10 23.00000 2459875.50000 2 5 35.042
国立天文台天文情報センター暦計算室の歴表年表と比較する場合は、時刻系を「+09時間(日本)」にセットしてください。これは、時刻の入力が日本標準時刻(JST)として入力しているからです。ユリウス日およびグリニッジ平均恒星時は日本標準時刻 – 9時間として計算されています。ちなみに、国立天文台天文情報センター暦計算室の歴表年表の時刻を0時、時刻系を「+00時間(世界時)」に変更して計算しても同じ結果になります。