Почему преобразование координат Земли в галактоцентрические координаты в астропии не сохраняет расстояния? - PullRequest
1 голос
/ 14 июня 2019

Я конвертирую GCRS объекты в галактоцентрические координаты и нахожу, что расстояния между двумя точками не сохраняются при этом преобразовании.

import astropy.units
import astropy.coordinates
import astropy.time
from numpy.linalg import norm

t = astropy.time.Time('1999-01-01T00:00:00.123456789')

def earth2galaxy(lat):
    '''                                                                         
    Convert an Earth coordinate to a galactocentric coordinate.                 
    '''
    # get GCRS coordinates                                                      
    earth = astropy.coordinates.EarthLocation(lat=lat*astropy.units.deg,
                                            lon=0,
                                            height=0)
    pos, _ = earth.get_gcrs_posvel(obstime=t)
    cartrep = astropy.coordinates.CartesianRepresentation(pos.xyz,
                                                          unit=astropy.units.m)

    gcrs = astropy.coordinates.GCRS(cartrep)

    # convert GCRS to galactocentric                                            
    gc = gcrs.transform_to(astropy.coordinates.Galactocentric)

    return earth, gcrs, gc

earthA, gcrsA, gcA = earth2galaxy(0)
earthB, gcrsB, gcB = earth2galaxy(0.01)

print(norm(earthA-earthB))
print(norm(gcrsA.cartesian.xyz-gcrsB.cartesian.xyz))
print(norm(gcA.cartesian.xyz-gcB.cartesian.xyz))

Этот код дает

1105.74275693
1105.74275232
971.796949054

Я считаю, что это не проблема для больших расстояний (например, смещения широты в 10 с градусов).

Раньше я обходил это путем - учитывая точки A и B - точки преобразования A и C = A + c*AB, где c - некоторое большое число. Затем я восстановил бы преобразованный B', отменив это масштабирование B' = A' + A'C' / c. Однако мне кажется, что вместо этого обходного пути мне следует обратиться к фактическому корню проблемы.

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Это может быть просто проблема точности с плавающей запятой. Если я посмотрю на декартовы значения, x, y и z имеют порядок 1e6, 1e6 и 1e2 для кадра GCRS, но они имеют порядок 1e20, 1e10 и 1e17 соответственно для Галактической системы отсчета.

Учитывая точность 1e-15 для 8-байтовых чисел с плавающей запятой (numpy.finfo('f8').eps), это означает, что значение x координаты Галактики может быть точным только до 1e5 (метров). Тогда принятие нормы (с доминирующей неопределенностью x) также приведет к точности порядка 1e5 метров, что намного больше, чем фактическое разделение.

Тот факт, что вычисленные значения по-прежнему близки друг к другу, во многом является удачей (хотя у него будет основная причина, такая как отклонения, усредняющие несколько).

Это также согласуется с тем фактом, что вы не видите проблемы (или меньше проблемы) для больших смещений. Несмотря на то, что я тестировал его сам, я все еще вижу разницу порядка 1e4 ~ 1e5) Чтобы быть точным, используя 0 и 10 широту, я получаю:

GCRS:     1104451.74511518
Galactic: 1108541.8206286128

Если мои предположения верны, то мой совет прост: используйте подходящую систему координат для ваших координат и учитывайте соответствующие неопределенности (как точность станка, так и точность используемой системы координат).

1 голос
/ 19 июня 2019

Я думаю, что «0 0» в основном поражает гвоздь на голове, но для этого случая есть альтернативное решение: использовать тип float dtype, который имеет большую точность - например, float128 dtype (который вы передадите ключевому слову dtype CartesianRepresentation), вероятно, расстояние будет намного ближе.

К сожалению, есть ошибка, которая, кажется, заставляет dtypes возвращаться к float64 (о котором я сообщал: https://github.com/astropy/astropy/issues/8870),, но если это исправлено, в зависимости от вашего компьютера и поддерживаемой точности, используя более высокую точность dtype может сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...