二分法
理论基础:
将隔离区间进行对分,找出根所在的小区间,然后再对该小区间对分,依次类推,直到隔离区间的长度满足给定的精度为止。
设f(x)在[a,b]上连续,且f(a)f(b)<0,则由介值定理可得,在(a,b)内至少存在一点ξ使得f(ξ)=0
- 求隔离区间内的根,f(a)f(b)<0
- 用二分法求根,通常先给出f(x)图像以确定有根区间
①将方程转换为f(x)函数式,通过Matlab绘制函数图像,根据图像零点位置确定原方程的有根区间[a,b](f(a)f(b)<0)。
②利用设计好的Matlab二分法函数求解方程的近似解。
x=[0:0.01:10];
y=f(x);
Draw(x,y);
a=input('请输入有根区间左端点a的值:');
b=input('请输入有根区间右端点b的值:');
xi=input('请输入预定精度\xi\n:');
%delta=input('请输入精度\delta\n:');
x0=0;
k=0;
[k,x0]=CMTheFunOfDichotomy(a,b,xi);
disp('该方程的近似根为:');
disp(x0);
disp('该程序执行的总步数为:');
disp(k);
f:
在该函数中定义待求解方程。
function y=f(x)
y=(cos(x)).*(cos(x))+6-x;
% y=log(x)+x.*x-3;
% y=1+5*x-6*(x^3)-exp(2*x);
% y=cos(x)-sin(x);
end
Draw:
通过该函数绘制f(x)图像。
function Draw(x,y)
grid on;hold on;
plot(x,y);
title('f(x)图像')
xlabel('x')
ylabel('f(x)');
end
CMTheFunOfDichotomy:
二分法的主体函数
思路①:直接对有根区间[a,b]二分
function [k,x0]=CMTheFunOfDichotomy(a,b,xi)
x0=(a+b)/2;%直接对有根区间二分
k=1;%记录步数
m=1+round(log(b-a)-log(2*xi)/log(2));
while k<=m
y=f(x0);
ya=f(a);
yb=f(b);
if y==0
x0=x0;
return;
elseif ya*y<0
b=x0;
elseif y*yb<0
a=x0;
end
x0=(a+b)/2;k=k+1;
end
end
思路②:利用几何关系(相似三角形对应线段成比例)进行二分
function [k,x0]=CMTheFunOfDichotomy(a,b,xi)
ya=f(a);
yb=f(b);
lambda=abs(ya)/(abs(yb)+abs(ya));
x0=lambda*b+(1-lambda)*a;
k=1;
m=1+round(log(b-a)-log(2*xi)/log(2));
while k<=m
y=f(x0);
ya=f(a);
yb=f(b);
if y==0
x0=x0;
return;
elseif ya*y<0
b=x0;
elseif y*yb<0
a=x0;
end
x0=lambda*b+(1-lambda)*a; k=k+1;
end
end
m=1+round(log(b-a)-log(2*xi)/log(2)); 1
(1)(cos(x))*(cos(x))+6=x
图形绘制函数结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xArpfA0y-1646553203911)(二分图一.png)]
由此可将[6,7]视为该函数的有根区间。即a=6,b=7。
当预设精度为0.005时:
- 思路①下所得结果:
该方程的近似根为:
6.7754
该程序执行的总步数为:
9
- 思路②下所得结果:
该方程的近似根为:
6.7749
该程序执行的总步数为:
9
(2)y=log(x)+x.*x-3;
图形绘制函数结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I5AYPhjA-1646553203911)(二分图二.png)]
由此可将[-2,-1]及[1,2]视为该函数的有根区间。
当预设精度为0.005时:
- 思路①下所得结果
该方程的第一个近似根为:
-1.9980
对应执行的总步数为:
9
该方程的第二个近似根为:
1.5918
对应执行的总步数为:
9
- 思路②下所得结果
该方程的第一个近似根为:
-1.9984
对应执行的总步数为:
9
该方程的第二个近似根为:
1.5932
对应执行的总步数为:
9
(3)y=1+5x-6(x^3)-exp(2*x);
图形绘制函数结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yKLCX8CC-1646553203912)(二分图三.png)]
由此可将[-3,2]视为该函数的有根区间。即a=-3,b=2。
当预设精度为0.005时:
- 思路①下所得结果:
该方程的近似根为:
-0.8174
该程序执行的总步数为:
10
- 思路②下所得结果:
该方程的近似根为:
0.5042
该程序执行的总步数为:
10
由于该函数在[-1,1]区间上的图像几乎与x轴重叠,所以不同的二分思路得到的结果差值会比较大。此外所得值还会受到区间范围取值设置的影响。
(4)y=cos(x)-sin(x);
图形绘制函数结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MO3XxOR6-1646553203913)(二分图四.png)]
由此可将[0,1]及[3,4]视为该函数的有根区间。
当预设精度为0.005时:
- 思路①下所得结果:
该方程的第一个近似根为:
0.7871
对应执行的总步数为:
9
该方程的第二个近似根为:
3.9277
对应执行的总步数为:
9
- 思路②下所得结果:
该方程的第一个近似根为:
0.7967
对应执行的总步数为:
9
该方程的第二个近似根为:
3.9580
对应执行的总步数为:
9
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LKlDVPoA-1646553203908)(k的条件判断来源.png)]; ↩︎