用matlab对非线性方程求解
- 格式:doc
- 大小:205.23 KB
- 文档页数:7
非线性方程求解
摘要:利用matlab软件编写程序,分别采用二分法、牛顿法和割线法求解非线性方程,
0 2= -x e
x
的根,要求精确到三位有效数字,其中对于二分法,根据首次迭代结果,事先估计迭代次数,比较实际迭代次数与估计值是否吻合。
并将求出的迭代序列用表格表示。
对于牛顿法和割线法,至少取3组不同的初值,比较各自迭代次数。
将每次迭代计算值求出,并列于表中。
关键词:matlab、二分法、牛顿法、割线法。
引言:
现实数学物理问题中,很多可以看成是解方程的问题,即f(x)=0的问题,但是除了极少简单方程的根可以简单解析出来。
大多数能表示成解析式的,大多数不便于计算,所以就涉及到算法的问题,算法里面,具体求根时,一般先寻求根的某一个初始近似值,然后再将初始近似值逐步加工成满足精度要求为止,但是,我们知道,人为计算大大的加重了我们的工作量,所以大多用计算机编程,这里有很多可以计算的软件,例如matlab等等。
正文:
一、二分法
1 二分法原理:对于在区间[,]上连续不断且满足·<0的函数,
通过不断地把函数的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫做二分法。
2 二分法求根步骤:(1)确定区间,,验证·<0,给定精确度;(2)求区间,的中点;(3)计算。
若=,则就是函数的零点;若·
<0,则令=;若·<0,则令=。
(4)判断是否达到精确度;即若
<,则得到零点近似值(或);否则重复步骤2-4.
3 二分法具体内容:精度要求为5e-6,,解得实际迭代次数与估计值基本吻合,迭代如下表。
n=2 c=0.000000 fc=-1.000000 n=11 c=-0.705078 fc=0.003065 n=3 c=-0.500000 fc=-0.356531 n=12 c=-0.704102 fc=0.001206 n=
4 c=-0.750000 fc=0.090133 n=13 c=-0.703613 fc=0.000277 n=
5 c=-0.625000 fc=-0.14463
6 n=14 c=-0.703369 fc=-0.00018
7 n=6 c=-0.687500 fc=-0.030175 n=15 c=-0.703491 fc=0.000045 n=7 c=-0.718750 fc=0.029240 n=16 c=-0.703430 fc=-0.000071 n=
8 c=-0.703125 fc=-0.000651 n=17 c=-0.703461 fc=-0.000013 n=
9 c=-0.710938 fc=0.014249 n=18 c=-0.703476 fc=0.000016
n=10 c=-0.707031 fc=0.006787 n=19 c=-0.703468 fc=0.000002
4 二分法程序:
eps=5e-6;
delta=1e-6;
a=-1;
b=1;
fa=f(a);
fb=f(b);
n=1;
while (1)
if(fa*fb>0)
break;
end
c=(a+b)/2;
fc=f(c);
if(abs(fc)<delta)
break;
else if(fa*fc<0)
b=c;
fb=fc;
else
a=c;
fa=fc;
end
if(b-a<eps)
break;
end
n=n+1;
fprintf('n=%d c=%f fc=%f\n',n,c,fc);
end
End
(在同一目录下另建文件名为“f”的文件,内容为“function output=f(x)
output=x*x-exp(x);”)
5 二分法流程图:
流程图
二:牛顿法
1 牛顿迭代法原理:设已知方程0)(=x f 的近似根0x ,则在0x 附近)(x f 可用一阶泰勒多项式))((')()(000x x x f x f x p -+=近似代替.因此, 方程0)(=x f 可近似地表示为
0)(=x p .用1x 表示0)(=x p 的根,它与0)(=x f 的根差异不大.
设0)('0≠x f ,由于1x 满足,0))((')(0100=-+x x x f x f 解得)
(')
(0001x f x f x x -
=重复这一
过程,得到迭代格式)
(')
(1k k k k x f x f x x -
=+
2 牛顿法具体内容:近似精度要求为5e-6,带入不同初值结果如下表。
初值-0.8迭代序列 初值-0.5迭代序列 初值-0.7迭代序列 -0.706959
-0.721926
-0.703472
-0.703472 -0.703601
-0.703467
3 牛顿法程序:这里以初值为0.7为例
fc=@(x)x*x-exp(x);
df=@(x)2*x-exp(x);
eps=5e-6;
delta=1e-6;
x0=-0.7;
N=100;
n=0;
while(1)
x1=x0-fc(x0)/df(x0);
n=n+1;
if(n>N|abs(x1)<eps);
disp('Newton method failed');
break;
end
if abs(x1)<1
d=x1-x0;
else
d=(x1-x0)/x1;
end
x0=x1;
if (abs(d)<eps|abs(df(x1))<delta) break;
end
fprintf('%f\n',x0)
End
4 牛顿法流程图:
流程图
三、割线法
1 割线法原理:牛顿迭代法的收敛速度快,但是每迭代一次,除需计算)(k x f 的值外,还要计算)(k x f '的值。
如果)(x f 比较复杂,计算)(k x f '的工作量就可能很大。
为了避免计算导数值,我们用差商来代替导数。
设经过k 次迭代后,与求1+k x 。
用)(x f 在k x ,1+k x 两点的差商1
1)
()(----k k k k x x x f x f 来代替
牛顿迭代公式中的导数值)(k x f ',于是我们得到如下迭代公式:
)()
()()
(111--+---
=k k k k k k k x x x f x f x f x x ()⋯⋯=,3,2,1k
2 割线法具体内容:近似精度要求为5e-6,带入不同初值结果如下表。
初值x0=-2 x1=0
初值x0=-1 x1=1 初值x0=-1 x1=0
=-0.411128 -0.462117 -0.612700
=-0.812307 -0.929762 -0.735079
-0.690233 -0.681847 -0.702313
=-0.702913 -0.701642 -0.703453
=-0.703470 -0.703483
3 割线法程序如下:这里以初值x0=-1 x1=0为例
fa=@(x)x*x-exp(x);
eps=5e-6;
delta=1e-6;
x0=-1;
x1=0;
while(1)
x2=x1-(fa(x1)/(fa(x1)-fa(x0)))*(x1-x0);
if (abs(fa(x2))<delta|abs(x2-x1)<eps)
break;
end
x0=x1;
x1=x2;
fprintf('x2=%f\n',x2)
end
割线法流程图:同牛顿法流程图。
结论:在以上利用三种方法求非线性方程的根中,可以明显看出,牛顿法和割线法,明显比二分法迭代次数小,而割线法虽然比牛顿法迭代次数稍多,但是避免乐求导的过程,故,从中可以看出各种算法有各种算法的优点。
参考文献:
[1] 孙志忠等《计算方法与实习》第五版东南大学出版社。