# 精度与性能 [English](en/accuracy.md) | [README](../../README.md) 下表说明内置模型及已有样本的对照结果。样本最大误差不代表所有日期、地点的误差上限。与外部星历比较时,需要先统一时标、参考系、观测点高度和折射模型。 UTC、UT1 与 TT 的换算见[时标](timescale.md)。 ## 目录 - [太阳与行星](#太阳与行星) - [月球](#月球) - [Lite 轻量链路](#lite-轻量链路) - [精度校验参考](#精度校验参考) ## 太阳与行星 太阳和行星使用内置 VSOP87 解析项,当前表项覆盖 **J2000 前后约 4000 年**。下表列出相对完整 VSOP87 的截断误差量级: | 目标 | 黄经/黄纬 | 距离 | | --- | --- | --- | | 太阳/地球 | 约 `0.1"` | 约 `0.1 × 10^-6 AU` | | 水星、金星 | 约 `0.2"` | 约 `0.2 × 10^-6 AU` | | 火星 | 约 `0.5"` | 约 `1 × 10^-6 AU` | | 木星 | 约 `0.5"` | 约 `3 × 10^-6 AU` | | 土星 | 约 `0.5"` | 约 `5 × 10^-6 AU` | | 天王星 | 约 `1"` | 约 `20 × 10^-6 AU` | | 海王星 | 约 `1"` | 约 `40 × 10^-6 AU` | 这类精度适合常规天文历法、观测辅助、科普展示和个人研究;航天导航、精确掩星预报和严格动力学积分不在该范围内,这类用途通常需要 JPL DE 等专业星历。 ## 月球 月球使用内置的 ELP2000/82 风格截断解析级数,库体积轻,不需要外部星历文件。它适合农历定朔、月相、升落、月食、业余月掩预报和常规位置计算;极高精度月球测距、长期物理天平动和专业掩星超出该范围,这类用途以 JPL 星历或专门月球星历为准。 ## Lite 轻量链路 `lite/sun` 和 `lite/moon` 是独立于 `sun` / `moon` 的近似实现。不依赖 VSOP87 或主链的 ELP2000/82 级数,适合 CPU / 内存受限环境。 - `lite/sun`:简化太阳真黄经 / 视黄经公式 + 轻量赤道坐标转换 - `lite/moon`:Schlyter 风格月球近似(约 15 个摄动项)+ 轻量站心修正 - 升落搜索:固定步长扫描 + 二分,不走主链的高精度章动迭代 - 计算链路零堆分配(0 allocs/op);相对主链,位置与月相等纯求值接口约快 `7.5–27.1x`,升落接口约 `0.9–3.5x` 能力边界: | 包 | 位置模型 | 升落搜索 | 主要用途 | | --- | --- | --- | --- | | `lite/sun` | 简化太阳真/视黄经 + 轻量赤道坐标转换 | `30` 分钟步长扫描 + 二分 | 日出日落、太阳高度角、表盘/前端周期刷新 | | `lite/moon` | Schlyter / vFPS 月球近似 + 轻量站心修正 | `15` 分钟步长扫描 + 二分 | 月出月落、月相、月龄、轻量月球观测辅助 | 与 `sun` / `moon` 包的误差(2026 全年,8 个站点;升落每 7 或 15 天取样,月相月龄每 6 小时): | 能力 | 平均绝对误差 | P95 | 最大绝对误差 | 备注 | | --- | --- | --- | --- |-----------------------------------| | `lite/sun` 日出 | `0.02 min` | `0.04 min` | `0.31 min` | 样本中无事件存在性分歧 | | `lite/sun` 日落 | `0.02 min` | `0.06 min` | `0.35 min` | `2` 个高纬样本在跨午夜日期归属上有语义差异 | | `lite/moon` 月出 | `0.28 min` | `0.57 min` | `1.44 min` | 样本中无事件存在性分歧 | | `lite/moon` 月落 | `0.36 min` | `0.86 min` | `1.24 min` | `1` 个高纬样本在“当天是否有月落”上与主链判断不同 | | `lite/moon` `Phase()` | `0.00089` | `0.00185` | `0.00243` | 与 `moon.Phase` 对比的结果 | | `lite/moon` `PhaseAge()` | `0.003 d` | `0.010 d` | `0.014 d` | 约平均 4.3 分钟、P95 14.4 分钟、最大 20.2 分钟 | | `lite/moon` 地心黄经 | `2.41'` | `6.82'` | `9.91'` | 相对主链月球位置 | | `lite/moon` 地心黄纬 | `0.87'` | `1.83'` | `2.92'` | 相对主链月球位置 | `Go testing.Benchmark` 参考值(单机测量,仅供比较;绝对值因机器而异): | 接口 | 主链 | `lite` | 加速倍数 | 主链分配 | `lite` 分配 | | --- | --- | --- | --- | --- | --- | | `Sun ApparentRaDec` | `6.031 µs/op` | `222.4 ns/op` | `27.1x` | `0 B/op, 0 allocs/op` | `0 B/op, 0 allocs/op` | | `Sun Altitude` | `6.127 µs/op` | `672.3 ns/op` | `9.1x` | `0 B/op, 0 allocs/op` | `0 B/op, 0 allocs/op` | | `Sun RiseTime` | `101.874 µs/op` | `29.168 µs/op` | `3.5x` | `0 B/op, 0 allocs/op` | `0 B/op, 0 allocs/op` | | `Moon ApparentRaDec` | `16.897 µs/op` | `1.070 µs/op` | `15.8x` | `0 B/op, 0 allocs/op` | `0 B/op, 0 allocs/op` | | `Moon Phase` | `15.441 µs/op` | `935.6 ns/op` | `16.5x` | `0 B/op, 0 allocs/op` | `0 B/op, 0 allocs/op` | | `Moon Altitude` | `9.714 µs/op` | `1.294 µs/op` | `7.5x` | `0 B/op, 0 allocs/op` | `0 B/op, 0 allocs/op` | | `Moon RiseTime` | `121.772 µs/op` | `132.312 µs/op` | `0.9x` | `0 B/op, 0 allocs/op` | `0 B/op, 0 allocs/op` | 主链与 `lite` 的差距随场景变化:位置、月相等纯求值接口约 `7.5–27.1x`;升落接口两边都要做时间搜索,差距缩小到 `0.9–3.5x`,其中 `Moon RiseTime` 接近持平。 日月食、物理天平动或高纬边界判定使用主链 `sun` / `moon`。 ## 精度校验参考 下面这些函数曾与 JPL Horizons、NASA GSFC 等资料对照,可作为使用时判断结果量级的参考: - 太阳/行星/月亮视直径:各天体与外部基线的最大差异从 `0.000002"` 到 `0.194598"` 不等,月亮因视差和距离变化更敏感 - 太阳物理星历 `P/B0/L0`:最大差异约 `0.003349° / 0.003986° / 0.047394°` - 行星升/中天/落:已用 JPL Horizons 升中落事件做对比校验;该基线按 1 分钟步长生成,当前结果与 Horizons 事件时间在分钟级上对齐 - 月出/月落:`aero=true` 按动态标准折射和实时月球视半径计算上缘过地平线。7 个地点、14 个海平面事件相对 JPL Horizons DE441 的平均/最大差异约 `0.30s / 0.75s` - 月出/月落的其他口径:相对固定 `-0.8333°` 的 MET Norway(Skyfield 1.53 + DE440s)约 `38.77s / 76.22s`;相对未公开地平线口径的 IMCCE Miriade 平均约 `2m13.46s`,`61°N` 低仰角样本最大约 `6m41.82s` - 地球近日点/远日点:时刻最大差异约 `1m28.84s`,距离最大差异约 `0.000000039837 AU` - 月球主链位置:当前算法为 ELP2000/82 风格截断解析级数;在 `-2000` 年四个 JPL/Horizons `JDTT` 样本上,相对 JPL/Horizons 的最大差异约为黄经 `219.6"`、黄纬 `25.8"`、距离 `34.3 km` - 月球近地点/远地点:时刻最大差异约 `15m53.45s`,距离最大差异约 `39.758 km` - 月球最大赤纬:时刻最大差异约 `2.43s`,赤纬最大差异约 `0.00006431°`