2022年数值分析实验报告.pdf
武汉理工大学学 生 实 验 报 告 书实验课程名称数值分析开 课 学 院计算机科学与技术学院指导老师姓名学 生 姓 名学生专业班级20102010 学年第一学期学生学号实验课成绩精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 10 页 - - - - - - - - - - 实验课程名称:数值分析实验项目名称实验成绩实验者专业班级组别同组者实验日期年月日第一部分:实验分析与设计(可加页)一、实验内容描述(问题域描述)1、 分别画出Lagrange 插值公式、 Newton 插值公式、分段插值公式和Hermite 插值公式的算法流程图2、 分别用 Lagrange 插值公式和Newton 插值公式通过编程计算函数f(x)的近似值已知对于 f(x)=ex, 有数据表如下:xi0f(xi)(1) 对 x0=0,x1=利用线性插值计算f 的近似值; 对 x0=,x1=1 利用线性插值计算f 的近似值;(2) 对 x0=0,x1=,x2=2 利用二次插值计算f 和 f 的近似值(3) 对 x0=0,x1=,x2=2 求 f(x)的 Hermite 插值多项式H5(x) ;(4) 分析和比较各插值算法的精度差异3、 通过编程计算函数f(x) 的近似值。已知对于f(x)= ,有数据表如下:xif(xi)(1) 计算各阶插值多项式在不同点的值:f,f,f;(2) 利用分段线性插直和分段抛物插值计算(1) 中的函数值;(3) 分析和比较算法的效率差异和精度差异(同时注意插值点的位置与精度之间的关系)。4、用不同方式方法编程给出计算Langrange 插值和 Newton 插值的算法, 分析和比较两种算法的编程难易以及算法的效率差异总计算量之间的关系。5、写出实习报告二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 2 页,共 10 页 - - - - - - - - - - 辑或者算法描述)【拉格朗日插值法算法流程图】【牛顿插值法算法流程图】【分段插值法算法流程图】精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 3 页,共 10 页 - - - - - - - - - - 【艾尔米特插值法算法流程图】【拉格朗日插值法源程序】#includeusing namespace std;int main() cout请输入坐标点个数:count; double point1002; int count1=0; cout请输入坐标: endl; while(count1pointcount10pointcount11; count1+; cout计算 f(x) 请输入 x:x; double f=0,Lu=1; for(int i=0;icount;i+)精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 4 页,共 10 页 - - - - - - - - - - for(int j=0;jcount;j+) if(j=i)continue; Lu=Lu*(x-pointj0)/(pointi0-pointj0); Lu=Lu*pointi1; f=f+Lu; Lu=1; coutf(x)的值为: fendl; return 0;【牛顿插值法源程序】#includeusing namespace std;int main() cout请输入坐标点个数:count; double point1002; int count1=0; cout请输入坐标: endl; while(count1pointcount10pointcount11;count1+; cout计算 f(x) 请输入 x:x; double d100; for(int i=0;icount;i+) di=pointi1;精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 5 页,共 10 页 - - - - - - - - - - for(int j=1;j=j;i-) di=(di-di-1)/(pointi0-pointi-j0); double f=d0,Lu=1,L; for(i=1;icount;i+) Lu=Lu*(x-pointi-10); L=Lu*di; f=f+L; coutf(x)的值为: fendl; return 0;【埃米尔特插值法源程序】#includeusing namespace std;struct pointdouble x;double y;double d;point100;int main() cout请输入坐标点个数:count; int count1=0; cout请依次输入坐标的横纵坐标和对应的导数:endl; while(count1pointcount1.xpointcount1.ypointcount1.d; count1+; 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 6 页,共 10 页 - - - - - - - - - - cout计算 f(x) 请输入 x:x; double f=0,Lu=1,Laa=0,La,Lb; for(int i=0;icount;i+) for(int j=0;jcount;j+) if(j=i)continue; Lu=Lu*(x-pointj.x)/(pointi.x-pointj.x); Laa=Laa+(pointi.x-pointj.x); La=pointi.y*(1-2*(x-pointi.x)*Laa)*Lu*Lu; Lb=pointi.d*(x-pointi.x)*Lu*Lu; f=f+La+Lb; Lu=1; Laa=0; coutf(x)的值为: fendl; return 0;三、主要仪器设备及耗材1PC机2开发环境(比如:VC ,Eclipse)精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 7 页,共 10 页 - - - - - - - - - - 第二部分:实验调试与结果分析(可加页)一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)(1)用拉格朗日插值法计算时,输入及运行结果如下:拉格朗日插值法牛顿插值法(2)利用二次插值计算时,输入及运行结果如下:拉格朗日插值法牛顿插值法(3)用艾尔米特插值法计算时,f(x)的插值多项式H5(x)=(1+4*x)*(x-2)*(x-2)+(4)各插值算法的精度差异比较经过比较,拉格朗日插值法要比牛顿插值法算法的计算量多一些,拉格朗日插值法后一次计算时用到了前一次计算的结果,提高了运算的效率,但拉格朗日插值法在构造艾尔米特插值法时很方便,将坐标点和对应的导数结合起来的精度比线性插值的精度又要高一些。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 8 页,共 10 页 - - - - - - - - - - 但从实验数据来看,在坐标不是很多的情况下,已知的点越多精度也就相对较高。对于实验要求的第二组数据用拉格朗日插值法(或者牛顿插值法)实验结果如下:一下分别是二阶、三阶、四阶、五阶插值得到的结果以上只是实验结果的一部分,改变插值的位置时,得到的实验结果精度也是有所不同的。由以上结果分析可知,插值次数并不是越多越好,多了反而会让结果更加偏离真实结果,这充分说明了高次插值存在“病态性质” ,在已知点很多的情况下应该采用分段低次插值,将拉格朗日插值法和牛顿插值法运用到分段低次插值法当中,这样得到的结果可能胡更加精确。对于分段低次插值本实验没有给出实验结果,但从实践上来看,分段低次插值的精度要比线性插值精度高,但当插值阶数比较少的时候没有必要采用分段低次插值。二、实验小结、建议及体会各种插值法都有自己的利与弊,拉格朗日插值法运算过程相对复杂,但当和导数结合起来,组成抛物插值的时候,精度就可以提高很多。牛顿插值法、拉格朗日插值法等线性插值法只能适合在已知点不多的情况下使用,当已知的坐标点很多时候应该将区间分成小段进行分段线性插值或者分段抛物插值。采用组合的思想是数值分析常用的思想和技巧之一,单个的方法得到的结果虽然不是很理想,但将多个方法按照某种方式结合在一起就能改进实验方法,我们应该触类旁通,在以后的学习中学会使用这种思精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 9 页,共 10 页 - - - - - - - - - - 想。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 10 页,共 10 页 - - - - - - - - - -