非线性方程二分法
优点:算法直观、简单、总能保证收敛;局限:收敛速度慢、一般不单独用它求根,仅为了获取根的粗略近似
1 二分法基本思想
设
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
则在区间
[
a
,
b
]
[a,b]
[a,b]内必有一根
x
∗
x^*
x∗。通过反复对分有根区间,以极限思想求解出非线性方程的数值解。具体步骤如下:
- 取
[
a
,
b
]
[a,b]
[a,b]的中点
x
0
=
(
a
+
b
)
/
2
x_0=(a+b)/2
x0=(a+b)/2,计算
f
(
x
0
)
f(x_0)
f(x0),当
- f ( a ) f ( x 0 ) < 0 f(a)f(x_0)<0 f(a)f(x0)<0,则令 a 1 = a , b 1 = x 0 a_1=a,b_1=x_0 a1=a,b1=x0;
- f ( x 0 ) f ( b ) < 0 f(x_0)f(b)<0 f(x0)f(b)<0,则令 a 1 = x 0 , b 1 = b a_1=x_0,b_1=b a1=x0,b1=b;
通过重复上述步骤,得到一系列有根区间
[
a
,
b
]
⊃
[
a
1
,
b
1
]
⊃
[
a
2
,
b
2
]
⊃
⋯
⊃
…
[a,b]\supset [a_1,b_1]\supset[a_2,b_2]\supset\dots \supset\dots
[a,b]⊃[a1,b1]⊃[a2,b2]⊃⋯⊃…
由于后一个区间长度是前一个区间的一半,通过递归公式求解出区间长度的通项公式
b
k
−
a
k
=
b
−
a
2
k
b_k-a_k=\frac{b-a}{2^k}
bk−ak=2kb−a
当
k
→
∞
k\to \infty
k→∞时,
∣
∣
b
k
−
a
k
∣
∣
→
0
||b_k-a_k||\to0
∣∣bk−ak∣∣→0,此时序列
{
a
k
}
,
{
b
k
}
,
{
x
k
}
→
x
∗
\{a_k\},\{b_k\},\{x^k\} \to x^*
{ak},{bk},{xk}→x∗,其中
x
∗
=
a
k
+
b
k
2
x^*=\frac{a_k+b_k}{2}
x∗=2ak+bk
由于方程根和中点间的距离真包含于
[
a
k
,
b
k
]
[a_k,b_k]
[ak,bk],故收敛速度
0
≤
∣
x
∗
−
x
k
∣
≤
(
b
k
−
a
k
)
/
2
=
(
b
−
a
)
/
2
k
+
1
0\le|x^*-x_k|\le(b_k-a_k)/2=(b-a)/2^{k+1}
0≤∣x∗−xk∣≤(bk−ak)/2=(b−a)/2k+1
当
k
→
∞
k\to \infty
k→∞时,利用夹逼定理
lim
k
→
∞
0
≤
lim
k
→
∞
∣
x
∗
−
x
k
∣
≤
lim
k
→
∞
(
b
−
a
)
/
2
k
+
1
=
0
\mathop {\lim }\limits_{k\to \infty}0 \le \mathop {\lim }\limits_{k\to \infty}|x^*-x_k|\le\mathop {\lim }\limits_{k\to \infty}(b-a)/2^{k+1}=0
k→∞lim0≤k→∞lim∣x∗−xk∣≤k→∞lim(b−a)/2k+1=0
故有
x
k
→
x
∗
x^k\to x^*
xk→x∗。给定终止条件
ε
\varepsilon
ε,当
(
b
−
a
)
/
2
k
+
1
<
ε
(b-a)/2^{k+1}<\varepsilon
(b−a)/2k+1<ε
时,可求出满足精度
ε
\varepsilon
ε的最少二分次数
k
k
k。
2 二分法实现
求解:
f
(
x
)
=
2
x
+
x
−
2
f(x)=2^x+x-2
f(x)=2x+x−2
function[xstar,index,it] = bisect(fun,a,b,ep)
% 非线性方程二分法
% fun为目标函数
% a,b为初始区间
% ep为精确度,当(b-a)/2<ep循环结束,迭代失败输出两端点函数值
% index指标变量,index = 1,迭代成功,index = 0表明初始区间不是有根区间
% it迭代次数
if nargin < 4
ep = 1e-5;
end
fa = feval(fun,a); %计算a处的函数值
fb = feval(fun,b); %计算b处的函数值
if fa*fb>0
xstar = [fa,fb];
index = 0;
it = 0;
return
end
k = 0;
while abs(b-a)/2 >= ep
x = (a+b)/2;
fx = feval(fun,x);
if fx*fa<0
b = x;fb = fx;
else
a = x;fa = fx;
end
k = k +1;
end
xstar = (a+b)/2;index = 1;it = k
%具体函数
function f = fun1(x)
%测试函数
f = 2^x+x-2; %任意可改
end
format long
[xstar,index,it] = bisect(@fun1,0,2,0.0000001)
xstar = 0.543000400066376
index = 1
it = 24
参考文献文章来源:https://www.toymoban.com/news/detail-440421.html
曾繁慧. 数值分析[M]. 中国矿业大学出版社,2009文章来源地址https://www.toymoban.com/news/detail-440421.html
到了这里,关于非线性方程二分法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!