Astropy: frame dengan kecepatan dan representasi "satuan" gagal dikonversi ke kartesian

Dibuat pada 23 Des 2017  ·  3Komentar  ·  Sumber: astropy/astropy

Beberapa pengujian kasus sudut di #6944 mengungkapkan beberapa perilaku bermasalah untuk bingkai yang memiliki kecepatan di mana representasi sebenarnya adalah UnitSpherical . Ternyata ini benar. Kasus di bawah ini menggambarkan masalah:

Perhatikan juga bahwa jika #6944 digabungkan, ia memiliki beberapa tempat dengan solusi untuk bug ini. Jika bug ini diperbaiki, solusi tersebut harus dihapus (cari sub-paket coordinates untuk #7028 untuk menemukannya).

Ini bekerja:

>>> f = ICRS(1*u.deg, 2*u.deg)
>>> f.cartesian
<CartesianRepresentation (x, y, z) [dimensionless]
    ( 0.99923861,  0.01744177,  0.0348995)>

Tetapi kedua kasus ini tidak:

>>> f = ICRS(1*u.deg, 2*u.deg,
          pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr, radial_velocity=10*u.km/u.s)
>>> f.represent_as('cartesian', in_frame_units=True)
UnitConversionError: 'mas / (rad yr)' (frequency) and 'km / s' (speed) are not convertible
>>> f = ICRS(1*u.deg, 2*u.deg, 
                pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr)
>>> g = f.transform_to(GCRS)
>>> g.cartesian
UnitConversionError: '1 / s' (frequency) and 'km / s' (speed) are not convertible

Ini mungkin petunjuk berguna yang dalam kasus gagal kedua, f.cartesian tidak bekerja, tetapi sesuatu dalam transformasi ke GCRS adalah apa yang membuatnya mulai gagal. Mungkin saja ini adalah masalah yang agak berbeda, tetapi mereka cukup dekat sehingga mungkin harus diselesaikan bersama.

@adrn atau @mhvk , tahu apa yang terjadi di sini? Orang dapat berargumen bahwa setidaknya langkah transformasi di atas agak tidak jelas, tetapi seseorang masih dapat mengeluarkan representasi kartesius bahkan jika unitnya agak aneh ...

Bug coordinates

Semua 3 komentar

Hai @eteq ,

Saya mencoba untuk bekerja pada masalah ini. Tetapi dalam contoh kasus,


>>> f = ICRS(1*u.deg, 2*u.deg,
          pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr, radial_velocity=10*u.km/u.s)
>>> f.represent_as('cartesian', in_frame_units=True)

Contoh tidak memiliki distance di dalamnya, tetapi memiliki radial_velocity . Saya tidak mengerti apa artinya sebenarnya. Juga, Jika saya menempatkan beberapa jarak dalam bingkai, itu bekerja dengan sempurna!

Bisakah Anda membuat saya memahami masalah ini, saya semakin bingung.

@shreyasbapat Bisakah Anda mencoba melihat apakah https://github.com/astropy/astropy/pull/9064 memperbaiki masalah ini? (Sunting: tidak)

9086 mengingatkan saya tentang masalah ini. Untuk dua kasus:

Tidak ada jarak tetapi dengan RV

>>> f = ICRS(1*u.deg, 2*u.deg,
          pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr, radial_velocity=10*u.km/u.s)
>>> f.represent_as('cartesian', in_frame_units=True)
UnitConversionError: 'mas / (rad yr)' (frequency) and 'km / s' (speed) are not convertible

Saya pikir yang ini tidak dapat dipecahkan: tanpa jarak, seseorang tidak dapat mengubah gerakan yang tepat menjadi kecepatan spasial, atau kecepatan spasial menjadi kecepatan agular. Jadi, saya pikir untuk kasus ini, kita hanya perlu memastikan pesan kesalahannya lebih jelas (dipicu dengan memiliki RV tetapi tidak ada jarak).

RV diperkenalkan oleh transformasi koordinat

>>> f = ICRS(1*u.deg, 2*u.deg, 
                pm_dec=1*u.mas/u.yr, pm_ra_cosdec=2*u.mas/u.yr)
>>> g = f.transform_to(GCRS)
>>> repr(g)
# error
>>> g.data
<CartesianRepresentation (x, y, z) [dimensionless]
    (0.99923901, 0.01742676, 0.03489572)
 (has differentials w.r.t.: 's')>
