044f2f4381
- 新增半解析、旧模型、自定义与多源堆叠星历实例,提供 Context、Instance、SPK 读取及状态与视位置计算 - 统一太阳、月球和行星实例接口,扩展黄经穿越、留、相位、最近角距、偕日可见、任意高度升落、轨道节点及凌日等天象查询 - 完善日月食、月掩与凌日的月缘剖面、有限盘面接触、站心修正、局地可见性、全球路径和地图输出 - 新增 SVG、GeoJSON、KML 天象输出及凌日、月掩和月缘地形相关缓存与几何求解 - 新增恒星星表导入与查询,支持 CSV、Hipparcos、BSC5、Stellarium 等格式及名称、交叉标识、锥面检索和星等过滤 - 补充 IAU 2006、地球定向、折射消光、大气观测、轨道传播及半解析行星/月球数据支持 - 将默认未来民用时标切换为 TimeScaleLeapHour,更新 2027–2400 农历速查表、中文日期解析和时区边界处理 - 增加事件基线、跨模型回归、几何边界、月缘地形和输出契约测试,完善中英文手册、示例资源、NOTICE 与忽略规则
72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
package basic
|
|
|
|
import (
|
|
"math"
|
|
"testing"
|
|
)
|
|
|
|
func TestGetJQTime(t *testing.T) {
|
|
originalFunc := func(year, angle int) float64 {
|
|
const iterations = 1
|
|
|
|
var day int
|
|
if angle%2 == 0 {
|
|
day = 18
|
|
} else {
|
|
day = 3
|
|
}
|
|
|
|
month := 3.0
|
|
if angle%10 != 0 {
|
|
month += float64(angle+15) / 30.0
|
|
} else {
|
|
month += float64(angle) / 30.0
|
|
}
|
|
if month > 12 {
|
|
month -= 12
|
|
}
|
|
|
|
jd := JDCalc(year, int(month), float64(day))
|
|
if angle == 0 {
|
|
angle = 360
|
|
}
|
|
|
|
for i := 0; i < iterations; i++ {
|
|
for {
|
|
jd0 := jd
|
|
slope := (JQLospec(jd0+0.000005, float64(angle)) - JQLospec(jd0-0.000005, float64(angle))) / 0.00001
|
|
jd = jd0 - (JQLospec(jd0, float64(angle))-float64(angle))/slope
|
|
if math.Abs(jd-jd0) <= 0.00001 {
|
|
break
|
|
}
|
|
}
|
|
jd -= 0.001
|
|
}
|
|
jd += 0.001
|
|
return TT2UTC(jd)
|
|
}
|
|
|
|
testCases := []struct {
|
|
year int
|
|
angle int
|
|
}{
|
|
{1900, 0}, {1900, 15}, {1900, 30}, {1900, 45}, {1900, 90}, {1900, 180}, {1900, 270}, {1900, 360},
|
|
{1950, 0}, {1950, 30}, {1950, 90}, {1950, 180}, {1950, 270},
|
|
{2000, 0}, {2000, 15}, {2000, 45}, {2000, 90}, {2000, 360},
|
|
{2023, 0}, {2023, 30}, {2023, 90}, {2023, 180}, {2023, 270},
|
|
{2100, 0}, {2100, 15}, {2100, 30}, {2100, 45}, {2100, 90}, {2100, 180}, {2100, 270}, {2100, 360},
|
|
{2200, 0}, {2200, 30}, {2200, 90}, {2200, 180}, {2200, 270},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
originalResult := originalFunc(tc.year, tc.angle)
|
|
optimizedResult := GetJQTime(tc.year, tc.angle)
|
|
// 两种解法各自收敛到 1e-5 日,末步残差可达数十微秒;1e-8 日足以区分选错相邻年份的根。
|
|
diff := math.Abs(originalResult - optimizedResult)
|
|
if diff > 1e-8 {
|
|
t.Fatalf("GetJQTime mismatch: year=%d angle=%d original=%.15f optimized=%.15f diff=%.15f",
|
|
tc.year, tc.angle, originalResult, optimizedResult, diff)
|
|
}
|
|
}
|
|
}
|