数值计算二分法简单迭代法Newton迭代法弦截法解读Word文档格式.docx
《数值计算二分法简单迭代法Newton迭代法弦截法解读Word文档格式.docx》由会员分享,可在线阅读,更多相关《数值计算二分法简单迭代法Newton迭代法弦截法解读Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
3判断|x1-x0|是否满足精度要求,如不满足则重复上述步骤。
4•输出x1,即为方程的近似解。
开始
2.3Newton迭代法
设r是n的根,选取•作为r的初始近似值,过点也』氐丈做曲线
S的切线L,L的方程为L—「也"
八1丘一Z;
求出L与x轴交点的
2.计算
JC少1—=———=
的切线,并求该切线与x轴交点的横坐标=「,称•一为r的二次近似
-迪
值。
重复以上过程,得r的近似值序列,其中,称为r的..
次近似值步骤:
1.计算原函数的导数f'
(x);
构造牛顿迭代公式
若f'
(x0)=0,退出计算,否则继续向下迭代。
3.若|x1-x0|满足精度要求,xi即为方程的近似解。
yes
输出
/
x1
/
L
(、结束
2.4弦截法
思想:
为加速收敛,改用两个端点都在变动的弦,用差商替代牛顿迭代公式的导数f'
(x)
1.构造双点弦法的公式
2计算x2=x1-f(x1)(x1-x0)/f(x1)-f(x0);
3•判断f(x2)是否满足精度要求,若没有则按照上述步骤继续迭代,否则输出x2.x2即为方程的近似解。
第3章测试结果及分析
测试结果
函数图像
函数Y=x5-3x3+x-1
分法俵1-1,1-2,1-3)
[-16-1.3]
k
xk
-1.45
5
-1.50156
10
-1.50493
1
-1.525
6
-1.50391
11
-1.505
2
-1.4875
7
-1.50508
12
-1.50504
3
-1.50625
8
-1.50449
13
-1.50506
4
-1.49688
9
-1.50479
14
-1.50507
表1-1
区间[-12-0.9]
-1.05
-0.998437
-1.00005
-0.975
-1.00078
-0.999976
-1.0125
-0.999609
-1.00001
-0.99375
-1.0002
-0.999994
-1.00312
-0.999902
-1
表1-2
区间[1.5,1.8]
1.65
1.69102
1.69029
1.725
1.69043
15
1.6875
1.69014
16
1.70625
1.69028
17
1.69687
1.69036
18
1.69219
1.69032
1.68984
1.6903
表1-3
简单迭代法(表2-1.2-2.2-3)
初值-1.5
-1.5
-1.50435
-1.50217
-1.50453
-1.50497
-1.50287
-1.50466
1.50499
-1.50341
-1.50476
-1.50501
-1.50381
-1.50483
-1.50412
-1.50489
-1.50505
表2-1
初值-1
x
初值1.6结果x=1.69028
1.6
1.68862
1.69023
1.65669
1.68927
1.69025
1.66987
1.68967
1.69027
1.6779
1.68991
1.68278
1.69006
19
1.68573
1.69015
20
1.68753
1.6902
表2-3
牛顿迭代法(表3-1.3-2,3-3)
初值-1.5结果x=-1.50507
-1.50471
表3-1
初值-1结果x=-1.50507
表3-2
1.69024
1.68602
1.68893
1.68985
表3-3
双点弦法(表4-1.4-2,4-3)
区间卜1.6,-1.3]结果x=-1.50507
f(xk)
0.03125
-1.50667
0.0784566
-1.66149
0.376502
-0.010079
-1.47175
-1.56322
0.000440988
-1.492
0.186801
2.30387e-006
表4-1
区间[-12-0.9]结果x=-1
-1.01393
0.0415678
0.000607777
-0.999999
-3.11969e-006
2.11001e-010
表4-2
区间[1.5,1.8]结果X=1.69028
1.64403
-0.676455
1.68071
-0.151106
1.69126
0.0157988
-0.000313515
-6.3006e-007
表4-3
从测试结果可以看出二分法和简单迭代法的收敛速度远大于牛顿迭代和弦
截法的收敛速度。
二分法和简单迭代法的公式易于构造和计算,牛顿迭代法虽然
收敛高,但要求导数,计算的复杂度高!
双点弦法随稍慢于牛顿跌代法,可以用
差商代替牛顿迭代法中的导数,降低了计算的复杂度!
附录:
源程序清单
#include<
iostream>
math.h>
usingnamespacestd;
〃定义寻根步长
〃解的区间
//方程近似解
//根的个数
//精度要求
doublefoot=0.3;
inta=-8,b=8;
double*rn=newdouble[5];
double*r=newdouble[5];
intm=0;
intx_count;
doubleprecision=0.000001;
//函数的表达式(xA5-3xA3+x-1)doublef(doublex){
//根据函数图像确定根的区间和迭代初值
return(pow(x,5)-3*pow(x,3)+x-1);
}voidinit(){
r[0]=-1.5;
r[1]=-1;
r[2]=1.6;
rn[0]=-1.6;
rn[1]=-1.2;
rn[2]=1.5;
}
//寻找根的区间
voidsearch(){〃若没有给出区间和初值,进行逐步搜索有根区间
for(inti=0;
i*foot-8<
8;
i++){
if(f(i*foot-8)*f((i+1)*foot-8)v0){
rn[m]=i*foot-8;
m++;
//=====================二分法==========================doubleDichotomy(doublea,doubleb){
doublemid=0;
inti=0;
while(fabs(b-a)>
precision){
mid=(a+b)/2;
if(f⑻*f(mid)<
=0)b=mid;
//判断与端点函数值得符号
elsea=mid;
cout<
<
mid<
endl;
r[x_count++]=mid;
returnmid;
//返回最终结果
//================简单迭代法=========================
//构造迭代公式doublefitera(doublex){
doubleresult=0;
doublexx=3*pow(x,3)-x+1;
if(xx<
=0){
XX=-xx;
returnpow(xx,1.0/5.0)*(-1);
else
returnpow(xx,1.0/5.0);
//简单迭代
doubleitera(doublex0){
x0<
endl;
doublex1=fitera(x0);
while(fabs(x1-x0)>
x0=x1;
x1=fitera(x0);
//没有到达精度要