我正在编写一个程序,它通过光度测定法浏览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个周期。可能与它有关吗?
答案 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
代替分离?