设 f(x) 在 [a,b] 内连续, 且 f(a)f(b)<0, 则在 (a,b) 内至少存在一点 ξ, 使得 f(ξ)=0.
- 给定函数 f(x) 和求解区间 [a,b], 以及精度要求 ξ>0
- 令 a1=a, b1=b
- 计算 f(a1) 和 f(b1), 如果 \absf(a1)<ξ, 则返回数值解 x=a1 并停止计算; 如果 \absf(b1)<ξ, 则返回数值解 x=b1 并停止计算; 如果 f(a1)f(b1)>0, 则输出算法失败信息并停止计算
for
k=1,2,…, do
计算 xk=2ak+bk 和 f(xk)
如果 \absf(xk)<ξ 或者 \absbk−ak<ξ, 则返回数值解 xk 并停止计算;
如果 f(ak)f(xk)<0, 则令 ak+1=ak, bk=xk; 否则令 ak+1=xk, bk+1=b;end for
关于对分法的几点注记
- 适用范围: 只适合求连续函数的 单重实根 或 奇数重实根;
- 优点: 简单易用, 只要满足介值定理的条件, 算法总是收敛的;
- 缺点:
- 收敛速度较缓慢;
- 不能求复根和偶数重根;
- 一次只能求一个根;
- 总结: 一般可先用来计算解的一个粗糙估计, 然后再用其他方法进行加速, 如 Newton 法.
设 φ(x)∈C[a,b] 且满足
对任意 x∈[a,b], 都有 φ(x)∈[a,b],
存在常数 L, 满足 0<L<1, 使得对任意 x,y∈[a,b] 都有
\absφ(x)−φ(y)⩽L\absx−y,
则 φ(x) 在 [a,b] 上存在唯一的不动点.
设 φ(x)∈C[a,b] 且满足
对任意 x∈[a,b], 都有 φ(x)∈[a,b],
存在常数 L, 满足 0<L<1, 使得对任意 x,y∈[a,b] 都有
\absφ(x)−φ(y)⩽L\absx−y
则对任意初始值 x0∈[a,b], 不动点迭代收敛, 且
\absxk−x∗⩽1−LL\absxk−xk−1⩽1−LLk\absx1−x0,
其中 x∗ 是 φ(x) 是 [a,b] 内存在唯一的不动点.
设 φ(x)∈C1[a,b] 且对任意 x∈[a,b], 都有 φ(x)∈[a,b]. 如果存在常数 L, 使得
\absφ′(x)⩽L<1,∀x∈[a,b]
则对任意初始值 x0∈[a,b], 不动点迭代收敛, 且
\absxk−x∗⩽1−LL\absxk−xk−1⩽1−LLk(x1−x0).
设 x∗ 是 φ(x) 的不动点, 若 φ′(x) 在 x∗ 的某个邻域内连续且
\absφ′(x∗)<1,
则不动点迭代局部收敛.