Hello 天文

反复“改进答案”,为什么有时越算越离谱?

不是所有重复计算都能靠近答案;同一道题,改写方式和起点都会影响结果。

通用算法与数值计算

你反复修改一个猜测,希望误差越来越小。可书里的同一道五次方程,只换一下写法,就可能从稳定收敛变成不停跳动。把它们放在同一张图里,看“迭代”什么时候需要换工具。

打开互动课程 →

先猜一下

同一个方程只换一种等价改写,迭代会得到完全相同的收敛表现吗?

查看答案与解释

不一定 — 等价方程有相同的根,但更新规则的稳定性可能完全不同。

再把体验和科学连起来

先看“每次怎么改”

同一个方程可以改写成不同的更新规则。每条规则都要检查,而不是看到重复计算就相信它会收敛。

x新 = g(x旧)

看残差,不只看数字像不像

残差f(x)说明候选答案还差多少。收敛、步数用完和数值失控必须分开标注。

残差 |f(x)| 与步长容差

Newton用切线预测下一步

切线与横轴的交点给出新猜测。切线太平或起点不好时,这个预测也可能失败。

x新 = x旧 − f(x旧)/f′(x旧)

二分守住一个有根的区间

已知连续函数两端异号,每次把区间减半。它可能慢些,但每一步的误差界都清楚。

第n步区间宽度 = 原宽度 / 2ⁿ

把计算链展开

xₙ₊₁ = g(xₙ) xₙ₊₁ = xₙ − f(xₙ)/f′(xₙ) m = (a+b)/2 二分n轮后的宽度 = (b₀−a₀)/2ⁿ

分别对应固定点、牛顿与二分。牛顿法要求导数可用且不为零;二分需要连续函数的异号括区。步长小还应检查残差。

试一试

先看收敛例,再选发散和来回跳动的改写。Newton遇到坏起点也会失败;二分依靠的是连续且异号的包围区间。

动手看一遍 →

符号不用背

f(x)
希望变成零的函数
f′(x)
切线斜率,Newton法的分母
[a,b]
连续函数异号端点包围的区间
容差
允许的残差或区间宽度,不用浮点完全相等作唯一停止条件

算法、精度与适用范围

补第5章例5.b–5.d与Newton、二分和浮点停止条件。可比较x⁵+17x−8、x⁵+3x−8、x⁵−3x−8、s³+3s−0.9。固定点形式为(b−xᵖ)/a、实数奇次根(b−ax)^(1/p)、b/(x^(p−1)+a),同一方程的不同改写可能收敛、发散或形成二周期。Newton使用导数p x^(p−1)+a,导数近零停止;二分在已验证异号的连续多项式区间内工作。演示最多40步,绝对候选值超过1e8即停止并提示,不把截断叫做收敛;容差1e−10。旧硬件浮点尾数震荡只解释其原因,不伪造当前JavaScript引擎必然出现同样序列。曲线窗固定x∈[−3,3]、y∈[−40,40],窗外值用数字提示。

我的理解检查

两次显示的小数看起来一样,就一定应该停止吗?

还应检查容差与残差 — 显示舍入可能掩盖变化;算法必须有明确停止条件和迭代上限。

二分法只要两端异号就能保证中间有零点吗?

还要求函数在区间内连续 — 跨过tan的垂直渐近线也会异号,却没有那个零点。

Newton的导数接近零时,应该?

停止或改起点/方法 — 分母过小会造成巨大、不可靠的修正。

迭代不是“多算几次就行”。要选合适规则、检查残差,并在失败时明确停下来。

Jean Meeus · Astronomical Algorithms, 2nd ed. · 第 5 章

通用算法与数值计算 · 全部互动课程