1实验报告学院(系)名称:姓名学号20125540专业计算机科学与技术班级2012级1班实验项目实验二函数插值课程名称数值计算方法课程代码0665026实验时间2015年6月4日第5-6节实验地点7-215批改意见:成绩教师签字:实验目的:编写线性插值,抛物插值,拉格朗日插值及数值微分等算法程序,上机调试通过。实验环境:硬件环境:IBM-PC或兼容机软件环境:Windows操作系统编程语言:C语言实验内容:一.输入n值,x,以及(xi,yi),i=0,1,…,n,构造拉格朗日插值多项式计算f(x)的值已知列表函数,求当x=0.472时的插值函数值Pn(x):xi0.460.470.480.49yi0.4846550.4937450.5027500.511668二.使用分段抛物线插值方法计算插值点x的函数值已知列表函数,求当t=0.57891时的函数值:xi0.40.50.60.70.8yi0.389420.479430.564640.644220.71736三.用埃特金算法计算插值点函数值已知部分插值表,取插值点个数m=5x0.30.40.50.60.7y0.298500.396460.493110.588130.68122求当x=0.462时的插值函数值。实验步骤:一.拉格朗日插值法实验结果:2拉格朗日插值是用插值基函数构造的,下面是拉格朗日插值工式的构造方法:设连续函数y=f(x)在[a,b]上给定n+1个不同结点:x0,x1,…,xn,分别取函数值y0,y1,…,yn,其中yi=f(xi)i=0,1,2,…,n构造一个次数不超过n的插值多项式:使之满足条件即得Pn(x)的表达式:拉格朗日插值法流程图:二.分段抛物线插值法1.插值结点的选择当x靠近xk-1,即|x-xk-1|≤|x-xk|时,我们补选xk-2为结点,令公式中的下标i=k-1;反之,当x靠近xk时,即|x-xk-1||x-xk|时,则补选xk+1作为结点,而令i=k。当x靠近表头,即x≤x1时,自然取x0,x1,x2作为结点,而令i=1当x靠近表尾,即xxn-1时,则取i=n-12.用已经选好的插值点进行抛物线插值抛物线插值公式:分段抛物线插值法流程图:三.埃特金插值法1.输入已知n组插值点x与相应的函数值y2.输入待求点R的值及所选取插值点的个数m3.确定待求插值点R在m个插值点中尽量剧中的位置4.在m个插值点中,分别对R进行线性插值,得到m-1个新的插值函数值y5.以上一轮计算的结果作为下一轮计算的初始值,进行反复插值迭代计算。直到进行m-1轮迭代计算之后,以最后得到的最新插值函数ym,作为埃特金插值法的结果。6.输出运算结果ymnnnxaxaxaaxP2210)(iinyxP)(knknkjjjkjknkknyxxxxyxlxP000)()(2120210121012002010212))(())(())(())(())(())(()(yxxxxxxxxyxxxxxxxxyxxxxxxxxxP37.如果再增加一个已知插值点,即由m个点变为m+1个点时,只进行最后一组插值的线性插值计算,所得其精度稍高埃特金插值法流程图:实验结果:一.拉格朗日插值法1.插值多项式P(x)只与数据xi,f(xi)有关,与节点排列顺序无关,与f(x)无关,但余项R(x)与f(x)有关2.f(x)是次数不超过n次的多项式,取n+1个节点插值时,插值多项式就是其自身基函数之和为13.n+1个节点的插值多项式不超过n次,不超过n+1项,可求插值区间[a,b]中任一点函数的近似值4.内插比外推精度高。当给定m个点,取n+1个节点(n+1≤m)作插值多项式,求x点的函数值时,n+1个节点取尽可能靠近x时,余项小,近似程度好5.当节点数变化时,需重新计算全部基函数,因基函数和每一个节点有关6.n=1时是线性插值,n=2时是抛物线插值输入各个插值点的值后,运行程序输出0.495553二.分段抛物线插值法输入各个插值点的值后,通过程序选取离所求点最近的三个点作为抛物线插值的插值点,运行程序后输出:0.547138三.埃特金插值法1.埃特金算法的特点2.插值的反复线性组合3.插值结果含在插值过程中4.继续提高计算精度5.选取m个插值结点的要求输入各个插值点后,运行程序输出0.4565584附录(源程序及运行结果):一.拉格朗日插值法#includestdio.h#includemath.h#defineMAX100voidmain(){intn,k=0,j=0;doublex[MAX],y[MAX],x0,y0=0;printf(请输入节点个数n:);scanf(%d,&n);printf(请输入节点值(x,y):);for(inti=0;in;i++)scanf(%lf,%lf,&x[i],&y[i]);printf(输入所求节点的x的值:);scanf(%lf,&x0);while(k!=n){doublet=1;for(intj=0;jn;j++)if((j!=k))t=(x0-x[j])/(x[k]-x[j])*t;y0=y0+t*y[k];k++;}printf(使用拉格朗日插值法输出x的y值为:%lf\n,y0);}运行结果:二.分段抛物线插值法#includestdio.h#includemath.h#defineMAX20voidY(doublex[],doubley[],doublex0,inti){doubley0;printf(选取的节点为(%lf,%lf)(%lf,%lf)(%lf,%lf)\n,x[i-1],y[i-1],x[i],y[i],x[i+1],y[i+1]);y0=(x0-x[i])*(x0-x[i+1])*y[i-1]/(x[i-1]-x[i])/(x[i-1]-x[i+1])+(x0-x[i-1])*(x0-x[i+1])*y[i]/(x[i]-x[i-1])/(x[i]-x[i+1])+(x0-x[i-1])*(x0-x[i])*y[i+1]/(x[i+1]-x[i-1])/(x[i+1]-x[i]);printf(使用分段抛物线插值输出结果为:%lf\n,y0);}voidmain(){intn,i;doublex[MAX],y[MAX],x0,y0=0;printf(请输入节点个数n:);scanf(%d,&n);printf(请输入节点值(x,y):);for(i=1;i=n;i++)scanf(%lf,%lf,&x[i],&y[i]);printf(输入所求节点的x的值:);scanf(%lf,&x0);if(x0=x[1]){i=2;Y(x,y,x0,i);}if(x0=x[n]){i=n-1;Y(x,y,x0,i);}for(i=2;i=n;i++){if(x0=x[i]){if(fabs(x0-x[i-1])=fabs(x0-x[i]))i=i-1;Y(x,y,x0,i);break;}}}运行结果:5三.埃特金插值法#includestdio.h#includemath.h#defineMAX100voidmain(){intn,k=0;doublex[MAX],y[MAX],x0,y0=0;printf(请输入节点个数n:);scanf(%d,&n);printf(请输入节点值(x,y):);for(inti=0;in;i++){scanf(%lf,%lf,&x[i],&y[i]);}printf(输入所求节点的x的值:);scanf(%lf,&x0);while(k!=n){for(inti=k;in;i++)y[i]=(x0-x[k-1])/(x[i]-x[k-1])*y[i]+(x0-x[i])/(x[k-1]-x[i])*y[k-1];k++;}printf(用埃特金插值法输出:%lf\n,y[n-1]);}运行结果: