数值分析实验五 非线性方程的求根1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数值分析实验五 非线性方程的求根
组号 班级 学号 姓名 分数
一:实验目的
1、掌握用二分法解非线性方程的方法。
2、掌握用迭代法解非线性方程的方法。
3、掌握用牛顿法解非线性方程的方法。
4、学会运用Matlab 语言解决提供的函数求解实际问题。
二:实验内容所需的基本知识
二分法的原理:
设)(x f 在],[b a 上连续,且0)()(<⋅b f a f 。
则],[b a 为方程区间(设只有唯一根)。
取中点)(2
10b a x +=,检查)(a f 与)(0x f 是否同号,若同号,说明根*x 与b 之间,此时b b x a ==101,;若异号,说明根*x 在a 与0x 之间,此时011,x b a a ==,得新区间],[11b a 为原区间的一半。
对],[11b a 进行上述过程,取中点)(2
1111b a x +=,检查)(1a f 与)(1x f 是否同号,如此反复二分下去,即可得出一系列有根区间⊃⊃⊃],[],[],[2211b a b a b a …⊃⊃],[k k b a …,其中每个区间都是前一个区间的一半,因此
],[k k b a 的长度k k k a b a b 2)(-=-,当∞→k 时趋于零,就是说,如果二分过程无限地继续下去,这些区间最终必收缩于一点*
x ,该点显然就是所求的根。
迭代法原理:
首先给定一个粗糙的初始值,然而用一个迭代公式反复校正这个初值,将已有近似根逐步精确化,一直到满足精度要求为止。
具体地,把方程0)(=x f 改写成x 的等价表达式)(x x ϕ=,若)(**x x ϕ=,称*
x 为)(x ϕ的一个不动点,求)(x f 的零点就等价于求)(x ϕ的不动点。
任取一点0x 代入)(x ϕ求得 )(01x x ϕ= 又将1x 代入)(x ϕ求得
)(12x x ϕ= 如此反复迭代下去
一般地 )(1k k x x ϕ=+ k=0,1,2,………
)(x ϕ称为迭代函数,)(x x ϕ=称为迭代公式。
若迭代序列}{k x 有极限,即*lim x x k k =∞
→,则称迭代方程)(x x ϕ=,k=0,1,2,…收敛,这时*x 显然是)(x x ϕ=的不动点。
牛顿(Newton)法:
将非线性方程0)(=x f 逐步转化为某种线性方程求解。
已知0)(=x f 的一个近似根0x ,则函数)(x f 在点0x 附近可以用一阶泰勒公式来近似,0))(()()(00'0=-+≈x x x f x f x f ,若0)(0'≠x f ,解得)
()(0'00x f x f x x -=,将此根记为原方程的近似根1x ,然后按上式迭代计算,使形成一种新的迭代公式:,....2,1,0,)
()('1=-=+k x f x f x x k k k k 三:实验问题、方法及步骤
1、用二分法解方程013=--x x 在区间[1.0,1.5]上的一个根。
解 先按照二分法的基本原理编写二分发的MATLAB 程序(程序命名为:HalfInterval.m ),
编程如下:
function root=HalfInterval(f,a,b,eps)
if(nargin==3)
eps=1.0e-4
end
f1=subs(sym(f),findsym(sym(f)),a);
f2=subs(sym(f),findsym(sym(f)),b);
if(f1==0)
root=a;
end
if(f2==0)
root=b;
end
if(f1*f2>0)
disp('两端点函数值乘积大于0!');
return;
else
root=FindRoots(f,a,b,eps);
end
function r=FindRoots(f,a,b,eps)
f_1=subs(sym(f),findsym(sym(f)),a);
f_2=subs(sym(f),findsym(sym(f)),b);
mf=subs(sym(f),findsym(sym(f)),(a+b)/2);
if(f_1*mf>0)
t=(a+b)/2;
r=FindRoots(f,t,b,eps);
else
if(f_1*mf==0)
r=(a+b)/2;
if(abs(b-a<=eps))
r=(b-3*a)/4;
else
s=(a+b)/2;
r=FindRoots(f,a,s,eps);
end
end
end
首先在MA TLAB 命令窗口中输入
fplot('x^3-3*x+1',[0,1]),grid
回车,可得图形
由图形可以看到,曲线与x 轴有交点,也就是说有根,并且从图中能够大致估算到根的位置。
在MA TLAB 命令窗口中输入
root=HalfInterval('x^3-x-1',1.0,1.5)
输出结果为
root=
1.3247
根据输出结果可得:方程3
310x x -+=在区间[0,1]上的一个根为 1.3247x =。
2、用迭代法求方程2sin 0x x -=的一个近似值,给定初始值00.5x =,误差界为510-。
解 按照迭代法的基本原理编写迭代法的MALAB 程序(函数名为:fixpt.m )
编程如下:
function[p0,k,err,p]=fixpt(g,p0,to1,max1)
%g 是给定的迭代函数
%p0是给定的初始值
%k是所进行的迭代次数加1
%p是不动点的近似值
%err是误差
%p(p1,p2, …,pn)
P(1)=p0;
for k=2:max1
P(k)=feval('g',P(k-1));
k,err=abs(P(k)-P(k-1))
p=P(k);
if(err<tol),
break;end
if k==max1
disp('maximum number of iteration exceeded');
end
首先在MA TLAB命令窗口输入
fplot('[sin(x)-x^2,0]',[-5,5]);grid
回车,可得图形
f x与x轴有交点,也就是说有根,并且从图中能够大致估算到根的位置。
有图形可知函数()
先用M-文件写一个名为g.m的函数。
function y=g(x);
y=sin(x)/x;
然后再MA TLAB的命令窗口输入:
fixpt('g',0.5,10^(-5),20)
结果为:
k =
2
err =
k =
3
err =
0.1052
k =
4
err =
0.0292
k =
5
err =
0.0078
k =
6
err =
0.0021
k =
7
err =
5.7408e-004
k =
8
err =
1.5525e-004
k =
9
err =
4.1975e-005
k =
10
err =
1.1350e-005
k =
11
err =
3.0688e-006
P =
0.5000 0.9589 0.8537 0.8829 0.8751 0.8772 0.8766 0.8768 0.8767 0.8767 0.8767
ans =
0.5000
结果中列出了最后两次迭代产生的n x 和1n n x x --。
因为65109 3.50031010x x ---=⨯<。
所以*100.876x x ≈=。
3、用牛顿法求方程332x x -+的近似值,给定一个初始值0 1.2p =,误差界为6
10-。
解 按照Newton 法的基本原理编写Newton 法德MATLAB 程序(函数名为Newton.m )
编程如下:
function [p1,err,k,y,]=newton(f,df,p0,delta,max1)
%f 是非线性函数
%df 是f 的微商
%p0是初始值
%delta 是给定允许误差
%max1是迭代的最大次数
%p1是牛顿法求得的方程的近似值
%err 是p0的误差估计
%k 是迭代的次数
%y=f(p1)
p0,feval('f',p0)
for k=1:max1
p1=p0-feval('f',p0)/feval('df',p0);
err=abs(p1-p0);
p0=p1;
p1,err,k,y=feval('f',p1)
if(err<delta)|(y==0),
break,end
end
首先在MA TLAB 命令窗口输入
fplot('[x^3-3*x+2,0]',[-2.5,2.5]);grid;
回车,得到图形
有图形可知函数()f x 与x 轴有交点,也就是说有根,并且从图中能够大致估算到根的位置。
先用M-文件写一个名为f.m 的文件定义函数3()32f x x x =-+。
function y=f(x);
y=x^3-3*x+2;
再用M-文件写一个名为df.m 的文件定义函数的微商2()33df x x =-。
function y=df(x)
y=3*x^2-3;
然后再MA TLAB 的命令窗口输入:
newton('f','df',1.2,10^(-6),10)
结果为:
p0 =
1.2000
ans =
0.1280
p1 =
1.1030
err =
0.0970
k =
1
y =
0.0329
p1 =
1.0524
err =
0.0507
k =
2
y =
0.0084
p1 =
1.0264
err =
0.0260
k =
3
y =
0.0021
p1 =
1.0133
err =
0.0131
k =
4
5.2963e-004 p1 =
1.0066 err =
0.0066
k =
5
y =
1.3270e-004 p1 =
1.0033 err =
0.0033
k =
6
y =
3.3211e-005 p1 =
1.0017 err =
0.0017
k =
7
y =
8.3074e-006 p1 =
1.0008 err =
8.3157e-004 k =
8
y =
2.0774e-006 p1 =
1.0004 err =
4.1596e-004 k =
9
y =
5.1943e-007 p1 =
1.0002 err =
2.0802e-004
10
y =
1.2987e-007
ans =
1.0002
四:计算结果的分析
通过以上三种方法计算结果,我们可以看出二分法的计算精度较差,因为它只能求得一个较好的近似值;迭代法的计算精度相对很高,它是一种逐次逼近的方法,要想求得很精确的解,只要迭代足够多次就可得到;牛顿法的计算精度也是很高的,但是它必须能够选一个很好的初值,因为牛顿法的收敛性依赖于初值0x 的选取,若0x 偏离*x 较远,则牛顿法可能发散。
五:思考与提高
二分法是求解线性方程根最简单的算法,它的优点是算法简单,且总是收敛的,缺点是收敛太慢,故一般不单独将其用于求根,只用其为根求得一个较好的近似值。
迭代法是一种逐次逼近法,迭代过程是个极限过程,在用迭代法进行实际计算是,必须按精度要求控制迭代次数。
并且对于收敛的迭代过程,只要迭代足够多次,就可以是结果达到任意的精度,但有时迭代过程收敛缓慢,从而使计算量变得很大。
牛顿法实质上是一种线性化方法,就是将非线性方程线性化,以线性方程的解逐步逼近非线性方程的解。
牛顿迭代公式的收敛速度很快,但计算实践表明,当初值不够好时,Newton 法可能发散,一般可有问题的实际背景来预测后由对分区间法求得教的初始值。