计算方法实验指导书(2014.2.27)讲解

上传人:我** 文档编号:114326031 上传时间:2019-11-10 格式:DOC 页数:38 大小:696KB
返回 下载 相关 举报
计算方法实验指导书(2014.2.27)讲解_第1页
第1页 / 共38页
计算方法实验指导书(2014.2.27)讲解_第2页
第2页 / 共38页
计算方法实验指导书(2014.2.27)讲解_第3页
第3页 / 共38页
计算方法实验指导书(2014.2.27)讲解_第4页
第4页 / 共38页
计算方法实验指导书(2014.2.27)讲解_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《计算方法实验指导书(2014.2.27)讲解》由会员分享,可在线阅读,更多相关《计算方法实验指导书(2014.2.27)讲解(38页珍藏版)》请在金锄头文库上搜索。

1、实验一插值方法实验学时:4实验类型:设计实验要求:必修一 实验目的通过本次上机实习,能够进一步加深对各种插值算法的理解;学会使用用三种类型的插值函数的数学模型、基本算法,结合相应软件(如VC/VB/Delphi/Matlab/JAVA/Turbo C)编程实现数值方法的求解。并用该软件的绘图功能来显示插值函数,使其计算结果更加直观和形象化。二 实验内容通过程序求出插值函数的表达式是比较麻烦的,常用的方法是描出插值曲线上尽量密集的有限个采样点,并用这有限个采样点的连线,即折线,近似插值曲线。取点越密集,所得折线就越逼近理论上的插值曲线。本实验中将所取的点的横坐标存放于动态数组中,通过插值方法计算

2、得到的对应纵坐标存放于动态数组中。以Visual C+.Net 2005为例。本实验将Lagrange插值、Newton插值和三次样条插值实现为一个C+类CInterpolation,并在Button单击事件中调用该类相应函数,得出插值结果并画出图像。CInterpolation类为class CInterpolationpublic: CInterpolation();/构造函数CInterpolation(float *x1, float *y1, int n1);/结点横坐标、纵坐标、下标上限 CInterpolation();/析构函数int n, N;/结点下标上限,采样点下标上限f

3、loat *x, *y, *X;/分别存放结点横坐标、结点纵坐标、采样点横坐标float *p_H,*p_Alpha,*p_Beta,*p_a,*p_b,*p_c,*p_d,*p_m;/样条插值用到的公有指针,分别存放,和;其中,有参数的构造函数为CInterpolation(float *x1, float *y1, int n1) /动态数组x1,y1中存放结点的横、纵坐标,n1是结点下标上限(即n1+1个结点) n=n1; N=x1n-x10; X=new floatN+1; x=new floatn+1; y=new floatn+1; for(int i=0;i=n;i+) xi=x

4、1i; yi=y1i; for(int i=0;i=N;i+) Xi=x0+i;2.1 Lagrange插值,其中对于一个自变量,要求插值函数值,首先需要计算对应的Lagrange插值基函数值float l(float xv,int i) /求插值基函数的值 float t=1; for(int j=0;j=n;j+) if(j!=i) t=t*(xv-xj)/(xi-xj); return t;调用函数l(float x,int i),可求出float p_l(float x) /求在一个点的插值结果 float t=0; for(int i=0;i=n;i+) t+=yi*l(x,i);

5、return t;调用p_l(float x)可实现整个区间的插值float *Lagrange() /求整个插值区间上所有采样点的插值结果 float *Y=new floatN+1; for(int k=0;k=N;k+) Yk=p_l(x0+k*h); return Y;2.2 Newton插值,其中,对于一个自变量,要求插值函数值,首先需要计算出和float *f()/该函数的返回值是一个长度为n1的动态数组,存放各阶差商float w(float x, int i)/该函数计算在求的函数中调用*f()得到各阶差商,然后在循环中调用w(float x)可得出插值结果float p_n(

6、float x)/该函数计算在一点的值调用p_n(float x)可实现整个区间的插值float *Newton()/该函数计算出插值区间内所有点的值2.3 三次样条插值三次样条插值程序可分为以下四步编写:(1) 计算结点间的步长、;(2) 利用、产生三对角方程组的系数矩阵和常数向量;(3) 通过求解三对角方程组,得出中间结点的导数;(4) 对自变量x,在对应区间上,使用Hermite插值;(5) 调用上述函数,实现样条插值。将每步写成函数:(1)void GetH(void)/该函数计算数组void GetAlpha(void)/该函数计算数组void GetBeta(void)/该函数计算

