1

ephem初めて使用していますが、 oberver.sidereal_time() の出力を理解するのに苦労しています

時角から太陽時を判断するためのスクリプトをいくつか作成しました。1 つ目は、ephem を使用して赤経を計算し、Meeus の天文アルゴリズムの式を使用して、グリニッジ平均恒星時を取得します。これは、経度を使用してローカル平均恒星時に変換できます。

import sys
from datetime import datetime, time, timedelta
import ephem

def hour_angle(dt, longit, latit, elev):
    obs = ephem.Observer()
    obs.date = dt.strftime('%Y/%m/%d %H:%M:%S')
    obs.lon = longit
    obs.lat = latit
    obs.elevation = elev
    sun = ephem.Sun()
    sun.compute(obs)
    # get right ascention
    ra = ephem.degrees(sun.g_ra)

    # get sidereal time at greenwich (AA ch12)
    jd = ephem.julian_date(dt)
    t = (jd - 2451545.0) / 36525
    theta = 280.46061837 + 360.98564736629 * (jd - 2451545) \
            + .000387933 * t**2 - t**3 / 38710000

    # hour angle (AA ch13)
    ha = (theta + longit - ra * 180 / ephem.pi) % 360
    return ha

def main():
    if len(sys.argv) != 6:
        print 'Usage: hour_angle.py [YYYY/MM/DD] [HH:MM:SS] [longitude] [latitude] [elev]'
        sys.exit()
    else:
        dt = datetime.strptime(sys.argv[1] + ' ' + sys.argv[2], '%Y/%m/%d %H:%M:%S')
        longit = float(sys.argv[3])
        latit = float(sys.argv[4])
        elev = float(sys.argv[5])

    # get hour angle
    ha = hour_angle(dt, longit, latit, elev)

    # convert hour angle to timedelta from noon
    days = ha / 360
    if days > 0.5:
        days -= 0.5
    td = timedelta(days=days)

    # make solar time
    solar_time = datetime.combine(dt.date(), time(12)) + td
    print solar_time

if __name__ == '__main__':
    main()

これにより、いくつかのデータをプラグインしたときに期待される出力が得られます。

> python hour_angle_ephem.py 2012/11/16 20:34:56 -122.2697 37.8044 3.0
2012-11-16 12:40:54.697115

私が書いた 2 番目のスクリプトは、同じ方法で赤経を計算しますが、ephem の sidereal_time() を使用してローカルの見かけの恒星時を取得します。

import sys
from datetime import datetime, time, timedelta
import math
import ephem

def solartime(observer, sun=ephem.Sun()):
    sun.compute(observer)
    # sidereal time == ra (right ascension) is the highest point (noon)
    t = observer.sidereal_time() - sun.ra
    return ephem.hours(t + ephem.hours('12:00')).norm  # .norm for 0..24

def main():
    if len(sys.argv) != 6:
        print 'Usage: hour_angle.py [YYYY/MM/DD] [HH:MM:SS] [longitude] [latitude] [elev]'
        sys.exit()
    else:
        dt = datetime.strptime(sys.argv[1] + ' ' + sys.argv[2], '%Y/%m/%d %H:%M:%S')
        longit = float(sys.argv[3])
        latit = float(sys.argv[4])
        elev = float(sys.argv[5])

    obs = ephem.Observer()
    obs.date = dt.strftime('%Y/%m/%d %H:%M:%S')
    obs.lon = longit
    obs.lat = latit
    obs.elevation = elev
    solar_time = solartime(obs)
    print solar_time

if __name__ == '__main__':
    main()

これは私が期待する出力を得られません。

python hour_angle_ephem2.py 2012/11/16 20:34:56 -122.2697 37.8044 3.0
9:47:50.83

私の知る限り、2つのスクリプトの唯一の違いは、最初の時角が地方の平均恒星時を基準にしているのに対し、2番目の時角は地方の見かけの恒星時を基準にしていることです。非常に小さな要因。代わりに、約 3 時間の違いが見られます。誰が私に何が起こっているのか説明できますか?

4

1 に答える 1

2

PyEphem に角度を期待する生の浮動小数点数を指定すると、最初に角度がラジアンに変換されたと信頼されます — 常に浮動小数点の角度をラジアンとして扱い、一貫性を保つためです。しかし、2 番目のスクリプトでは、度で表された経度と緯度を取得し、ラジアンであるかのように PyEphem に提供しています。print1 つまたは 2 つのステートメントを追加して、.lonおよび.latの属性がどのように見えるかを確認すると、結果を確認できますObserver

print observer.lon  #--> -7005:32:16.0
print observer.lat  #-->  2166:01:57.2

代わりに、生の経度と緯度の文字列を PyEphem に提供して、2 番目のスクリプト内のfloat()呼び出しargv[3]を削除することで、機械で読み取り可能なラジアンではなく、人間が読み取り可能な度として解釈するようにするだけだと思います。argv[4]次に、期待する値に近い値を返すことがわかります。

$ python tmp11.py 2012/11/16 20:34:56 -122.2697 37.8044 3.0
12:40:55.59
于 2012-11-20T05:27:45.413 に答える