轨道积分里,Adams积分器是绕不开的工具。它属于多步法,每一步只算一次右函数,比RKF78那种单步法省太多算力。尤其在处理非线性微分方程时,效率差距能达到10倍以上。这篇直接拆代码,不讲虚的理论推导。
单步法像RK4、RKF78,每一步都得反复横跳。RKF78一次积分要算13次右函数f(x,y)。在轨道动力学里,这个函数通常包含摄动力、地球非球形引力、太阳光压,算一次就要几毫秒。
想象一下,积分一年的轨道,步长1秒,一年3100万秒。RKF78要算40亿次右函数。换成Adams多步法,每一步只算1次,直接砍掉90%的计算量。这就是为什么航天领域偏爱多步法。
Adams分两半:Bashforth预测公式和Moulton校正公式。
预测公式用前k步的导数,推出下一步的初值:
yn+1=yn+hi=0∑kpiy˙n−i
校正公式用预测出的yn+1算出新导数,再回头修正:yn+1=yn+hi=0∑kqiy˙n−i+1
这就是PECE(Predict-Evaluate-Correct-Evaluate)。实际工程里,一次校正就够了,迭代反而容易震荡。系数pi和qi是Adams的灵魂。代码里getCoef()函数干的就是这件事。它先算一组中间变量c和g,再通过组合数学生成最终系数。
void GAdams::getCoef()
{
double *c = new double[m_order];
double *g = new double[m_order];
c[0] = 1.0;
// 计算c数组
for( int n = 1 ; n < m_order; n++ )
{
double s = 0.0;
for( int i = 0 ; i <= n-1; i++)
{
s += c[i] / (n + 1 - i);
}
c[n] = -s;
}
// 计算g数组(c的累加和)
for( int n = 0 ; n < m_order ; n++)
{
double s = 0.0;
for(int k = 0 ; k <= n; k++)
{
s += c[k];
}
g[n] = s;
}
// Bashforth系数 (预测)
for( int n = m_order-1 ; n >= 0 ; n-- )
{
int sign = -1;
for( int i = 0 ; i <= n; i++ )
{
sign *= -1;
m_bC[i] += sign * g[n] * GMath::nchoosek(n, i);
}
}
// Moulton系数 (校正)
for( int n = m_order-1 ; n >= 0 ; n-- )
{
int sign = -1;
for( int i = 0 ; i <= n; i++ )
{
sign *= -1;
m_mC[i] += sign * c[n] * GMath::nchoosek(n, i);
}
}
delete[] c;
delete[] g;
}
这段逻辑看着绕,其实就是在做多项式插值。组合数nchoosek用来处理差分表的权重。nchoosek函数很容易溢出。比如C10050,结果有29位数,早就超出了long long的范围。
代码里用了个巧妙的办法:取对数。
ln(Cnm)=ln(n!)−ln(m!)−ln((n−m)!)
把乘法变成加法,再用exp()还原。这样即使n=1000也不会爆。最后判断一下结果是否超过long的最大值,超了就保留浮点数,没超就转成整数。double GMath::nchoosek(int n, int m)
{
if (m > n / 2.0) m = n - m; // 对称性优化
double s1 = 0.0, s2 = 0.0;
for(int i = m + 1; i <= n; i++)
s1 += log((double)i);
for(int i = 2; i <= n - m; i++)
s2 += log((double)i);
return exp(s1 - s2);
}多步法有个麻烦:起步需要前k步的历史数据。第0步只有初始值,怎么办?
答案是用单步法起步。先用RKF78积前5步,把这5个点的状态量和导数存进缓冲区,再切到Adams。这就是混合积分器。
阶数选多少?轨道积分一般用8到12阶。阶数太低,截断误差大;阶数太高,数值不稳定,而且对舍入误差敏感。在2026年的硬件环境下,12阶是个甜点,兼顾精度和速度。

另外,步长h别乱变。Adams是定步长积分器,变步长需要重新插值历史数据,代码复杂度会飙升。如果系统变化剧烈,宁可缩小固定步长,也别轻易改算法。
这套代码在卫星轨道预报里跑了三年,误差控制在1公里以内。你现在用的是几阶Adams?有没有遇到过积分发散的情况?可以交流下。
武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks 等。