您好,欢迎访问三七文档
1实验报告学院(系)名称:姓名学号专业班级实验项目函数插值与数值微分课程名称数值计算方法课程代码实验时间实验地点批改意见:成绩教师签字:实验目的:编写线性插值,抛物插值,拉格朗日插值及数值微分等算法程序,上机调试通过。实验环境:硬件环境: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时的插值函数值。实验步骤:一.拉格朗日插值法实验结果:拉格朗日插值是用插值基函数构造的,下面是拉格朗日插值工式的构造方法:设连续函数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.插值结点的选择nnnxaxaxaaxP2210)(iinyxP)(knknkjjjkjknkknyxxxxyxlxP000)()(2当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.输出运算结果ym7.如果再增加一个已知插值点,即由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]中任一点函数的近似值2120210121012002010212))(())(())(())(())(())(()(yxxxxxxxxyxxxxxxxxyxxxxxxxxxP34.内插比外推精度高。当给定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.456558附录(源程序及运行结果):一.拉格朗日插值法#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]);4y0=(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;}}}运行结果:三.埃特金插值法#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]);}运行结果:
本文标题:数值计算方法实验2
链接地址:https://www.777doc.com/doc-5584715 .html