Хороший вопрос! Я должен добавить новый раздел к https://rhodesmill.org/skyfield/searches.html, объясняющий это обычное поведение, наблюдаемое при вычитании двух долгот или прямых восхождений. Ключ к разгадке тайны - это посмотреть, что происходит с разницей углов в один из моментов, который проявляется в вашем выводе как фантомное соединение. Я приложил скрипт, который печатает это для самого первого события, которое вы печатаете, между Венерой и Альдебараном:
2020-02-07 Difference: -19.33880215224481 Venus RA: 23.93746881891146
2020-02-08 Difference: 4.5908654129343995 Venus RA: 0.007801253732248779
Разница углов колеблется между -19,3 и 4,6, что сразу должно показаться нам подозрительным, поскольку это просто два разных названия для одного и того же угла! Вы можете подтвердить это, добавив 24,0 к -19,3, и вы получите угол, очень близкий к 4,6 (плюс-минус немного фактического движения, которое Венера совершила за один день).
Почему результат будет скачком? между двумя псевдонимами для одной и той же angular разницы в небе?
Ответ заключается во втором факте, приведенном выше: прямое восхождение Венеры. Разрыв происходит точно в тот момент, когда Венера пересекает 0h прямого восхождения! Несмотря на то, что 23,93746881891146 и 0,007801253732248779 имеют почти одинаковый угол, они различаются на 24,0, потому что они охватывают то место в небе, где мы меняем название прямого восхождения.
Мой сценарий ниже также отображает сюжет, проясняющий ситуацию:
Сюжет прямых восхождений
На верхнем графике вы можете видеть, что именно в тот момент, когда Венера сбрасывает свое RA обратно на ноль, разница RA делает скачок на 24,0 часа от одного псевдонима к другому для того же разница в четыре с половиной часа в RA.
Решение?
Angular различия должны быть ограничены диапазоном вроде [-12h, + 12h), чтобы заставить выбор одного предпочтительного псевдонима для каждого возможного значения angular. В Python, как вы можете видеть в приведенном ниже скрипте, типичный маневр:
(ra1.hours - ra2.hours + 12.0) % 24.0 - 12.0
Это показано на втором графике выше как «Улучшенная разница» и не только правильно скрывает Разрыв 7 февраля больше не делает его похожим на событие, но теперь он правильно определяет противостояние между Венерой и Альдебараном ближе к концу 2020 года (на правом краю графика), которое ранее проявлялось просто как разница, превышающая -12,0 но теперь это становится решающим моментом для различия angular.
Наконец, этот скрипт проверяет оппозиции и отфильтровывает их из результатов поиска. Вы также найдете несколько возможных настроек вашего кода Python, которые вы можете рассмотреть, продолжая кодировать в Python. Вот и:
from skyfield.searchlib import find_maxima, find_minima, find_discrete
from skyfield.api import Star, load
from datetime import datetime, date,timedelta
import pytz
planets = load('de430t.bsp')
earth = planets['earth']
stars = [
['Aldebaran', (4, 35, 55.2), (16, 30, 33)],
['Regulus', (10, 8, 22.3), (11, 58, 2)],
['Pollux', (7, 45, 18.9), (28, 1, 34)],
['Antares', (16, 29, 24.4), (-26, 25, 55)],
]
ts = load.timescale(builtin=True)
t0 = ts.utc(2020, 1, 1)
t1 = ts.utc(2021, 1, 1)
# Exploring the first bad result for Venus and Aldebaran.
star = Star(ra_hours=stars[0][1], dec_degrees=stars[0][2])
for utc in (2020, 2, 7), (2020, 2, 8):
t = ts.utc(*utc)
ra1, _, _ = planets['earth'].at(t).observe(star).radec()
ra2, _, _ = planets['earth'].at(t).observe(planets['venus']).radec()
print(t.utc_strftime('%Y-%m-%d'),
'Difference:', ra1.hours - ra2.hours,
'Venus RA:', ra2.hours)
# Plot showing how to protect an angular difference against discontinuity.
import matplotlib.pyplot as plt
t = ts.utc(2020, 1, range(365))
e = planets['earth'].at(t)
star = Star(ra_hours=stars[0][1], dec_degrees=stars[0][2])
ra1, _, _, = e.observe(star).radec()
ra2, _, _, = e.observe(planets['venus']).radec()
fig, (ax, ax2) = plt.subplots(2, 1)
ax.plot(t.J, ra2.hours, label='Venus RA')
ax.plot(t.J, ra1.hours - ra2.hours, label='RA difference')
ax.set(xlabel='Year', ylabel='Hours')
ax.grid()
ax.legend()
ax2.plot(t.J, ra2.hours, label='Venus RA')
ax2.plot(t.J, (ra1.hours - ra2.hours + 12.0) % 24.0 - 12.0,
label='Improved difference')
ax2.set(xlabel='Year', ylabel='Hours')
ax2.grid()
ax2.legend()
fig.savefig('tmp.png')
# So we need to force the difference into the range [-12 hours .. +12 hours]
def difference(t):
e = earth.at(t)
ra11, dec11, distance = e.observe(object).radec()
ra12, dec12, distance2 = e.observe(planets[target1]).radec()
diff = (ra11.hours - ra12.hours + 12.0) % 24.0 - 12.0
return diff >= 0
difference.rough_period = 1.0
for name, ra_hms, dec_dms in stars:
object = Star(ra_hours=ra_hms, dec_degrees=dec_dms)
target1 = 'venus'
t, b = find_discrete(t0, t1, difference)
if len(t) == 0:
break
print (f"{name} and {target1}")
for a, b in zip(t, b):
e = earth.at(a)
ra1, dec1, _ = e.observe(object).radec('date')
ra2, dec2, _ = e.observe(planets[target1]).radec('date')
if abs(ra1.hours - ra2.hours) > 6.0:
continue # ignore oppositions
print(f"Diff: {ra1.hours - ra2.hours:.4f}, ra_{name}: {ra1.hours}, ra_{target1}: {ra2.hours}")
print(f"{a.utc_iso()},{dec1._degrees - dec2._degrees}")
print()
Теперь напечатаны следующие события:
Aldebaran and venus
Diff: -0.0014, ra_Aldebaran: 4.617748605529591, ra_venus: 4.619169121320681
2020-04-17T20:25:49Z,-10.136618155920797
Diff: -0.0007, ra_Aldebaran: 4.617892691238804, ra_venus: 4.618562784294269
2020-06-08T07:56:08Z,-4.921187477025711
Diff: -0.0001, ra_Aldebaran: 4.618000948409604, ra_venus: 4.618129623302464
2020-07-12T06:44:16Z,-0.9622868107603999
Regulus and venus
Diff: 0.0000, ra_Regulus: 10.157702949500333, ra_venus: 10.157697096607553
2020-10-02T23:42:45Z,0.09034295610918264
Pollux and venus
Diff: 0.0012, ra_Pollux: 7.776229220287636, ra_venus: 7.775002995218732
2020-09-01T16:39:22Z,8.68200041253418
Antares and venus
Diff: 0.0008, ra_Antares: 16.511260401870718, ra_venus: 16.51042838802181
2020-12-23T00:34:39Z,-5.652225570418828
Что, я считаю, решает вашу проблему!