数学与计算机学院上机实践报告
课程名称:计算方法A年级:上机实践成绩:
指导教师:姓名:
上机实践名称:拉格朗日插值和牛顿插值法学号:上机实践日期:
上机实践编号:1上机实践时间:
一、目的
1.通过本实验加深对拉格朗日插值和牛顿插值法构造过程的理解;
2.能对上述两种插值法提出正确的算法描述编程实现。
二、内容与设计思想
自选插值问题,编制一个程序,分别用拉格朗日插值法和牛顿插值法求解某点的函数近似值。
(从课件或教材习题中选题)
已知y=f(
三、使用环境
操作系统:windows XP
软件环境:Microsoft Visual C++6.0
四、核心代码及调试过程
(一) 拉格朗日插值法:
lude<stdio.h>
double product(double *p,double newx,int k,int n);
main()
{
/*divisor,dividend
double x[10]={0.10,0.15,0.25,0.40,0.50,0.57,0.70,0.85,0.93,1.00};
double newx[3]={0.45,0.6,0.80},divisor,dividend,quotient,result;
double
y[10]={0.904837,0.860708,0.778801,0.670320,0.606531,0.565525,0.496585,0.427415,0.394554;
int i,th;
for(th=0;th<3;th++)
{
result=0;
for(i=0;i<10;i++)
{
dividend=product(x,newx[th],i,9);
divisor=product(x,x[i],i,9);
quotient=dividend/divisor;
result+=quotient*y[i];
}
printf("%lf处的近似值为%lf\n",newx[th],result);
}
}
double product(double *p,double newx,int k,int n)
{
int cycle_times;
double result=1;
for(cycle_times=0;cycle_times<=n;cycle_times++)
if(cycle_times!=k)
result=result*(newx-p[cycle_times]);
return result;
}
(二)牛顿插值法:
#include<stdio.h>
#define total_points 10
void fill_in_the_blank(double *p,int x,int y);
double newton(double (*p)[total_points+1],double newx);
main()
{
double table[total_points][total_points+1], newx;
int x,y;
printf("Please notice (x,y) is from (x1,y1) to (x%d,y%d)!\n",total_points,total_points); for(x=0;x<total_points;x++)
{
printf("input (x%d,y%d):",x+1,x+1);
scanf("%lf%lf",&table[x][0],&table[x][1]);
}
for(y=2;y<=total_points+1;y++)
{
for(x=1;x<=total_points;x++)
if(x+2>y)
fill_in_the_blank(table,x,y);
}
printf("input a number you want to calculate:");
scanf("%lf",&newx);
printf(" the result is:%lf\n",newton(table,newx));
}
void fill_in_the_blank(double (*p)[total_points+1],int x,int y)
{
double diff_up,diff_down;
diff_up=*(*(p+x)+y-1)-*(*(p+x-1)+y-1);
diff_down=*(*(p+x))-*(*(p+x-y+1));
*(*(p+x)+y)=diff_up/diff_down;
}
double newton(double (*p)[total_points+1],double newx)
{
double result=*(*p+1),mid;
int k,i;
for(k=1;k<=total_points;k++)
{
mid=1;
for(i=0;i<=k-1;i++)
mid*=(newx-*(*(p+i)));
mid*=*(*(p+k)+k+1);
result+=mid;
}
return result;
}
五、总结
本次实验利用两种插值方法进行计算,计算结果均正确,通过本次实验加深了对拉格朗日插值和牛顿插值法构造过程的理解,掌握了利用C语言实现两种算法的方法,为深入学习打下坚实基础。
实验结果如下图所示:
图①拉格朗日插值法运算结果
图②牛顿插值法运算结果六、附录。