实验1拉格朗日插值与牛顿插值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数学与计算机学院上机实践报告
课程名称:计算方法A年级:上机实践成绩:
指导教师:姓名:
上机实践名称:拉格朗日插值和牛顿插值法学号:上机实践日期:
上机实践编号:1上机实践时间:
一、目的
1.通过本实验加深对拉格朗日插值和牛顿插值法构造过程的理解;
2.能对上述两种插值法提出正确的算法描述编程实现。
二、内容与设计思想
自选插值问题,编制一个程序,分别用拉格朗日插值法和牛顿插值法求解某点的函数近似值。(从课件或教材习题中选题)
已知y=f(
三、使用环境
操作系统:windows XP
软件环境:Microsoft Visual C++6.0
四、核心代码及调试过程
(一) 拉格朗日插值法:
lude
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
#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 { 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语言实现两种算法的方法,为深入学习打下坚实基础。 实验结果如下图所示: 图①拉格朗日插值法运算结果