二分法
二分法也称对分区间法、对分法等,是最简单的求根方法,属于区间法求根类型。
1 基本思想
利用连续函数零点定理,将含根区间逐次减半缩小构造点列来逼近根。
2 构造原理
设连续函数 f ( x ) f(x) f(x)在 [ a , b ] [a,b] [a,b]只有一个根,满足 f ( a ) f ( b ) < 0 f(a)f(b)<0 f(a)f(b)<0。
- 记 I 0 = [ a , b ] I_0= [a,b] I0=[a,b],取区间中点 x 0 = 0.5 ( a + b ) x_0=0.5(a+b) x0=0.5(a+b)
- 判别
f
(
x
0
)
f(x_0)
f(x0)的值
- 若 f ( x 0 ) = 0 f(x_0)=0 f(x0)=0,则 x ∗ = x 0 x^*=x_0 x∗=x0,停止
- 若 f ( x ₒ ) ⋅ f ( a ) < 0 f(xₒ)\cdot f(a)<0 f(xₒ)⋅f(a)<0, 记 I 1 = [ a , x 0 ] I_1=[a,x_0] I1=[a,x0];否则,记 I 1 = [ x 0 , b ] I_1=[x_0,b] I1=[x0,b]
- 记 I 1 = [ a 1 , b 1 ] I_1=[a_1,b_1] I1=[a1,b1],再取 x 1 = 0.5 ( a 1 + b 1 ) x_1=0.5(a_1+b_1) x1=0.5(a1+b1)
- 若 x 1 x_1 x1满足根精度要求,则 x ∗ ≈ x 1 x^*\approx x_1 x∗≈x1,停止;否则, I 1 I_1 I1代替 I 0 I_0 I0。转到第1步
3 分析
3.1 求根数列
记第
k
k
k次二分得到的含根区间为
I
k
=
[
a
k
,
b
k
]
I_k=[a_k,b_k]
Ik=[ak,bk],则二分法对应的求根数列算式为
x
k
=
0.5
(
a
k
+
b
k
)
x_k=0.5(a_k+b_k)
xk=0.5(ak+bk)
3.2 收敛性
由于
x
∗
∈
I
k
,
k
=
0
,
1
,
⋯
⇒
I
0
⊃
I
1
⊃
I
2
⋯
x^*\in I_k,k=0,1,\cdots \Rightarrow I_0\supset I_1\supset I_2\cdots
x∗∈Ik,k=0,1,⋯⇒I0⊃I1⊃I2⋯
因此
∣
x
∗
−
x
k
∣
≤
1
2
(
b
k
−
a
k
)
=
1
2
2
(
b
k
−
1
−
a
k
−
1
)
=
⋯
=
1
2
k
+
1
(
b
−
a
)
|x^*-x_k|\le\frac12(b_k-a_k)=\frac{1}{2^2}(b_{k-1}-a_{k-1})=\cdots =\frac{1}{2^{k+1}}(b-a)
∣x∗−xk∣≤21(bk−ak)=221(bk−1−ak−1)=⋯=2k+11(b−a)
故
1
2
k
+
1
(
b
−
a
)
→
0
⇒
x
k
→
x
∗
\frac{1}{2^{k+1}}(b-a)\to 0\Rightarrow x_k\to x^*
2k+11(b−a)→0⇒xk→x∗
3.3 计算次数控制
由于
∣
x
∗
−
x
k
∣
≤
1
2
k
+
1
(
b
−
a
)
|x^*-x_k|\le \frac{1}{2^{k+1}}(b-a)
∣x∗−xk∣≤2k+11(b−a)
对给定的计算精度
ϵ
>
0
\epsilon\gt 0
ϵ>0,要成立
∣
x
∗
−
x
k
∣
<
ϵ
|x^*-x_k|\lt\epsilon
∣x∗−xk∣<ϵ ,让
1
2
k
+
1
(
b
−
a
)
≤
ϵ
⇒
k
>
ln
(
b
−
a
)
−
ln
ϵ
ln
2
−
1
\frac{1}{2^{k+1}}(b-a)\le \epsilon\Rightarrow k\gt\frac{\ln(b-a)-\ln\epsilon}{\ln2}-1
2k+11(b−a)≤ϵ⇒k>ln2ln(b−a)−lnϵ−1
即满足精度要求的二分次数为
k
>
ln
(
b
−
a
)
−
ln
ϵ
ln
2
−
1
k\gt\frac{\ln(b-a)-\ln\epsilon}{\ln2}-1
k>ln2ln(b−a)−lnϵ−1
又由于
∣
b
k
−
a
k
∣
=
2
∣
x
k
−
x
k
−
1
∣
⇒
∣
x
∗
−
x
k
∣
≤
∣
x
k
−
x
k
−
1
∣
|b_k-a_k|=2|x_k-x_{k-1}|\Rightarrow |x^*-x_k|\le|x_k-x_{k-1}|
∣bk−ak∣=2∣xk−xk−1∣⇒∣x∗−xk∣≤∣xk−xk−1∣
于是,满足精度的根可取使
∣
x
k
−
x
k
−
1
∣
≤
ϵ
|x_k-x_{k-1}|\le\epsilon
∣xk−xk−1∣≤ϵ成立的
x
k
x_k
xk 。
3.4 二分法的误差估计
-
事先估计:
k > ln ( b − a ) − ln ϵ ln 2 − 1 k\gt\frac{\ln(b-a)-\ln\epsilon}{\ln2}-1 k>ln2ln(b−a)−lnϵ−1 -
事后估计:
∣ x ∗ − x k ∣ ≤ ∣ x k − x k − 1 ∣ |x^*-x_k|\le|x_k-x_{k-1}| ∣x∗−xk∣≤∣xk−xk−1∣
事先估计的
k
k
k往往偏大,主要用于理论估计。
事后估计的
k
k
k往往较小,主要用于实际控制。
4 例题及代码
用二分法求方程 2 x 3 − 5 x − 1 = 0 2x^3-5x-1=0 2x3−5x−1=0在区间 [ 1 , 2 ] [1,2] [1,2]内的根,绝对误差 ϵ ≤ 1 0 − 2 \epsilon\le10^{-2} ϵ≤10−2。
% 二分法求方程在[a,b]区间、误差小于等于epsilon下的近似根
function result = dichotomy(epsilon,a,b)
f=@(x)2*x^3-5*x-1;
m=(a+b)/2;
while ~(abs(a-b)<epsilon || f(m)==0)
m = (a+b)/2;
if f(a)*f(m) < 0
b = m;
else
a = m;
end
end
result = (a+b)/2;
fprintf("近似解为:%.6f",result);
end