实验1拉格朗日插值与牛顿插值

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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语言实现两种算法的方法,为深入学习打下坚实基础。

实验结果如下图所示:

图①拉格朗日插值法运算结果

相关文档
最新文档