1、实验报告 实验项目 插值法 实验日期 2016/9/30 理论内容 Lagrange插值与Newton插值 授课日期 实验室名称 文理管203 微机编号 E1 实验目的及要求: 1、了解多项式差值公式的存在唯一性条件及其余项表达式的推导。 2、了解拉格朗日插值多项式的构造、计算及其基函数的特点,牛顿插值多项式的构造与应用,差商、差分的计算及基本性质。 实验内容: 编写Lagrange插值法及Newton插值法通用子程序,依据数据表 0.32 0.34 0.36 0.314567 0.333487 0.352274 构造一个抛
2、物插值多项式及,计算的近似值并估计误差。
实验步骤及程序:
1、 Lagrange插值公式算法流程图
开始
输入
输出y
结束
Newton插值公式算法流程图
调用函数ChaShang()
返回i阶差商f
调用函数Newton()
I阶差商f=ChaShang(i,X,Y)
temp=1
i 3、
/*拉格朗日插值*/
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[] = new double[n];
for (int i1 = 0; i1 < n; i1++) {//遍历X0
double 4、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 * (X0[i1] - X[i3]) / (X[i2] - X[i3]);
}
}
5、 u = u * Y[i2];
t = t + u;
}
Y0[i1] = t;
}
return Y0;
}
public static void main(String[] args) {
/*输入插值点横纵坐标*/
System.out.println("Input number of interpolation point:");
Scanner scan = new Scanner( 6、System.in);
int m = scan.nextInt();
System.out.println("Input number of test point:");
int n = scan.nextInt();
double X[] = new double[m];
double Y[] = new double[m];
double X0[] = new double[n];
System.out.println("Input the elements of X:");//已知插值点
for (int 7、i = 0; i < m; i++) {
X[i] = scan.nextDouble();
}
System.out.println("Input the elements of Y:");//已知插值点的函数值
for (int i = 0; i < m; i++) {
Y[i] = scan.nextDouble();
}
System.out.println("Input the elements of X0:");//需要求的插值点的横坐标标值
for (in 8、t i = 0; i < n; i++) {
X0[i] = scan.nextDouble();
}
double Y0[] = Lag_method(X, Y, X0);//使用拉格朗日插值法求解得到需求插值点的纵坐标值
System.out.println("拉格朗日插值法求解得:");
for (int i = 0; i < n; i++) {
System.out.println(Y0[i] + " ");
}
System.out.println();
}
}
9、
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.length;
if(k!=k2){
System.out.println("the two vector's lengt 10、h is not equal!");
System.exit(0);
}
for(inti=0;i 11、uble[n];
double[] cp_Y=new double[m];
for(int i1=0;i1 12、])/(X[i2]-X[kk-1]);
}
}
/*求插值结果*/
double temp=cp_Y[0];
for(int i=1;i<=m-1;i++){
double u=1;
intjj=0;
while(jj 13、 temp+=cp_Y[i]*u;
}
Y0[i1]=temp;
}
return Y0;
}
public static void main(String[] args) {
/*输入插值点横纵坐标*/
System.out.println("Input number of interpolation point:");
Scanner scan=new Scanner( 14、System.in);
int m=scan.nextInt();
System.out.println("Input number of test point:");
int n=scan.nextInt();
double X[]=new double[m];
double Y[]=new double[m];
double X0[]=new double[n];
System.out.println("Input the elements of X:");//已知插值点
for(inti=0;i 15、 16、i 17、
结果分析与讨论:
拉格朗日插值法求解得:
0.3303743620375
牛顿法解得
0.3303743620375
1、Lagrange插值法和Newton插值法解决实际问题中关于只提供复杂的离散数据的函数求值问题,通过将所考察的函数简单化,构造关于离散数据实际函数f(x)的近似函数P(x),从而可以计算未知点出的函数值,是插值法的基本思路。
2、实际上Lagrange插值法和Newton插值法是同一种方法的两种变形,其构造拟合函数的思路是相同的,而实验中两个实际问题用两种算法计算出结果是相同的。
3、实验所得结果精确度并不高,一方面是因为所给数据较少,另一方面也 18、是主要方面在Win32中C++中数据类型double精度只有7位,计算机在进行浮点运算时截断运算会导致误差。实际问题中,测量数据也可能导致误差。
4、在解决实际问题中,更多是利用精确且高效的计算机求解。所以解决问题时不仅要构造可求解的算法,更重要是构造合理的可以编写成程序由计算机求解的算法,而算法的优化不仅可以节省时间空间,更能得到更为精确有价值的结果。
实验报告评分标准
评分项目
满分
得分
评分项目
满分
得分
实验步骤及程序
10
运行结果
5
结果分析与讨论
5
合计
20
【本文档内容可以自由复制内容或自由编辑修改内容期待你的好评和关注,我们将会做得更好】
最新范本,供参考!






