求解非线性方程 f ( x ) = 0 f(x) = 0 f ( x ) = 0 是整个代数学最古老、最核心的问题之一。对于一次和二次方程,求根公式给出了优雅的封闭解析解。然而,代数求根的道路很快便遭遇了数学上的叹息之墙:著名的 Abel-Ruffini 定理宣告,五次及以上的普遍多项式方程不存在根式通解;而包含三角函数或指数的超越方程(如 cos x = x \cos x = x cos x = x 或 x 3 + 4 x 2 = 10 x^3 + 4x^2 = 10 x 3 + 4 x 2 = 10 ),在解析上更是无法直接反演。
当解析公式穷途末路,计算科学便接管了战场:我们转向迭代逼近 (Iterative Approximation) 。迭代法不再奢求一步到位的精确闭式解,而是从一个初始猜测 x 0 x_0 x 0 出发,构造一串在几何上向真解 x ∗ x^* x ∗ 稳步收敛的数值序列 x 0 , x 1 , x 2 , … x_0, x_1, x_2, \dots x 0 , x 1 , x 2 , … 。
本篇笔记深入探讨一维非线性方程求解的两大基石范式:
二分法 (Bisection Method) :实数轴上的“二分搜索”。它依托 Bolzano 介值定理,通过维护一个严格变号的区间套逐步逼近真解。它虽然每步只能稳定获得 1-bit(约 0.3 位十进制)精度,但具备永不发散的绝对可靠性。
不动点迭代 (Fixed-Point Iteration) :动力系统视角的范式转换。它将静态方程 f ( x ) = 0 f(x) = 0 f ( x ) = 0 转换为动态反馈系统 x n + 1 = g ( x n ) x_{n+1} = g(x_n) x n + 1 = g ( x n ) 。在 Banach 压缩映射定理的庇护下,迭代函数的局部斜率 ∣ g ′ ( x ∗ ) ∣ < 1 |g'(x^*)| < 1 ∣ g ′ ( x ∗ ) ∣ < 1 成为吸引子收敛的核心动力。
根、不动点与动力学转换
在深入分析收敛性之前,我们首先建立“函数的零点”与“迭代映射的不动点”之间的形式对应。
定义 根
若 f ( x ∗ ) = 0 f(x^*) = 0 f ( x ∗ ) = 0 ,就称 x ∗ x^* x ∗ 是 f f f 的根 或零点 。
定义 不动点
对函数 g : D → R g \colon D \to \mathbb{R} g : D → R ,若 x ∗ ∈ D x^* \in D x ∗ ∈ D 满足 g ( x ∗ ) = x ∗ g(x^*) = x^* g ( x ∗ ) = x ∗ ,就称 x ∗ x^* x ∗ 是 g g g 的不动点 。在几何上,不动点恰好是曲线 y = g ( x ) y = g(x) y = g ( x ) 与对角线 y = x y = x y = x 的交点。
定义 不动点迭代
给定初始点 x 0 ∈ D x_0 \in D x 0 ∈ D ,由迭代函数 g g g 生成的序列定义为
x n + 1 = g ( x n ) , n = 0 , 1 , 2 , … x_{n+1} = g(x_n), \qquad n = 0,1,2,\dots x n + 1 = g ( x n ) , n = 0 , 1 , 2 , … 只要每一步的函数求值均合法定义。
定义 序列收敛
x n → x ∗ x_n \to x^* x n → x ∗ 的数学含义是:对任意给定的误差容限 ε > 0 \varepsilon > 0 ε > 0 ,存在一个指标 N N N ,使得只要 n ≥ N n \ge N n ≥ N ,就有 ∣ x n − x ∗ ∣ < ε |x_n - x^*| < \varepsilon ∣ x n − x ∗ ∣ < ε 。平移后的序列具有完全相同的极限:x n → x ∗ x_n \to x^* x n → x ∗ 蕴含 x n + 1 → x ∗ x_{n+1} \to x^* x n + 1 → x ∗ 。
任何求根问题 f ( x ) = 0 f(x) = 0 f ( x ) = 0 都可以通过代数变换改写成无穷多种不动点形式 x = g ( x ) x = g(x) x = g ( x ) 。例如,引入任意非零常数 λ \lambda λ ,定义
g λ ( x ) = x − λ f ( x ) . g_\lambda(x) = x - \lambda f(x). g λ ( x ) = x − λ f ( x ) .
显然 f ( x ) = 0 f(x) = 0 f ( x ) = 0 当且仅当 g λ ( x ) = x g_\lambda(x) = x g λ ( x ) = x 。也就是说,f f f 的根与 g λ g_\lambda g λ 的不动点在集合上严格一致。然而,代数形式的等价仅仅是第一步:迭代动力系统 x n + 1 = g ( x n ) x_{n+1} = g(x_n) x n + 1 = g ( x n ) 究竟是收敛还是发散,完全取决于函数 g g g 的解析性质。
例 代数等价与动力学收敛的巨大鸿沟
考虑求解方程 f ( x ) = x 2 − 2 = 0 f(x) = x^2 - 2 = 0 f ( x ) = x 2 − 2 = 0 的正根 2 ≈ 1.4142 \sqrt{2} \approx 1.4142 2 ≈ 1.4142 。我们可以构造多种不动点形式:
x = x − 1 4 ( x 2 − 2 ) x = x - \tfrac{1}{4}(x^2 - 2) x = x − 4 1 ( x 2 − 2 )
x = 2 / x x = 2 / x x = 2/ x
x = 1 2 ( x + 2 / x ) x = \tfrac{1}{2}(x + 2/x) x = 2 1 ( x + 2/ x )
这三种形式的代数不动点完全相同。然而在数值迭代下:形式 2 在初值 x 0 = 1 x_0 = 1 x 0 = 1 下会陷入 1 → 2 → 1 → 2 … 1 \to 2 \to 1 \to 2 \dots 1 → 2 → 1 → 2 … 的无限振荡死循环;形式 1 以一阶线性速率缓慢逼近;而形式 3(即巴比伦/牛顿法)每迭代一步,有效精度位数就翻倍。
因此,将 f ( x ) = 0 f(x)=0 f ( x ) = 0 转化为 x = g ( x ) x=g(x) x = g ( x ) 并不是解法,而是一个需要经过压缩性证明来检验的算法设计。
两个存在性工具
定理 介值定理
若 f f f 在 [ a , b ] [a,b] [ a , b ] 上连续且 f ( a ) f ( b ) < 0 f(a)f(b) < 0 f ( a ) f ( b ) < 0 ,则存在 x ∗ ∈ ( a , b ) x^* \in (a,b) x ∗ ∈ ( a , b ) 使 f ( x ∗ ) = 0 f(x^*) = 0 f ( x ∗ ) = 0 。
证明
必要时把 f f f 换成 − f -f − f ,可设 f ( a ) < 0 < f ( b ) f(a)<0<f(b) f ( a ) < 0 < f ( b ) 。令 S = { x ∈ [ a , b ] : f ( x ) < 0 } S=\{x\in[a,b]:f(x)<0\} S = { x ∈ [ a , b ] : f ( x ) < 0 } 。由实数完备性,c = sup S c=\sup S c = sup S 存在;端点处的连续性保证 a < c < b a<c<b a < c < b 。若 f ( c ) < 0 f(c)<0 f ( c ) < 0 ,连续性给出比 c c c 更大且仍在 S S S 中的点,与上确界矛盾;若 f ( c ) > 0 f(c)>0 f ( c ) > 0 ,则 c c c 的整个小邻域都没有 S S S 中的点,与 S S S 中的点可从下方逼近上确界矛盾。因此 f ( c ) = 0 f(c)=0 f ( c ) = 0 。
变号保证存在,不保证唯一。反过来,f ( a ) f ( b ) > 0 f(a)f(b) > 0 f ( a ) f ( b ) > 0 也不能证明没有根:区间里可以穿过偶数次。
定理 中值定理
若 g g g 在 [ a , b ] [a,b] [ a , b ] 上连续、在 ( a , b ) (a,b) ( a , b ) 上可导,则对任意不同的 x , y ∈ [ a , b ] x,y \in [a,b] x , y ∈ [ a , b ] ,存在介于二者之间的 c c c ,使得
g ( x ) − g ( y ) = g ′ ( c ) ( x − y ) . g(x) - g(y) = g'(c)\,(x-y). g ( x ) − g ( y ) = g ′ ( c ) ( x − y ) .
证明
先设 x < y x<y x < y ,从函数中减去割线:
h ( t ) = g ( t ) − g ( x ) − g ( y ) − g ( x ) y − x ( t − x ) . h(t)=g(t)-g(x)-\frac{g(y)-g(x)}{y-x}(t-x). h ( t ) = g ( t ) − g ( x ) − y − x g ( y ) − g ( x ) ( t − x ) . 于是 h ( x ) = h ( y ) = 0 h(x)=h(y)=0 h ( x ) = h ( y ) = 0 。由已给出证明的 Rolle 定理 ,某个内点满足 h ′ ( c ) = 0 h'(c)=0 h ′ ( c ) = 0 ,代回即得公式。交换 x , y x,y x , y 就覆盖另一种顺序。
介值定理制造根或不动点。中值定理把导数界变成函数改变量的界。
Lipschitz 条件与压缩
定义 Lipschitz 条件
设 g : [ a , b ] → R g \colon [a,b] \to \mathbb{R} g : [ a , b ] → R 。若存在有限常数 L ∈ [ 0 , ∞ ) L \in [0,\infty) L ∈ [ 0 , ∞ ) ,使得对一切 x , y ∈ [ a , b ] x,y \in [a,b] x , y ∈ [ a , b ] 有 ∣ g ( x ) − g ( y ) ∣ ≤ L ∣ x − y ∣ |g(x)-g(y)| \le L |x-y| ∣ g ( x ) − g ( y ) ∣ ≤ L ∣ x − y ∣ ,就称 g g g 在 [ a , b ] [a,b] [ a , b ] 上是 Lipschitz 的。这样的 L L L 叫 Lipschitz 常数。并不要求 L < 1 L < 1 L < 1 。
定义 压缩条件
若 Lipschitz 不等式对某个落在 L ∈ [ 0 , 1 ) L \in [0,1) L ∈ [ 0 , 1 ) 里的常数成立,就称 g g g 是 [ a , b ] [a,b] [ a , b ] 上的压缩 。若还满足 g ( [ a , b ] ) ⊆ [ a , b ] g([a,b]) \subseteq [a,b] g ([ a , b ]) ⊆ [ a , b ] ,则 g g g 是 [ a , b ] [a,b] [ a , b ] 的压缩自映射 :压缩让点靠近,自映射让每一步迭代仍留在区间里。
本文用 L L L 同时表示 Lipschitz 常数,以及(当 L < 1 L < 1 L < 1 时)压缩因子。L = 0 L = 0 L = 0 时 g g g 是常数。有限的全局界 ∣ g ′ ( x ) ∣ ≤ L < ∞ |g'(x)| \le L < \infty ∣ g ′ ( x ) ∣ ≤ L < ∞ 证明 g g g 是 Lipschitz 的;只有当这个界可以取成 L < 1 L < 1 L < 1 时,才证明 g g g 是压缩。找到一个点使 ∣ g ′ ( x ) ∣ > 1 |g'(x)| > 1 ∣ g ′ ( x ) ∣ > 1 ,排除的是“用导数判别压缩”,并不能排除 Lipschitz 连续性。
命题 导数界给出 Lipschitz 估计
若 g g g 在 [ a , b ] [a,b] [ a , b ] 上连续、在 ( a , b ) (a,b) ( a , b ) 上可导,且存在有限 L ≥ 0 L \ge 0 L ≥ 0 使 ∣ g ′ ( s ) ∣ ≤ L |g'(s)| \le L ∣ g ′ ( s ) ∣ ≤ L 对一切 s ∈ ( a , b ) s \in (a,b) s ∈ ( a , b ) 成立,则对一切 x , y ∈ [ a , b ] x,y \in [a,b] x , y ∈ [ a , b ] 有 ∣ g ( x ) − g ( y ) ∣ ≤ L ∣ x − y ∣ |g(x)-g(y)| \le L |x-y| ∣ g ( x ) − g ( y ) ∣ ≤ L ∣ x − y ∣ 。从而 g g g 是 Lipschitz 的。若同一界还能取成 L < 1 L < 1 L < 1 ,则 g g g 是压缩。
证明
若 x = y x = y x = y ,结论显然。若 x ≠ y x \neq y x = y ,中值定理给出介于二者之间的 c c c ,使 g ( x ) − g ( y ) = g ′ ( c ) ( x − y ) g(x)-g(y) = g'(c)(x-y) g ( x ) − g ( y ) = g ′ ( c ) ( x − y ) 。取绝对值并用导数界,得到 ∣ g ( x ) − g ( y ) ∣ = ∣ g ′ ( c ) ∣ ∣ x − y ∣ ≤ L ∣ x − y ∣ |g(x)-g(y)| = |g'(c)|\,|x-y| \le L |x-y| ∣ g ( x ) − g ( y ) ∣ = ∣ g ′ ( c ) ∣ ∣ x − y ∣ ≤ L ∣ x − y ∣ 。
这个全局常数是整段区间上的界,一般不是单独那个数 ∣ g ′ ( x ∗ ) ∣ |g'(x^*)| ∣ g ′ ( x ∗ ) ∣ 。
二分法
设 f f f 在 [ a 0 , b 0 ] [a_0,b_0] [ a 0 , b 0 ] 上连续且 f ( a 0 ) f ( b 0 ) < 0 f(a_0)f(b_0) < 0 f ( a 0 ) f ( b 0 ) < 0 。由介值定理,初始括号里至少有一个根。对 k ≥ 1 k \ge 1 k ≥ 1 ,令中点 x k = ( a k − 1 + b k − 1 ) / 2 x_k = (a_{k-1}+b_{k-1})/2 x k = ( a k − 1 + b k − 1 ) /2 。若 f ( x k ) = 0 f(x_k) = 0 f ( x k ) = 0 ,停止。否则保留端点值仍然异号的那一半。
命题 括号不变式
在返回精确根之前,每一步二分都给出区间 I k = [ a k , b k ] I_k = [a_k,b_k] I k = [ a k , b k ] ,满足
f ( a k ) f ( b k ) < 0 , b k − a k = ( b 0 − a 0 ) / 2 k , f(a_k)f(b_k) < 0, \qquad b_k - a_k = (b_0-a_0)/2^k, f ( a k ) f ( b k ) < 0 , b k − a k = ( b 0 − a 0 ) / 2 k , 且 I k I_k I k 里至少有一个根。区间是套着的:I k ⊆ I k − 1 I_k \subseteq I_{k-1} I k ⊆ I k − 1 。
证明
I 0 I_0 I 0 由初始假设和介值定理成立。假定对 I k − 1 I_{k-1} I k − 1 成立。中点把它分成两个闭半区间。若中点不是根,则 f ( a k − 1 ) f ( x k ) f(a_{k-1})f(x_k) f ( a k − 1 ) f ( x k ) 与 f ( x k ) f ( b k − 1 ) f(x_k)f(b_{k-1}) f ( x k ) f ( b k − 1 ) 恰有一个为负。留下那一半,变号括号得以保持,因而至少含一个根。它是前一括号的子集,宽度减半。归纳给出套叠和宽度公式。
直观上,二分法反复寻找介值定理保证有根的区间,直到区间足够小。假设成立时一定收敛,只是慢。
算法 1 缓存端点值的二分法
Require: 连续函数 f f f ,端点 a < b a < b a < b ,容差 ε > 0 \varepsilon > 0 ε > 0 ,最大中点数 N max N_{\max} N m a x
1: 求值并缓存 f a = f ( a ) f_a = f(a) f a = f ( a ) 、f b = f ( b ) f_b = f(b) f b = f ( b )
2: if f a = 0 f_a = 0 f a = 0 then
4: end if
5: if f b = 0 f_b = 0 f b = 0 then
7: end if
8: if f a f b > 0 f_a f_b > 0 f a f b > 0 then
10: end if
11: for k ← 1 k \gets 1 k ← 1 to N max N_{\max} N m a x do
12: x ← ( a + b ) / 2 x \gets (a+b)/2 x ← ( a + b ) /2 ,只求一次 f x = f ( x ) f_x = f(x) f x = f ( x )
13: if f x = 0 f_x = 0 f x = 0 then
15: end if
16: if f a f x < 0 f_a f_x < 0 f a f x < 0 then
17: b ← x b \gets x b ← x ,f b ← f x f_b \gets f_x f b ← f x
18: else
19: a ← x a \gets x a ← x ,f a ← f x f_a \gets f_x f a ← f x
20: end if
21: if ( b − a ) / 2 < ε (b-a)/2 < \varepsilon ( b − a ) /2 < ε then
23: end if
24: end for
25: 报告已达最大迭代次数
两次初始端点求值之后,每圈只需一次新的函数求值。
定理 二分法的收敛与先验误差
设 f f f 在 [ a 0 , b 0 ] [a_0,b_0] [ a 0 , b 0 ] 上连续且 f ( a 0 ) f ( b 0 ) < 0 f(a_0)f(b_0) < 0 f ( a 0 ) f ( b 0 ) < 0 。套着的二分括号确定一个根 x ∗ x^* x ∗ 。若 x k x_k x k 是第 k k k 个中点,则
∣ x ∗ − x k ∣ ≤ ( 1 2 ) k ( b 0 − a 0 ) . |x^* - x_k| \le \Bigl(\frac{1}{2}\Bigr)^k (b_0 - a_0). ∣ x ∗ − x k ∣ ≤ ( 2 1 ) k ( b 0 − a 0 ) . 从而 x k → x ∗ x_k \to x^* x k → x ∗ 。
证明
由括号不变式,I k I_k I k 闭、非空、套叠,长度 ( b 0 − a 0 ) / 2 k → 0 (b_0-a_0)/2^k \to 0 ( b 0 − a 0 ) / 2 k → 0 。闭区间套原理给出同时属于每个 I k I_k I k 的唯一点 x ∗ x^* x ∗ 。对每个 k k k ,介值定理给出根 r k ∈ I k r_k \in I_k r k ∈ I k 。r k r_k r k 与 x ∗ x^* x ∗ 同在 I k I_k I k 里,故 ∣ r k − x ∗ ∣ ≤ b k − a k → 0 |r_k-x^*| \le b_k-a_k \to 0 ∣ r k − x ∗ ∣ ≤ b k − a k → 0 。于是 r k → x ∗ r_k \to x^* r k → x ∗ ,连续性给出 f ( x ∗ ) = 0 f(x^*) = 0 f ( x ∗ ) = 0 。
第 k k k 步开始时,这个根 x ∗ x^* x ∗ 和第 k k k 个中点 x k x_k x k 都在 I k − 1 I_{k-1} I k − 1 里。区间里任何一点离中点最远不超过半宽,所以
∣ x ∗ − x k ∣ ≤ b k − 1 − a k − 1 2 = b 0 − a 0 2 k . |x^* - x_k| \le \frac{b_{k-1}-a_{k-1}}{2} = \frac{b_0-a_0}{2^k}. ∣ x ∗ − x k ∣ ≤ 2 b k − 1 − a k − 1 = 2 k b 0 − a 0 . 右端趋于零,故 x k → x ∗ x_k \to x^* x k → x ∗ 。
这是先验 估计:只用初始宽度和步数,不必知道根,也不必对 f f f 求导。
命题 达到严格容差的充分中点数
给定 ε > 0 \varepsilon > 0 ε > 0 ,整数
K = ⌊ log ( ( b 0 − a 0 ) / ε ) / log 2 ⌋ + 1 K = \Bigl\lfloor \log\bigl((b_0-a_0)/\varepsilon\bigr) / \log 2 \Bigr\rfloor + 1 K = ⌊ log ( ( b 0 − a 0 ) / ε ) / log 2 ⌋ + 1 足以保证 ∣ x ∗ − x K ∣ < ε |x^* - x_K| < \varepsilon ∣ x ∗ − x K ∣ < ε 。
证明
先验估计严格小于 ε \varepsilon ε ,当且仅当 ( b 0 − a 0 ) / 2 K < ε (b_0-a_0)/2^K < \varepsilon ( b 0 − a 0 ) / 2 K < ε 。量都为正,这等价于 K > log ( ( b 0 − a 0 ) / ε ) / log 2 K > \log((b_0-a_0)/\varepsilon)/\log 2 K > log (( b 0 − a 0 ) / ε ) / log 2 。对任意实数 r r r ,已知满足 K > r K > r K > r 的最小整数是 ⌊ r ⌋ + 1 \lfloor r \rfloor + 1 ⌊ r ⌋ + 1 。
若目标是非严格界 ∣ x ∗ − x K ∣ ≤ ε |x^*-x_K| \le \varepsilon ∣ x ∗ − x K ∣ ≤ ε ,则 K = ⌈ log 2 ( ( b 0 − a 0 ) / ε ) ⌉ K = \lceil \log_2((b_0-a_0)/\varepsilon) \rceil K = ⌈ log 2 (( b 0 − a 0 ) / ε )⌉ 就够。差别只在对数比恰好是整数时出现。
设中点迭代次数为 N N N 。由停机结果,N = O ( log ( ( b 0 − a 0 ) / ε ) ) N = O(\log((b_0-a_0)/\varepsilon)) N = O ( log (( b 0 − a 0 ) / ε )) 。若一次求 f f f 的代价是 T f T_f T f ,算法时间是 O ( N T f ) O(N T_f) O ( N T f ) 。滚动存储是 O ( 1 ) O(1) O ( 1 ) 。“线性收敛”说的是误差如何收缩。Big-O 运行时间数的是运算。即使两者都带对数,问的也不是同一件事。
作为具体算例,考虑把二分法应用于区间 [ 1 , 2 ] [1,2] [ 1 , 2 ] 上的三次多项式 f ( x ) = x 3 + 4 x 2 − 10 f(x) = x^3 + 4x^2 - 10 f ( x ) = x 3 + 4 x 2 − 10 。由于 f ( 1 ) = − 5 < 0 f(1) = -5 < 0 f ( 1 ) = − 5 < 0 且 f ( 2 ) = 14 > 0 f(2) = 14 > 0 f ( 2 ) = 14 > 0 ,初始变号括号合法。对于目标容差 ε = 10 − 4 \varepsilon = 10^{-4} ε = 1 0 − 4 ,理论上保证精度的严格中点步数是 K = 14 K = 14 K = 14 。若仅使用残差准则,程序可能会提前终止(在第 9 步时就有 ∣ f ( x 9 ) ∣ < 10 − 4 |f(x_9)| < 10^{-4} ∣ f ( x 9 ) ∣ < 1 0 − 4 ),但残差反映的是函数曲线在纵轴上与零的距离,而二分法的误差证书严格保证的是横轴上近似点与真实根的距离。
这个交互图需要启用 JavaScript。
不动点迭代
要把 f ( x ) = 0 f(x) = 0 f ( x ) = 0 变成不动点问题,选非零常数 λ \lambda λ ,令 g λ ( x ) = x − λ f ( x ) g_\lambda(x) = x - \lambda f(x) g λ ( x ) = x − λ f ( x ) 。则 f f f 的根恰好是 g λ g_\lambda g λ 的不动点。对应算法是 x n + 1 = x n − λ f ( x n ) x_{n+1} = x_n - \lambda f(x_n) x n + 1 = x n − λ f ( x n ) 。不同的 λ \lambda λ 给出不同的映射。这里 g λ ′ ( x ) = 1 − λ f ′ ( x ) g_\lambda'(x) = 1 - \lambda f'(x) g λ ′ ( x ) = 1 − λ f ′ ( x ) ,所以 λ \lambda λ 会改变局部吸引或排斥。
命题 收敛迭代的极限是不动点
设 x n + 1 = g ( x n ) x_{n+1} = g(x_n) x n + 1 = g ( x n ) ,x n → x ∗ x_n \to x^* x n → x ∗ ,且 g g g 在 x ∗ x^* x ∗ 连续。则 g ( x ∗ ) = x ∗ g(x^*) = x^* g ( x ∗ ) = x ∗ 。
证明
由 x n → x ∗ x_n \to x^* x n → x ∗ 得 x n + 1 → x ∗ x_{n+1} \to x^* x n + 1 → x ∗ 。迭代规则给出 x n + 1 = g ( x n ) x_{n+1} = g(x_n) x n + 1 = g ( x n ) ,故 lim x n + 1 = lim g ( x n ) \lim x_{n+1} = \lim g(x_n) lim x n + 1 = lim g ( x n ) 。g g g 在 x ∗ x^* x ∗ 连续,于是 g ( x n ) → g ( x ∗ ) g(x_n) \to g(x^*) g ( x n ) → g ( x ∗ ) 。因此 g ( x ∗ ) = x ∗ g(x^*) = x^* g ( x ∗ ) = x ∗ 。
这是必要条件,不是充分条件。映射可以有不动点,而迭代从它旁边散开。把极限送进 g g g ,用的是 g g g 的连续性,不是 g g g 的线性。例如 g ( u ) = u 2 g(u) = u^2 g ( u ) = u 2 非线性,但连续。
定理 闭区间上的不动点定理
设 g g g 在 [ a , b ] [a,b] [ a , b ] 上连续且 g ( [ a , b ] ) ⊆ [ a , b ] g([a,b]) \subseteq [a,b] g ([ a , b ]) ⊆ [ a , b ] 。则 g g g 在 [ a , b ] [a,b] [ a , b ] 上至少有一个不动点。
再设 g ′ g' g ′ 在 ( a , b ) (a,b) ( a , b ) 上存在,且存在常数 0 ≤ L < 1 0 \le L < 1 0 ≤ L < 1 ,使 ∣ g ′ ( x ) ∣ ≤ L |g'(x)| \le L ∣ g ′ ( x ) ∣ ≤ L 对一切 x ∈ ( a , b ) x \in (a,b) x ∈ ( a , b ) 成立。则不动点唯一,并且对每个 x 0 ∈ [ a , b ] x_0 \in [a,b] x 0 ∈ [ a , b ] ,迭代 x n + 1 = g ( x n ) x_{n+1} = g(x_n) x n + 1 = g ( x n ) 留在 [ a , b ] [a,b] [ a , b ] 里并收敛到该不动点。
记号 g ( [ a , b ] ) g([a,b]) g ([ a , b ]) 表示把 g g g 作用在区间里每个输入上得到的输出集合。导数界是判断压缩的方便充分条件,不能代替自映射条件。初学者常容易忽略自映射条件 g ( [ a , b ] ) ⊆ [ a , b ] g([a,b]) \subseteq [a,b] g ([ a , b ]) ⊆ [ a , b ] 。若缺少这一前提,不仅无法保证不动点落在指定区间内,迭代序列在演化过程中也随时可能跳出区间导致无定义。
证明
存在性。 x ∗ x^* x ∗ 是不动点当且仅当 g ( x ∗ ) − x ∗ = 0 g(x^*)-x^* = 0 g ( x ∗ ) − x ∗ = 0 。令 q ( x ) = g ( x ) − x q(x) = g(x)-x q ( x ) = g ( x ) − x ,它在 [ a , b ] [a,b] [ a , b ] 上连续。因为 g g g 把区间映回自身,a ≤ g ( a ) ≤ b a \le g(a) \le b a ≤ g ( a ) ≤ b 、a ≤ g ( b ) ≤ b a \le g(b) \le b a ≤ g ( b ) ≤ b ,从而 q ( a ) ≥ 0 q(a) \ge 0 q ( a ) ≥ 0 、q ( b ) ≤ 0 q(b) \le 0 q ( b ) ≤ 0 。若某一端为零,该端点就是不动点。否则 q ( a ) > 0 > q ( b ) q(a) > 0 > q(b) q ( a ) > 0 > q ( b ) ,介值定理给出 x ∗ ∈ ( a , b ) x^* \in (a,b) x ∗ ∈ ( a , b ) 使 q ( x ∗ ) = 0 q(x^*) = 0 q ( x ∗ ) = 0 。
唯一性。 设 p p p 、q q q 都是不动点。则 p − q = g ( p ) − g ( q ) p-q = g(p)-g(q) p − q = g ( p ) − g ( q ) 。导数假设和中值定理给出 ∣ p − q ∣ = ∣ g ( p ) − g ( q ) ∣ ≤ L ∣ p − q ∣ |p-q| = |g(p)-g(q)| \le L |p-q| ∣ p − q ∣ = ∣ g ( p ) − g ( q ) ∣ ≤ L ∣ p − q ∣ 。由于 L < 1 L < 1 L < 1 ,只能 p = q p = q p = q 。
不变性与收敛。 自映射让每一步迭代留在 [ a , b ] [a,b] [ a , b ] 。设 x ∗ x^* x ∗ 是唯一不动点。则 ∣ x ∗ − x n + 1 ∣ = ∣ g ( x ∗ ) − g ( x n ) ∣ ≤ L ∣ x ∗ − x n ∣ |x^*-x_{n+1}| = |g(x^*)-g(x_n)| \le L |x^*-x_n| ∣ x ∗ − x n + 1 ∣ = ∣ g ( x ∗ ) − g ( x n ) ∣ ≤ L ∣ x ∗ − x n ∣ ,归纳得 ∣ x ∗ − x n ∣ ≤ L n ∣ x ∗ − x 0 ∣ |x^*-x_n| \le L^n |x^*-x_0| ∣ x ∗ − x n ∣ ≤ L n ∣ x ∗ − x 0 ∣ 。L < 1 L < 1 L < 1 ,右端趋于零。
局部导数检验解释单个不动点附近的行为:∣ g ′ ( x ∗ ) ∣ < 1 |g'(x^*)| < 1 ∣ g ′ ( x ∗ ) ∣ < 1 时,在 g ′ g' g ′ 适当连续的假设下局部吸引;∣ g ′ ( x ∗ ) ∣ > 1 |g'(x^*)| > 1 ∣ g ′ ( x ∗ ) ∣ > 1 时局部排斥。局部检验并不能证明从大区间里每个点都收敛。
算法 2 带后验检验的不动点迭代
Require: 映射 g g g ,初值 x 0 x_0 x 0 ,压缩界 0 ≤ L < 1 0 \le L < 1 0 ≤ L < 1 ,目标误差 ε > 0 \varepsilon > 0 ε > 0 ,最大步数 N max N_{\max} N m a x
1: x ← x 0 x \gets x_0 x ← x 0
2: for n ← 0 n \gets 0 n ← 0 to N max − 1 N_{\max}-1 N m a x − 1 do
3: y ← g ( x ) y \gets g(x) y ← g ( x )
4: if L = 0 L = 0 L = 0 then
6: end if
7: if L / ( 1 − L ) ∣ y − x ∣ ≤ ε L/(1-L)\, |y-x| \le \varepsilon L / ( 1 − L ) ∣ y − x ∣ ≤ ε then
9: end if
10: x ← y x \gets y x ← y
11: end for
12: 报告已达最大迭代次数
停机检验来自可计算估计
∣ x ∗ − x n + 1 ∣ ≤ L 1 − L ∣ x n + 1 − x n ∣ . |x^* - x_{n+1}| \le \frac{L}{1-L}\, |x_{n+1}-x_n|. ∣ x ∗ − x n + 1 ∣ ≤ 1 − L L ∣ x n + 1 − x n ∣.
证明
由压缩估计,对一切 j ≥ n + 1 j \ge n+1 j ≥ n + 1 有 ∣ x j + 1 − x j ∣ ≤ L ∣ x j − x j − 1 ∣ |x_{j+1}-x_j| \le L |x_j-x_{j-1}| ∣ x j + 1 − x j ∣ ≤ L ∣ x j − x j − 1 ∣ ,从而 ∣ x j + 1 − x j ∣ ≤ L j − n ∣ x n + 1 − x n ∣ |x_{j+1}-x_j| \le L^{j-n} |x_{n+1}-x_n| ∣ x j + 1 − x j ∣ ≤ L j − n ∣ x n + 1 − x n ∣ 。对 m > n + 1 m > n+1 m > n + 1 ,三角不等式和等比级数给出
∣ x m − x n + 1 ∣ ≤ ∣ x n + 1 − x n ∣ ∑ j = n + 1 m − 1 L j − n . |x_m - x_{n+1}| \le |x_{n+1}-x_n| \sum_{j=n+1}^{m-1} L^{j-n}. ∣ x m − x n + 1 ∣ ≤ ∣ x n + 1 − x n ∣ j = n + 1 ∑ m − 1 L j − n . 令 m → ∞ m \to \infty m → ∞ ,得到 ∣ x ∗ − x n + 1 ∣ ≤ L 1 − L ∣ x n + 1 − x n ∣ |x^*-x_{n+1}| \le \frac{L}{1-L}|x_{n+1}-x_n| ∣ x ∗ − x n + 1 ∣ ≤ 1 − L L ∣ x n + 1 − x n ∣ 。
先验估计 ∣ x ∗ − x n ∣ ≤ L n ∣ x ∗ − x 0 ∣ |x^*-x_n| \le L^n |x^*-x_0| ∣ x ∗ − x n ∣ ≤ L n ∣ x ∗ − x 0 ∣ 意味着 N N N 随 1 / ε 1/\varepsilon 1/ ε 对数增长,但常数在 L L L 靠近 1 1 1 时变差。滚动存储是 O ( 1 ) O(1) O ( 1 ) 。
这个交互图需要启用 JavaScript。
典型例题与辨析
练习 余弦迭代
考虑 [ 0 , 1 ] [0,1] [ 0 , 1 ] 上的 cos x − x = 0 \cos x - x = 0 cos x − x = 0 。写成 x = g ( x ) x = g(x) x = g ( x ) ,其中 g ( x ) = cos x g(x) = \cos x g ( x ) = cos x 。从 x 0 = 1 / 2 x_0 = 1/2 x 0 = 1/2 出发考虑 x n + 1 = g ( x n ) x_{n+1} = g(x_n) x n + 1 = g ( x n ) 。证明方程在 [ 0 , 1 ] [0,1] [ 0 , 1 ] 上恰有一个根,g ( [ 0 , 1 ] ) ⊆ [ 0 , 1 ] g([0,1]) \subseteq [0,1] g ([ 0 , 1 ]) ⊆ [ 0 , 1 ] ,并且迭代收敛。
证明
令 F ( x ) = cos x − x F(x) = \cos x - x F ( x ) = cos x − x 。它连续,F ( 0 ) = 1 > 0 F(0) = 1 > 0 F ( 0 ) = 1 > 0 ,F ( 1 ) = cos 1 − 1 < 0 F(1) = \cos 1 - 1 < 0 F ( 1 ) = cos 1 − 1 < 0 ,介值定理给出一个根。又 F ′ ( x ) = − sin x − 1 < 0 F'(x) = -\sin x - 1 < 0 F ′ ( x ) = − sin x − 1 < 0 在 [ 0 , 1 ] [0,1] [ 0 , 1 ] 上成立,故 F F F 严格递减,根唯一。
对 x ∈ [ 0 , 1 ] x \in [0,1] x ∈ [ 0 , 1 ] ,余弦在此区间递减,故 cos 1 ≤ cos x ≤ 1 \cos 1 \le \cos x \le 1 cos 1 ≤ cos x ≤ 1 。由于 0 < cos 1 < 1 0 < \cos 1 < 1 0 < cos 1 < 1 ,映射把 [ 0 , 1 ] [0,1] [ 0 , 1 ] 映回自身。
g ( x ) = cos x g(x) = \cos x g ( x ) = cos x 在 [ 0 , 1 ] [0,1] [ 0 , 1 ] 上连续、在 ( 0 , 1 ) (0,1) ( 0 , 1 ) 上可导,且 ∣ g ′ ( x ) ∣ = sin x ≤ sin 1 < 1 |g'(x)| = \sin x \le \sin 1 < 1 ∣ g ′ ( x ) ∣ = sin x ≤ sin 1 < 1 。不动点定理的全部假设以 L = sin 1 L = \sin 1 L = sin 1 成立。因此 g g g 在 [ 0 , 1 ] [0,1] [ 0 , 1 ] 上有唯一不动点,迭代对每个 x 0 ∈ [ 0 , 1 ] x_0 \in [0,1] x 0 ∈ [ 0 , 1 ] 都收敛,包括 x 0 = 1 / 2 x_0 = 1/2 x 0 = 1/2 。
练习 检验假设
设 g ( x ) = x − 1 π sin ( π x ) g(x) = x - \frac{1}{\pi}\sin(\pi x) g ( x ) = x − π 1 sin ( π x ) ,x ∈ [ 0 , 1 ] x \in [0,1] x ∈ [ 0 , 1 ] 。证明 g g g 把 [ 0 , 1 ] [0,1] [ 0 , 1 ] 映入自身,从而至少有一个不动点;再证明用于唯一性的导数条件失败,并在 [ 0 , 1 ] [0,1] [ 0 , 1 ] 上解 g ( x ) = x g(x) = x g ( x ) = x 。
证明
因为 g ′ ( x ) = 1 − cos ( π x ) ≥ 0 g'(x) = 1 - \cos(\pi x) \ge 0 g ′ ( x ) = 1 − cos ( π x ) ≥ 0 ,g g g 递增。端点值是 g ( 0 ) = 0 g(0) = 0 g ( 0 ) = 0 、g ( 1 ) = 1 g(1) = 1 g ( 1 ) = 1 ,故 0 ≤ g ( x ) ≤ 1 0 \le g(x) \le 1 0 ≤ g ( x ) ≤ 1 。连续性和自映射给出至少一个不动点。
唯一性的导数条件失败:∣ g ′ ( 2 / 3 ) ∣ = ∣ 1 − cos ( 2 π / 3 ) ∣ = 3 / 2 > 1 |g'(2/3)| = |1 - \cos(2\pi/3)| = 3/2 > 1 ∣ g ′ ( 2/3 ) ∣ = ∣1 − cos ( 2 π /3 ) ∣ = 3/2 > 1 ,不存在 L < 1 L < 1 L < 1 使 ∣ g ′ ( x ) ∣ ≤ L |g'(x)| \le L ∣ g ′ ( x ) ∣ ≤ L 在整个 ( 0 , 1 ) (0,1) ( 0 , 1 ) 上成立。映射仍然是 Lipschitz 的,可取常数 L = 2 L = 2 L = 2 ,因为 0 ≤ g ′ ( x ) ≤ 2 0 \le g'(x) \le 2 0 ≤ g ′ ( x ) ≤ 2 。单凭这个 Lipschitz 估计给不出唯一性。
不动点方程是 sin ( π x ) = 0 \sin(\pi x) = 0 sin ( π x ) = 0 ,在 [ 0 , 1 ] [0,1] [ 0 , 1 ] 上恰好当 x = 0 x = 0 x = 0 或 x = 1 x = 1 x = 1 。所以有两个不动点。
连续性配合不变区间保证了不动点的存在性;全局导数压缩界则进一步确立了唯一性,并确保从区间内任意初值出发均全局收敛。若自映射条件失效,该定理无法给出任何保证;若仅是压缩界不满足,不动点仍可能存在,但其唯一性与迭代收敛性必须借助其他手段单独判定。
下一篇把 Newton 法 写成一个特别选定的不动点映射。本页属于计算数学 阅读路径。
评论