g.data.differentials
<CartesianDifferential (d_x, d_y, d_z) in 1 / s
    (6.07736084e-13, -1.85772092e-11, -8.12625661e-12)>

Ini sedikit lebih halus. Tanpa gerakan yang tepat, g adalah UnitSpherical , yang masuk akal, dan ini juga seharusnya, jadi ada yang salah dengan transformasinya. Untuk kelengkapan, merepresentasikannya pada bola satuan berfungsi:

g.represent_as('unitspherical')                                                               
Out[24]: 
<UnitSphericalRepresentation (lon, lat) in rad
    (0.01743826, 0.0349028)
 (has differentials w.r.t.: 's')>

In [25]: g.represent_as('unitspherical').differentials['s']                                            
Out[25]: 
<UnitSphericalDifferential (d_lon, d_lat) in rad / s
    (-1.85963079e-11, -8.13120751e-12)>

Namun meskipun demikian, g.cartesian harus bekerja juga - di sini, masalahnya adalah bahwa frame memutuskan bagi pengguna unit apa yang masuk akal, bersikeras bahwa kecepatan kartesius dalam km/s (tentu saja, ini kembali untuk keluhan lama saya bahwa unit koordinat dalam representasi diputuskan untuk saya ...): https://github.com/astropy/astropy/blob/c3dc7b38303b3615945aa36a11ebf7bd31d5cc0a/astropy/coordinates/baseframe.py#L1744 -L1753

Satuannya sendiri didapat dari:

g.representation_info
{astropy.coordinates.representation.CartesianRepresentation: {'names': ['x',
   'y',
   'z'],
  'units': [None, None, None]},
 astropy.coordinates.representation.UnitSphericalRepresentation: {'names': ('ra',
   'dec'),
  'units': (Unit("deg"), Unit("deg"))},
 astropy.coordinates.representation.RadialRepresentation: {'names': ['distance'],
  'units': [None]},
 astropy.coordinates.representation.SphericalRepresentation: {'names': ('ra',
   'dec',
   'distance'),
  'units': (Unit("deg"), Unit("deg"), None)},
 astropy.coordinates.representation.PhysicsSphericalRepresentation: {'names': ['phi',
   'theta',
   'r'],
  'units': [Unit("deg"), Unit("deg"), None]},
 astropy.coordinates.representation.CylindricalRepresentation: {'names': ['rho',
   'phi',
   'z'],
  'units': [None, Unit("deg"), None]},
 astropy.coordinates.representation.CartesianDifferential: {'names': ('v_x',
   'v_y',
   'v_z'),
  'units': (Unit("km / s"), Unit("km / s"), Unit("km / s"))},
 astropy.coordinates.representation.UnitSphericalDifferential: {'names': ('pm_ra',
   'pm_dec'),
  'units': (Unit("mas / yr"), Unit("mas / yr"))},
 astropy.coordinates.representation.SphericalDifferential: {'names': ('pm_ra',
   'pm_dec',
   'radial_velocity'),
  'units': (Unit("mas / yr"), Unit("mas / yr"), Unit("km / s"))},
 astropy.coordinates.representation.UnitSphericalCosLatDifferential: {'names': ('pm_ra_cosdec',
   'pm_dec'),
  'units': (Unit("mas / yr"), Unit("mas / yr"))},
 astropy.coordinates.representation.SphericalCosLatDifferential: {'names': ('pm_ra_cosdec',
   'pm_dec',
   'radial_velocity'),
  'units': (Unit("mas / yr"), Unit("mas / yr"), Unit("km / s"))},
 astropy.coordinates.representation.RadialDifferential: {'names': ['d_distance'],
  'units': [None]},
 astropy.coordinates.representation.PhysicsSphericalDifferential: {'names': ['d_phi',
   'd_theta',
   'd_r'],
  'units': [None, None, None]},
 astropy.coordinates.representation.CylindricalDifferential: {'names': ['d_rho',
   'd_phi',
   'd_z'],
  'units': [None, None, None]}}

Orang melihat di sini bahwa CartesianDifferential adalah satu-satunya yang salah, karena ia memiliki unit pilihan yang disetel sama sekali.

Yang mungkin berarti bahwa perbaikan di #9086 baik-baik saja dengan sedikit modifikasi: seseorang harus mencoba pergi ke unit yang diminta tetapi tidak peduli jika itu gagal.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat