计算方法编程作业1-拉格朗日插值与牛顿插值

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

西华大学计算机系学生上机实践报告第1页共4页西华数学与计算机学院上机实践报告课程名称:计算方法年级:2012级上机实践成绩:指导教师:严常龙姓名:贺容英上机实践名称:拉格朗日插值和牛顿插值法学号:上机实践日期:yyyy.mm.dd上机实践编号:1312012070102209上机实践时间:2014.10.27一、目的1.通过本实验加深对拉格朗日插值和牛顿插值法构造过程的理解;2.能对上述两种插值法提出正确的算法描述编程实现。二、内容与设计思想自选插值问题,编制一个程序,分别用拉格朗日插值法和牛顿插值法求解某点的函数近似值。(从课件或教材习题中选题)已知y=f(x)的数据表如下,求t=0.63处的函数值z=f(t)。ixiyiixiyi10.100.90483760.570.56552520.150.86070870.700.49658530.250.77880180.850.42741540.400.67032090.930.39455450.500.606531101.000.367879三、使用环境操作系统:win7软件环境:vs2012四、核心代码及调试过程4.1核心代码1、拉格朗日插值法代码如下doublelagrangesf(pointpoints[],intt){intn=t;inti,j;doublex,tmp=1,lagrange=0;printf(请输入需要计算的x的值:);scanf(%lf,&x);for(i=0;i=n-1;i++){tmp=1;for(j=0;j=n-1;j++){西华大学计算机系学生上机实践报告第2页共4页if(j!=i)tmp=tmp*(x-points[j].x)/(points[i].x-points[j].x);}lagrange=lagrange+tmp*points[i].y;}printf(lagrange(%lf)=%lf\n,x,lagrange);return0;}2、牛顿插值法代码如下doublenewtonsf(pointpoints[],intt){intn=t;inti,j;doubled[maxt+1];doublex,tmp,newton=0;printf(差商表\n);printf(***************************************************\n);printf(x);for(i=0;i=n-1;i++){printf(%lf,points[i].x);}printf(\n);printf(y);for(i=0;i=n-1;i++){d[i]=points[i].y;printf(%lf,points[i].y);}printf(\n);for(i=0;in-1;i++){printf(%d阶差商,i+1);for(intt=1;t=i+12;t++)printf();for(j=n-1;ji;j--){d[j]=(d[j]-d[j-1])/(points[j].x-points[j-i-1].x);//计算差商printf(%lf,d[j]);}printf(\n);}printf(***************************************************\n);printf(请输入需要计算的x的值:);scanf(%lf,&x);tmp=1;newton=d[0];for(i=0;in-1;i++){西华大学计算机系学生上机实践报告第3页共4页tmp=tmp*(x-points[i].x);newton=newton+tmp*d[i+1];}printf(newton(%lf)=%lf\n,x,newton);return0;}3、主函数中负责输入被插值点的输入,以及拉格朗日插值法和牛顿插值法的调用,代码如下intn=0;inti,j;pointpoints[maxt+1];doublex,tmp=0,lagrange=0;do{printf(请输入被插值点数目:);scanf(%d,&n);if(nmaxt){printf(被插值点数超出范围%d,maxt);return0;}}while(n=0);printf(请输入被插值点:\n);for(i=0;i=n-1;i++){scanf(%lf%lf,&points[i].x,&points[i].y);}printf(lagrange插值\n);lagrangesf(points,n);printf(newton插值\n);newtonsf(points,n);system(pause);4.2、调试过程1、在拉格朗日插值法调试过程中,累乘过程中用来承载累乘的tmp没有重新赋值为1,导致结果始终不正确。for(i=0;i=n-1;i++){tmp=1;for(j=0;j=n-1;j++){还有在调用传值时,没有传被插值点数目,导致传过去的point结构体读不出值。printf(lagrange插值\n);lagrangesf(points,n);printf(newton插值\n);newtonsf(points,n);在方法体中错写成“intn=0”,所以point结构体读不出值。应是“intn=t”,t为传过来的被插值点数目。2、调试结果:西华大学计算机系学生上机实践报告第4页共4页拉格朗日插值法t=0.63时,值为0.532488;牛顿插值法t=0.63时,值为0.532488。五、总结使用这两种插值法都可以近似求出t=0.63时的函数值,从结果来看拉格朗日插值法和牛顿插值法结果没有差别,但从理论来说是有的,并且牛顿插值法会精确些,可以多保留小数点位数再来观察结果就会有差别。六、附录1、点结构体#definemaxt20typedefstructpoint{doublex,y;}point;2、调试结果图

1 / 4
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功