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