浅析二分法及其Matlab和C程序实现Word格式.docx
《浅析二分法及其Matlab和C程序实现Word格式.docx》由会员分享,可在线阅读,更多相关《浅析二分法及其Matlab和C程序实现Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
1
-10
8
-3
问:
这段时间内人有几次通过礁石尖端处?
方法3:
使用“幸运52”猜测商品价格的游戏作情景.
方法4:
(1)请同学们思考下面的问题:
能否解下列的方程
1x2-2x-1=0
②lgx=3-x
③x4-3x-1=0
(2)特殊入手:
不解方程求方程x2-2x-1=0的近似解(精确到0.01).
方法1、2、3都是以“实际问题”为情境引入.
方法4以学生已有的认知水平:
会求一元二次方程的实数解,对应二次函数的图像与二轴的交点坐标.让学生探究具体的一元二次方程的根与其对应的一元二次函数的图像与二轴的交点的横坐标的关系,再探究一般的一元二次方程的根与其对应的一元二次函数的图像与x轴的交点的横坐标的关系.
三、函数零点的处理
用二分法求方程近似解的理论基础是零点存在定理.下面我们来看看教材上描述的零点存在定理.如果函数y=f(x)在区间[a,b]上的图像是连续不断的一条曲线,并且有f(a)f(b)<
0,那么函数y=f(x)在区间[a,b]内有零点即存在c∈(a,b),使f(c)=0.
由此可见,定理的题设部分有两个条件:
(1)y=f(x)在区间[a,b]上的图象是连续不断的一条曲线;
(2)f(a)f(b)<
0.
学生在运用这个定理时往往会存在以下疑问:
①我怎样去判断某一函数的图像在某一区间是连续不断的呢?
②y=f(x)满足条件
(1)
(2)就一定存在零点,那么是否只存在一个零点呢?
③若把条件
(2)改为f(a)f(b)>
0,则y=f(x)在(a,b)是否就不存在零点呢?
对于问题①,我们可以告诉学生我们前面所学的一次函数、二次函数、指数函数、对数函数、幂函数在它们各自的定义域内图像都是连续的.这些函数经过加减乘除或经过复合而成的新的函数在各自的定义域内图像仍然是连续的.
对于问题②,主要通过观察函数图像来总结.
(1)对全部零点为单重零点既对应方程无重根的情况.
y=f(x)在区间[a,b]上的图象是连续不断的一条曲线且f(a)f(b)<
0,则y=f(x)在(a,b)上有奇数个零点.若y=f(x)在区间[a,b]上单调则y=f(x)在(a,b)上有唯一零点.
y=f(x)在区间[a,b]上的图象是连续不断的一条曲线且f(a)f(b)>
0,则y=f(x)在(a,b)上有偶数个零点.若y=f(x)在区间[a,b]上单调则y=f(x)在(a,b)上有无零点.
可以看出连续函数的零点具有一个很重要的性质:
函数的图象如果是连续的,当它通过零点时,函数的值变号,也就是图象要经过该点要穿越x轴.
(2)对多重零点的情况
从图7、图8可以看出偶数重零点不穿过x轴;
奇数重零点穿过x轴.函数若有一零点为多重零点,当该零点为偶重零点时,图象通过该零点时,函数值不变号,也就是图象经过该零点而不穿越x轴.当该零点为奇重零点时,图象经过该点时函数值要变号,也就是图象经过该零点且穿越x轴.处理好这个问题是本节课的关键.
四、精度
精确度的说明是一个无法避免的问题,而且需要和初中学习的“精确到”有所区分.教学中不可能让学生掌握严格的、形式化的定义,而且教科书对此也作了简化处理:
对于达到精确度ε的界定是只要精确值所在区间的长度小于ε,那么这个区间的所有的值就都是满足精确度ε的近似值.那么,如何让学生明白这个含义呢?
一个可行的方法就是通过简单例子来说明问题.最后,在学生思考、讨论及进一步分析的基础上给出精确度的含义:
“一般地,对于数值x,如果要获得它的满足精确度0.01的近似值,就是找到一个包含x的区间[a,b],只要|a-b|<
0.01即可.”
五、二分法的定义与步骤
利用二分法求方程的近似解时,学生用二分法求方程的近似解最大的困难就是第一步.第一步确定初始区间不好把握.要引导学生先研究函数的性质,画出函数大致图象,再确定初始区间.如果我们对函数的性质不了解,不能画出大致图象,问题比较麻烦,只能采用尝试的办法去搜索它的初始区间.
六、信息技术的使用
有意识借助计算器和几何画板帮助学生探究得到零点个数,下面以Excel为例引导学生求y=ln(2x+6)+3-3x的零点.先用画函数图象工具画出函数图象.
确定初始区间为[1,2],然后确定第一次迭代时每个单元格的公式,最后填充即可:
x1
(x1+x2)/2
x2
f(x1)
f((x1+x2)/2)
f(x2)
f(x1)f(x2)
f((x1+x2)/2)f(x1)
f((x1+x2)/2)f(x2)
精度
迭代次数
1.5
2
2.079442
0.001072
-3.69741
-7.688558154
0.002229483
-0.00396
1.75
-1.58723
-0.003964201
-0.001701755
5.868646
0.5
1.625
-0.73642
-0.000789552
1.168862
0.25
3
1.5625
-0.35445
-0.000380029
0.261025
0.125
4
1.53125
-0.1735
-0.000186016
0.061497
0.0625
5
1.515625
-0.08543
-9.15918E-05
0.014822
0.03125
6
1.507813
-0.04198
-4.50126E-05
0.003587
0.015625
7
1.503906
-0.02041
-2.18796E-05
0.000857
0.0078125
1.501953
-0.00966
-1.03521E-05
0.000197
0.00390625
9
1.500977
-0.00429
-4.59805E-06
4.14E-05
0.001953125
1.500488
-0.00161
-1.72346E-06
6.89E-06
0.000976563
11
1.500244
-0.00027
-2.8677E-07
4.3E-07
0.000488281
12
1.500122
0.000402
4.31423E-07
-1.1E-07
0.000244141
13
1.500183
6.75E-05
-1.07627E-07
2.71495E-08
-1.8E-08
0.00012207
14
1.500214
-1E-04
-1.80465E-08
-6.74688E-09
2.67E-08
6.10352E-05
15
1.500198
-1.6E-05
-1.09724E-09
1.63E-09
3.05176E-05
16
1.500191
2.56E-05
1.72755E-09
-4.2E-10
1.52588E-05
17
1.500195
4.67E-06
-4.16389E-10
1.19598E-10
-7.6E-11
7.62939E-06
18
1.500196
-5.8E-06
-7.59619E-11
-2.70718E-11
9.43E-11
3.8147E-06
19
-5.6E-07
-2.62675E-12
3.26E-12
1.90735E-06
20
2.05E-06
9.59574E-12
-1.2E-12
9.53674E-07
21
7.46E-07
-1.15526E-12
1.53249E-12
-4.2E-13
4.76837E-07
22
七、二分法思想的应用
注意用二分法的思想解决其他问题.
(2006浙江16题)设f(x)=3ax
,f(0)>0,f
(1)>0,求证:
(Ⅰ)a>0且-2<
<-1;
(Ⅱ)方程f(x)=0在(0,1)内有两个实根.
证明:
(I)(略)
(II)解法1:
抛物线
的顶点坐标为
,
利用二分法思想
在
的两边乘以
,得
.
又因为
而
所以方程
在区间
与
内分别有一实根。
故方程
内有两个实根
解法2采用“二分法”,只需证:
①区间(0,1)两个端点处f(0),f
(1)的符号都为正;
②在区间(0,1)内寻找一个二分点,使这个二分点所对应的函数值小于0,它保证抛物线与x轴有两个不同的交点(因a>
0抛物线开口方向向上).综合①、②,由函数的图象可知:
方程f(x)=0在(0,1)内必有两个不同实根.
在区间(0,1)内选取二等分点
,因f(
)=
a+b+c=
a+(-a)=-
a<
0,
所以结论得证.(若f(
)<
0不成立,可看f(
)是否为负,若还不成立,再看f(
)是否为负,总之,在区间(0,1)内存在一个分点,使它对应的函数值为负即可.)
例2(2006全国II12题)函数f(x)=|x-1|+|x-19|的最小值为()
(A)190(B)171(C)90(D)45
分析因|x-n|表示数轴上的动点x到点n之间的距离.当|x-1|+|x-19|最小时,x为区间[1,19]内的任意一个分点;
……以此类推,当|x-9|+|x-11|最小时,x为区间[9,11]内的任意一个分点;
当x-10最小时,x=10.利用“二分法”的思想方法,当x是区间[1,19],[2,18],[3,17],…,[9,11]共同二等分点,即x=10时,f(x)取得最小值,所以f(x)min=10-1+10-2+10-3+…+10-9+10-10+10-11+…+10-19=90.
二分法的Matlab和C程序实现
第二部分主要通过一个实例来研究单变量非线性方程f(x)=0的二分法求解及此方法的收敛性,根据误差估计确定二分次数并进行求解。
同时实现Matlab和C语言程序编写。
从而掌握过程的基本形式和二分法的基本思想,在以后的学习过程中得以应用。
一、引言
在科学研究与工程技术中常会遇到求解非线性方程f(x)=0的问题。
而方程f(x)是多项式或超越函数又分为代数方程或超越方程。
对于不高于四次的代数方程已有求根公式,而高于四次的代数方程则无精确的求根公式,至于超越方程就更无法求其精确解了。
因此,如何求得满足一定精度要求的方程的近似根也就成为了我们迫切需要解决的问题。
近年来,随着数学科学研究的不断进展,又更新了许多方程求解的方法。
我们知道,对于单变量非线性方程f(x)=0,一般都可采用迭代法求根,由此产生了二分法。
二、Matlab实现
function[c,err,yc]=bisect(f,a,b,delta)
%f是要求解的函数
%a和b分别是有根区间的左右限
%delta是允许的误差界
%c为所求近似解
%yc为函数f在c的误差估计
ifnargin<
4delta=1e-5;
end
ya=feval(‘f’,a);
yb=feval(‘f’,b);
ifyb==0,c=b,return,end
ifya*yb>
disp(‘(a,b)不是有根区间’);
return,end
max1=1+round((log(b-a)-log(delta))/log
(2));
fork=1:
max1
c=(a+b)/2;
ye=feval(‘f’,c);
ifyc==0a=c;
b=c;
break,
elseifyb*yc>
yb=yc;
else
a=c;
ya=c;
if(b-a)
k,c=(a+b)/2,err=abs(b-a),yc=feval(‘f’,c)
例如,要求f(x)=x3-x-1=0在区间[1,2]内的根
先在命令窗口中输入:
>
fplot(‘[x^3-x-1,0]‘,[12]);
grid
回车后输出曲线图
现在再编写所求的非线性函数,输入:
f=inline(‘x^3-x-1′);
bisect(f,1,2)
敲回车就能得到你想要的了。
三、C实现
#include"
stdio.h"
math.h"
main()
{
doublex1,x2;
doublex12;
doubley1,y12;
x1=1;
x2=3;
do
y1=exp(x1)-sin(x1)-sqrt(x1)-2;
x12=(x1+x2)/2.0;
y12=exp(x12)-sin(x12)-sqrt(x12)-2;
if(y1*y12<
0)
x2=x12;
else
x1=x12;
}
while(fabs(y12)>
1e-12);
printf("
xis:
%.6g\n"
x12);
运行结果:
编程思路:
二分法的思是,取自变量两个边界的中间值,并求此自变量值下的函数值,与其中的一个边界值(假若为第一个边界值且为负)相乘,如结果为负,则表明该中间值包含函数值为0的x值,再减小后边界继续循环即可;
如结果为正,则表明该中间值不包含函数值为0的x值,再增大前边界继续循环即可;
当不满足精度要求时,即可求出结果,输出即可。
求该方程的两个边界值时,可编程实现。
代码为:
doublex,y;
inputx:
\n"
);
scanf("
%lf"
&
x);
y=exp(x)-sin(x)-sqrt(x)-2;
yis:
y);
结果为: