package basic import "math" var defDeltaTFn = DefaultDeltaTv2 func DeltaT(date float64, isJDE bool) float64 { return defDeltaTFn(date, isJDE) } func SetDeltaTFn(fn func(float64, bool) float64) { if fn != nil { defDeltaTFn = fn } } func GetDeltaTFn() func(float64, bool) float64 { return defDeltaTFn } func DefaultDeltaTv2(date float64, isJd bool) float64 { //传入年或儒略日,传出为秒 if !isJd { date = JDECalc(int(date), int((date-math.Floor(date))*12)+1, (date-math.Floor(date))*365.25+1) } return DeltaTv2(date) } // 使用Stephenson等人(2016)和Morrison等人(2021)的拟合和外推公式计算Delta T // http://astro.ukho.gov.uk/nao/lvm/ // 2010年后的系数已修改以包含2019年后的数据 // 返回Delta T,单位为秒 func DeltaTSplineY(y float64) float64 { // 积分lod(平均太阳日偏离86400秒的偏差)方程: // 来自 http://astro.ukho.gov.uk/nao/lvm/: // lod = 1.72 t − 3.5 sin(2*pi*(t+0.75)/14) 单位ms/day,其中 t = (y - 1825)/100 // 是从1825年开始的世纪数 // 使用 1ms = 1e-3s 和 1儒略年 = 365.25天, // lod = 6.2823e-3 * Delta y - 1.278375*sin(2*pi/14*(Delta y /100 + 0.75) 单位s/year // 其中 Delta y = y - 1825。积分该方程得到 // Integrate[lod, y] = 3.14115e-3*(Delta y)^2 + 894.8625/pi*cos(2*pi/14*(Delta y /100 + 0.75) // 单位为秒。积分常数设为0。 integratedLod := func(x float64) float64 { u := x - 1825 return 3.14115e-3*u*u + 284.8435805251424*math.Cos(0.4487989505128276*(0.01*u+0.75)) } if y < -720 { // 使用积分lod + 常数 const c = 1.007739546148514 return integratedLod(y) + c } if y > 2025 { // 使用积分lod + 常数 const c = -150.56787057979514 return integratedLod(y) + c } // 使用三次样条拟合 y0 := []float64{-720, -100, 400, 1000, 1150, 1300, 1500, 1600, 1650, 1720, 1800, 1810, 1820, 1830, 1840, 1850, 1855, 1860, 1865, 1870, 1875, 1880, 1885, 1890, 1895, 1900, 1905, 1910, 1915, 1920, 1925, 1930, 1935, 1940, 1945, 1950, 1953, 1956, 1959, 1962, 1965, 1968, 1971, 1974, 1977, 1980, 1983, 1986, 1989, 1992, 1995, 1998, 2001, 2004, 2007, 2010, 2013, 2016, 2019, 2022} y1 := []float64{-100, 400, 1000, 1150, 1300, 1500, 1600, 1650, 1720, 1800, 1810, 1820, 1830, 1840, 1850, 1855, 1860, 1865, 1870, 1875, 1880, 1885, 1890, 1895, 1900, 1905, 1910, 1915, 1920, 1925, 1930, 1935, 1940, 1945, 1950, 1953, 1956, 1959, 1962, 1965, 1968, 1971, 1974, 1977, 1980, 1983, 1986, 1989, 1992, 1995, 1998, 2001, 2004, 2007, 2010, 2013, 2016, 2019, 2022, 2025} a0 := []float64{20371.848, 11557.668, 6535.116, 1650.393, 1056.647, 681.149, 292.343, 109.127, 43.952, 12.068, 18.367, 15.678, 16.516, 10.804, 7.634, 9.338, 10.357, 9.04, 8.255, 2.371, -1.126, -3.21, -4.388, -3.884, -5.017, -1.977, 4.923, 11.142, 17.479, 21.617, 23.789, 24.418, 24.164, 24.426, 27.05, 28.932, 30.002, 30.76, 32.652, 33.621, 35.093, 37.956, 40.951, 44.244, 47.291, 50.361, 52.936, 54.984, 56.373, 58.453, 60.678, 62.898, 64.083, 64.553, 65.197, 66.061, 66.919, 68.130, 69.250, 69.296} a1 := []float64{-9999.586, -5822.27, -5671.519, -753.21, -459.628, -421.345, -192.841, -78.697, -68.089, 2.507, -3.481, 0.021, -2.157, -6.018, -0.416, 1.642, -0.486, -0.591, -3.456, -5.593, -2.314, -1.893, 0.101, -0.531, 0.134, 5.715, 6.828, 6.33, 5.518, 3.02, 1.333, 0.052, -0.419, 1.645, 2.499, 1.127, 0.737, 1.409, 1.577, 0.868, 2.275, 3.035, 3.157, 3.199, 3.069, 2.878, 2.354, 1.577, 1.648, 2.235, 2.324, 1.804, 0.674, 0.466, 0.804, 0.839, 1.005, 1.348, 0.594, -0.227} a2 := []float64{776.247, 1303.151, -298.291, 184.811, 108.771, 61.953, -6.572, 10.505, 38.333, 41.731, -1.126, 4.629, -6.806, 2.944, 2.658, 0.261, -2.389, 2.284, -5.148, 3.011, 0.269, 0.152, 1.842, -2.474, 3.138, 2.443, -1.329, 0.831, -1.643, -0.856, -0.831, -0.449, -0.022, 2.086, -1.232, 0.22, -0.61, 1.282, -1.115, 0.406, 1.002, -0.242, 0.364, -0.323, 0.193, -0.384, -0.14, -0.637, 0.708, -0.121, 0.21, -0.729, -0.402, 0.194, 0.144, -0.109, 0.275, 0.068, -0.822, 0.001} a3 := []float64{409.16, -503.433, 1085.087, -25.346, -24.641, -29.414, 16.197, 3.018, -2.127, -37.939, 1.918, -3.812, 3.25, -0.096, -0.539, -0.883, 1.558, -2.477, 2.72, -0.914, -0.039, 0.563, -1.438, 1.871, -0.232, -1.257, 0.72, -0.825, 0.262, 0.008, 0.127, 0.142, 0.702, -1.106, 0.614, -0.277, 0.631, -0.799, 0.507, 0.199, -0.414, 0.202, -0.229, 0.172, -0.192, 0.081, -0.165, 0.448, -0.276, 0.11, -0.313, 0.109, 0.199, -0.017, -0.084, 0.128, -0.069, -0.297, 0.274, 0.086} n := len(y0) var i int for i = n - 1; i >= 0; i-- { if y >= y0[i] { break } } t := (y - y0[i]) / (y1[i] - y0[i]) dT := a0[i] + t*(a1[i]+t*(a2[i]+t*a3[i])) return dT } func DeltaTv2(jd float64) float64 { if jd > 2461041.5 || jd < 2441317.5 { var y float64 if jd >= 2299160.5 { y = (jd-2451544.5)/365.2425 + 2000 } else { y = (jd+0.5)/365.25 - 4712 } return DeltaTSplineY(y) } // 闰秒JD值 jdLeaps := []float64{2457754.5, 2457204.5, 2456109.5, 2454832.5, 2453736.5, 2451179.5, 2450630.5, 2450083.5, 2449534.5, 2449169.5, 2448804.5, 2448257.5, 2447892.5, 2447161.5, 2446247.5, 2445516.5, 2445151.5, 2444786.5, 2444239.5, 2443874.5, 2443509.5, 2443144.5, 2442778.5, 2442413.5, 2442048.5, 2441683.5, 2441499.5, 2441133.5} n := len(jdLeaps) deltaTSeconds := 42.184 for i := 0; i < n; i++ { if jd > jdLeaps[i] { deltaTSeconds += float64(n - i - 1) break } } return deltaTSeconds } func TD2UT(jde float64, utToTD bool) float64 { // true 世界时转力学时CC,false 力学时转世界时VV deltaTSeconds := DeltaT(jde, true) if utToTD { return jde + deltaTSeconds/3600/24 } else { return jde - deltaTSeconds/3600/24 } }