7、数组(2)void Geta(void)/该函数计算数组下对角线 void Getb(void)/该函数计算数组主对角线 void Getc(void)/该函数计算数组上对角线void Getd(void)/该函数计算方程组右端常数项(3)float *Chasing(float *pa,float *pb,float *pc,float *pd,int n)/追赶过程,计算各点斜率(4)float F0(float x)/该函数计算函数的值float F1(float x)/该函数计算函数的值float P0(float x)/该函数计算函数的值float P1(float x)/该函数计算

8、函数的值调用上述函数,实现三次样条插值float *Cubic_Spline()/该函数计算所有点的插值结果三 实验组织运行要求 实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。集中上机、调试并通过计算机图形可视化演示操作实例来测试、验证所学的数值分析理论。四 实验条件为每个学生提供一台具有WINDOWS 98/XP/NT/2000操作系统的计算机;同时提供VC+/VB/JAVA/TC等集成语言开发环境来编程设计计算方法的上机实验。五 实验步骤1 根据实验内容和算法流程图预先编好程序初稿,上机调试、运行, 输出正确的结果。2 三种类型的插值函数所生成的图形要显示在同一坐标

9、轴上,并用三种不同的颜色分别表示出来。3 分析它们的运行结果,并比较三种插值函数各自不同的特点。4 实验完毕后提交实验报告六 实验报告实验报告的内容包括:实验目的、实验内容、源程序清单和结果分析及心得体会。并分析它们的运行结果,并比较三种插值函数各自不同的特点。上述是第一个实验插值方法程序的构思和编写过程。将其简单概括,可分为以下几步:(1) 按照本实验指导书的开篇“集成开发环境Visual C+.Net的使用”中的第一部分“开发环境介绍”建立项目。(2) 为项目添加一个类,在该类中编写插值算法。该类需要一个有参数的构造函数将类外的插值条件数据传递到类中。(3) 按照“集成开发环境Visual

10、 C+.Net的使用”所述为项目添加对话框双击事件响应程序,将鼠标双击的坐标存放于数组或线性表中,用于插值,并将双击的点用小圆圈标出。(4) 在对话框上添加一个Button(按钮),双击改按钮,添加响应程序,调用拉格朗日插值函数,并将得到的相邻插值点用直线连接起来。连线的方法在“集成开发环境Visual C+.Net的使用”有介绍。(5) 用与(4)类似的方法添加牛顿插值和三次样条插值的Button和相应的响应程序。对于插值结点的存储,可以采用线性表。为了通过插值结点确定插值区间,可将这些点按照横坐标递增排序。务必熟练实验一程序编写的每一步骤,做到能够从头至尾独立编写。在项目的建立、画图、类的

11、添加和编程思维各方面,后面的四个实验与实验一都是类似的。本实验指导书对后面的四个实验不再如此赘述。实验二数值积分实验学时:2实验类型:设计实验要求:必修一 实验目的通过该课程实习,学会使用数值积分的各种方法求解定积分计算的问题,体会各种方法的精度差异。二 实验内容本实验将梯形法的递推化和龙贝格算法编写为类CIntegration,在工程中调用该类得出积分结果并画出区间二分图像。首先画出被积函数图像,并储存被积函数在图像中每个像素对应的采样点的横坐标(存放于float型指针p_X中)和纵坐标(存放于int型指针p_Y中);然后调用CIntegration类中相应函数,计算积分结果;最后将x轴上的

12、区间二分点与其对应的被积函数值的点连线。CIntegration有公有变量和指针float a,b,h,*x;int n和带参数的构造函数CIntegration:CIntegration(float ma,float mb)a=ma; /a、b分别为积分区间左右端点b=mb;n=1; /区间二分个数h=b-a; /步长x=new floatn+1; /存放区间二分点x0=a;x1=b;另需被积函数float CIntegration:f(float x)float mTemp=sin(x); /可替换为其他函数return mTemp;绘制函数图像时,需要将图像按照比例放大。2.1 梯形法的

13、递推化 梯形法递推化公式为该过程是下列过程的往复循环 求已有各区间中点函数值的和; 求积分值。 区间二分,即更新结点,并将步长减半。要实现该算法过程,需要先编写下面两个函数float CIntegration:Sum(void)/该函数求的值void CIntegration:Divide(void)/该函数实现区间二分和步长更新float *px=new float2*n+1;for(int i=0;in;i+)px2*i=xi;px2*i+1=(xi+xi+1)/2;px2*n=xn;delete x;x=px;n=n*2;h=h/2;为了后面编程的方便,可将单次二分过程写为函数float CIntegration:T1ToT2(float T1)最后,调用T1ToT2,可实现梯形法递推化的函数float CIntegration:Trapezium_Recurrence(float e)在后面的Romberg函数中,还需要用到迭代一定次数的梯形法递推函数float CIntegration:Trapezium_Recurrence(in

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号