数值计算(二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法))(共16页)_第1页
数值计算(二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法))(共16页)_第2页
数值计算(二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法))(共16页)_第3页
数值计算(二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法))(共16页)_第4页
数值计算(二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法))(共16页)_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上本科生实验报告实验课程 数值计算方法 学院名称 信息科学与技术学院 专业名称 计算机科学与技术 学生姓名 学生学号 指导教师 实验地点 实验成绩 二 一六 年 五 月 二一六 年 五 月实验一 非线性方程求根1.1问题描述实验目的:掌握非线性方程求根的基本步骤及方法,。实验内容:试分别用二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法),求 x5-3x3+x-1= 0 在区间 -8,8上的全部实根,误差限为10-6。要求:讨论求解的全过程,对所用算法的局部收敛性,优缺点等作分析及比较, 第2章 算法思想2.1二分法思想:在函数的单调有根区间内,将有根区

2、间不断的二分,寻找方程的解。步骤: 1.取中点mid=(x0+x1)/22.若f(mid)=0,则mid为方程的根,否则比较与两端的符号,若与f(x0)异号,则根在x0,mid之间,否则在mid,x1之间。3并重复上述步骤,直达达到精度要求,则mid为方程的近似解。2.2 简单迭代法思想:迭代法是一种逐次逼近的方法,它是固定公式反复校正跟的近似值,使之逐步精确,最后得到精度要求的结果。步骤:1.构造迭代公式f(x),迭代公式必须是收敛的。 2.计算x1,x1=f(x0). 3.判断|x1-x0|是否满足精度要求,如不满足则重复上述步骤。 4输出x1,即为方程的近似解。2.3 Newton迭代法

3、思想:设r是的根,选取作为r的初始近似值,过点做曲线的切线L,L的方程为,求出L与x轴交点的横坐标,称x1为r的一次近似值。过点做曲线的切线,并求该切线与x轴交点的横坐标,称为r的二次近似值。重复以上过程,得r的近似值序列,其中,称为r的次近似值步骤:1.计算原函数的导数f(x);构造牛顿迭代公式2.计算 ,若f(x0)=0,退出计算,否则继续向下迭代。3.若|x1-x0|满足精度要求,x1即为方程的近似解。2.4弦截法思想:为加速收敛,改用两个端点都在变动的弦,用差商替代牛顿迭代公式的导数f(x)。步骤: 1.构造双点弦法的公式2.计算x2=x1-f(x1)(x1-x0)/f(x1)-f(x

4、0);3.判断f(x2)是否满足精度要求,若没有则按照上述步骤继续迭代,否则输出x2.x2即为方程的近似解。第3章 测试结果及分析 测试结果函数图像函数 Y=x5-3x3+x-1 二分法(表1-1,1-2,1-3)-1.6,-1.3kxkkxkkxk0-1.455-1.5015610-1.504931-1.5256-1.5039111-1.5052-1.48757-1.5050812-1.505043-1.506258-1.5044913-1.505064-1.496889-1.5047914-1.50507 表1-1 区间-1.2,-0.9kxkkxkkxk0-1.055-0.10-1.00

5、0051-0.9756-1.0007811-0.2-1.01257-0.12-1.000013-0.993758-1.000213-0.4-1.003129-0.14-1表1-2区间1.5,1.8kxkkxkkxk01.6571.69102141.6902911.72581.69043151.6902921.687591.69014161.6902931.70625101.69028171.6902841.69687111.69036181.6902851.69219121.6903261.68984131.6903表1-3简单迭代法(表2-1.2-2.2-3)初值-1.5kxkkxkkxk1

6、-1.57-1.5043513-1.504932-1.502178-1.5045314-1.504973-1.502879-1.50466151.504994-1.5034110-1.5047616-1.505015-1.5038111-1.5048317-1.505046-1.5041212-1.5048918-1.50505表2-1初值-1kx1-12-1表2-2初值1.6 结果 x=1.69028kxkkxkkxk11.681.68862151.6902321.6566991.68927161.6902531.66987101.68967171.6902741.6779111.68991

7、181.6902751.68278121.69006191.6902861.68573131.69015201.6902871.68753141.6902表2-3牛顿迭代法(表3-1.3-2,3-3)初值-1.5 结果 x=-1.50507kxkkxk1-1.54-1.505042-1.504715-1.505063-1.504976-1.50507表3-1初值-1 结果 x=-1.50507kx1-12-1表3-2初值1.6 结果 x=1.69028kxkkxk11.651.6902421.6860261.6902731.6889371.6902841.6898581.69028表3-3双点

