Python 为什么星象学中从地球坐标到银河系中心坐标的转换不能保持距离?

Python 为什么星象学中从地球坐标到银河系中心坐标的转换不能保持距离?,python,debugging,astropy,Python,Debugging,Astropy,我正在将GCRS对象转换为银河系中心坐标,并发现在这种转换下两点之间的距离并没有保持不变 导入astropy.units 导入astropy.com坐标 导入astropy.time 来自numpy.linalg进口规范 t=astropy.time.time('1999-01-01T00:00:00.123456789') def earth2galaxy(纬度): '''

我正在将
GCRS
对象转换为银河系中心坐标,并发现在这种转换下两点之间的距离并没有保持不变

导入astropy.units
导入astropy.com坐标
导入astropy.time
来自numpy.linalg进口规范
t=astropy.time.time('1999-01-01T00:00:00.123456789')
def earth2galaxy(纬度):
'''                                                                         
将地球坐标转换为银河系中心坐标。
'''
#获取GCRS坐标
地球=天文坐标。地球位置(纬度=纬度*天文单位度,
lon=0,
高度=0)
位置=接地。获取位置级别(obstime=t)
cartrep=astropy.坐标CartesianRepresentation(位置xyz,
单位=astropy.units.m)
gcrs=天文坐标gcrs(cartrep)
#将GCR转换为银河中心
gc=gcrs.transform_to(天文坐标系,银河系中心)
返回地球,gcrs,gc
earthA,gcrsA,gcA=earth2galaxy(0)
earthB,gcrsB,gcB=earth2galaxy(0.01)
打印(标准(earthA earthB))
打印(norm(gcrsA.cartesian.xyz gcrsB.cartesian.xyz))
打印(标准(gcA.cartesian.xyz gcB.cartesian.xyz))
该代码给出了

1105.74275693
1105.74275232
971.796949054
我发现,对于较大的距离(例如,10度的纬度偏移),这不是问题


我之前是通过——给定点
A
B
——转换点
A
C=A+C*AB
,其中
C
是一个很大的数字。然后,我将通过撤消此缩放来恢复转换后的
B'
。但是,我觉得我应该解决问题的实际根源,而不是这个解决方法。

这可能只是一个浮点精度问题。如果我看一下笛卡尔值,
x
y
z
对于GCRS框架是有序的
1e6
1e6
1e2
,但是对于银河系框架,它们分别是有序的
1e20
1e10
1e17

给定8字节浮点数(
numpy.finfo('f8').eps
)的
1e-15
),这意味着银河系坐标的
x
-值只能精确到大约
1e5
(米)。然后采用范数(以
x
值不确定性为主),也将导致
1e5
米的精度,远高于实际分离

计算值仍然彼此接近这一事实在很大程度上是幸运的(尽管这有一个潜在的原因,比如偏差在某种程度上是平均的)

这也符合这样一个事实,即对于较大的偏移量,您看不到问题(或问题较少)。虽然我自己测试了它,但我仍然看到了不同,顺序是
1e4
~
1e5
)。准确地说,使用0和10纬度,我得到:

GCRS:     1104451.74511518
Galactic: 1108541.8206286128

如果我的假设是正确的,那么我的建议很简单:对坐标使用适当的坐标系,并考虑相关的不确定性(机器精度和所用坐标系的精度)

这可能只是一个浮点精度问题。如果我看一下笛卡尔值,
x
y
z
对于GCRS框架是有序的
1e6
1e6
1e2
,但是对于银河系框架,它们分别是有序的
1e20
1e10
1e17

给定8字节浮点数(
numpy.finfo('f8').eps
)的
1e-15
),这意味着银河系坐标的
x
-值只能精确到大约
1e5
(米)。然后采用范数(以
x
值不确定性为主),也将导致
1e5
米的精度,远高于实际分离

计算值仍然彼此接近这一事实在很大程度上是幸运的(尽管这有一个潜在的原因,比如偏差在某种程度上是平均的)

这也符合这样一个事实,即对于较大的偏移量,您看不到问题(或问题较少)。虽然我自己测试了它,但我仍然看到了不同,顺序是
1e4
~
1e5
)。准确地说,使用0和10纬度,我得到:

GCRS:     1104451.74511518
Galactic: 1108541.8206286128
如果我的假设是正确的,那么我的建议很简单:对坐标使用适当的坐标系,并考虑相关的不确定性(机器精度和所用坐标系的精度)

我认为“0 0”主要是一针见血,但对于这种情况,有另一种解决方案:使用精度更高的float数据类型,例如
float128
dtype(您可以将其传递到
CartesianRepresentation
dtype
关键字),距离可能会更近

不幸的是,有一个bug似乎迫使数据类型返回到
float64
(我报告了:),但是如果这个bug被修复了,取决于你的计算机和它支持的精度,使用更高精度的数据类型可能会做到这一点。

我认为“0 0”主要是一针见血,但对于这种情况,还有一种替代解决方案:使用精度更高的浮点数据类型,例如
float128
dtype(您将其传递到
CartesianRepresentation
dtype
关键字),距离可能会更近

不幸的是,有一个bug似乎迫使数据类型返回到
float64
(我报告了:),但是如果这个bug被修复了,请依赖