天体の位置計算 – グリニッジ平均恒星時の計算
「天球座標-恒星時」26-28頁
グリニッジ平均恒星時は春分点を基準とする恒星時で歳差の影響を考慮したものになります。本来は歳差と章動の影響を含めて計算するのですが、計算量の多さと複雑さで大変な計算となります。天文計算で使用する恒星時は、グリニッジ視恒星時との差は1″しかなく、よほど精密な計算をしない限り、グリニッジ平均恒星時でも充分です。
今回は、グリニッジ平均恒星時を求めます。「天体の位置計算 増補版」では、新しい計算システムとして、新しい計算式も掲載されていますので、それも併せて紹介して計算していきたいと思います。
グリニッジ平均恒星時を求める計算式
26頁の式2-5を使用して求めることができます。サブルーチン化するにあたり、これを角度に換算しています。
\(T_{u}\) は1900年1月0日正午から計算日までの経過日数を36525日を単位として求めた値になります。
\[ T_{u} = \frac{(JD\,-\,2415020)}{36525} \]▶ サブルーチン MeanSDT50
function MeanSDT50(t) result(msdt)
! グリニッジ平均恒星時(1950)
! t = (JD - 2415020) / 36525
double precision, intent(in) :: t
double precision :: msdt
msdt = Mla(99.690983333d0 + 36000.768925d0 * t + 0.0003870833d0 * t**2)
end function MeanSDT50
新しいグリニッジ平均恒星時を求める計算式
235頁式9-6、この式もサブルーチン化するにあたり、角度に換算しています。
Tは2000年1月1日正午から計算日の世界時0時のユリウス通日(JD)を36525日を単位として求めた値になります。こちらは「天体の位置計算 増補版」に掲載されているような経過日数を求める計算式はなく、必ず世界0時ユリウス通日を求めなければなりません
\[ T = \frac{(JD – 2451545)}{36525} \]▶ サブルーチン MeanSDT80
function MeanSDT80(t) result(msdt)
! グリニッジ平均恒星時(1984)
! t = (JD - 2451545) / 36525
double precision, intent(in) :: t
double precision :: msdt
msdt = Mla(100.460618375d0 + 36000.770053608d0 * t + 0.000387933d0 * t**2 - 0.00000002583d0 * t**3)
end function MeanSDT80
Fortranによるコード
▶ メインルーチン pcc_msdt.f90
program pcc_msdt
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
t = (julian - 2415020d0) / 36525d0
! グリニッジ平均恒星時の計算
! msdt = deg2hms(rad2deg(MeanSDT80(t)))
msdt = deg2hms(rad2deg(MeanSDT50(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
コンパイル
gfortran pcc_lib.f90 pcc_msdt.f90
実行
./a.out
実行結果
DATE AND TIME(JST) ? 19780620,090000 Date / 0h UTC Julian Date Mean Sidereal Time ------------------------------------------------------------- h m s 1978 6 20.00000 2443679.50000 17 51 24.247