Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用skyfield的脚本的结果无效_Python_Skyfield - Fatal编程技术网

Python 使用skyfield的脚本的结果无效

Python 使用skyfield的脚本的结果无效,python,skyfield,Python,Skyfield,我正在探索Brandon Rhodes的宏伟软件Skyfield的可能性。我已经制作了一个脚本来计算随机物体之间在赤经中的连词。我使用以下脚本: from skyfield import almanac from skyfield.searchlib import find_maxima, find_minima, find_discrete from skyfield.api import Star, load from datetime import datetime, date,timed

我正在探索Brandon Rhodes的宏伟软件Skyfield的可能性。我已经制作了一个脚本来计算随机物体之间在赤经中的连词。我使用以下脚本:

from skyfield import almanac
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']

x = [
['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)
t = ts.now()
tzn = 'Europe/Amsterdam'

tz = pytz.timezone(tzn)
now = datetime(2020, 1, 1, 0, 0, 0)
t0 = ts.utc(tz.localize(now))
t1 = ts.utc(tz.localize(now) + timedelta(days=+365))

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
    return diff >= 0

difference.rough_period = 1.0

for count in range (len(x)):
    object = Star(ra_hours=(x[count][1][0], x[count][1][1], x[count][1][2]),dec_degrees=(x[count][2][0], x[count][2][1], x[count][2][2]))
    target1 = 'venus'

    t, b = find_discrete(t0, t1, difference)
    if len(t) > 0:
        print (f"{x[count][0]} and {target1}")

        for i, (a, b) in enumerate(zip(t, b)):
            e = earth.at(a)
            ra11, dec11, distance = e.observe(object).radec('date')
            ra12, dec12, distance2 = e.observe(planets[target1]).radec('date')
            print (f"Diff: {ra11.hours - ra12.hours}, ra_{x[count][0]}: {ra11.hours}, ra_{target1}: {ra12.hours}")
            print(f"{a.utc_iso()},{dec11._degrees - dec12._degrees}")
            print ("")
我相信这是在计算两个物体具有相同RA的时间实例

不幸的是,我得到了以下结果:

Aldebaran and venus
Diff: 4.600705365706519, ra_Aldebaran: 4.6176105612629375, ra_venus: 0.016905195556418524
2020-02-07T21:20:06Z,16.962942031863825

Diff: -0.0014205156698450239, ra_Aldebaran: 4.617748605529588, ra_venus: 4.619169121199433
2020-04-17T20:25:49Z,-10.136618155596008

Diff: -0.000670093218860579, ra_Aldebaran: 4.617892691238783, ra_venus: 4.618562784457644
2020-06-08T07:56:08Z,-4.921187478324768

Diff: -0.0001286749609095139, ra_Aldebaran: 4.618000948409605, ra_venus: 4.618129623370515
2020-07-12T06:44:16Z,-0.962286810883981

Regulus and venus
Diff: 10.140247344361857, ra_Regulus: 10.157152539918275, ra_venus: 0.016905195556418524
2020-02-07T21:20:06Z,12.28436748615726

Diff: 5.852858068422506e-06, ra_Regulus: 10.157702949500333, ra_venus: 10.157697096642265
2020-10-02T23:42:45Z,0.0903429562716429

Pollux and venus
Diff: 7.758742204719277, ra_Pollux: 7.7756474002756955, ra_venus: 0.016905195556418524
2020-02-07T21:20:06Z,28.391501492522927

Diff: 0.001226225278400328, ra_Pollux: 7.776229220287632, ra_venus: 7.775002995009232
2020-09-01T16:39:22Z,8.682000412217121

Antares and venus
Diff: 16.493491164600684, ra_Antares: 16.510396360157102, ra_venus: 0.016905195556418524
2020-02-07T21:20:06Z,-26.059118330110437

Diff: 0.000832014094154232, ra_Antares: 16.51126040187071, ra_venus: 16.510428387776557
2020-12-23T00:34:39Z,-5.652225571050259
以“Diff”开头的行是用于监视输出有效性的行。 Diff表示计算出的RA差值。它应该接近于零。另外两个值是两个对象的右提升。它们应该非常相似。 第二行是我想要的结果,它是计算出的时间和对象之间的距离(以度为单位)。 正如您所看到的,由于某些原因,对于每一组对象,我得到的时间实例的结果是无效的:2020-02-07T21:20:06Z,该实例的差值肯定不接近于零。如果我把金星变成月亮,情况会变得更糟,因为每一秒的结果都是无效的。 我对照Skychart/Cartes du Ciel软件和那些结帐的结果检查了其他结果


我不知道这里出了什么问题。有人能帮我吗?

好问题!我应该添加一个新的部分来解释减去两个经度或右提升时看到的这种常见行为。解开谜团的关键是观察在输出中显示为幻影连接的某个时刻,角度差会发生什么变化。我附上了一个脚本,它为你打印的第一个事件打印了这个,在维纳斯和奥尔德巴兰之间:

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的角度(给出或接受金星在一天内完成的实际运动)

对于天空中完全相同的角度差,为什么结果会在两个别名之间跳跃

答案在上面印刷的第二个事实中:金星的RA。这种不连续性恰好发生在金星经过0小时赤经的时刻!尽管23.93746881891146和0.0078012532248779的角度非常接近,但它们相差24.0,因为它们横跨天空中我们重新命名正确提升的地方

下面我的脚本还显示了一个澄清情况的情节:

在上图中,你可以看到,就在金星将其RA重置为零的那一刻,RA差从一个别名跳到另一个别名,为相同的RA差4.5小时

解决方案是什么

角度差异需要限制在[-12h、+12h)这样的范围内,以强制为每个可能的角度值选择一个首选别名。在Python中,正如您在下面的脚本中所看到的,典型的操作是:

(ra1.hours - ra2.hours + 12.0) % 24.0 - 12.0
这在上面的第二张图中显示为“改进的差异”,它不仅正确地隐藏了2月7日的不连续性,不再让它看起来像一个事件,而且现在它正确地确定了金星和艾尔德巴拉之间在2020年底(在图的右边缘)的对立面这之前仅仅表现为超过-12.0的差异,但现在它作为角度差异的关键时刻闪耀

最后,这个脚本检查对立并将它们从搜索结果中过滤出来。在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

我相信这可以解决并纠正您的问题!

谢谢您的时间。这是一个很好的解释,确实解决了问题。