separation()返回巨大的角度

时间:2013-11-23 20:03:58

标签: pyephem

我正在编写一个程序,它通过光度测定法浏览FITS文件并查找.dat文件中给出的星号。 其中一个步骤是使用ephem.separation()

计算两颗给定恒星之间的距离

效果很好。但是,分离时不时返回角度,如1389660529:33:00.8

import ephem
import math

star = ['21:45:15.00', '65:49:24.0']
first_coo = ['21:45:15.00', '65:49:24.0']

check = ephem.FixedBody()
check._ra = ephem.hours(star[0])
check._dec = ephem.degrees(star[1])
check.compute()

# star is a list with coordinates, strings in form %s:%s:%s

first = ephem.FixedBody()
first._ra = ephem.hours(first_coo[0])
first._dec = ephem.degrees(first_coo[1])
first.compute()

sep = math.degrees(float(ephem.separation(check,first)))
print sep

随机发生。有没有人遇到过这种行为?

我在212个文件中搜索18颗星,这使得3816个周期。可能与它有关吗?

1 个答案:

答案 0 :(得分:0)

更新:我发布了一个新的PyEphem 3.7.5.2,修复了这个角度与自身比较的特殊情况。

您的代码示例有两个有趣的功能: 首先,它包含一个我认为可能在问题背后的小错误; 第二,我错了你的代码是问题,因为你的代码 确实暴露了separation()函数中的缺陷 当被问到一个职位离自己多远时!

您自己的代码中的错误是调用compute()并询问.ra.dec 返回那个坐标系中的坐标 调用compute() - 所以你的两个compute()调用正在返回坐标 在两个不同的坐标系中,这些坐标系略有不同, 因此,结果位置无法与separation()进行有意义的比较 因为separation()需要两个位于同一坐标系中的坐标。

要解决此问题,请选择一个now时刻作为您的昼夜平分点时刻:

now = ephem.now()
...
check.compute(epoch=now)
...
first.compute(epoch=now)

这将为您提供可以进行有意义比较的坐标。

现在,关于PyEphem本身的问题!

当向separation()提供相同位置的两个副本时,它会继续并试图找到它们之间的距离,并最终进行相当于以下的计算:

acos(sin(angle) ** 2.0 + cos(angle) ** 2.0)

它应该提醒我们标准的欧几里德距离公式,但它周围有acos()而不是sqrt()。问题在于,虽然理论上parens内部的值应始终为1.0,但IEEE浮点数学内部的舍入并不总是产生总和为1.0的平方。相反,它有时会产生一个有点高或有点低的值。

当结果略低于1.0时,separation()将为坐标返回一个非常小的分隔,即使它们实际上是“相同的坐标”。

当结果稍微超过1.0时,separation()将在我的系统上返回非数字(nan) - 并且,我敢打赌,返回那么大的回报您看到的价值打印在您的身上 - 因为cos()根据定义不能返回大于1.0的数字,因此当被问及“什么角度返回时,没有答案acos()可以返回这个值大于一?“

我在GitHub中创建了一个错误报告,并将为下一版PyEphem修复此问题:

https://github.com/brandon-rhodes/pyephem/issues/31

与此同时,您的代码必须避免为实际位置相同的两个位置调用separation() - 您是否可以使用if语句,==之间进行两次ra比较}和dec检测此类情况,只使用值0.0代替分离?