Lagrange插值及Newton插值.docx
《Lagrange插值及Newton插值.docx》由会员分享,可在线阅读,更多相关《Lagrange插值及Newton插值.docx(9页珍藏版)》请在冰豆网上搜索。
Lagrange插值及Newton插值
实验报告
实验项目
插值法
实验日期
2016/9/30
理论内容
Lagrange插值与Newton插值
授课日期
实验室名称
文理管203
微机编号
E1
实验目的及要求:
1、了解多项式差值公式的存在唯一性条件及其余项表达式的推导。
2、了解拉格朗日插值多项式的构造、计算及其基函数的特点,牛顿插值多项式的构造与应用,差商、差分的计算及基本性质。
实验内容:
编与Lagrange插值法及Newton插值法通用子程序,依据数据表
Xi
0.32
0.34
0.36
sinxi
0.314567
0.333487
0.352274
构造一个抛物插值多项式P2(x)及N2(x),计算sinO.3367的近似值并估计误差。
实验步骤及程序:
1、
Lagrange插值公式算法流程图
开始
输入.二」二丿…冲
0=
ny
0=
=>k
—气
t=^t
\-xj
1=0j****k-ljk+1/-fn
输出y
结束
k+Ink
2、Lagrange插值源程序
importjava.util.Scanner;
/*拉格朗日插值*/
publicclassLagrange_interpolation{
/*拉格朗日插值法*/
privatestaticdouble[]Lag_method(doubleX[],doubleY[],doubleX0[]){intm=X.length;
intn=X0.length;
doubleY0[]=newdouble[n];
for(inti1=0;i1doublet=0;
for(inti2=0;i2doubleu=1;
for(inti3=0;i3if(i2!
=i3){
u=u*(X0[i1]-X[i3])/(X[i2]-X[i3]);
}
}
u=u*Y[i2];
t=t+u;
}
Y0[i1]=t;
}
returnY0;
}
publicstaticvoidmain(String[]args){
/*输入插值点横纵坐标*/
System.out.println("Inputnumberofinterpolationpoint:
");
Scannerscan=newScanner(System.in);
intm=scan.nextInt();
System.out.println("Inputnumberoftestpoint:
");
intn=scan.nextInt();
doubleX[]=newdouble[m];
doubleY[]=newdouble[m];
doubleX0[]=newdouble[n];
System.out.println("lnputtheelementsofX:
");〃已知插值点
for(inti=0;iX[i]=sean.nextDouble();
}
System.out.println("InputtheelementsofY:
");〃已知插值点的函数值
for(inti=0;iY[i]=sean.nextDouble();
}
System.out.println("InputtheelementsofX0:
");〃需要求的插值点的横坐标标值
for(inti=0;iX0[i]=scan.nextDouble();
}
doubleY0[]=Lag_method(X,Y,X0);〃使用拉格朗日插值法求解得到需求插值点的纵坐标值
System.out.println("拉格朗日插值法求解得:
");
for(inti=0;iSystem.out.println(Y0[i]+"");
}
System.out.println();
}
}
Newton插值源程序
importjava.util.Scanner;
publicclassNewton_interpolation{
/*拷贝向量*/
privatestaticvoidcopy_vector(doublefrom[],doubleto[]){
intk=from.length;
intk2=to.length;
if(k!
=k2){
System.out.println("thetwovector'slengthisnotequal!
");
System.exit(O);
}
for(inti=O;ito[i]=from[i];
}
}
doubleX0[]){
/*牛顿插值法*/
privatestaticdouble[]Newton_inter_method(double[]X,double[]Yintm=X.length;
intn=X0.length;
double[]Y0=newdouble[n];
double[]cp_Y=newdouble[m];
for(inti1=0;i1doublet=0;
intj=0;
copy_vector(Y,cp_Y);
intkk=j;
/*求各级均差*/
while(kkkk=kk+1;
for(inti2=kk;i2cp_Y[i2]=(cp_Y[i2]-cp_Y[kk-1])/(X[i2]-X[kk-1]);
}
}
/*求插值结果*/
doubletemp=cp_Y[0];
for(inti=1;i<=m-1;i++){
doubleu=1;
intjj=O;
while(jj
u*=(XO[i1]-X[jj]);
jj++;
}
temp+=cp_Y[i]*u;
}
Y0[i1]=temp;
}
returnY0;
}
publicstaticvoidmain(String[]args){
/*输入插值点横纵坐标*/
System.out.println("lnputnumberofinterpolationpoint:
");
Scannerscan=newScanner(System.in);
intm=scan.nextInt();
System.out.println("lnputnumberoftestpoint:
");
intn=scan.nextInt();
doubleX[]=newdouble[m];
doubleY[]=newdouble[m];
doubleX0[]=newdouble[n];
System.out.println("InputtheelementsofX:
");〃已知插值点
for(inti=0;iX[i]=scan.nextDouble();
}
System.out.println("lnputtheelementsofY:
");〃已知插值点的函数值
for(inti=0;iY[i]=scan.nextDouble();
}
System.out.println("lnputtheelementsofX0:
");〃需要求的插值点的横坐标标值
for(inti=O;iX0[i]=scan.nextDouble();
}
doubleY0[]=Newton」nter_method(X,Y,X0);〃使用拉格朗日插值法求解得到需
求插值点的纵坐标值
System.out.println("拉格朗日插值法求解得:
");
for(inti=0;iSystem.out.println(Y0[i]+"");
}
System.out.println();
}
}
结果分析与讨论:
拉格朗日插值法求解得
0.3303743620375
牛顿法解得
0.3303743620375
1、Lagrange插值法和Newton插值法解决实际问题中关于只提供复杂的离散数据的函数求值问题,通过将所考察的函数简单化,构造关于离散数据实际函数f(x)的近似函数P(x),从而可以计算未知点
岀的函数值,是插值法的基本思路。
2、实际上Lagrange插值法和Newton插值法是同一种方法的两种变形,其构造拟合函数的思路是相同的,而实验中两个实际问题用两种算法计算出结果是相同的。
3、实验所得结果精确度并不高,一方面是因为所给数据较少,另一方面也是主要方面在Win32中C++中数据类型double精度只有7位,计算机在进行浮点运算时截断运算会导致误差。
实际问题中,测量
数据也可能导致误差。
4、在解决实际问题中,更多是利用精确且高效的计算机求解。
所以解决问题时不仅要构造可求解的算法,更重要是构造合理的可以编写成程序由计算机求解的算法,而算法的优化不仅可以节省时间空间,更能得到更为精确有价值的结果。
实验报告评分标准
评分项目
满分
得分
评分项目
满分
得分
实验步骤及程序
10
运行结果
5
结果分析与讨论
5
合计
20
【本文档内容可以自由复制内容或自由编辑修改内容期待
你的好评和关注,我们将会做得更好】