【问题标题】:How do I compute correct planet oppositions?我如何计算正确的行星冲日?
【发布时间】:2019-12-04 19:58:11
【问题描述】:

我很难找到一种方法来计算行星冲撞的确切时刻。根据定义,当从地球 的角度看,它与太阳 对面时,行星 被称为对冲,所以我的假设是它发生在角度 处于最大值。

为了找到这个,我用 Skyfield 编写了以下代码:

def get_skf_objects():
    return get_loader()('de421.bsp')

def get_angle(time: Time):
    sun_pos = earth.at(time).observe(get_skf_objects()['sun'])
    aster_pos = earth.at(time).observe(get_skf_objects()[aster.skyfield_name]) # e.g. aster.skyfield_name = 'MARS'
    degrees = sun_pos.separation_from(aster_pos).degrees
    return degrees

get_angle.rough_period = 1.0

times, angles = _find_maxima(start_time, end_time, get_angle, epsilon=1./3600/24)

由于某些我不太明白的原因,这会在实际发生反对时产生价值。但我真正的问题是,与真正的反对时间相比,我得到的时间总是错误的。例如:

  • 2018 年 7 月 27 日的火星冲日被认为是在 2:15 UTC,但实际上,它实际上是在 5:12 UTC。
  • 2020 年 10 月 13 日的火星冲日将在 UTC 时间 23:59 发生,但 Skyfield 告诉我它将在 10 月 14 日 01:55 UTC 发生。

等等……

我在get_angleangles 中的degrees 变量上添加了打印调用,在调用_find_maxima() 之后得到了10 月14 日的结果:

[177.00547411 177.00728148 177.00435833 176.99671953 176.98440208
 176.96746426 176.94598429 176.92005866 176.88980009 176.85533528
 176.81680257 176.77434952]
[177.00547411 177.00615453 177.00667867 177.00704644 177.00725779
 177.00731269 177.00721115 177.00695318 177.00653883 177.00596817
 177.00524129 177.00435833]
[177.00725779 177.00727941 177.00729586 177.00730713 177.00731323
 177.00731417 177.00730993 177.00730051 177.00728593 177.00726617
 177.00724125 177.00721115]
[177.00731323 177.00731379 177.00731417 177.00731438 177.00731443
 177.0073143  177.00731399 177.00731352 177.00731288 177.00731207
 177.00731108 177.00730993]
[177.00731438 177.0073144  177.00731442 177.00731443 177.00731443
 177.00731443 177.00731442 177.00731441 177.00731439 177.00731436
 177.00731433 177.0073143 ]
[177.00731443 177.00731443 177.00731443 177.00731443 177.00731443
 177.00731443 177.00731443 177.00731443 177.00731443 177.00731443
 177.00731443 177.00731443]
[177.00731443 177.00731443 177.00731443 177.00731443 177.00731443
 177.00731443 177.00731443 177.00731443 177.00731443 177.00731443
 177.00731443 177.00731443]


[177.00731443]

发生了什么?

【问题讨论】:

    标签: python astronomy skyfield


    【解决方案1】:

    您在正确的轨道上,但您的方法存在一些问题。

    1. 您反对的确切时间的来源(您是否提到了来源?如果是这样,那么我还没有在您的问题文本中找到它)似乎是不正确的。 2020 年火星冲日的确切时间是 23:25 UT,您可以在 this Google Books link 验证。

    2. 您对使用原始分离角定义对立面的猜测很接近但并不准确。根据this article on the Wikipedia 的说法,冲日是太阳和行星的黄道经度相距 180° 的时刻。除其他外,这个定义意味着在过去,可以通过从行星经度表中减去两个角度来找到对立时刻,而涉及原始角度分离的定义需要一对纬度之间的球面三角(或 RA-dec) 坐标。

    3. 该定义碰巧使用视位置,因此您需要调用.apparent() 来转换您收到的坐标。

    把这些调整放在一起,看看下面的脚本是否给你正确的答案:

    from skyfield.api import load, tau, pi
    from skyfield.almanac import find_discrete
    
    planets = load('de421.bsp')
    sun = planets['sun']
    earth = planets['earth']
    mars = planets['mars']
    
    ts = load.timescale(builtin=True)
    
    def longitude_difference(t):
        e = earth.at(t)
        s = e.observe(sun).apparent()
        m = e.observe(mars).apparent()
        _, lon1, _ = s.ecliptic_latlon()
        _, lon2, _ = m.ecliptic_latlon()
        return (lon1.degrees - lon2.degrees) - 180 > 0
    
    longitude_difference.rough_period = 300.0
    
    t, b = find_discrete(ts.utc(2020), ts.utc(2021), longitude_difference)
    for ti in t:
        print(t.utc_jpl())
    

    【讨论】:

    • 像魅力一样工作,感谢您的精确!仅供参考,23:59 UTC 的事情是与疲劳有关的错误,感谢您的更正:)
    • 我很高兴它成功了!受您的问题启发,下一个版本的 Skyfield 将有一个用于此计算的官方函数:github.com/skyfielders/python-skyfield/commit/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多