← 回到目录
第 1 幕
第六页那把刀,砍得太慢了
第六页用二分法找过 x³ − x − 2 = 0 的根。它一定能找到——但很慢。
那一页的作业算过:要把误差从 0.5 压到 10⁻⁶,得砍 19 刀。
因为每砍一刀,区间只减半:1 → 0.5 → 0.25 → …
慢的原因不难找:二分法只看了函数的一样东西——符号。
它知道"根在这段里",可对根更靠近哪一头一无所知。
你手上明明有一整条曲线的信息,它却只用了一个正负号。
顺带说清一件事:二分法凭什么一定管用。
靠的是第六页的零点定理——连续函数在两端异号,中间必有根。
它只要求"连续",一个字都不多。正因为要求低,它才那么稳;也正因为知道得少,它才那么慢。
第 2 幕
把曲线换成切线
曲线的零点解不出来。但切线是一条直线,直线的零点小学生都会解。
于是:在 x₀ 处作切线,拿切线与 x 轴的交点当作新的猜测:
一步:从 x₀ 顺着切线滑到 x 轴,落点就是 x₁
x₁ = x₀ − f(x₀) / f′(x₀)
公式一行就推得出来:切线是 y = f(x₀) + f′(x₀)(x − x₀),令 y = 0 解 x。
"用切线代替曲线"这句话,你已经听过三次了。
第七页:切线是割线的极限位置。
第十四页:微分就是用切线代替曲线,dy ≈ Δy。
这一页:解方程时,也用切线代替曲线。
同一个动作,第三次派上用场——而这次换来的是速度。
第 3 幕
看它扑向根
还是 x³ − x − 2 = 0,从 x₀ = 2 出发。拖动看每一步:
看误差那一列的规律
1.1e−1 → 9.0e−3 → 6.2e−5 → 2.9e−9
每一步的误差,大约是上一步误差的平方。
换句话说:正确的有效数字位数,每走一步就翻一倍。这叫二次收敛。
二分法那一列是每次减半,一步只多赚 0.3 位——两者根本不是一个量级。
二分法一步"多赚 0.3 位有效数字",这个 0.3 是哪来的?
来自 log₁₀ 2 ≈ 0.301。
每砍一刀误差除以 2,而"有效数字位数"看的是误差的数量级,也就是 −log₁₀(误差)——
误差除以 2,这个数就增加 log₁₀2 ≈ 0.301。
所以要多拿 6 位有效数字,二分法得砍 6/0.301 ≈ 20 刀——这正是第六页那个 19 的来历。
而牛顿法拿 6 位,从 1 位起算只要 3 步(1→2→4→8)。
第 4 幕
⚠️ 支点:牛顿法翻车的三种方式
二分法只要两端异号,就一定收敛。牛顿法没有这个保证——它快,但它会翻车。
四个开关,把三种典型翻车各看一遍:
三种翻车有一个共同点:切线把你带到了一个更糟的地方。
而二分法永远不会——因为它压根不看切线,只把区间对折。
牛顿法用的信息更多,所以更快;也正因为多用了信息,它才可能被那些信息误导。
⚠️ 教科书上的收敛条件,其实就是在排除这三种情形:
要求 f′ ≠ 0(排除第 ②)、f″ 不变号、初值离根足够近(排除第 ③④)。
那些条件不是凭空写的,每一条背后都站着一张翻车的图。
既然牛顿法可能翻车,工程上为什么还敢用?真实的数值库是怎么做的?
把两把刀合起来用。
先用二分法(或类似的稳妥办法)把根圈进一个足够小的区间——这一步有保证;
区间够小之后再切换到牛顿法冲刺——这一步够快。
这就是 Brent 法一类"混合算法"的思路,也是 SciPy、MATLAB 里默认求根器的做法。
工程上很少非要在"稳"和"快"之间二选一——通常是先用稳的把范围锁住,再用快的收尾。
第 5 幕
两把刀,摆在一起看
没有免费的快。
牛顿法的速度是拿两样东西换的:多交出一个条件(可导),外加放弃"一定成功"的保证。
这张表值得记住的不是哪一列更好,而是那个交换本身——
工程里几乎所有"更快的算法",都是这么换来的。
第 6 幕
它其实是泰勒公式砍到一次
为什么偏偏是二次收敛?把泰勒展开写出来,答案就在眼前:
- f(x) = f(x₀) + f′(x₀)(x−x₀) + ½f″(ξ)(x−x₀)²第十页的拉格朗日余项形式
- 牛顿法做的事:把二次项扔掉,令剩下的一次式等于 0解出来就是 x₁ = x₀ − f/f′
- 所以误差 ~ 被扔掉的那一项 ~ (x₀ − r)²扔掉的是二阶,误差就是平方级
"扔掉的是几阶",决定了这个方法有多快。
这句话你已经在三处见过:第四页(阶决定谁可以忽略)、第二十一页(微元法要求零头高阶)、
这一页(扔掉二阶,换来二次收敛)。
整个数值计算这门课,讲的就是"扔什么、扔掉之后错多少"。
牛顿法是"扔掉二阶项"。如果连一阶项也扔掉会怎样?如果保留二阶项又会怎样?
扔掉一阶项就什么都不剩了——方程变成 f(x₀) = 0,要么恰好成立、要么无解,迭代根本走不动。
保留二阶项就得解一个二次方程,收敛会更快(三次收敛),这叫哈雷法。
可它每步要多算一个 f″——快了一点,代价涨了一截。
实际上很少有人用:牛顿法的二次收敛已经够快,多算一阶导数常常不划算。又是那个交换:更快的方法,总要交更多东西出去。
顺手解释一个上古算法
求 √a 就是解 x² − a = 0。套牛顿公式:
x ← x − (x²−a)/(2x) = (x + a/x) / 2
这就是巴比伦人四千年前用的开方法——取猜测值和 a/x 的平均。
求 √2 从 1 出发:1 → 1.5 → 1.41667 → 1.414216 → 1.4142136,四步到八位有效数字。
你手机按下 √ 时,芯片里跑的就是它的近亲。
第 7 幕
这一章到此结束
回头看第三章做了什么:
这一章的名字叫「导数的应用」,而最后这一节最配得上这个名字:
它要解的方程没有公式解——五次以上的方程根本不存在求根公式(阿贝尔定理),
超越方程更不用说。
可我们照样能把根算到任意多位。靠的不是解出它,是一步步逼近它。
这也是整个微积分最本质的态度:算不出来的东西,用能算的东西一层层逼上去。
第 8 幕
整节话,就这三行
牛顿法 = 用切线代替曲线,解切线的零点:x ← x − f/f′
二次收敛:有效数字每步翻倍,因为扔掉的是二阶项
快是换来的:多要一个"可导",外加放弃"一定收敛"
工程上的常规做法:先用稳的把范围锁住,再用快的收尾。
今 天 的 任 务
八道,第 3、5、7 题是这一页的命门
凡是迭代题,把每一步的 x 和误差都列成表。这一节的全部意思都在那张表的第三列里。
- 推一遍 x₁ = x₀ − f(x₀)/f′(x₀)写出切线方程,令 y=0。三行
- 用牛顿法解 x² − 2 = 0,从 x₀ = 1 出发算 4 步先化简出迭代式 (x + 2/x)/2。答案见第 6 幕
- ⚠️ 接上题,把每一步的误差写出来(与 1.41421356 比),并说明它们之间是什么关系相邻两个误差是平方关系。这一列才是这道题的重点
- 用牛顿法解 x³ − x − 2 = 0,从 x₀ = 2 出发算 3 步对着第 3 幕的表核一遍
- ⚠️ 取 f(x) = x³ − 2x + 2,x₀ = 0,算两步看看发生了什么会回到 0。先动手算,再回头看第 4 幕第 ③ 个开关
- 为什么 f′(x₀) = 0 时牛顿法用不了?用图说,不要只说"分母为零"切线是水平的,它和 x 轴没有交点
- ⚠️ 二分法要把误差压到 10⁻⁶ 需要约 20 步,牛顿法只要 4 步。写清楚这个差距是怎么来的,以及牛顿法为此付出了什么答案要同时出现"二次收敛"和"不保证收敛"
- 设计一个求 ∛a 的迭代公式解 x³−a=0。答案 x ← (2x + a/x²)/3。用它算 ∛10 试试,从 x₀=2 起
第 3 题的那一列误差,请用科学计数法写(如 8.6e−3),别写成小数。
写成科学计数法,"每步指数翻倍"才会跳出来;写成 0.0086 你只会觉得"变小了"。
怎么记录,决定你能不能看见规律。
对完答案,每道错题旁只写一句:
我是迭代式推错、没注意 f′ 也要重算、把二分法和牛顿法的适用条件搞混,还是纯算错?