0

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

4

1 回答 1

1

更新:

Skyfield 的年历模块现在直接支持这种计算!见:月球节点

原始答案,对于那些想要这些细节的人:

至少很容易找到相对于 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
于 2018-01-15T02:48:28.960 回答