计算方法实验指导书_第1页
计算方法实验指导书_第2页
计算方法实验指导书_第3页
计算方法实验指导书_第4页
计算方法实验指导书_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、计 算 方 法实验指导书彭彬计算机技术实验中心2012年3月· 实验环境: VC+ 6.0· 实验要求:在机房做实验只是对准备好的实验方案进行验证,因此上机前要检查实验准备情况,通过检查后方可上机。没有认真准备的学生不能上机,本次实验没有分数。实验中要注意考察和体会数值计算中出现的一些问题和现象:误差的估计,算法的稳定性、收敛性、收敛速度以及迭代初值对收敛的影响等。· 关于计算精度:如果没有特别说明,在计算的过程中,小数点后保留5位数字,最后四舍五入到小数点后四位数字。迭代运算的结束条件统一为。在VC+ 6.0中,可使用setprecision在流的输出中控制浮点

2、数的显示(缺省显示6位)。演示如下:# include<iostream.h># include<math.h># include<iomanip.h>/输出6位精度,输出左对齐cout<<setprecision(6)<<setiosflags(ios:left);/设置输出宽度为12(不够将补充0)cout<<setw(12)<<coeffi;· 关于图形绘制本课程个别实验要求画出函数的曲线,所有画图题目均要求用MFC完成。利用VC+6.0的MFC画图,先要建立一个工程,然后在*View中加入自定

3、义变量、自定义函数等,最后在OnDraw()方法中调用自定义函数。也可以把代码直接写入OnDraw()方法中。画曲线有两种方法,(一)一句坐标逐个打点(用SetPixel()函数),(二)先把当前光标移动(MoveTo()函数)到曲线的始点,再用LineTo()函数画线。线的样式由画笔决定。对封闭区域可以填充,填充的样式由画刷决定。在VC+6.0中,先新建一个MFC AppWizard(exe)类型的工程(建立工程时,“应用程序类型”选择“单文档”;“是否包含数据库”选择“不包含数据库”;其它选择缺省),然后在“ClassView”中选择XXView 类文件加以操作。图1是一个名为test的工

