资源描述:
《c++实现牛顿插值法实验报告》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、用Newton商差公式进行插值姓名:陈辉学号:13349006院系:数据科学与计算机学院专业:计算机科学与技术班级:计科-班日期:2015-10-11指导老师:纪庆革目录一、实验目的3二、实验题目3三、实验原理与基础理论3四、实验内容6五、实验结果10六、心得体会14七、参考资料14八、附录(源代码)14一、实验冃的编写一个程序,用牛顿差商公式进行插值。二、实验题目编写一个程序,用牛顿差商公式进行插值。三、实验原理与基础理论牛顿插值公式为:NnM=fM+/[Xo^iK%一%0)+…+f[xOf...,xn](x一%0)…(
2、X-Xn_!)其中,丫]_(衍)-心)/00*兀1」一衍-%0耐]/!巾…耳]一门兀0,・・・,尢订f[xQf...9xk=Xk—尤0我们将从键盘读入n阶牛顿插值的n+1个节点、=0,1,以此得出牛顿插值多项式。有了节点,我们只需要求亢勺,…,冷]即可。我们记f[xmf...,s订为t[m][k],则t[m][k]在差商表表的位置为(m,k):mk012•••n0/(%o)2心)f[xlfx0]3心)f込衍]f[x2txlfx0]••••・•・••••••••nf[^n>兀n-l]f氏p^n-2]・••f[兀?V…>X
3、°]由fRo,…,g]的公式可得t[m][k]=[t[m][k-l]-t[m-l][k-l])/(x[i]直观上来看,表中的某格的差商值口J由其左边和左上边的值求得,从而牛顿插值多项式变为N(x)=t[0][0]+t[l][l](x-x[O])+…+t[n][n](x-x[O])...(x-x[n-l])做到这一步,我们已经可以通过上面的数据计算对于给出的x,f(x)的近似值。为了更规范地表示,下面我把N(x)变换成标准的降幕多项式N(x)二a[n]xAn+a[n-l]xA(n-l)+...+a[2]xA2+a[l]x+a
4、[0]o为了便于运算,不妨先把x・x[i]中的减号换成加号(在最后令y[i]=-x[i],在令x[i]=y[i],仍可以得到原本的结果),那么有:(%+x[O])(x+x[l])...(%+x[m—1])m-1=xm+xm_1》x[i]i=0+xm~2》x[i[O]]x[i[l]+…+x°》x[i[O]]x[i[l]]...x[i[m—1]]为了便于表示,把》x[t[O]]x[i[l]]...%i[k—1]]记为m那么(%+x[O])(x+x[l])...(%+x[m—1])只要把N(x)中的每一项展开然后x次数相同的系数
5、相加就可以得到数组ao于是可以列出下表:x[0]x[l]■••x[k]•••x[n-l]x[n]t[0]10000t[l]11000t[2]22000・••t[k]》x[n—k]n_k》x[n—k—1]n-k10•・••••••■•・••••t[n-l]x[n—1]n-1^x[n—2]n-1•••^x[n-k—1]n-1•••10t[n]》x[n]n》x[n—1]n■••》x[n—k]n•••»[1]n1表中x[i]列的和就是N(x)中a[i]的值,下面就来求这个和,记c[g][h]=工x[i[0]]...x[i[h-l]
6、=^x[h]c[g][h]的意义为g个数屮所冇h个数乘积Z和,可以由g-1个数中所冇h-1个数乘积Z和,和g-1个数中所有h个数乘积Z和求得,递推公式为c[g][h]=c[g-l][h-l]x[i[h]]+c[g-l][h]o由c[g][h]的意义可以得到递推的边界状态为c[i][0]=x[0]+...+x[i],c[i][i]=x[0]...x[i]o于是我们又可以得到一张数组C的表(初始状态):ij01•■■k•・•n0x[0]1x[0]+x[l]x[0]x[l]・••••••••kk》冰]t=lkt=l•・••・
7、•nnt=lnt=l表的左下角每个空格都可以由其上血的和左上边的格中的值求;II。这样,所需要求的所有值都已经得到,只需要通过简单的循环结构就可以算出数组a,从而得到一个降幕的多项式。四、实验内容实验环境:MacOSXYosemite,SublimeText2,Xcode,CMD实验步骤:我用一个类封装牛顿插值算法:678901234567890111122222222223private:intn;doublex[20]rf[20]ra[20],c[20][20]fy[20];doublet[20][20];//Divi
8、dedDifferenceTablepublic:Ne^onlnterpolation();voidInterpolation。;voidInput();voidMakeTableO;doubleDividedDifference(doubleflrdoublef0rdoublexlrdoublex0)