1课程实验报告课程名称:计算方法计算机科学与技术学院2目录实验一Lagrange插值1实验内容与要求..............................................32公式与算法描述..............................................33程序源码....................................................44实验结果....................................................55实验小结....................................................5实验二牛顿插值1实验内容与要求..............................................52公式与算法描述..............................................63程序源码....................................................64实验结果....................................................75实验小结....................................................7实验三复化SIMPSON公式1实验内容与要求..............................................82公式与算法描述..............................................83程序源码....................................................84实验结果...................................................105实验小结...................................................10实验四变步长梯形法1实验内容与要求.............................................102公式与算法描述.............................................113程序源码...................................................114实验结果...................................................135实验小结...................................................133实验一、Lagrange插值1.实验内容与要求利用三次Lagrange插值多项式计算函数值,编写C程序实现其功能。已知函数表如下:Xi0.561600.562800.564010.56521Yi0.827410.826590.825770.82495试用lagrange插值多项式求X=0.5635时的函数值。2.公式与算法描述Lagrange插值基函数0,()njijjiijxxlxxxLagrange插值公式00,()()nnjniijjiijxxpxyxx↓↓↓↓开始输入已知点个数n输出结果输入已知点的X坐标以及输入已知点的Y坐标调用函数lagrange函数43程序源码#includeiostream#includeconio.h#includemalloc.hfloatlagrange(float*x,float*y,floatxx,intn)/*拉格朗日插值算法*/{inti,j;float*a,yy=0.0;/*a作为临时变量,记录拉格朗日插值多项式*/a=(float*)malloc(n*sizeof(float));for(i=0;i=n-1;i++){a[i]=y[i];for(j=0;j=n-1;j++)if(j!=i)a[i]*=(xx-x[j])/(x[i]-x[j]);yy+=a[i];}free(a);returnyy;}intmain(){inti;intn;floatx[20],y[20],xx,yy;printf(Inputn:);scanf(%d,&n);if(n=20){printf(Error!Thevalueofnmustin(0,20).);getch();return1;}if(n=0){printf(Error!Thevalueofnmustin(0,20).);getch();return1;}for(i=0;i=n-1;i++){printf(x[%d]:,i);scanf(%f,&x[i]);}printf(\n);for(i=0;i=n-1;i++){printf(y[%d]:,i);scanf(%f,&y[i]);}5printf(\n);printf(Inputxx:);scanf(%f,&xx);yy=lagrange(x,y,xx,n);printf(x=%f,y=%f\n,xx,yy);getch();}4.实验结果5.实验小结本次实验,我用C语言实现了Langrange插值。本实验算法简单,只是有很多地方的细节需要注意,比如变量类型要用float,如果使用double型,则对于本实验的数据来说太大了。本次实验简单,也很快解决了问题。只要解决了精度和实现了Lagrange插值函数,一切都迎刃而解。实验二、牛顿插值1.实验内容与要求用C语言实现f(x)的n阶差商f[x0,x1,x2…xn],并由此实现Newton插值:对输入的任一X,用Newton插值计算其函数值。已知函数表如下:Xi0.40.550.650.80.9Yi0.410750.578150.696750.888111.02652试用Newton插值多项式求X=0.596和X=0.895时的函数值。62.公式与算法描述Newton插值公式0010012010101(x)f(x)f[x,x](xx)f[x,x,x](xx)(xx)...f[x,x,...,x](xx)(xx)...(xx)nnnN差商:012011011f[x,x,...,x,x]f[x,x,...,x]f[x,x,...,x]kkkkkkxx由线性知f[x0,x1,x2…xn]=不含(xj-xj)项构造差商表xkf(x)k0f[x,x]k01f[x,x,x]k012f[x,x,x,x]k0123f[x,x,x,x,x]k0x0y1x1y01f[x,x]2x2y02f[x,x]012f[x,x,x]3x3y03f[x,x]013f[x,x,x]0123f[x,x,x,x]4x4y04f[x,x]014f[x,x,x]0124f[x,x,x,x]01234f[x,x,x,x,x]3.程序源码#includestdio.hvoidmain(void){intj,i,k;floatx,p,y[20],xx[20],li[20],c[20],result;p=1;printf(thevalueofx:);for(i=0;i5;i++){scanf(%f,&xx[i]);}printf(thevalueofy:);for(i=0;i5;i++){scanf(%f,&y[i]);}for(i=0;i5;i++){c[i]=0;li[i]=1.0;}7for(k=0;k5;k++)for(i=0;i=k;i++){for(j=0;j=k;j++)if(i!=j)li[k]*=xx[i]-xx[j];c[k]+=y[i]/li[k];li[k]=1;}c[0]=y[0];for(i=0;i5;i++)printf(第%d阶差商为:%f\n,i,c[i]);printf(pleaseinputthevalueofx:);scanf(%f,&x);result=c[0];for(i=0;i4;i++){p*=x-xx[i];result+=c[i+1]*p;}printf(theresultis:%f\n,result);}4.实验结果5.实验小结本次实验的数据与课本上的结果稍微有点差异,不过在误差允许的范围之内,经分析可能是数据的精度不够高,才导致会出现这种问题。本次实验比上一个实验要头疼,首先,要实现差商的运算,然后再通过差商来计算函数值。最重要的一点就是要根据差商公式实现其运算。8实验三、复化Simpson公式1.实验内容与要求利用复化Simpson公式计算积分I=∫011+X2dx2.公式与算法描述3.源程序代码#includestdio.hfloatf(floatx){floata;a=1/(1+x*x);return(a);}intmain(){floata,b,h,M=0;inti,n;n=1;printf(请输入积分区间:\na:);scanf(%f,&a);printf(\nb:);scanf(%f,&b);printf(\n如需结束可输入N值为0\n);while(n){9printf(\nN:);scanf(%d,&n);h=(b-a)/n;for(i=0;in;i++)M=M+f(a+h/2+h*i);M=4*M;for(i=1;in;i++)M=M+2*f(a+h*i);M=f(a)+f(b)+M;h=h/6;M=h*M;printf(\nS(%d)=%f\n,n,M);M=0;}return0;}4.实验结果105.实验小结本次实验比较简单,只需要根据公式将公式实现即可。根据实验数据只需将数据精度控制在float型即可。在源码中,通过一个函数表达被积函数,方便后续中求得其函数值。基本上只要把公式翻译成代码就可以实现其功能。通过本次实验,对复化Simpson有了更深的理解和记忆,相信以后碰到这样的题目会游刃有余。实验四、变步长梯形法1.实验内容与要求用变步长梯形法计算I=∫011+X2dx2.公式及算法描述113.源程序代码#includestdio.h#includemath.h#includestdlib.hfloatf(floatx){floata;a=1/(1+x*x);returna;}intmain(){inta,b,n,i;floatl,s,T1,T2,h,x;printf(请输入积分区间\na:);scanf(%d,&a);printf(b:);scanf(%d,&b);12printf(请输入预期精度:);scanf(%f,&l);system(cls);printf(\n);printf(精度为%f\n,l);printf(\n);n=1;h=b-a;T1=h/2*(f(a)+f(b));printf(%f\t,T1);for(i=0;;i++){x=a+h/2;s=0;for(i=0;in;i++){s=s+f(x);x=x+h;}T2=(T1+s*h)/2;printf(%f\t,T2);n=2*n;if(fabs((T2-T1)l))break;h=h/2;T1=T2;13}printf(\n);printf(T(%d)=%f,n,T2);return0;}4.实验结果5.实验小结本实验通过变步长梯形法求积分值,通过输入预期的精度来控制程序运行时的精度。在源码中,通过一个函数表达被积函数,方便后续中求得其函数值。首先根据公式求得T1,然后通过一个双重循环求得T2n,通过比较T2n和Tn是否满足精度再确定是否输出。