5

PyEphem を使用して太陽の緯度と経度を計算しようとしましたが、エフェメリスと一致しませんでした
SUN: 2011 MAY 04 We 04 14:46:08 13TA12 = 約 43 度 (ウェブサイト www.findyourfate.com による)

a = Sun()
a.compute('2011-05-04')
>>> a.hlon
274:18:49.1
>>> a.hlat
0:00:00.1

何が間違っている可能性がありますか?惑星/太陽の経度を計算する方法。ヘリオ/ジオセントリック。

4

2 に答える 2

16

詳細な回答に値する興味深い質問。

最初の問題。PyEphemは、日付ではYYYY/mm/ddなく、の形式で日付を取得しますYYYY-mm-dd

>>> from ephem import *
>>> Date('2011-05-04')
2010/6/26 00:00:00
>>> Date('2011/05/04')
2011/5/4 00:00:00

(この動作は非常に役に立たないようです。バグとしてBrandon Craig Rhodesに報告し、PyEphemバージョン3.7.5.1以降、この動作は修正されました。)

2番目の問題。PyEphemでは、hlon通常、体の地動説の経度(太陽を中心とした座標系の経度)です。これは太陽には意味がありません。したがって、文書化されていない特別な例外として、太陽と太陽を調べるhlonと、地球hlatの地動説の経度と緯度がわかります。

(これが文書化されていればいいのですが。私もこれを報告しました。PyEphem3.7.5.1には、私の推奨事項に従った文書が含まれています。)

代わりにあなたが望むのは、太陽の黄道経度だと私は信じています。PyephemのEcliptic関数を使用して、体の黄道座標を見つけることができます。

>>> sun = Sun()
>>> sun.compute('2011/05/04')
>>> Ecliptic(sun).lon
43:02:58.9

ただし、findyourfate.comは「13TA12」(つまり、おうし座の13°12'、PyEphemの43:12:00に対応)を報告します。行方不明の0:09はどうなりましたか?これは、エポックの選択(つまり、どの程度の歳差運動を考慮に入れるか)に帰着すると思います。デフォルトでは、PyEphemは標準の天文エポックJ2000.0を使用します。しかし、findyourfate.comはepoch-of-dateを使用しているようです:

>>> sun.compute('2011/05/04', '2011/05/04')
>>> Ecliptic(sun).lon
43:12:29.0

私はこれがすべて明確であることを願っています:そうでないかどうか尋ねてください。


テーブル全体をPythonで生成する場合は、次のコードのように実行できます。PyEphemを使用して月の交点を計算する簡単な方法がわからないため、そのビットを実装していません。(反復検索で実行できると思いますが、試していません。)

from ephem import *
import datetime
import itertools
import math

zodiac = 'AR TA GE CN LE VI LI SC SG CP AQ PI'.split()

def format_zodiacal_longitude(longitude):
    "Format longitude in zodiacal form (like '00AR00') and return as a string."
    l = math.degrees(longitude.norm)
    degrees = int(l % 30)
    sign = zodiac[int(l / 30)]
    minutes = int(round((l % 1) * 60))
    return '{0:02}{1}{2:02}'.format(degrees, sign, minutes)

def format_angle_as_time(a):
    """Format angle as hours:minutes:seconds and return it as a string."""
    a = math.degrees(a) / 15.0
    hours = int(a)
    minutes = int((a % 1) * 60)
    seconds = int(((a * 60) % 1) * 60)
    return '{0:02}:{1:02}:{2:02}'.format(hours, minutes, seconds)

def print_ephemeris_for_date(date, bodies):
    date = Date(date)
    print datetime.datetime(*date.tuple()[:3]).strftime('%A')[:2],
    print '{0:02}'.format(date.tuple()[2]),
    greenwich = Observer()
    greenwich.date = date
    print format_angle_as_time(greenwich.sidereal_time()),
    for b in bodies:
        b.compute(date, date)
        print format_zodiacal_longitude(Ecliptic(b).long),
    print

def print_ephemeris_for_month(year, month, bodies):
    print
    print (datetime.date(year, month, 1).strftime('%B %Y').upper()
           .center(14 + len(bodies) * 7))
    print
    print 'DATE  SID.TIME',
    for b in bodies:
        print '{0: <6}'.format(b.name[:6].upper()),
    print
    for day in itertools.count(1):
        try:
            datetuple = (year, month, day)
            datetime.date(*datetuple)
            print_ephemeris_for_date(datetuple, bodies)
        except ValueError:
            break

def print_ephemeris_for_year(year):
    bodies = [Sun(), Moon(), Mercury(), Venus(), Mars(), Jupiter(), 
              Saturn(), Uranus(), Neptune(), Pluto()]
    for month in xrange(1, 13):
        print_ephemeris_for_month(year, month, bodies)
        print
于 2011-06-02T23:07:00.950 に答える