--- title: 数值方法与误差 tags: numerical, error, iteration, conditioning, convergence summary: 当精确答案不存在时,一个算出来的数字会有什么行为,以及算错、不够精确、不稳定这三者的区别。 --- # 数值方法与误差 轨道工作中的大多数量没有闭式解。摄动场中椭圆轨道的周期、经历一段阻力历史后的近地点角、卫星进入某视锥锥面的时刻:这些量由一个必须**求解**而非求值的方程定义。数值求解用另一个问题替换了一个有答案的问题,而后者没有答案。 ## 定义 当一个数字被算出时,有三类不同的事情会出错,值得分开看待: - **截断误差**。方法通过提前终止、或用更简单的函数替代原函数,得到精确答案的近似。 - **舍入误差**。数字本身的表示是有限的。双目精度大约保存十五到十七位有效十进制数字;再往后的位是噪声。 - **不稳定**。输入的微小误差,或中间步骤的微小误差,会放大为答案的大误差。 前两类是有界且可估计的。第三类是问题本身的性质,无法从算术中估计,必须靠识别。 ## 数学含义 ### 迭代 不动点通过反复代入达到,$x$ 变为 `g(x)`。当根附近导数绝对值小于一时收敛: $$ \lvert g'(x) \rvert < 1 \quad \text{(收敛)}, \qquad \lvert g'(x) \rvert > 1 \quad \text{(发散)} $$ 开普勒方程 $M = E - e\sin E$ 对 $E$ 没有闭式解,用牛顿法求解: $$ E_{n+1} = E_n - \frac{E_n - e \sin E_n - M}{1 - e \cos E_n} $$ 当 `e` 不接近一时在根附近二次收敛。该迭代很快,其收敛率取决于偏心率;对接近抛物线的轨道分母趋近于零,需要改用其他形式。 二分法每步更慢但不会发散,因为它把一个已知包含根的区间减半。选哪一种取决于发散与代价哪一个更要紧。 ### 条件数 答案对输入扰动的敏感程度是**条件数**。对函数 $f$, $$ \kappa = \frac{\lvert f'(x) \rvert \, \lvert x \rvert}{\lvert f(x) \rvert} $$ 条件数大意味着小的输入误差变成大的输出误差,与方法无关。在奇点附近条件数发散:由半长轴与偏心率计算轨道半径是良态的,而由同样元素计算近地点时刻不是,因为分母中出现 $\sqrt{1 - e^2}$,当 `e` 趋近一时趋于零。问题病态而非算术病态,多给几位有效数字无济于事。 ### 步长带来的截断 定步长积分的全局误差与步长成正比,局部误差与步长平方成正比。因此步长减半只让答案改善两倍而非四倍,"干脆把步长减半"因此是换精度的昂贵做法。 对 $p$ 阶方法,全局误差按步长的 $p$ 次幂下降。四阶 Runge-Kutta 给出 $h^4$,因此常用:每步代价是四次函数求值,步长减半代价增至八倍,而误差减少十六倍。 ## 单位约定 - 容差相对于答案的量级,绝不用绝对值。半径 `7000` km 上的绝对容差 `1e-9` 远严于表示所能保存,迭代将无法终止。 - 用于相对容差的尺度应取该量自身的大小而非其单位,这样在千米与米之间切换不会改变答案。 ## 适用边界 收敛的方法未必准确。对开普勒方程用牛顿法,收敛到所提方程的根;若方程漏掉了某个摄动,解就是错误问题的根,而且会自信地收敛。 迭代也可能因判据过松而悄然停止。报告迭代次数而不只报告答案,能让调用方看出结果是否在预期步数内得到。 三类失效在实践中可分:舍入表现为可达精度的下限;截断表现为方法细化后缩小的误差;不稳定表现为会增大的误差。 ## 标准 - Newton,*De analysi per aequationes numero terminas infinitas*,1669 - Higham,*Accuracy and Stability of Numerical Algorithms*,第二版,2002 - Quarteroni、Sacco、Saleri,*Numerical Mathematics*,第二版,2007 ## 另见 - [[units-and-dimensions]]:这些数字的含义 - [[ephemeris-interpolation]]:采样表的误差 - [[higher-order-gravity]]:级数不收敛的模型