astro/basic/nutation.go
starainrt 3ffdbe0034
feat: 扩展天文计算能力
- 新增日食、月食、本地可见性、中心线、半影区域、SVG 图示与沙罗周期信息
- 新增行星冲合、留、方照、物理星历、视直径、相位、亮肢角、轨道节点等计算
- 新增木星伽利略卫星位置、现象与接触事件计算
- 新增恒星星表、星座判定、自行修正与观测辅助能力
- 新增 coord、formula、orbit、sundial、lite/sun、lite/moon 等扩展包
- 完善农历年号、月相英文别名、视差角、大气质量、折射、日晷与双星计算
- 增加 NASA、JPL Horizons、IMCCE 等回归测试数据与基线测试
- 重构基础算法文件组织,补充大量公开 API 注释和语义回归测试
- 更新中文和英文 README,补充示例、精度说明、SVG 配图
2026-05-01 22:38:44 +08:00

703 lines
19 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package basic
import (
"math"
)
/*
黄赤交角、nutation==true时计算交角章动
*/
func EclipticObliquity(jde float64, nutation bool) float64 {
eps := Obliquity1980(jde)
if nutation {
eps += Nutation2000Bs(jde)
}
return eps
}
func TrueObliquity(JD float64) float64 {
return EclipticObliquity(JD, true)
}
// 黄经章动 1980
func Nutation1980i(jd float64) float64 { // '黄经章动
res, _ := Nutation1980(jd)
return res
}
// 交角章动1980
func Nutation1980s(jd float64) float64 { //交角章动
_, res := Nutation1980(jd)
return res
}
// 黄经章动 2000B
func Nutation2000Bi(jd float64) float64 { // '黄经章动
res, _ := Nutation2000B(jd)
return res
}
// 交角章动2000B
func Nutation2000Bs(jd float64) float64 { //交角章动
_, res := Nutation2000B(jd)
return res
}
// 定义 IAU 1980 章动系数
var coefficientsNut1980 = [][9]float64{
{0, 0, 0, 0, 1, -171996.0, -174.2, 92025.0, 8.9},
{0, 0, 0, 0, 2, 2062.0, 0.2, -895.0, 0.5},
{-2, 0, 2, 0, 1, 46.0, 0.0, -24.0, 0.0},
{2, 0, -2, 0, 0, 11.0, 0.0, 0.0, 0.0},
{-2, 0, 2, 0, 2, -3.0, 0.0, 1.0, 0.0},
{1, -1, 0, -1, 0, -3.0, 0.0, 0.0, 0.0},
{0, -2, 2, -2, 1, -2.0, 0.0, 1.0, 0.0},
{2, 0, -2, 0, 1, 1.0, 0.0, 0.0, 0.0},
{0, 0, 2, -2, 2, -13187.0, -1.6, 5736.0, -3.1},
{0, 1, 0, 0, 0, 1426.0, -3.4, 54.0, -0.1},
{0, 1, 2, -2, 2, -517.0, 1.2, 224.0, -0.6},
{0, -1, 2, -2, 2, 217.0, -0.5, -95.0, 0.3},
{0, 0, 2, -2, 1, 129.0, 0.1, -70.0, 0.0},
{2, 0, 0, -2, 0, 48.0, 0.0, 1.0, 0.0},
{0, 0, 2, -2, 0, -22.0, 0.0, 0.0, 0.0},
{0, 2, 0, 0, 0, 17.0, -0.1, 0.0, 0.0},
{0, 1, 0, 0, 1, -15.0, 0.0, 9.0, 0.0},
{0, 2, 2, -2, 2, -16.0, 0.1, 7.0, 0.0},
{0, -1, 0, 0, 1, -12.0, 0.0, 6.0, 0.0},
{-2, 0, 0, 2, 1, -6.0, 0.0, 3.0, 0.0},
{0, -1, 2, -2, 1, -5.0, 0.0, 3.0, 0.0},
{2, 0, 0, -2, 1, 4.0, 0.0, -2.0, 0.0},
{0, 1, 2, -2, 1, 4.0, 0.0, -2.0, 0.0},
{1, 0, 0, -1, 0, -4.0, 0.0, 0.0, 0.0},
{2, 1, 0, -2, 0, 1.0, 0.0, 0.0, 0.0},
{0, 0, -2, 2, 1, 1.0, 0.0, 0.0, 0.0},
{0, 1, -2, 2, 0, -1.0, 0.0, 0.0, 0.0},
{0, 1, 0, 0, 2, 1.0, 0.0, 0.0, 0.0},
{-1, 0, 0, 1, 1, 1.0, 0.0, 0.0, 0.0},
{0, 1, 2, -2, 0, -1.0, 0.0, 0.0, 0.0},
{0, 0, 2, 0, 2, -2274.0, -0.2, 977.0, -0.5},
{1, 0, 0, 0, 0, 712.0, 0.1, -7.0, 0.0},
{0, 0, 2, 0, 1, -386.0, -0.4, 200.0, 0.0},
{1, 0, 2, 0, 2, -301.0, 0.0, 129.0, -0.1},
{1, 0, 0, -2, 0, -158.0, 0.0, -1.0, 0.0},
{-1, 0, 2, 0, 2, 123.0, 0.0, -53.0, 0.0},
{0, 0, 0, 2, 0, 63.0, 0.0, -2.0, 0.0},
{1, 0, 0, 0, 1, 63.0, 0.1, -33.0, 0.0},
{-1, 0, 0, 0, 1, -58.0, -0.1, 32.0, 0.0},
{-1, 0, 2, 2, 2, -59.0, 0.0, 26.0, 0.0},
{1, 0, 2, 0, 1, -51.0, 0.0, 27.0, 0.0},
{0, 0, 2, 2, 2, -38.0, 0.0, 16.0, 0.0},
{2, 0, 0, 0, 0, 29.0, 0.0, -1.0, 0.0},
{1, 0, 2, -2, 2, 29.0, 0.0, -12.0, 0.0},
{2, 0, 2, 0, 2, -31.0, 0.0, 13.0, 0.0},
{0, 0, 2, 0, 0, 26.0, 0.0, -1.0, 0.0},
{-1, 0, 2, 0, 1, 21.0, 0.0, -10.0, 0.0},
{-1, 0, 0, 2, 1, 16.0, 0.0, -8.0, 0.0},
{1, 0, 0, -2, 1, -13.0, 0.0, 7.0, 0.0},
{-1, 0, 2, 2, 1, -10.0, 0.0, 5.0, 0.0},
{1, 1, 0, -2, 0, -7.0, 0.0, 0.0, 0.0},
{0, 1, 2, 0, 2, 7.0, 0.0, -3.0, 0.0},
{0, -1, 2, 0, 2, -7.0, 0.0, 3.0, 0.0},
{1, 0, 2, 2, 2, -8.0, 0.0, 3.0, 0.0},
{1, 0, 0, 2, 0, 6.0, 0.0, 0.0, 0.0},
{2, 0, 2, -2, 2, 6.0, 0.0, -3.0, 0.0},
{0, 0, 0, 2, 1, -6.0, 0.0, 3.0, 0.0},
{0, 0, 2, 2, 1, -7.0, 0.0, 3.0, 0.0},
{1, 0, 2, -2, 1, 6.0, 0.0, -3.0, 0.0},
{0, 0, 0, -2, 1, -5.0, 0.0, 3.0, 0.0},
{1, -1, 0, 0, 0, 5.0, 0.0, 0.0, 0.0},
{2, 0, 2, 0, 1, -5.0, 0.0, 3.0, 0.0},
{0, 1, 0, -2, 0, -4.0, 0.0, 0.0, 0.0},
{1, 0, -2, 0, 0, 4.0, 0.0, 0.0, 0.0},
{0, 0, 0, 1, 0, -4.0, 0.0, 0.0, 0.0},
{1, 1, 0, 0, 0, -3.0, 0.0, 0.0, 0.0},
{1, 0, 2, 0, 0, 3.0, 0.0, 0.0, 0.0},
{1, -1, 2, 0, 2, -3.0, 0.0, 1.0, 0.0},
{-1, -1, 2, 2, 2, -3.0, 0.0, 1.0, 0.0},
{-2, 0, 0, 0, 1, -2.0, 0.0, 1.0, 0.0},
{3, 0, 2, 0, 2, -3.0, 0.0, 1.0, 0.0},
{0, -1, 2, 2, 2, -3.0, 0.0, 1.0, 0.0},
{1, 1, 2, 0, 2, 2.0, 0.0, -1.0, 0.0},
{-1, 0, 2, -2, 1, -2.0, 0.0, 1.0, 0.0},
{2, 0, 0, 0, 1, 2.0, 0.0, -1.0, 0.0},
{1, 0, 0, 0, 2, -2.0, 0.0, 1.0, 0.0},
{3, 0, 0, 0, 0, 2.0, 0.0, 0.0, 0.0},
{0, 0, 2, 1, 2, 2.0, 0.0, -1.0, 0.0},
{-1, 0, 0, 0, 2, 1.0, 0.0, -1.0, 0.0},
{1, 0, 0, -4, 0, -1.0, 0.0, 0.0, 0.0},
{-2, 0, 2, 2, 2, 1.0, 0.0, -1.0, 0.0},
{-1, 0, 2, 4, 2, -2.0, 0.0, 1.0, 0.0},
{2, 0, 0, -4, 0, -1.0, 0.0, 0.0, 0.0},
{1, 1, 2, -2, 2, 1.0, 0.0, -1.0, 0.0},
{1, 0, 2, 2, 1, -1.0, 0.0, 1.0, 0.0},
{-2, 0, 2, 4, 2, -1.0, 0.0, 1.0, 0.0},
{-1, 0, 4, 0, 2, 1.0, 0.0, 0.0, 0.0},
{1, -1, 0, -2, 0, 1.0, 0.0, 0.0, 0.0},
{2, 0, 2, -2, 1, 1.0, 0.0, -1.0, 0.0},
{2, 0, 2, 2, 2, -1.0, 0.0, 0.0, 0.0},
{1, 0, 0, 2, 1, -1.0, 0.0, 0.0, 0.0},
{0, 0, 4, -2, 2, 1.0, 0.0, 0.0, 0.0},
{3, 0, 2, -2, 2, 1.0, 0.0, 0.0, 0.0},
{1, 0, 2, -2, 0, -1.0, 0.0, 0.0, 0.0},
{0, 1, 2, 0, 1, 1.0, 0.0, 0.0, 0.0},
{-1, -1, 0, 2, 1, 1.0, 0.0, 0.0, 0.0},
{0, 0, -2, 0, 1, -1.0, 0.0, 0.0, 0.0},
{0, 0, 2, -1, 2, -1.0, 0.0, 0.0, 0.0},
{0, 1, 0, 2, 0, -1.0, 0.0, 0.0, 0.0},
{1, 0, -2, -2, 0, -1.0, 0.0, 0.0, 0.0},
{0, -1, 2, 0, 1, -1.0, 0.0, 0.0, 0.0},
{1, 1, 0, -2, 1, -1.0, 0.0, 0.0, 0.0},
{1, 0, -2, 2, 0, -1.0, 0.0, 0.0, 0.0},
{2, 0, 0, 2, 0, 1.0, 0.0, 0.0, 0.0},
{0, 0, 2, 4, 2, -1.0, 0.0, 0.0, 0.0},
{0, 1, 0, 1, 0, 1.0, 0.0, 0.0, 0.0},
}
// fmod 函数实现浮点数取模
func fmod(f, m float64) float64 {
return f - m*math.Floor(f/m)
}
// frac 函数获取小数部分
func frac(f float64) float64 {
return f - math.Floor(f)
}
// Obliquity1980 计算黄赤交角,单位为度
// 公式 3.222-1
func Obliquity1980(jd float64) float64 {
T := (jd - 2451545.0) / 36525.0
as2r := ((1.0 / 3600.0) * math.Pi) / 180.0
eps := 84381.448 - 46.8150*T - 0.00059*T*T + 0.001813*T*T*T // 84381.448 = 23d26'21.448 转换为角秒
return math.Mod(eps*as2r, 2*math.Pi) * deg
}
// Nutation1980 计算 IAU 1980 章动模型
// 返回黄经章动 (dpsi) 和交角章动 (deps),单位为度
func Nutation1980(jd float64) (float64, float64) {
t := (jd - 2451545.0) / 36525.0
twoPI := 2 * math.Pi
as2r := ((1.0 / 3600.0) * math.Pi) / 180.0
// 表 3.222.2 - 计算章动参数
l := fmod((485866.733+(715922.633+(31.310+0.064*t)*t)*t)*as2r+frac(1325.0*t)*twoPI, twoPI)
lp := fmod((1287099.804+(1292581.224+(-0.577-0.012*t)*t)*t)*as2r+frac(99.0*t)*twoPI, twoPI)
F := fmod((335778.877+(295263.137+(-13.257+0.011*t)*t)*t)*as2r+frac(1342.0*t)*twoPI, twoPI)
D := fmod((1072261.307+(1105601.328+(-6.891+0.019*t)*t)*t)*as2r+frac(1236.0*t)*twoPI, twoPI)
O := fmod((450160.280+(-482890.539+(7.455+0.008*t)*t)*t)*as2r+frac(-5.0*t)*twoPI, twoPI)
deps := 0.0
dpsi := 0.0
// 公式 3.222-6 - 计算章动
for i := len(coefficientsNut1980) - 1; i >= 0; i-- {
sumargs := coefficientsNut1980[i][0]*l +
coefficientsNut1980[i][1]*lp +
coefficientsNut1980[i][2]*F +
coefficientsNut1980[i][3]*D +
coefficientsNut1980[i][4]*O
deps += math.Cos(sumargs) * (coefficientsNut1980[i][7] + coefficientsNut1980[i][8]*t)
dpsi += math.Sin(sumargs) * (coefficientsNut1980[i][5] + coefficientsNut1980[i][6]*t)
}
deps = (deps * as2r) / 10000.0
dpsi = (dpsi * as2r) / 10000.0
return dpsi * deg, deps * deg
}
// Nutation2000B 计算 IAU 2000B 章动模型
// 返回交角章动 (de) 和黄经章动 (dp),单位为度
func Nutation2000B(jd float64) (float64, float64) {
// 常量定义
as2r := 4.848136811095359935899141e-6 // 角秒到弧度的转换因子
twopi := 6.283185307179586476925287 // 2π
T := (jd - 2451545) / 36525
L := math.Mod(485868.249036+1717915923.2178*T, 1296000.0) * as2r
Lp := math.Mod(1287104.79305+129596581.0481*T, 1296000.0) * as2r
F := math.Mod(335779.526232+1739527262.8478*T, 1296000.0) * as2r
D := math.Mod(1072260.70369+1602961601.2090*T, 1296000.0) * as2r
Om := math.Mod(450160.398036-6962890.5431*T, 1296000.0) * as2r
dp := 0.0
de := 0.0
var arg, sinarg, cosarg float64
// 以下是 IAU 2000B 章动模型的各项计算
// 每行对应一个章动项
arg = math.Mod(L+Lp+2*F+-2*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 1290 * sinarg
de += -556 * cosarg
arg = math.Mod(-1*L+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 1405*sinarg + 4*cosarg
de += -610*cosarg + 2*sinarg
arg = math.Mod(-2*L+2*F+2*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 1383*sinarg + -2*cosarg
de += -594*cosarg + -2*sinarg
arg = math.Mod(L+2*F+2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -1331*sinarg + 8*cosarg
de += 663*cosarg + 4*sinarg
arg = math.Mod(-2*Lp+2*F+-2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -1283 * sinarg
de += 672 * cosarg
arg = math.Mod(-1*L+Lp+D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 1314 * sinarg
de += -700 * cosarg
arg = math.Mod(-1*L+2*F+4*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -1521*sinarg + 9*cosarg
de += 647*cosarg + 4*sinarg
arg = math.Mod(2*F+D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 1660*sinarg + -5*cosarg
de += -710*cosarg + -2*sinarg
arg = math.Mod(-1*L+D, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 4026*sinarg + -353*cosarg
de += -553*cosarg + -139*sinarg
arg = math.Mod(L+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -1981 * sinarg
de += 854 * cosarg
arg = math.Mod(-1*L+2*F+-2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -1987*sinarg + -6*cosarg
de += 1073*cosarg + -2*sinarg
arg = math.Mod(L+2*F, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 3339*sinarg + -13*cosarg
de += -107*cosarg + 1*sinarg
arg = math.Mod(L+Lp, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -3389*sinarg + 5*cosarg
de += 35*cosarg + -2*sinarg
arg = math.Mod(-1*L+Lp+D, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 3276*sinarg + 1*cosarg
de += -9 * cosarg
arg = math.Mod(2*L+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 2179*sinarg + -2*cosarg
de += -1129*cosarg + -2*sinarg
arg = math.Mod(L+Lp+2*F+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 2481*sinarg + -7*cosarg
de += -1062*cosarg + -3*sinarg
arg = math.Mod(-2*L+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -2294*sinarg + -10*cosarg
de += 1266*cosarg + -4*sinarg
arg = math.Mod(-1*Lp+2*F+2*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -2647*sinarg + 11*cosarg
de += 1129*cosarg + 5*sinarg
arg = math.Mod(-1*L+2*F, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -4056*sinarg + 5*cosarg
de += 40*cosarg + -2*sinarg
arg = math.Mod(-1*L+-1*Lp+2*F+2*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -2819*sinarg + 7*cosarg
de += 1207*cosarg + 3*sinarg
arg = math.Mod(D, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -4230*sinarg + 5*cosarg
de += -20*cosarg + -2*sinarg
arg = math.Mod(L+-1*Lp+2*F+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -2878*sinarg + 8*cosarg
de += 1232*cosarg + 4*sinarg
arg = math.Mod(-1*Lp+2*D, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 4348*sinarg + -10*cosarg
de += -81*cosarg + 2*sinarg
arg = math.Mod(3*L+2*F+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -2904*sinarg + 15*cosarg
de += 1233*cosarg + 7*sinarg
arg = math.Mod(-2*L+2*F+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -3075*sinarg + -2*cosarg
de += 1313*cosarg + -1*sinarg
arg = math.Mod(L+-1*Lp, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 4725*sinarg + -6*cosarg
de += -41*cosarg + 3*sinarg
arg = math.Mod(Lp+2*F+-2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 3579*sinarg + 5*cosarg
de += -1900*cosarg + 1*sinarg
arg = math.Mod(L+2*D, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 6579*sinarg + -24*cosarg
de += -199*cosarg + 2*sinarg
arg = math.Mod(2*L+-2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 4065*sinarg + 6*cosarg
de += -2206*cosarg + 1*sinarg
arg = math.Mod(-1*L+-1*Lp+2*D, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 7350*sinarg + -8*cosarg
de += -51*cosarg + 4*sinarg
arg = math.Mod(-2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-4940+-11*T)*sinarg + -21*cosarg
de += 2720*cosarg + -9*sinarg
arg = math.Mod(-1*Lp+2*F+-2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-4752+-11*T)*sinarg + -3*cosarg
de += 2719*cosarg + -3*sinarg
arg = math.Mod(2*L+2*F+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -5350*sinarg + 21*cosarg
de += 2695*cosarg + 12*sinarg
arg = math.Mod(-2*L+2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-5774+-11*T)*sinarg + -15*cosarg
de += 3041*cosarg + -5*sinarg
arg = math.Mod(2*L+2*F+-2*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 6443*sinarg + -7*cosarg
de += -2768*cosarg + -4*sinarg
arg = math.Mod(L+2*F+-2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (5800+10*T)*sinarg + 2*cosarg
de += -3045*cosarg + -1*sinarg
arg = math.Mod(2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-6302+-11*T)*sinarg + 2*cosarg
de += 3272*cosarg + 4*sinarg
arg = math.Mod(-1*Lp+2*F+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-7141+21*T)*sinarg + 8*cosarg
de += 3070*cosarg + 4*sinarg
arg = math.Mod(2*F+2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-6637+-11*T)*sinarg + 25*cosarg
de += 3353*cosarg + 14*sinarg
arg = math.Mod(Lp+2*F+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (7566+-21*T)*sinarg + -11*cosarg
de += -3250*cosarg + -5*sinarg
arg = math.Mod(-2*L+2*F, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -11024*sinarg + -14*cosarg
de += 104*cosarg + 2*sinarg
arg = math.Mod(L+2*F+2*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -7691*sinarg + 44*cosarg
de += 3268*cosarg + 19*sinarg
arg = math.Mod(2*Lp, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (16707+-85*T)*sinarg + -10*cosarg
de += (168+-1*T)*cosarg + 10*sinarg
arg = math.Mod(-1*L+2*F+2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -10204*sinarg + 25*cosarg
de += 5222*cosarg + 15*sinarg
arg = math.Mod(-1*Lp+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-12654+11*T)*sinarg + 63*cosarg
de += 6415*cosarg + 26*sinarg
arg = math.Mod(L+-2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-12873+-10*T)*sinarg + -37*cosarg
de += 6953*cosarg + -14*sinarg
arg = math.Mod(-2*F+2*D, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 21783*sinarg + 13*cosarg
de += -167*cosarg + 13*sinarg
arg = math.Mod(2*Lp+2*F+-2*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-15794+72*T)*sinarg + -16*cosarg
de += (6850+-42*T)*cosarg + -5*sinarg
arg = math.Mod(-1*L+2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (15164+10*T)*sinarg + 11*cosarg
de += -8001*cosarg + -1*sinarg
arg = math.Mod(Lp+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-14053+-25*T)*sinarg + 79*cosarg
de += (8551+-2*T)*cosarg + -45*sinarg
arg = math.Mod(2*F, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 25887*sinarg + -66*cosarg
de += -550*cosarg + 11*sinarg
arg = math.Mod(2*L, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 29243*sinarg + -74*cosarg
de += -609*cosarg + 13*sinarg
arg = math.Mod(-1*L+2*F+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (20441+21*T)*sinarg + 10*cosarg
de += -10758*cosarg + -3*sinarg
arg = math.Mod(L+2*F+-2*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 28593*sinarg + -1*cosarg
de += (-12338+10*T)*cosarg + -3*sinarg
arg = math.Mod(2*L+2*F+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-31046+-1*T)*sinarg + 131*cosarg
de += (13238+-11*T)*cosarg + 59*sinarg
arg = math.Mod(-2*L+2*D, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += -47722*sinarg + -18*cosarg
de += 477*cosarg + -25*sinarg
arg = math.Mod(-2*Lp+2*F+-2*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += 32481 * sinarg
de += -13870 * cosarg
arg = math.Mod(2*F+2*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-38571+-1*T)*sinarg + 158*cosarg
de += (16452+-11*T)*cosarg + 68*sinarg
arg = math.Mod(2*D, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (63384+11*T)*sinarg + -150*cosarg
de += -1220*cosarg + 29*sinarg
arg = math.Mod(-2*L+2*F+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (45893+50*T)*sinarg + 31*cosarg
de += (-24236+-10*T)*cosarg + 20*sinarg
arg = math.Mod(L+2*F+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-51613+-42*T)*sinarg + 129*cosarg
de += 26366*cosarg + 78*sinarg
arg = math.Mod(-1*L+2*F+2*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-59641+-11*T)*sinarg + 149*cosarg
de += (25543+-11*T)*cosarg + 66*sinarg
arg = math.Mod(-1*L+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-57976+-63*T)*sinarg + -189*cosarg
de += 31429*cosarg + -75*sinarg
arg = math.Mod(L+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (63110+63*T)*sinarg + 27*cosarg
de += -33228*cosarg + -9*sinarg
arg = math.Mod(-1*L+2*D, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (156994+10*T)*sinarg + -168*cosarg
de += -1235*cosarg + 82*sinarg
arg = math.Mod(-1*L+2*F+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (123457+11*T)*sinarg + 19*cosarg
de += (-53311+32*T)*cosarg + -4*sinarg
arg = math.Mod(2*F+-2*D+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (128227+137*T)*sinarg + 181*cosarg
de += (-68982+-9*T)*cosarg + 39*sinarg
arg = math.Mod(-1*Lp+2*F+-2*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (215829+-494*T)*sinarg + 111*cosarg
de += (-95929+299*T)*cosarg + 132*sinarg
arg = math.Mod(L+2*F+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-301461+-36*T)*sinarg + 816*cosarg
de += (129025+-63*T)*cosarg + 367*sinarg
arg = math.Mod(2*F+Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-387298+-367*T)*sinarg + 380*cosarg
de += (200728+18*T)*cosarg + 318*sinarg
arg = math.Mod(L, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (711159+73*T)*sinarg + -872*cosarg
de += -6750*cosarg + 358*sinarg
arg = math.Mod(Lp+2*F+-2*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-516821+1226*T)*sinarg + -524*cosarg
de += (224386+-677*T)*cosarg + -174*sinarg
arg = math.Mod(Lp, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (1475877+-3633*T)*sinarg + 11817*cosarg
de += (73871+-184*T)*cosarg + -1924*sinarg
arg = math.Mod(2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (2074554+207*T)*sinarg + -698*cosarg
de += (-897492+470*T)*cosarg + -291*sinarg
arg = math.Mod(2*F+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-2276413+-234*T)*sinarg + 2796*cosarg
de += (978459+-485*T)*cosarg + 1374*sinarg
arg = math.Mod(2*F+-2*D+2*Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-13170906+-1675*T)*sinarg + -13696*cosarg
de += (5730336+-3015*T)*cosarg + -4587*sinarg
arg = math.Mod(Om, twopi)
sinarg = math.Sin(arg)
cosarg = math.Cos(arg)
dp += (-172064161+-174666*T)*sinarg + 33386*cosarg
de += (92052331+9086*T)*cosarg + 15377*sinarg
de *= as2r / 1e7
dp *= as2r / 1e7
// 行星章动修正
dp += -0.135 * (as2r / 1e3)
de += 0.388 * (as2r / 1e3)
return dp * deg, de * deg
}