4、程,在CtestView节点,点击右键,用户可以增加自定义变量,自定义函数。图1 MFC工程图2是一个自定义函数的例子,代码如下:void CTestView:drawOldLine(int N, CDC *pDC) /N画线所用点的数目 pDC->TextOut(250,10,"龙格现象");/文本输出/设置画笔,将影响画线的样式CPen *pnewPen,*poldPen; pnewPen=new CPen();pnewPen->CreatePen(PS_SOLID,10,RGB(0,0,0);poldPen=pDC->SelectObject(pne

5、wPen);/画坐标系pDC->MoveTo(0,380);pDC->LineTo(640,380);pDC->MoveTo(320,0);pDC->LineTo(320,480); /画曲线,先移动到本曲线的第一个点pDC->MoveTo(20,380);for(int i=0;i<=N;i+) /原始坐标float x0=-1+2.0/N*i;float y0=1.0/(1+4*x0*x0); /坐标放大 x0=x0*300;y0=-y0*300; /坐标转化为整型 int x1=(int)(320+x0);int y1=(int)(440+y0); p

6、DC->LineTo(x1,y1);/重置画笔pDC->SelectObject(poldPen); 图 2 自定义函数画函数的图形图3是一个根据Lagrange插值多项式求函数值的自定义函数Lagrange(float x, int n, float x1, float y1),其中n是插值节点的个数,数组X1,y1存放插值节点的坐标,x是待求点的x坐标,函数根据插值多项式返回对应的y坐标。float CTestView:Lagrange(float x, int n, float x1, float y1) float y=0;/存放函数值 int k=0;/控制变量,求lag

7、range基函数的值 for( k=0;k<n;k+) float t=1; for (int j=0;j<n;j+) if (j!=k) t=t*(x-x1j)/(x1k-x1j); y=y+t*y1k; return y;图3 自定义函数,根据插值多项式求值图4是onDraw函数,这是MFC画图的主要部分。相关代码如下:void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/画原始图形dr

8、awOldLine(2000,pDC);float px11,py11;图4 OnDraw()函数的内容/N-N等分for(int N=2;N<=10;N=N+2) /求插值节点for(int i=0;i<=N;i+) pxi=-1+2.0/N*i; pyi=1.0/(1+4*pxi*pxi); /移动到第一个点pDC->MoveTo(20,380); /设置画笔 CPen *pnewPen,*poldPen; pnewPen=new CPen(); pnewPen->CreatePen(PS_DASHDOT,1+N/2,RGB(255-20*N,0+10*N,20*N

9、); poldPen=pDC->SelectObject(pnewPen); /按照插值节点求插值多项式的值,并描点 for(int k=0;k<=2000;k+) float x=-1+2.0/2000*k; float y=Lagrange(x,N+1,px,py);/注意N+1个节点 /坐标变换 x=x*300; /Y坐标放大,并且反号,因为Y坐标轴是向下的 y=-y*300; /转化为整型 int x1=(int)(320+x); int y1=(int)(440+y); if (N=2 && x1=80)pDC->TextOut(x1,y1,&quo

10、t;二等分"); if (N=4 && x1=50)pDC->TextOut(x1,y1,"四等分"); if (N=6 && x1=60)pDC->TextOut(x1,y1,"六等分"); if (N=8 && x1=580)pDC->TextOut(x1,y1,"八等分"); if (N=10 && x1=600)pDC->TextOut(x1,y1,"十等分"); pDC->LineTo(x1,y1);

11、/重置画笔 pDC->SelectObject(poldPen); 实验项目一览表实验学时12应开实验项目个数6序号实验项目名称实验要求学时分配实验类型备注1一元非线性方程求根的算法必做2综合性2解线性方程组的直接方法必做2验证性3解线性方程组的间接方法必做2验证性4插值多项式的求法必做2验证性5数值积分必做2验证性6常微分方程的数值解必做2验证性实验一 一元非线性方程求根的算法【实验性质】综合性实验。【实验目的】了解非线性方程求根的基本方法;掌握二分法和牛顿法。【实验内容】选择合适的初值,用二分法和牛顿迭代法求出一元非线性方程的全部实根,。【理论基础】数值法求非线性方程的跟一般分三步:

12、 判定根的存在性; 确定根的分布范围 根的精确化常用的数值方法有二分法和迭代法。二分法的基本思想是:先确定有根区间,然后通过逐步缩小(二分区间)有根区间的长度,以求根的近似值。二分法只能求实根,不能求复根及重根。迭代法通过建立一个迭代序列来逼近根。迭代效果与迭代初值、迭代公式的收敛性有关。迭代初始值一般根据高等数学的知识或作图的方法来确定;迭代公式通过对已知方程的某种变换得到。迭代的收敛性以及收敛速度不仅与迭代公式有关,可能还与迭代初值有关。牛顿迭代是常用的迭代方法。把在处按泰勒公式展开为:,忽略高次项,得到。如果是方程的根,则有:由此得:从而建立起牛顿迭代公式:当相邻两次迭代结果满足时停止计

13、算。如果非线性方程为一元多项式方程,则其牛顿解法的关键在于求与,这时可以用如下的快速算法(秦九韶算法)。设次多项式为:次多项式为:如果、满足 (1)则有于是求就转换为求系数。将式(1)展开,有如下递推关系:因此可以用上述递推公式求出,从而计算出。同理,设次多项式满足 (2)则有由(2)式有递推关系:因此求可以用上式递推计算。【实验过程】1. 手工或用MFC画出的图形。【MFC画图代码】2.估计三个有根区间,用二分法求出三根,并用下述样式的表描述求根过程。对每个求根过程,如果二分区间次数超过10次,则只记录最前面和最后面各5次。初始有根区间二分过程根二分区间次数区间的符号精度【分析上述实验数据,

14、总结你获得的结论】【实验代码】3.取三个初值,用牛顿迭代法求根,并用下述样式的表描述求根过程。对每个求根过程,如果迭代次数超过30次,则只记录最前面和最后面各15次(迭代初值1)=(迭代初值2)=(迭代初值3)= 误差误差误差【分析上述实验数据,总结你获得的结论】【实验代码】4.比较两种方法,分析实验出现的问题,并总结解决办法。【实验心得】实验二 解线性方程组的直接方法【实验性质】验证性实验。【实验目的】掌握Gauss消元法和追赶法求解线性方程组。 【实验内容】应用列主元消去法和追赶法迭代法求解下方程组:【理论基础】线性方程组的数值解法分直接算法和迭代算法。直接算法是经过有限次的运算即求得(如

15、果没有舍入误差)方程组精确解的方法,比如高斯消元法、矩阵分解法、追赶法等。在有限步内,迭代法得不到精确解。直接法程序复杂,但运算量较小。由于受到计算机字长的限制,直接法也得不到精确解,仅适用于系数矩阵阶数不太高的线性方程组。1.Gauss算法:Gauss消元法分消元和回代两个过程,消元和回代过程都要求主元非零。如果经过k-1步后的主元,则可进行下一步:,() ()()经过n-1步后,消元结束,然后回代:本算法最的特点是顺序消元,又称顺序高斯消元法,与线性代数的处理方法有显著的不同,请同学们牢记。计算过程中,如果出现主元为0,将使Gauss算法的计算终止。在使用Gauss消元法时,可以先判断系数

16、矩阵是否为严格对角占优(即),如果是就开始计算,否则就输出“不能保证主元非零,计算结束”。在线性代数中,只要系数行列式,线性方程组就可求解,但Gauss方法当主元为0时就不能继续进行,因此顺序高斯消元法有缺陷。另一方面,即使顺序高斯消元法可行,但主元很小,运算中用它作为除法的分母(),也会导致其它元素数量级的严重增长和舍入误差的扩散。这是Gauss法的另一缺陷。主元素消去法是对上述算法的改进,其中列主元消去法较为常用:在第i步,从第i列的第i行至最后一行中选取绝对值最大的元素(注意,不是该列的所有元素,而是部分元素),通过行互换,将其调到主元位置,然后再做消元。用列选主元方法可以克服高斯消元法

17、的额外限制,只要方程组有解,列选主元消元法就能畅通无阻地顺利求解,同时提高了解的精确度。2、追赶法在实践中,常遇到对角方程组的求解问题。这类方程组的系数矩阵一般非奇异,可分解为特殊的矩阵,基于相关矩阵可得到求解的快速算法。【实验过程】1.画出选列主元的算法框图。2.分别用高斯消元法和列主元消去法求解,用表格比较两种算法的结果与精度,分析实验出现的问题,并总结解决办法。3.用追赶法求解,分别给出两个方程组和,分析实验出现的问题,并总结解决办法。4.从使用条件、运算量比较列主元消去法和追赶法。【实验心得】实验三 解线性方程组的间接方法【实验性质】验证性实验。【实验目的】掌握迭代法求解线性方程组。

18、【实验内容】应用雅可比迭代法和Gauss-Sediel迭代法求解下方程组:【理论基础】线性方程组的数值解法分直接算法和迭代算法。迭代法将方程组的求解转化为构造一个向量序列,其极限就是方程组的解。迭代法程序简单,但有时工作量较大,在有限步内,得不到精确解,适宜某些系数矩阵阶数较高的问题。迭代的基本思想是构造一个关于解向量的迭代序列,使得这个序列随的增大而逐渐逼近准确解,常见的有Jacobi迭代算法和Gauss-Seidel加速迭代算法。设L+D+UJacobi迭代公式:Gauss-Seidel迭代公式为:迭代收敛的充分条件是:系数矩阵严格对角占优,或者迭代矩阵满足或者本题的参考答案:0.2857

19、、 -0.3265、0.0408、2.9796【实验过程】1.取三个不同初值,分别用雅可比法和高斯塞得尔法求解,用表格记载求解过程。2.根据程序运行结果填写下表,分析迭代初值、迭代公式对迭代的影响雅可比法高斯塞得尔法初值近似根迭代次数近似根迭代次数123【实验心得】实验四 插值多项式的求法【实验性质】验证性实验。【实验目的】掌握Lagrange插值算法、Newton插值算法;理解Newton插值算法相对于Lagrange插值算法的优点。【实验内容】先用C语言自带的系统函数求出在的值,然后分别用Lagrange、Newton方法求出的值,并与用C语言函数计算出的作比较。【理论基础】1.Lagra

20、nge插值公式经过个插值节点的次Lagrange插值多项式为:2.NewTon插值公式经过个插值节点的次Newton插值多项式为:上式中插商的计算常用到如下的Newton差商表: 一阶插商二阶插商三阶插商四阶插商其中差商是一个递推的定义:由上表可知:每增加一个插值节点,都需从一阶插商算起。但在具体应用时,有两种方案:(一)当节点数+1固定时,使用两个数组来存放插值计算的中间结果。其中存放插值节点的X坐标;开始存放插值节点的Y坐标,计算过程中存放差商值。计算差商时,一次计算差商表的一列。计算时用到y1和y0,计算时用到y2和y1,不必再用到y0,由此可把放到y0,把放到y1,。计算二阶差商时,把

21、二阶差商放到y0、y1、。这样牛顿插值公式中用到的fx0、fx0,x1、fx0,x1,x2、,依次均存放在Y0上。算法实现参考:Yy0,t=1for (int j=1;j<=n;j+) /计算J阶插商 t=t*(x-xj-1); for(int i=0;i<n-j;i+)yi=;/计算j阶插商的各种结果Y=Y+y0*t;NewTon差商表一阶二阶三阶四阶五阶(二)考虑动态增加插值结点,比如已有x0,x1,再增加x2时,依次计算fx1,x2,fx0,x1,x2。当增加第n+1个节点时,用xn+1存放该点X坐标,用yn+10存放点的Y 坐标,用yn+1i存放本行的i阶差商(1in)。Y

22、ni(Y的本行前1列Y的前1行前1列)/(X的本行?)(Yni-1Yn1i-1)/(xn-xn-i)一阶插商二阶插商三阶插商四阶插商【实验过程】1.分别用Lagrange插值和Newton插值求解。2.用表格Lagrange法、Newton法以及C语言自带函数对的求值结果。3.分析实验出现的问题,总结解决办法。【实验心得】实验五 数值积分【实验性质】验证性实验。【实验目的】理解插值型积分法;掌握复化积分法算法。 【实验内容】对,用复化梯形积分和变步长梯形积分求值(截断误差不超过)。【理论基础】积分在工程中有重要的应用,数值积分的基本思想是用被积函数在区间上的一些点处的值的线性组合作为积分的近似值:实际应用中是未知的,一般用的次数不超过的插值多项式来代替(插值型求积方法):。如果考虑等距节点,即,作变换,有:,上式称为Newton-Cotes求积公式,其中称为Cotes系数::系数为 ;

温馨提示

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

评论

0/150

提交评论