您好,欢迎访问三七文档
《工程常用算法》综合实践作业三作业名称:插值:三次样条插值与分段插值完成日期:2016年5月15日组号:8班级学号姓名主要工作说明自评成绩201307162013071605郭俊杰绘制流程图A201307162013071610凌泽宇程序编写201307162013071627张明旺文字总结一.已知飞机下轮廓线数据如下:x035791112131415y01.21.72.02.12.01.81.21.01.6飞机下轮廓线形状大致如下图所示:要求分别用拉格朗日插值法、Newton插值法、分段线性插值法和三次样条插值法计算x每改变0.5时y的值,即x取0.5,1,1.5,…,14.5时对应的y值。比较采用不同方法的计算工作量、计算结果和优缺点。二、程序流程图三、完整的程序及简要的注释拉格朗日#includestdio.h#includemath.hfloatx[10]={0,3,5,7,9,11,12,13,14,15},y[10]={0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6},n[29];/*定义29个隔值*/voidX()/*定义隔值函数*/{inti;for(i=0;i29;i++)/*隔值循环*/n[i]=(i+1)*0.5;}floatl(floatxx,inti)/*求Lagrange基函数*/{intj;floatl=1;for(j=0;j10;j++)if(i!=j)l=l*(xx-x[j])/(x[i]-x[j]);returnl;}floatLagrange(floatx)/*Lagrange插值法*/{inti;floatf=0;for(i=0;i10;i++)f=f+y[i]*l(x,i);returnf;}/*调用Lagrange插值函数*/intmain(){inti;floatY[29];X();printf(Lagrange插值法:\n);for(i=0;i29;i++){floatY[29];Y[i]=Lagrange(n[i]);printf(n[%d]=%.2fY[%d]=%8.4f\n,i,n[i],i,Y[i]);}}Newton#includestdio.h#includemath.hfloatx[10]={0,3,5,7,9,11,12,13,14,15},y[10]={0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6},n[29];/*定义29个隔值*/floatf[10][10]={0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6};voidX()/*定义隔值函数*/{inti;for(i=0;i29;i++)/*隔值循环*/n[i]=(i+1)*0.5;}voidCS()/*定义差商函数*/{inti,j;for(i=1;i10;i++)for(j=i;j10;j++)f[i][j]=(f[i-1][j]-f[i-1][j-1])/(x[j]-x[j-i]);}floatNewton(floatxx)/*Newton插值法*/{inti,j;floatt=1;floatN=f[0][0];for(i=1;i10;i++){t=t*(xx-x[i-1]);N=N+f[i][i]*t;}returnN;}/*调用Newton插值函数*/intmain(){inti;floatY[29];X();CS();printf(Newton插值法:\n);for(i=0;i29;i++){floatY[29];Y[i]=Newton(n[i]);printf(n[%d]=%.2fY[%d]=%8.4f\n,i,n[i],i,Y[i]);}}三次样条插值法#includestdio.h#includemath.hfloatx[10]={0,3,5,7,9,11,12,13,14,15},y[10]={0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6},G[29];/*定义29个隔值*/voidX()/*定义隔值函数*/{inti;for(i=0;i29;i++)/*隔值循环*/G[i]=(i+1)*0.5;}floatS(floatxx)/*三次样条插值法*/{floath[9],q[9],w[9],C[9],m[10],b[9],c[8],a[9],n[9],p[8],r[9],yp[9],s[9];inti;for(i=0;i9;i++)h[i]=x[i+1]-x[i];/*计算插值点之间的距离*/for(i=1;i9;i++){q[i]=h[i-1]/(h[i]+h[i-1]);w[i]=1-q[i];/*计算方程组中的两个系数*/C[i]=6/(h[i]+h[i-1])*((y[i+1]-y[i])/h[i]-(y[i]-y[i-1])/h[i-1]);/*计算方程组的结果*/}m[0]=m[9]=0;/*求线性方程组得m值*/for(i=1;i9;i++){b[i]=2;if(i8)c[i]=w[i];if(i1)a[i]=q[i];if(i==1){n[1]=b[1];p[1]=c[1]/n[1];}if(i1){r[i]=a[i];n[i]=b[i]-r[i]*p[i-1];if(i8)p[i]=c[i]/n[i];}}for(i=1;i9;i++){if(i==1)yp[1]=C[1]/n[1];elseyp[i]=(C[i]-r[i]*yp[i-1])/n[i];}for(i=8;i0;i--){if(i==8)m[8]=yp[8];elsem[i]=yp[i]-p[i]*m[i+1];}for(i=0;i9;i++)if(xx=x[i]&&xxx[i+1]){s[i]=pow(xx-x[i+1],3)*m[i]/6/h[i]+pow(xx-x[i],3)*m[i+1]/6/h[i]-(y[i]-h[i]*h[i]*m[i]/6)*(xx-x[i+1])/h[i]+(y[i+1]-h[i]*h[i]*m[i+1]/6)*(xx-x[i])/h[i];returns[i];}}intmain(){inti;floatY[29];X();printf(三次样条插值法:\n);for(i=0;i29;i++){floatY[29];Y[i]=S(G[i]);printf(G[%d]=%.2fY[%d]=%8.4f\n,i,G[i],i,Y[i]);}}分段线性插值#includestdio.h#includemath.hfloatx[10]={0,3,5,7,9,11,12,13,14,15},y[10]={0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6},G[29];/*定义29个隔值*/voidX()/*定义隔值函数*/{inti;for(i=0;i29;i++)/*隔值循环*/G[i]=(i+1)*0.5;}floatFD(floatxx)/*定义分段线性插值函数*/{inti;floatp;for(i=0;i10;i++)if((xx=x[i])&&(xxx[i+1])){p=(xx-x[i+1])*y[i]/(x[i]-x[i+1])+(xx-x[i])*y[i+1]/(x[i+1]-x[i]);returnp;}}intmain()/*调用分段线性插值函数*/{inti;X();printf(分段线性插值法:\n);for(i=0;i29;i++){floatY[29];G[i]=(i+1)*0.5;Y[i]=FD(G[i]);printf(G[%d]=%.2fY[%d]=%8.4f\n,i,G[i],i,Y[i]);}}四、程序运行结果五、对不同实现方法的运行结果进行比较六、问题与总结一、计算公式及计算方法
本文标题:工程常用算法作业三
链接地址:https://www.777doc.com/doc-2444406 .html