数值计算二分法简单迭代法Newton迭代法弦截法割线法双点弦法.docx
- 文档编号:29884547
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:40
- 大小:132.61KB
数值计算二分法简单迭代法Newton迭代法弦截法割线法双点弦法.docx
《数值计算二分法简单迭代法Newton迭代法弦截法割线法双点弦法.docx》由会员分享,可在线阅读,更多相关《数值计算二分法简单迭代法Newton迭代法弦截法割线法双点弦法.docx(40页珍藏版)》请在冰豆网上搜索。
数值计算二分法简单迭代法Newton迭代法弦截法割线法双点弦法
本科生实验报告
实验课程数值计算方法
学院名称信息科学与技术学院
专业名称计算机科学与技术
学生姓名
学生学号
指导教师
实验地址
实验成绩
二〇一六年五月二〇一六年五月
1
实验一非线性方程求根
1.1问题描绘
实验目的:
掌握非线性方程求根的基本步骤及方法,。
实验内容:
试分别用二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法),求x5-3x3+x-1=0在区间[-8,8]上的所有实根,偏差限为10-6。
要求:
议论求解的全过程,对所用算法的局部收敛性,优弊端等作剖析及比
较,
诈販镆藍嚕权泸嬰蟬迁渎桠窶鶻颢。
第2章算法思想
2.1二分法
思想:
在函数的单一有根区间内,将有根区间不停的二分,找寻方程的解。
步骤:
1.取中点mid=(x0+x1)/2
2.若f(mid)=0,则mid为方程的根,不然比较与两头的符号,若与f(x0)
异号,则根在[x0,mid]之间,不然在[mid,x1]之间。
3并重复上述步骤,直抵达到精度要求,则mid为方程的近似解。
开始
鶉巔销箫蕪绗驤瘋進锅偽煥駭鷯鲒。
读入a,b,e
mid=(a+b)/2
F(a)*f(b)<0
是a=mid
b=mid
no
|a-b| yes 输出mid 结束 2 2.2简单迭代法 思想: 迭代法是一种逐次迫近的方法,它是固定公式频频校订跟的近似值,使之逐渐精准,最后获得精度要求的结果。 步骤: 1.结构迭代公式f(x),迭代公式一定是收敛的。 2.计算x1,x1=f(x0). 3.判断|x1-x0|能否知足精度要求,如不知足则重复上述步骤。 4.输出x1,即为方程的近似解。 开始 艱贝礡詒撐动慚瘍黃腎础懨嚳鍛闾。 输入x0,e X1=f(x0)f为迭代函数 X1=x0;No |x1-x0| yes 输出x1 结束 3 2.3Newton迭代法 思想: 设r是的根,选用作为r的初始近似值,过点做曲线 的切线L,L的方程为,求出L与x轴交点的 横坐标,称x1为r的一次近似值。 过点做曲线 的切线,并求该切线与x轴交点的横坐标,称为r的二次近似 值。 重复以上过程,得r的近似值序列,此中,称为r的 嚌總觉缄旷狯轤擼綺輒吕鄒钍笼鹆。 次近似值 步骤: 1.计算原函数的导数f’(x);结构牛顿迭代公式 2.计算,若f’(x0)=0,退出计算,不然持续向下迭代。 若|x1-x0|知足精度要求,x1即为方程的近似解。 开始 输入 x0,e f’(x0)=0 X1=x0-f(x0)/f(x1) X1=x0;No |x1-x0| 嘩侨窦鹭伟矶刚齪酽飪区倀揚襤該。 yes 输出x1 结束 4 2.4弦截法 思想: 为加快收敛,改用两个端点都在改动的弦,用差商代替牛顿迭代公式的导数f’(x)。 步骤: 1.结构双点弦法的公式 2.计算x2=x1-f(x1)(x1-x0)/f(x1)-f(x0); 3.判断f(x2)能否知足精度要求,若没有则依据上述步骤持续迭代,不然输出x2.x2即为方程的近似解。 开始 鳳苇緝釧鴇貸貿恶举货偽郓龇伫缆。 输入 x0,x1,e x2=x1-x0-f(x1)(x1-x0)/f(x1)-f(x0) 计算f(x2) X1=x0;>= X2=x1; f(x1)=f(x0);|f(x2)| f(x2)=f(x1); No < 输出x2 结束 5 第3章测试结果及剖析 测试结果 函数图像 函数Y=x5-3x3+x-1 二分法(表1-1,1-2,1-3) [-1.6,-1.3] k xk k xk k xk 0 -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 区间[-1.2,-0.9] k xk k xk k xk 0 -1.05 5 -0.998437 10 -1.00005 1 -0.975 6 -1.00078 11 -0.999976 2 -1.0125 7 -0.999609 12 -1.00001 6 3 -0.99375 8 -1.0002 13 -0.999994 4 -1.00312 9 -0.999902 14 -1 表1-2 区间[1.5,1.8] k xk k xk k xk 0 1.65 7 1.69102 14 1.69029 1 1.725 8 1.69043 15 1.69029 2 1.6875 9 1.69014 16 1.69029 3 1.70625 10 1.69028 17 1.69028 4 1.69687 11 1.69036 18 1.69028 5 1.69219 12 1.69032 6 1.68984 13 1.6903 表1-3 简单迭代法(表 ) 初值-1.5 k xk k xk k xk 1 -1.5 7 -1.50435 13 -1.50493 2 -1.50217 8 -1.50453 14 -1.50497 3 -1.50287 9 -1.50466 15 1.50499 4 -1.50341 10 -1.50476 16 -1.50501 5 -1.50381 11 -1.50483 17 -1.50504 6 -1.50412 12 -1.50489 18 -1.50505 表2-1 初值-1 k x 1 -1 2 -1 表2-2 7 初值1.6 结果x=1.69028 k xk k xk k xk 1 1.6 8 1.68862 15 1.69023 2 1.65669 9 1.68927 16 1.69025 3 1.66987 10 1.68967 17 1.69027 4 1.6779 11 1.68991 18 1.69027 5 1.68278 12 1.69006 19 1.69028 6 1.68573 13 1.69015 20 1.69028 7 1.68753 14 1.6902 表2-3 牛顿迭代法(表 3-1.3-2,3-3) 初值-1.5 结果 x=-1.50507 k xk k xk 1 -1.5 4 -1.50504 2 -1.50471 5 -1.50506 3 -1.50497 6 -1.50507 表3-1 初值-1 结果 x=-1.50507 k x 1 -1 2 -1 表3-2 初值1.6 结果x=1.69028 k xk k xk 1 1.6 5 1.69024 2 1.68602 6 1.69027 3 1.68893 7 1.69028 4 1.68985 8 1.69028 表3-3 8 双点弦法(表 4-1.4-2,4-3) 区间[-1.6,-1.3] 结果x=-1.50507 k xk f(xk) k xk f(xk) 1 -1.5 0.03125 5 -1.50667 0.0784566 2 -1.66149 0.376502 6 -1.505 -0.010079 3 -1.47175 -1.56322 7 -1.50507 0.000440988 4 -1.492 0.186801 8 -1.50507 2.30387e-006 表4-1 区间[-1.2,-0.9] 结果 x=-1 k xk f(xk) 1 -1.01393 0.0415678 2 -1.0002 0.000607777 3 -0.999999 -3.11969e-006 4 -1 2.11001e-010 表4-2 区间[1.5,1.8] 结果x=1.69028 k xk f(xk) 1 1.64403 -0.676455 2 1.68071 -0.151106 3 1.69126 0.0157988 4 1.69027 -0.000313515 5 1.69028 -6.3006e-007 表4-3 从测试结果能够看出二分法和简单迭代法的收敛速度远大于牛顿迭代和弦 截法的收敛速度。 二分法和简单迭代法的公式易于结构和计算,牛顿迭代法固然 收敛高,但要求导数,计算的复杂度高! 双点弦法随稍慢于牛顿跌代法,能够用 差商取代牛顿迭代法中的导数,降低了计算的复杂度! 骡烂釷鸿鋅驷势韉滿試繃給陸锆齏。 9 附录: 源程序清单 #include #include usingnamespacestd; doublefoot=0.3; //定义寻根步长 inta=-8,b=8; double*rn=newdouble[5]; //解的区间 double*r=newdouble[5]; //方程近似解 intm=0; //根的个数 intx_count; doubleprecision=0.000001; //精度要求 //函数的表达式(x^5-3x^3+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)<0){ rn[m]=i*foot-8; m++; } } } //=====================二分法==========================doubleDichotomy(doublea,doubleb){纡烴诉驹盡脍论裢紳嬪规颐觴质澀。 10 doublemid=0; inti=0; while(fabs(b-a)>precision){ mid=(a+b)/2; if(f(a)*f(mid)<=0)b=mid;//判断与端点函数值得符号 elsea=mid; cout< } r[x_count++]=mid; returnmid;//返回最后结果 } //================简单迭代法========================= 结构迭代公式 doublefitera(doublex){ doubleresult=0; doublexx=3*pow(x,3)-x+1; if(xx<=0){ =-xx; returnpow(xx,1.0/5.0)*(-1);} else returnpow(xx,1.0/5.0); } 简单迭代 doubleitera(doublex0){ cout< doublex1=fitera(x0); while(fabs(x1-x0)>precision){ x0=x1; x1=fitera(x0);//没有抵达精度要求持续迭代cout< 锛闩诲笕书餑緹蓟铋賁權趙汆凤嗶。 } returnx1;//返回最后结果 } //===============牛顿迭代法================== //计算函数的一阶导数fderivatives(doublex) doublefderivatives(doublex){ return5*pow(x,4)-9*(x,2)+1; }轡橹塏摟捣绲麽鈥擁绫锟陧嫗驍铫。 11 结构牛顿迭代公式newtonitera(doublex)doublenewtonitera(doublex){ if(fderivatives(x)==0)return-1;//若导数为0则停止迭代 else returnx-(f(x)/fderivatives(x)); } 牛顿迭代 doublenewton(doublex0){ doublex1=newtonitera(x0); while(fabs(x1-x0)>precision){ x0=x1; if(newtonitera(x0)==-1)break; x1=newtonitera(x0);//持续迭代 cout< } returnx1;//返回最后结果 } //==================双点弦法迭代====================== //结构弦截法的迭代公式 doubletwopointchord_f(doublex0,doublex1){ returnx1-(f(x1)/(f(x1)-f(x0)))*(x1-x0); } //双点弦法迭代 doubletwopointchord(doublex0,doublex1){ doublex3=twopointchord_f(x0,x1); cout< while(fabs(f(x3))>precision){ cout<<"f(x3)"< x0=x1; x1=x3; x3=twopointchord_f(x0,x1);//没有抵达精度要求持续迭代 //cout< } cout< returnx3;//返回最后结果 } //测试 voidmain(){赖鴻儕銖旷漿嶄濰灏錫跹鉿鲳頸淥。 12 init();//初始化区间和迭代初值 /*测试代码输出每次的迭代结果和最后结果 cout<<"------------------------二分法----------------------"< for(inti=0;i<3;i++){ doubleresult=0; cout<<"有根区间为["< result=Dichotomy(rn[i],rn[i]+foot);//将区间端点带入公式 cout<<"求得近似解为"< } 滟闱赜澇奖論姍辏談鸞張蓣铒临雾。 cout<<"------------------------ 迭代法---------------------- "< for(i=0;i<3;i++){ doubleresult=0; cout<<"有根区间为["< "< doublex0=r[i]; //获得初值 result=itera(x0); //带入公式 cout<<"求得近似解为"< } cout<<"------------------------ 牛顿迭代---------------------- "< for(i=0;i<3;i++){ doubleresult=0; cout<<"有根区间为["< "< doublex0=r[i]; //获得初值 result=newton(x0); //带入公式 cout<<"求得近似解为"< } cout<<"------------------------ 弦截法---------------------- "< for(i=0;i<3;i++){ doubleresult=0; cout<<"有根区间为["< "< result=twopointchord(rn[i],rn[i]+foot); //将区间端点带入公式 cout<<"求得近似解为"< } /* 13 学生 实验 心得 在此次实验中,经过编程将二分法、简单迭代法、Newton迭代法、 弦截法(割线法、双点弦法)以代码的方式实现,这不单是一次实践过 癭挡阃气鯗枭铩癰褸銼铭禎姗韓蒉。 程,更是对这些求解方程的方法的深入理解,领会们各自的算法思想。 也提高的我对数值计算中的经典方法此中储藏的算法思想的兴趣,这 些思想方法对此后的问题的解决以及编程思想都是很有帮助的。 固然在实验过程中碰到了一些问题,可是经过查问资料以及不停的 调试程序都得以解决。 这也让我认识到只需深入理解,坚韧不拔,就 必定能够成功的。 我会将此次的实验的可贵经验实践到此后的学习 中,希望能在不停的锻炼中提高自己! 学生(署名): 年月日 14 指导 教师 考语 成绩评定: 指导教师(署名): 年 月 日 15
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 计算 二分法 简单 迭代法 Newton 弦截法 割线 法双点弦法