使用Skyfield的月球节点的经度

时间:2017-08-27 21:35:44

标签: python astronomy pyephem skyfield

我试图使用Skyfield找出上升/下降月球节点的经度,但无法在文档中找到任何参考。可能吗? 还有任何JPL文件提供此数据吗?

1 个答案:

答案 0 :(得分:1)

至少可以很容易地找到它们相对于J2000黄道 - 这对于远离2000年的日期来说也许没问题,因为我认为只有黄道经度的定义随着过去的年份而变化,而不是纬度(节点关心的是什么)?

在任何情况下,你都会先于此。假设您想要升序节点。它必须在接下来的30天内发生,因为这不仅仅是月球的完整轨道,所以让我们来看看月球纬度从负到正的那一天:

from skyfield.api import load
ts = load.timescale()
eph = load('de421.bsp')
earth = eph['earth']
moon = eph['moon']

t = ts.utc(2018, 1, range(14, 14 + 30))
lat, lon, distance = earth.at(t).observe(moon).ecliptic_latlon()
angle = lat.radians

for i in range(len(angle)):
    if angle[i] < 0 and angle[i+1] > 0:
        break

print(t[i].utc_jpl(), angle[i])
print(t[i+1].utc_jpl(), angle[i+1])

结果是发现升序节点必须在1月31日的某个时间发生:

A.D. 2018-Jan-31 00:00:00.0000 UT -0.0188679292421
A.D. 2018-Feb-01 00:00:00.0000 UT 0.00522392011676

要查找确切时间,请安装SciPy库,并让其中一个求解器找到值达到零的确切时间。你只需要创建一个带有数字并返回数字的小函数,将数字转换为Skyfield时间,然后将角度转换回普通数字:

from scipy.optimize import brentq

def f(jd):
    t = ts.tt(jd=jd)
    angle, lon, distance = earth.at(t).observe(moon).ecliptic_latlon()
    return angle.radians

node_t = brentq(f, t[i].tt, t[i+1].tt)
print(ts.tt(jd=node_t).utc_jpl())

结果应该是节点的确切时刻:

A.D. 2018-Jan-31 18:47:54.5856 UT