1、实验报告实验项目插值法实验日期2016/9/30理论内容Lagrange插值与Newton插值授课日期实验室名称文理管203微机编号E1实验目的及要求: 1、了解多项式差值公式的存在唯一性条件及其余项表达式的推导。2、了解拉格朗日插值多项式的构造、计算及其基函数的特点,牛顿插值多项式的构造与应用,差商、差分的计算及基本性质。实验内容:编写Lagrange插值法及Newton插值法通用子程序,依据数据表0.320.340.360.3145670.3334870.352274构造一个抛物插值多项式及,计算的近似值并估计误差。实验步骤及程序:1、 Lagrange插值公式算法流程图开始输入输出y结束
2、Newton插值公式算法流程图调用函数ChaShang()返回i阶差商f调用函数Newton()I阶差商f=ChaShang(i,X,Y)temp=1iX.Sie()返回结果result2、Lagrange插值源程序import java.util.Scanner;/*拉格朗日插值*/public class Lagrange_interpolation /*拉格朗日插值法*/ private static double Lag_method(double X, double Y, double X0) int m = X.length;int n = X0.length; double Y0
3、 = new doublen; for (int i1 = 0; i1 n; i1+) /遍历X0 double t = 0; for (int i2 = 0; i2 m; i2+) /遍历Y double u = 1; for (int i3 = 0; i3 m; i3+) /遍历X if (i2 != i3) u = u * (X0i1 - Xi3) / (Xi2 - Xi3); u = u * Yi2; t = t + u; Y0i1 = t; return Y0; public static void main(String args) /*输入插值点横纵坐标*/System.out.
4、println(Input number of interpolation point:); Scanner scan = new Scanner(System.in);int m = scan.nextInt();System.out.println(Input number of test point:);int n = scan.nextInt(); double X = new doublem; double Y = new doublem; double X0 = new doublen;System.out.println(Input the elements of X:);/已知
5、插值点 for (int i = 0; i m; i+) Xi = scan.nextDouble(); System.out.println(Input the elements of Y:);/已知插值点的函数值 for (int i = 0; i m; i+) Yi = scan.nextDouble(); System.out.println(Input the elements of X0:);/需要求的插值点的横坐标标值 for (int i = 0; i n; i+) X0i = scan.nextDouble(); double Y0 = Lag_method(X, Y, X0
6、);/使用拉格朗日插值法求解得到需求插值点的纵坐标值System.out.println(拉格朗日插值法求解得:); for (int i = 0; i n; i+) System.out.println(Y0i + ); System.out.println(); Newton插值源程序import java.util.Scanner; public class Newton_interpolation /*拷贝向量*/ private static void copy_vector(double from,double to) int k=from.length; int k2=to.le
7、ngth; if(k!=k2) System.out.println(the two vectors length is not equal!); System.exit(0); for(inti=0;ik;i+) toi=fromi; /*牛顿插值法*/ private static double Newton_inter_method(double X,double Y,double X0) int m=X.length; int n=X0.length; double Y0=new doublen; double cp_Y=new doublem; for(int i1=0;i1n;i1
8、+)/遍历X0 double t=0; int j=0; copy_vector(Y, cp_Y); intkk=j; /*求各级均差*/ while(kkm-1) kk=kk+1; for(int i2=kk;i2m;i2+) cp_Yi2=(cp_Yi2-cp_Ykk-1)/(Xi2-Xkk-1); /*求插值结果*/ double temp=cp_Y0; for(int i=1;i=m-1;i+) double u=1; intjj=0; while(jji) u*=(X0i1-Xjj); jj+; temp+=cp_Yi*u; Y0i1=temp; return Y0; public
9、static void main(String args) /*输入插值点横纵坐标*/System.out.println(Input number of interpolation point:); Scanner scan=new Scanner(System.in); int m=scan.nextInt(); System.out.println(Input number of test point:); int n=scan.nextInt(); double X=new doublem; double Y=new doublem; double X0=new doublen; Sy
10、stem.out.println(Input the elements of X:);/已知插值点 for(inti=0;im;i+) Xi=scan.nextDouble(); System.out.println(Input the elements of Y:);/已知插值点的函数值 for(inti=0;im;i+) Yi=scan.nextDouble(); System.out.println(Input the elements of X0:);/需要求的插值点的横坐标标值 for(inti=0;in;i+) X0i=scan.nextDouble(); double Y0 =N
11、ewton_inter_method(X, Y, X0);/使用拉格朗日插值法求解得到需求插值点的纵坐标值System.out.println(拉格朗日插值法求解得:); for (int i = 0; i n; i+) System.out.println(Y0i + ); System.out.println(); 结果分析与讨论:拉格朗日插值法求解得:0.3303743620375牛顿法解得0.33037436203751、Lagrange插值法和Newton插值法解决实际问题中关于只提供复杂的离散数据的函数求值问题,通过将所考察的函数简单化,构造关于离散数据实际函数f(x)的近似函数P
12、(x),从而可以计算未知点出的函数值,是插值法的基本思路。2、实际上Lagrange插值法和Newton插值法是同一种方法的两种变形,其构造拟合函数的思路是相同的,而实验中两个实际问题用两种算法计算出结果是相同的。3、实验所得结果精确度并不高,一方面是因为所给数据较少,另一方面也是主要方面在Win32中C+中数据类型double精度只有7位,计算机在进行浮点运算时截断运算会导致误差。实际问题中,测量数据也可能导致误差。4、在解决实际问题中,更多是利用精确且高效的计算机求解。所以解决问题时不仅要构造可求解的算法,更重要是构造合理的可以编写成程序由计算机求解的算法,而算法的优化不仅可以节省时间空间,更能得到更为精确有价值的结果。实验报告评分标准评分项目满分得分评分项目满分得分实验步骤及程序10运行结果5结果分析与讨论5合计20【本文档内容可以自由复制内容或自由编辑修改内容期待你的好评和关注,我们将会做得更好】最新范本,供参考!
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100