8、弦法(表4-1.4-2,4-3)区间-1.6,-1.3 结果 x=-1.50507 kxkf(xk)kxkf(xk)1-1.50.031255-1.506670.2-1.661490.6-1.505-0.3-1.47175-1.563227-1.505070.4-1.4920.8-1.505072.30387e-006表4-1区间-1.2,-0.9 结果 x= -1 kxkf(xk)1-1.013930.2-1.00020.3-0.-3.11969e-0064-12.11001e-010表4-2区间1.5,1.8 结果 x=1.69028kxkf(xk)11.64403-0.21.68071-

9、0.31.691260.41.69027-0.51.69028-6.3006e-007表4-3从测试结果可以看出二分法和简单迭代法的收敛速度远大于牛顿迭代和弦截法的收敛速度。二分法和简单迭代法的公式易于构造和计算,牛顿迭代法虽然收敛高,但要求导数,计算的复杂度高!双点弦法随稍慢于牛顿跌代法,可以用差商代替牛顿迭代法中的导数,降低了计算的复杂度!附录:源程序清单#include<iostream>#include<math.h>using namespace std;double foot =0.3; /定义寻根步长int a=-8,b=8;double *rn=new

10、double5; /解的区间double *r = new double5; / 方程近似解int m=0; /根的个数int x_count; double precision=0.; /精度要求/函数的表达式(x5-3x3+x-1)double f(double x) return (pow(x,5)-3*pow(x,3)+x-1);void init() /根据函数图像确定根的区间和迭代初值 r0=-1.5; r1=-1; r2=1.6; rn0=-1.6; rn1=-1.2; rn2=1.5;/寻找根的区间 void search()/若没有给出区间和初值,进行逐步搜索有根区间 for

11、(int i=0;i*foot-8<8;i+) if(f(i*foot-8)*f(i+1)*foot-8)<0) rnm=i*foot-8; m+; /=二分法=double Dichotomy (double a,double b)double mid=0;int i=0;while(fabs(b-a)>precision) mid = (a+b)/2; if(f(a)*f(mid)<=0) b=mid;/判断与端点函数值得符号 else a=mid; cout<<mid<<endl; rx_count+=mid; return mid; /返

12、回最终结果 /=简单迭代法= /构造迭代公式double fitera(double x) double result=0; double xx=3*pow(x,3)-x+1; if(xx<=0) xx=-xx; return pow(xx,1.0/5.0)*(-1); else return pow(xx,1.0/5.0); /简单迭代double itera(double x0) cout<<x0<<endl; double x1=fitera(x0); while(fabs(x1-x0)>precision) x0=x1; x1=fitera(x0);

13、 /没有到达精度要求继续迭代 cout<<x1<<endl; return x1; /返回最终结果/=牛顿迭代法=/计算函数的一阶导数fderivatives(double x)double fderivatives(double x) return 5*pow(x,4)-9*(x,2)+1; /构造牛顿迭代公式newtonitera(double x)double newtonitera(double x) if(fderivatives(x)=0) return -1; /若导数为0 则停止迭代 elsereturn x-(f(x)/fderivatives(x);

14、/牛顿迭代double newton(double x0) double x1=newtonitera(x0); while(fabs(x1-x0)>precision) x0=x1; if (newtonitera(x0)=-1) break; x1=newtonitera(x0); /继续迭代 cout<<x1<<endl; return x1; /返回最终结果/=双点弦法迭代=/构造弦截法的迭代公式double twopointchord_f(double x0,double x1) return x1-(f(x1)/(f(x1)-f(x0)*(x1-x0)

15、;/双点弦法迭代double twopointchord(double x0,double x1) double x3=twopointchord_f(x0,x1); cout<<x3<<endl; while(fabs(f(x3)>precision) cout<<"f(x3)"<<f(x3)<<endl;/输出x3的函数值 x0=x1; x1=x3; x3=twopointchord_f(x0,x1);/没有到达精度要求继续迭代 / cout<<x3<<endl; cout<

16、<f(x3)<<endl; return x3; /返回最终结果/测试void main()init();/初始化区间和迭代初值/* 测试代码 输出每次的迭代结果和最终结果 cout<<"-二分法-"<<endl;for(int i =0;i<3;i+)double result=0;cout<<"有根区间为"<<rni<<" "<<rni+foot<<""<<endl;result=Dichot

17、omy(rni,rni+foot); /将区间端点带入公式cout<<"求得近似解为"<<result<<endl;cout<<"-迭代法-"<<endl;for(i =0;i<3;i+)double result=0;cout<<"有根区间为"<<rni<<" "<<rni+foot<<""<<endl;double x0 =ri; /取得初值result=

18、itera(x0); /带入公式cout<<"求得近似解为"<<result<<endl;cout<<"-牛顿迭代-"<<endl;for(i =0;i<3;i+)double result=0;cout<<"有根区间为"<<rni<<" "<<rni+foot<<""<<endl;double x0 =ri; /取得初值result=newton(x0); /带入公式 cout<<"求得近似解为"<<result<<endl;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论