二分法
二分法也称对分区间法、对分法等,是最简单的求根方法,属于区间法求根类型。
1 基本思想
利用连续函数零点定理,将含根区间逐次减半缩小构造点列来逼近根。
2 构造原理
设连续函数f(x)f(x)f(x)在[a,b][a,b][a,b]只有一个根,满足f(a)f(b)<0f(a)f(b)<0f(a)f(b)<0。
- 记I0=[a,b]I_0= [a,b]I0=[a,b],取区间中点x0=0.5(a+b)x_0=0.5(a+b)x0=0.5(a+b)
- 判别f(x0)f(x_0)f(x0)的值
- 若f(x0)=0f(x_0)=0f(x0)=0,则x∗=x0x^*=x_0x∗=x0,停止
- 若f(xₒ)⋅f(a)<0f(xₒ)\cdot f(a)<0f(xₒ)⋅f(a)<0, 记 I1=[a,x0]I_1=[a,x_0]I1=[a,x0];否则,记I1=[x0,b]I_1=[x_0,b]I1=[x0,b]
- 记I1=[a1,b1]I_1=[a_1,b_1]I1=[a1,b1],再取x1=0.5(a1+b1)x_1=0.5(a_1+b_1)x1=0.5(a1+b1)
- 若x1x_1x1满足根精度要求,则x∗≈x1x^*\approx x_1x∗≈x1,停止;否则,I1I_1I1代替I0I_0I0。转到第1步
3 分析
3.1 求根数列
记第kkk次二分得到的含根区间为Ik=[ak,bk]I_k=[a_k,b_k]Ik=[ak,bk],则二分法对应的求根数列算式为
xk=0.5(ak+bk)
x_k=0.5(a_k+b_k)
xk=0.5(ak+bk)
3.2 收敛性
由于
x∗∈Ik,k=0,1,⋯⇒I0⊃I1⊃I2⋯
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∗−xk∣≤12(bk−ak)=122(bk−1−ak−1)=⋯=12k+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)
故
12k+1(b−a)→0⇒xk→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∗−xk∣≤12k+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∗−xk∣<ϵ|x^*-x_k|\lt\epsilon∣x∗−xk∣<ϵ ,让
12k+1(b−a)≤ϵ⇒k>ln(b−a)−lnϵln2−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ϵln2−1k\gt\frac{\ln(b-a)-\ln\epsilon}{\ln2}-1k>ln2ln(b−a)−lnϵ−1
又由于
∣bk−ak∣=2∣xk−xk−1∣⇒∣x∗−xk∣≤∣xk−xk−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∣
于是,满足精度的根可取使∣xk−xk−1∣≤ϵ|x_k-x_{k-1}|\le\epsilon∣xk−xk−1∣≤ϵ成立的xkx_kxk 。
3.4 二分法的误差估计
-
事先估计:
k>ln(b−a)−lnϵln2−1 k\gt\frac{\ln(b-a)-\ln\epsilon}{\ln2}-1 k>ln2ln(b−a)−lnϵ−1 -
事后估计:
∣x∗−xk∣≤∣xk−xk−1∣ |x^*-x_k|\le|x_k-x_{k-1}| ∣x∗−xk∣≤∣xk−xk−1∣
事先估计的kkk往往偏大,主要用于理论估计。
事后估计的kkk往往较小,主要用于实际控制。
4 例题及代码
用二分法求方程2x3−5x−1=02x^3-5x-1=02x3−5x−1=0在区间[1,2][1,2][1,2]内的根,绝对误差ϵ≤10−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
本文介绍了二分法的基本思想及其应用,详细解释了通过不断缩小区间来逼近方程根的过程,并提供了具体的实例和代码实现。
3603

被折叠的 条评论
为什么被折叠?



