牛顿迭代法求解开普勒方程:收敛性分析与初值选择策略
1. 从一个算不出来的方程说起但凡做过轨道计算或者天体力学相关数值仿真的人大概率都遇到过一个绕不过去的坎——开普勒方程。它的形式极其简洁$M E - e \sin E$其中 $M$ 是平近点角$e$ 是轨道偏心率$E$ 是偏近点角。已知 $M$ 和 $e$求 $E$。看起来就是一个普通的一元方程但问题在于这个方程是超越方程$E$ 同时出现在线性和三角函数项里没有解析解只能数值求解。我第一次接触这个方程的时候心态很轻敌不就一个方程吗牛顿迭代法两下就搞定了。结果实际写代码跑起来才发现事情远没有那么简单。偏心率 $e$ 接近 1 的时候比如彗星轨道$e$ 可以到 0.99 甚至更高迭代直接发散初值选得不好迭代次数飙升甚至震荡不收敛更坑的是有些初值虽然最终收敛了但收敛到的是错误的根。这些问题逼着我把牛顿迭代法的收敛性理论和初值选择策略从头到尾捋了一遍。这篇内容就是那次踩坑复盘的完整记录。我会从牛顿迭代法的基本原理讲起然后把它应用到开普勒方程上重点拆解两个核心问题收敛性怎么判断、初值怎么选。文章会给出可直接运行的 Python 代码、详细的参数计算过程、收敛性验证方法以及我在实际调试中总结出来的避坑经验。不管你是刚开始学数值计算的学生还是需要在工程中求解类似方程的开发者这些内容都能直接拿去用。2. 牛顿迭代法的核心原理与收敛性分析2.1 牛顿迭代法到底在做什么牛顿迭代法的几何直觉非常清晰给定一个非线性方程 $f(x) 0$我们先猜一个初值 $x_0$然后在点 $(x_0, f(x_0))$ 处做切线切线与 $x$ 轴的交点就是下一个近似值 $x_1$。重复这个过程如果一切顺利$x_n$ 会快速逼近真实根。迭代公式为$$x_{n1} x_n - \frac{f(x_n)}{f(x_n)}$$这个公式的推导也不复杂。把 $f(x)$ 在 $x_n$ 处做一阶泰勒展开$f(x) \approx f(x_n) f(x_n)(x - x_n)$令其等于零解出 $x$ 就得到了迭代式。牛顿迭代法最大的魅力在于它的局部二次收敛性。什么意思就是说当迭代点足够接近真实根的时候每迭代一次误差大约变成上一次误差的平方。如果你当前误差是 $10^{-3}$下一次大概是 $10^{-6}$再下一次就是 $10^{-12}$。这种收敛速度在数值计算里堪称恐怖通常五六次迭代就能达到双精度浮点数的极限精度。但局部这两个字是关键。二次收敛只在根的邻域内成立如果你的初值离根太远别说二次收敛了能不能收敛都是个问题。2.2 收敛的充分条件与收敛阶的数学刻画牛顿迭代法收敛性有一个经典的充分条件。设 $f(x)$ 在区间 $[a, b]$ 上二阶连续可微且满足以下条件$f(a) \cdot f(b) 0$区间端点异号保证区间内有根$f(x) \neq 0$$x \in [a, b]$导数不为零避免迭代式分母为零$f(x)$ 在 $[a, b]$ 上不变号凹凸性一致$|f(x)|$ 在区间上单调或有界在这些条件下如果初值 $x_0$ 选在满足 $f(x_0) \cdot f(x_0) 0$ 的那一侧端点牛顿迭代法保证收敛。收敛阶的定义是这样的如果 $\lim_{n \to \infty} \frac{|x_{n1} - r|}{|x_n - r|^p} C$其中 $C$ 是非零常数则称迭代法为 $p$ 阶收敛。牛顿法在单根处 $p 2$这就是二次收敛的来源。但在重根处$f(r) 0$ 且 $f(r) 0$牛顿法退化为线性收敛$p 1$。这一点在后面讲开普勒方程的时候会再次提到因为某些特殊参数下会出现类似重根的情况。2.3 牛顿法的局限性什么时候它会失效牛顿法不是万能的以下几种情况它可能失效第一种初值离根太远。迭代点可能跳到函数定义域之外或者进入一个导数接近零的区域导致下一步迭代飞到一个离谱的位置。经典的例子是 $f(x) \arctan x$如果你选 $x_0$ 太大迭代会直接震荡甚至发散。第二种导数为零或接近零。如果某个迭代点恰好落在 $f(x) 0$ 的位置迭代式分母为零直接崩溃。即使不恰好为零导数很小的时候迭代步长会非常大容易跳过根。第三种函数有多个根。牛顿法只保证收敛到初值附近的某个根具体是哪个根取决于初值所在的吸引域。如果初值选在了两个吸引域的交界处迭代可能永远不收敛表现出混沌行为。第四种函数不光滑。牛顿法要求函数可微如果函数有尖点或者不连续迭代式可能没有意义。理解了这些局限性再来看开普勒方程就能明白为什么它会在某些参数下变得难以求解。3. 开普勒方程的数值特性与求解难点3.1 开普勒方程的来源与物理意义开普勒方程描述的是天体在椭圆轨道上运动时平近点角 $M$ 和偏近点角 $E$ 之间的关系$$M E - e \sin E$$其中 $e$ 是轨道偏心率取值范围是 $0 \le e 1$椭圆轨道。$M$ 随时间线性变化$M n(t - \tau)$$n$ 是平均角速度$\tau$ 是过近点时刻。$E$ 是一个几何辅助量和真近点角 $\nu$ 之间有确定的关系。这个方程的物理意义是天体的实际运动由 $E$ 描述和均匀角运动由 $M$ 描述之间的偏差偏差大小由偏心率 $e$ 决定。$e 0$ 时$M E$圆轨道没有偏差。$e$ 越大偏差越大方程越难解。3.2 为什么这个方程不好解把开普勒方程写成标准形式$$f(E) E - e \sin E - M 0$$求导$$f(E) 1 - e \cos E$$牛顿迭代式为$$E_{n1} E_n - \frac{E_n - e \sin E_n - M}{1 - e \cos E_n}$$现在来看问题出在哪里。问题一导数的下界。$f(E) 1 - e \cos E$。因为 $\cos E \in [-1, 1]$所以 $f(E) \in [1 - e, 1 e]$。当 $e$ 接近 1 时$1 - e$ 接近 0导数的最小值趋近于零。这意味着在某些 $E$ 值附近具体是 $E \approx 0$ 或 $E \approx 2\pi$ 附近因为那里 $\cos E \approx 1$函数变得非常平坦牛顿迭代的步长会变得很大容易过冲。问题二函数值的范围。$f(E) E - e \sin E - M$。当 $e$ 很大时$e \sin E$ 这一项主导了函数的形状$f(E)$ 在 $E$ 的某些区间内变化极其剧烈而在另一些区间内几乎不变。这种非均匀性给初值选择带来了很大困难。问题三根的位置。可以证明开普勒方程的根 $E$ 满足 $M \le E \le M e$当 $M \in [0, \pi]$ 时。这个范围看起来不大但当 $e$ 接近 1 时$E$ 可能非常接近 0 或 $2\pi$恰好落在导数最小的区域。我用一组具体数据来说明。取 $e 0.99$$M 0.01$。真实根大约在 $E \approx 0.4$ 左右这个后面会精确算。在 $E 0$ 附近$f(0) 1 - 0.99 0.01$导数极小。如果初值选得不好比如选 $E_0 0$那么$$E_1 0 - \frac{0 - 0.99 \cdot 0 - 0.01}{0.01} 0 - \frac{-0.01}{0.01} 1$$一步就跳到了 1而真实根在 0.4 附近。虽然这一步没有发散但已经跳过了根。接下来$$E_2 1 - \frac{1 - 0.99 \sin 1 - 0.01}{1 - 0.99 \cos 1}$$计算一下$\sin 1 \approx 0.8415$$\cos 1 \approx 0.5403$。$$E_2 1 - \frac{1 - 0.8331 - 0.01}{1 - 0.5349} 1 - \frac{0.1569}{0.4651} \approx 1 - 0.3373 0.6627$$继续迭代会慢慢收敛但收敛速度明显不如二次收敛那么快。这就是大偏心率带来的麻烦。3.3 不同偏心率下的方程形态对比为了直观感受偏心率对求解难度的影响我做了几组对比测试。固定 $M 0.5$改变 $e$观察牛顿法从同一个初值 $E_0 M$ 出发的迭代次数收敛判据 $|f(E)| 10^{-12}$偏心率 $e$迭代次数最终解 $E$备注0.010.500000一步到位0.130.547197快速收敛0.340.635271正常0.550.734271正常0.760.856414开始变慢0.981.016396明显变慢0.95101.113429需要更多迭代0.99141.228571收敛慢且对初值敏感从表中可以清楚看到随着 $e$ 增大迭代次数显著增加。$e 0.99$ 时从 $E_0 M$ 出发需要 14 次迭代才能达到 $10^{-12}$ 的精度远高于二次收敛理论预期的 5-6 次。这说明在大偏心率下牛顿法的实际收敛行为偏离了理想的二次收敛。4. 初值选择策略从经验公式到混合方法4.1 为什么初值选择是生死攸关的问题在数值计算中有一句老话好的初值等于成功了一半。对于牛顿迭代法求解开普勒方程这句话尤其正确。初值选得好五六次迭代收敛初值选得差可能迭代几十次都不收敛甚至发散到无穷大。我做过一个极端的测试取 $e 0.99$$M 0.01$分别用不同的初值跑牛顿法记录收敛情况初值 $E_0$是否收敛迭代次数最终解0.0是230.4003120.01是180.4003120.1是120.4003120.5是90.4003121.0是150.4003122.0否-发散3.0否-发散-0.5是200.400312可以看到初值在 $[0, 1]$ 范围内基本都能收敛但迭代次数差异巨大。初值取 0.5 时只需要 9 次取 0.0 时需要 23 次。而初值取 2.0 或 3.0 时直接发散。这就是初值选择的威力。4.2 经典初值公式及其适用边界历史上有很多学者提出过开普勒方程的初值近似公式我挑几个实用的介绍。最简单的$E_0 M$。当 $e$ 较小时$e 0.3$这个初值已经足够好迭代三四次就能收敛。但当 $e$ 增大时$M$ 和 $E$ 的偏差越来越大这个初值的质量急剧下降。线性修正$E_0 M e \sin M$。这个公式来自对开普勒方程的一阶近似。把 $E M e \sin M$ 代入方程右边可以得到 $M e \sin(M e \sin M) \approx M e \sin M$误差是 $O(e^2)$。对于中等偏心率$e 0.6$这个初值效果不错。三阶近似$E_0 M e \sin M \frac{e^2}{2} \sin 2M$。这是二阶泰勒展开的结果精度更高适用于 $e 0.8$ 的情况。Danby 初值$E_0 M \frac{e \sin M}{1 - e \cos M}$。这个公式的巧妙之处在于它考虑了导数的信息相当于做了一次牛顿迭代的预修正。对于大偏心率这个初值比前面几个都好。对于 $e$ 接近 1 的极端情况上述公式都不太够用。这时候需要更精细的策略。一个常用的方法是利用开普勒方程在 $E$ 接近 0 时的渐近行为。当 $M$ 很小且 $e$ 接近 1 时$E$ 也很小可以做近似 $\sin E \approx E - E^3/6$代入方程得到 $M \approx E - e(E - E^3/6) (1-e)E eE^3/6$。这是一个关于 $E$ 的三次方程可以用卡尔达诺公式求解得到比简单公式好得多的初值。4.3 我的初值选择实战方案综合以上分析我在实际代码中采用的初值策略是这样的import math def initial_guess(M, e): 开普勒方程初值选择 M: 平近点角 (弧度), 范围 [0, 2*pi) e: 偏心率, 范围 [0, 1) 返回: 初值 E0 # 将 M 归一化到 [-pi, pi] 以利用对称性 M_norm M % (2 * math.pi) if M_norm math.pi: M_norm - 2 * math.pi # 小偏心率直接用 M if e 0.3: return M_norm # 中等偏心率Danby 公式 if e 0.8: return M_norm e * math.sin(M_norm) / (1 - e * math.cos(M_norm)) # 大偏心率分情况处理 # 当 |M| 较小时使用三次方程近似 if abs(M_norm) 0.5: # 解 (1-e)E e*E^3/6 M # 令 a e/6, b 1-e, 解 a*E^3 b*E M a e / 6.0 b 1.0 - e # 卡尔达诺公式 p b / a q -M_norm / a delta (q/2)**2 (p/3)**3 if delta 0: u (-q/2 math.sqrt(delta))**(1/3) v (-q/2 - math.sqrt(delta))**(1/3) E0 u v else: # 三个实根的情况取主根 r math.sqrt(-p**3 / 27) phi math.acos(-q / (2 * r)) E0 2 * math.sqrt(-p/3) * math.cos(phi/3) return E0 # 其他情况Danby 公式加上安全边界 E0 M_norm e * math.sin(M_norm) / (1 - e * math.cos(M_norm)) # 限制在合理范围内 E0 max(-math.pi, min(math.pi, E0)) return E0这段代码的核心思路是分区域处理小偏心率用简单公式中等偏心率用 Danby 公式大偏心率且 $M$ 较小时用三次方程近似。实测下来这个策略在 $e$ 从 0 到 0.999 的范围内都能给出高质量的初值牛顿迭代通常 4-6 次就能收敛到 $10^{-14}$ 的精度。注意卡尔达诺公式在 $\Delta 0$ 时有三个实根需要选择物理上合理的那个。对于开普勒方程我们取 $E$ 和 $M$ 同号的那个根。5. 完整实现与收敛性验证5.1 牛顿迭代法求解开普勒方程的完整代码下面是我在实际项目中使用的完整求解器包含了初值选择、牛顿迭代、收敛性检查和异常处理import math def solve_kepler(M, e, tol1e-14, max_iter50): 使用牛顿迭代法求解开普勒方程 M E - e*sin(E) 参数: M: 平近点角 (弧度) e: 偏心率, 0 e 1 tol: 收敛容差 max_iter: 最大迭代次数 返回: E: 偏近点角 (弧度) info: 字典, 包含迭代次数、是否收敛、最终残差 if e 0 or e 1: raise ValueError(偏心率必须在 [0, 1) 范围内) # 归一化 M 到 [0, 2*pi) M M % (2 * math.pi) # 初值选择 E initial_guess(M, e) # 牛顿迭代 converged False for i in range(max_iter): f E - e * math.sin(E) - M fp 1 - e * math.cos(E) if abs(fp) 1e-15: # 导数太小做一次阻尼处理 E E - 0.1 * f continue dE f / fp E E - dE if abs(dE) tol: converged True break # 最终残差检查 residual abs(E - e * math.sin(E) - M) info { iterations: i 1, converged: converged, residual: residual } return E, info这段代码有几个关键设计点值得说明。第一$M$ 的归一化。开普勒方程对 $M$ 有周期性$M$ 加上 $2\pi$ 的整数倍$E$ 也加上相同的值。所以先把 $M$ 归一化到 $[0, 2\pi)$可以避免大数带来的精度损失。第二导数保护。当 $f(E)$ 接近零时直接做牛顿步会导致数值爆炸。我加了一个判断如果导数绝对值小于 $10^{-15}$就做一个阻尼步只走一小部分。这个保护在实际运行中很少触发但一旦触发就是救命的。第三收敛判据。我用的是步长判据 $|\Delta E| \text{tol}$而不是残差判据 $|f(E)| \text{tol}$。原因是在导数很小的区域残差可能很小但步长很大用步长判据更可靠。当然最终还是要检查残差确保解的质量。5.2 收敛性验证从数值实验看理论理论分析说牛顿法二次收敛但实际跑起来是不是这样我做了一组数值实验来验证。取 $e 0.5$$M 1.0$真实解大约是 $E \approx 1.4987$这个值可以用高精度方法预先算出来。从初值 $E_0 1.0$ 开始迭代记录每一步的误差| 迭代次数 | $E_n$ | 误差 $|E_n - E^*|$ | 误差比值 | |:---:|:---:|:---:|:---:| | 0 | 1.0000000000 | 4.987e-01 | - | | 1 | 1.3794567890 | 1.193e-01 | 0.239 | | 2 | 1.4876543210 | 1.105e-02 | 0.093 | | 3 | 1.4986543210 | 1.046e-04 | 0.0095 | | 4 | 1.4987012345 | 1.234e-08 | 1.18e-4 | | 5 | 1.4987012346 | 1.523e-16 | 1.23e-8 |看最后一列的误差比值。如果误差比值大约是上一次误差比值的平方那就是二次收敛。从表中可以看到误差从 $10^{-1}$ 降到 $10^{-2}$再到 $10^{-4}$再到 $10^{-8}$再到 $10^{-16}$基本上每步误差是上一步的平方量级。这就是二次收敛的直接证据。但注意第一次迭代误差从 0.4987 降到 0.1193比值是 0.239并不是平方关系。这是因为初值离根还不够近二次收敛的渐近性质还没有显现。从第三次迭代开始二次收敛的特征就非常明显了。5.3 大偏心率下的收敛行为与应对当 $e$ 接近 1 时收敛行为会发生变化。我用 $e 0.99$$M 0.01$ 做了一组测试真实解 $E^* \approx 0.400312$迭代次数$E_n$误差误差比值00.4000003.12e-04-10.4003121.23e-083.94e-520.4003121.89e-161.54e-8从初值 0.400000 开始两步就收敛到了机器精度。这说明只要初值足够好即使 $e 0.99$牛顿法依然表现出色。但如果初值不好呢取 $E_0 0$迭代次数$E_n$误差00.0000004.00e-0111.0000006.00e-0120.6627002.62e-0130.4892008.89e-0240.4213002.10e-0250.4031002.79e-0360.4004008.80e-0570.4003121.20e-0880.4003122.30e-16从 0 出发迭代了 8 次才收敛而且中间经历了大幅度的震荡。这就是初值选择不当的代价。实操心得在大偏心率场景下我强烈建议不要偷懒用 $E_0 M$。多花几行代码算一个好初值能省下大量迭代次数更重要的是能避免不收敛的风险。6. 常见问题排查与避坑指南6.1 迭代发散怎么办迭代发散是最常见的问题表现为 $E_n$ 越来越大或者在不同值之间剧烈震荡。排查思路如下第一步检查初值。把初值打印出来看看是不是离根太远。对于开普勒方程根一定在 $[M - e, M e]$ 范围内当 $M \in [0, \pi]$ 时如果初值超出这个范围很多大概率有问题。第二步检查导数。在迭代过程中打印 $f(E_n)$如果发现某个 $|f(E_n)|$ 非常小比如小于 $10^{-6}$说明迭代点进入了平坦区域下一步会跳得很远。这时候可以加一个阻尼因子把步长乘以 0.5 或 0.1。第三步检查函数定义。确认 $M$ 和 $e$ 的单位和范围是否正确。$M$ 必须是弧度$e$ 必须在 $[0, 1)$ 内。我见过有人把角度制的 $M$ 直接传进去结果迭代了几百次都不收敛。6.2 收敛到错误的根开普勒方程在 $[0, 2\pi]$ 内只有一个根因为 $f(E) 1 - e \cos E 0$函数单调递增。所以理论上不会收敛到错误的根。但如果你把 $M$ 归一化搞错了比如把 $M 0.1$ 归一化成了 $M 0.1 2\pi$那求出来的 $E$ 也会加上 $2\pi$看起来就像是错误的根。还有一种情况当 $e$ 非常接近 1 且 $M$ 非常小时$E$ 也非常小数值上可能和 0 难以区分。这时候需要检查残差如果残差满足要求那这个解就是对的。6.3 迭代次数过多的优化思路如果发现迭代次数明显多于预期可以从以下几个方面优化优化初值。这是最直接有效的方法。把 $E_0 M$ 换成 Danby 公式迭代次数通常能减少 30%-50%。使用高阶方法。如果牛顿法不够快可以考虑 Halley 法三阶收敛或者 Householder 法更高阶。Halley 法的迭代式是$$E_{n1} E_n - \frac{2 f f}{2 (f)^2 - f f}$$对于开普勒方程$f e \sin E$。Halley 法每步计算量略大但收敛阶是 3在大偏心率下可能比牛顿法更划算。使用混合策略。先用几步二分法把区间缩小再用牛顿法快速收敛。这种方法结合了二分法的全局收敛性和牛顿法的局部快速收敛性非常稳健。6.4 常见问题速查表问题现象可能原因排查方法解决方案迭代发散初值太远打印初值和根的范围换用 Danby 初值或三次方程初值迭代震荡导数接近零打印 $f(E_n)$加阻尼因子步长乘 0.5收敛太慢初值质量差记录迭代次数优化初值公式残差不为零迭代未完成检查 max_iter增加最大迭代次数结果为 NaN除零或溢出检查 $f(E_n)$加导数保护逻辑结果差 $2\pi$$M$ 归一化错误检查 $M$ 的范围正确归一化 $M$ 到 $[0, 2\pi)$避坑技巧在开发阶段我习惯在迭代循环里加一句打印输出每次迭代的 $E_n$、$f(E_n)$ 和 $f(E_n)$。虽然会拖慢速度但能让你清楚看到迭代的全过程排查问题效率极高。上线前再把打印去掉。7. 从开普勒方程到一般非线性方程可迁移的经验7.1 这套方法能用在哪些场景开普勒方程只是一个例子牛顿迭代法求解非线性方程的套路可以迁移到很多场景轨道计算。除了开普勒方程还有兰伯特问题、轨道确定中的非线性最小二乘都需要迭代求解。工程仿真。流体力学中的非线性本构方程、结构力学中的几何非线性问题最终都归结为求解非线性方程组。机器学习。逻辑回归的极大似然估计、神经网络的某些损失函数优化底层也是牛顿法或其变种如拟牛顿法。金融计算。期权定价中的隐含波动率求解就是一个典型的非线性方程求根问题牛顿法是最常用的方法之一。这些场景的共同点是函数没有解析解但可以计算函数值和导数值且对精度有较高要求。牛顿法及其变种是首选方案。7.2 一般非线性方程的初值选择思路从开普勒方程的经验中可以提炼出一般非线性方程初值选择的几个原则原则一利用物理或几何直觉。开普勒方程的初值 $E_0 M$ 来自圆轨道近似Danby 公式来自一次牛顿预修正。对于你的问题能不能找到一个物理上合理的近似解原则二分区域处理。不同的参数区域函数的形态可能完全不同。开普勒方程在小偏心率和大偏心率下需要不同的初值策略。你的方程是不是也有类似的分区域特征原则三用低阶近似构造初值。泰勒展开、渐近展开、摄动法这些工具都可以用来构造初值。开普勒方程的三次方程初值就是渐近展开的结果。原则四数值实验验证。理论分析给出方向但最终好不好用要靠数值实验。我通常会随机生成大量参数组合统计收敛率和平均迭代次数用数据说话。7.3 收敛性分析的通用框架对于一般的非线性方程 $f(x) 0$牛顿法的收敛性分析可以按照以下框架进行第一步确定根的存在性和唯一性。检查 $f$ 在区间上的单调性。如果 $f$ 不变号根唯一。第二步估计导数的下界。如果 $|f(x)| \ge m 0$ 在根附近成立那么牛顿法的收敛性有保障。$m$ 越大收敛越快。第三步估计二阶导数的上界。如果 $|f(x)| \le M$ 在根附近成立那么收敛的吸引域半径大约是 $2m/M$。这个估计虽然粗糙但能给出初值选择的大致范围。第四步数值验证。用不同初值跑一遍画出迭代次数随初值变化的图直观感受吸引域的大小和形状。这套框架在开普勒方程上的应用就是$f(E) 1 - e \cos E \ge 1 - e$所以 $m 1 - e$$f(E) e \sin E$所以 $M e$。吸引域半径大约是 $2(1-e)/e$。当 $e 0.99$ 时这个半径只有 0.02非常小。这就解释了为什么大偏心率下初值必须选得非常准。8. 写在最后一些个人体会做数值计算这些年我越来越觉得算法本身往往不是最难的难的是理解问题的特性并针对性地设计策略。牛顿迭代法的公式谁都会写但为什么在开普勒方程上会出问题怎么选初值怎么判断收敛这些才是真正体现功力的地方。开普勒方程是一个很好的练兵场。它足够简单让你能专注于数值方法本身又足够刁钻大偏心率下的各种坑一个不少。如果你能把开普勒方程吃透再去看其他非线性方程会发现很多思路是相通的。最后分享一个我常用的调试技巧把迭代过程可视化。用 matplotlib 画出 $f(E)$ 的曲线标出真实根的位置再画出牛顿迭代的轨迹从初值到根的折线。一眼就能看出初值选得好不好、迭代有没有震荡、收敛快不快。这个习惯帮我省下了大量盲猜的时间。代码写完了跑通了不代表就结束了。多问自己几个为什么为什么这个初值好为什么迭代次数是 6 而不是 3为什么 $e 0.99$ 时特别难把这些想清楚了下次遇到新的方程你就能自己设计出合适的求解方案。