《数值逼近逼近》课程设计.docx
《《数值逼近逼近》课程设计.docx》由会员分享,可在线阅读,更多相关《《数值逼近逼近》课程设计.docx(17页珍藏版)》请在冰点文库上搜索。
《数值逼近逼近》课程设计
课程设计报告
课程名称数值逼近
专业信息与计算科学
班级计算091
姓名
学号
指导教师秦新强、胡钢
日期2011-07-01
理学院应用数学系
一、目的意义
(1)进一步掌握复化梯形积分公式,提高运用能力。
(2)进一步掌握复化抛物线积分公式,提高运用能力。
(3)进一步掌握c语言,提高编程能力。
二、内容要求
积分计算问题:
分别用复化梯形和复化Simpson求积公式计算积分
,并比较计算量(精度为10-8)。
三、问题解决的方法与算法
3.1解决方法:
利用复化梯形和复化Simpsom积分公式。
(1)根据两个方程式的误差估计式,求出各自满足精度的等分份数n。
(2)带入所编写的c语言程序,检验并计算出结果。
3.2算法设计:
(1)输入所求的等分数n。
(2)调用复化积分公式,算出n+1点和n点的积分估计数值。
(3)用n+1点和n点的数值检验,比较数值是否达到精度要求。
(4)若达不到精度要求,输出提示,结束程序。
(5)若达到精度要求,输出积分近似结果,程序结束。
四、计算程序
4.1复化梯形积分程序源代码:
#include
#definef(x)(13*((x)-(x)*(x))*exp(-1.5*(x)))
#defineepsilon0.00000001
doubleTixing(doubleaa,doublebb,intn){
inti;
doublefz;
doubleh=(bb-aa)/n;
fz=(f(aa)+f(bb))/2;
for(i=1;i{fz+=f(aa+h*i);}fz*=h;returnfz;}intmain(){doublea=0.0;doubleb=4.0;intn;printf("请输入等分值:");scanf("%d",&n);printf("\n");doubleT1;T1=Tixing(a,b,n);doubleT2;T2=Tixing(a,b,(n+1));if(fabs(T2-T1)>0.00000001){printf("达不到精度要求,请检查等分值是否求解正确!\n");}elseprintf("用复化梯形积分方法所计算的积分的数值为:%.8lf\n",T1);return0;}4.2复化Simpson积分程序源代码:#include#include#definef(x)(13*((x)-(x)*(x))*exp(-1.5*(x)))#defineepsilon0.00000001doubleSimp(doubleaa,doublebb,intn){inti;doubleS_n;doubleh=(bb-aa)/(2*n);doublefz,fm,fk;fz=f(aa)+f(bb);fm=0;fk=0;for(i=1;i{fm+=f(aa+(2*i-1)*h);}for(i=1;i{fk+=f(aa+(2*i)*h);}S_n=h*(fz+4*fm+2*fk)/3;returnS_n;}voidmain(){intn;doublea=0.0;doubleb=4.0;printf("请输入等分值:");scanf("%d",&n);doubleT1;T1=Simp(a,b,n);doubleT2;T2=Simp(a,b,(n+1));if(fabs(T2-T1)>0.00000001){printf("达不到精度要求,请检查等分值是否求解正确!\n");}elseprintf("用复化Simpson积分方法所计算的积分的数值为:%.8lf\n",T1);}五、计算结果与分析5.1复化梯形积分计算结果与分析:利用复化梯形积分的误差估计式,求出的值,带入公式计算,是满足精度要求的。5.2复化Simpson积分计算结果与分析:这里同样利用复化Simpson的误差估计式,求出n的值,带入公式计算,求出数值。比较两种方法,可见满足同样精度的积分算式,复化Simpson比复化梯形要求的等分数小得多。六、参考文献[1]谭浩强.C语言程序设计[M].北京:清华大学出版社,2007.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011. 一、目的意义(1)利用有限个离散点构造n次Lagrange插值计算式来解决实际问题。(2)掌握利用分段线性插值计算式来解决实际问题。(3)进一步提高c语言编程能力,提高实际问题分析能力。二、内容要求机械设计问题:万能拉拨机中有一个圆柱形凸轮(见图1),其底圆半径R=30cm,凸轮的上端面不在同一平面上,要根据从动杆位移变化的需要进行设计制造。将底圆周长36等分为xi(i=0,1,…,36),每一圆弧段长为h=52.36mm,对应于每一分点的柱高为yi(i=0,1,…,36)。为方便,将圆柱展开为平面,柱面的的顶端成为图2所示的平面曲线,并已知该曲线上的37个点的坐标(表1)。yCAByiyix0Oxix17x36xxi图1凸轮模型图2展开曲线表1:测量数据表xix0x1x2x3x4x5x6x7x8yi502.75520.96525523.6514.3492451394.6326.5xiX0x10x11x12x13x14x15x16x17-x36yi256.7188.6132.192.268.959.658.262.2480.45-502.75xi=jh,x0=0,x36=1884.96mm,h=52.36mm。是直线段,AB是曲线段,为了数控加工,需要计算出圆周上任一点处的柱高,试构造算法、设计程序、编程计算。三、问题解决的方法与算法3.1解决方法:(1)利用Excle算出到各点的值;表2-3-1各坐标点对应的数值x0x1x2x3x4x5x6x7052.36104.72157.08209.44261.8314.16366.52x8x9x10x11x12x13x14x15418.88471.24523.6575.96628.32680.68733.04785.4x16x17x18x19x20x21x22x23837.76890.12942.48994.841047.21099.561151.921204.28x24x25x26x27x28x29x30x311256.6413091361.361413.721466.081518.441570.81623.16x32x33x34x35x361675.521727.881780.241832.61884.96(2)对于前17个点和后20个点分别构造Lagrange插值函数和分段线性插值函数。3.2算法设计:(1)输入要计算的坐标点值。(2)用if语句进行控制,对坐标值进行判断裁定,选择相应的插值计算式进行。(3)输出计算的圆柱体高度,结束程序。四、计算程序#include#includevoidmain(){doublea;printf("********请输入要求的点的坐标值(范围为0到1884.96mm):");scanf("%lf",&a);if(a>=0&&a<=837.76){inti,j,n;doubletmp=1,lagrange=0,e;doublefm=1,fz=1;doublel[20];n=16;doublex[17]={0,52.36,104.72,157.08,209.44,261.8,314.16,366.52,418.88,575.96,628.32,680.68,733.04,785.4,837.76},y[17]={502.75,520.96,525,523.6,514.3,492,451,394.6,326.5,256.7,188.6,132.1,92.2,68.9,59.6,58.2,62.24};e=a;for(j=0;j<=n;j++){fm=1;fz=1;for(i=0;i<=n;i++){if(i!=j){fm*=e-x[i];fz*=x[j]-x[i];}l[j]=fm/fz;}}for(j=0;j<=n;j++)lagrange=lagrange+l[j]*y[j];printf("\n得到圆柱体的高度为:%lf(mm)\n",lagrange);}if(a>837.76){doubleh=a;doubleq[2]={890.12,1884.96},w[2]={80.45,502.75};doublefq=(h-q[1])/(q[0]-q[1]);doublefw=(h-q[0])/(q[1]-q[0]);doubles=w[0]*fq+w[1]*fw;printf("\n得到圆柱体的高度为:%lf(mm)\n",s);}}五、计算结果与分析在程序中任意输入范围内的一点,得到(截图):对于计算的结果,前17个点用了Lagrange插值法,计算出的高度肯定存在一定的误差,但是可以满足数控加工的精度要求。后面的点运用点斜式编程求出计算式,在认为数据没有误差的前提下,求出的圆柱体的高度精确成立。c语言程序运用if结构,来选择输入的坐标值点满足哪个计算式,从而选择正确的计算式,计算出相应的近似结果。六、参考文献[1]谭浩强.C语言程序设计[M].北京:清华大学出版社,2007.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011. 一、目的意义(1)掌握三次样条的推导过程,并熟练运用。(2)熟练运用三弯矩算法来构造三次样条插值函数。(3)了解运用Matlab作三次周期样条函数轮廓图。(4)熟练运用c++编程来解决问题,学会运用追赶法来解方程式,并会正确设计程序。二、内容要求三、问题解决的方法和算法3.1解决方法:(1)根据三弯矩算法,利用周期函数的条件,求解出弯矩向量。(2)带入三次样条函数计算式,求解出每个小区间上的插值关系式。(3)利用Matlab,画出三次样条周期函数的近似图。3.2算法设计:(1)运用追赶法,求出弯矩向量。(2)求出每个小区间上的三次样条函数插值,并输出。(3)检验,输入一个坐标值,输出两个函数值,程序结束。四、计算程序#include#include#includeusingnamespacestd;constintMAX=50;constdoublex[19]={100,134,164,180,198,195,186,160,136,100,66,35,15,0,5,17,32,63,100};constdoubley[19]={503,525,514.3,451.0,326.5,188.6,92.2,59.6,62.2,102.7,147.1,191.6,236.0,280.5,324.9,369.4,413.8,458.3,503};floath[MAX];floatc[MAX],a[MAX],g[MAX];floatf(intx1,intx2,intx3){floata=(y[x3]-y[x2])/(x[x3]-x[x2]);floatb=(y[x2]-y[x1])/(x[x2]-x[x1]);return(a-b)/(x[x3]-x[x1]);}voidM(intn){//用追赶法求解出弯矩向量MfloatB[18];B[0]=c[0]/2;for(inti=1;iB[i]=c[i]/(2-a[i]*B[i-1]);for(i=1;i<=n;i++)g[i]=(g[i]-a[i]*g[i-1])/(2-a[i]*B[i-1]);for(i=n-1;i>=0;i--)g[i]=g[i]-B[i]*g[i+1];}voidprintout(intn);voidmain(){intn=18,i;for(i=0;ih[i]=x[i+1]-x[i];for(i=1;ig[i]=6*f(i-1,i,i+1);g[0]=(h[18]/6*g[17]+(503-458.3)/(100-63)+h[1]/6*g[1]-11/17)/(-h[1]/3-h[18]/6);g[n]=g[0];for(i=1;ia[i]=h[i]/(h[i]+h[i+1]);c[i]=1-a[i];}a[n]=h[n]/(h[1]+h[n]);c[n]=h[1]/(h[n]+h[1]);M(n);cout<<"\n输出三次样条插值函数:\n";printout(n);doubleu;cout<<"请输入横坐标x的值:";cin>>u;doubley1;doubley2;intj=0;for(i=0;iif(u>=x[i]&&u<=x[i+1])y1=g[i]/(6*h[i])*(x[i+1]-u)*(x[i+1]-u)*(x[i+1]-u)+g[i+1]/(6*h[i])*(u-x[i])*(u-x[i])*(u-x[i])+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(x[i+1]-u)+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(u-x[i]);}for(i=0;iif(u<=x[i]&&u>=x[i+1])y2=fabs(g[i]/(6*h[i])*(u-x[i+1])*(u-x[i+1])*(u-x[i+1])+g[i+1]/(6*h[i])*(x[i]-u)*(x[i]-u)*(x[i]-u)+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(u-x[i+1])+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(x[i]-u));}cout<<"x对应的函数值为:"<cout<<"y1="<}voidprintout(intn){cout<for(inti=0;icout<<"["<"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
{fz+=f(aa+h*i);}
fz*=h;
returnfz;
}
intmain(){
doublea=0.0;
doubleb=4.0;
intn;
printf("请输入等分值:
");
scanf("%d",&n);
printf("\n");
doubleT1;
T1=Tixing(a,b,n);
doubleT2;
T2=Tixing(a,b,(n+1));
if(fabs(T2-T1)>0.00000001){
printf("达不到精度要求,请检查等分值是否求解正确!
\n");
elseprintf("用复化梯形积分方法所计算的积分的数值为:
%.8lf\n",T1);
return0;
4.2复化Simpson积分程序源代码:
doubleSimp(doubleaa,doublebb,intn){
doubleS_n;
doubleh=(bb-aa)/(2*n);
doublefz,fm,fk;
fz=f(aa)+f(bb);
fm=0;
fk=0;
for(i=1;i{fm+=f(aa+(2*i-1)*h);}for(i=1;i{fk+=f(aa+(2*i)*h);}S_n=h*(fz+4*fm+2*fk)/3;returnS_n;}voidmain(){intn;doublea=0.0;doubleb=4.0;printf("请输入等分值:");scanf("%d",&n);doubleT1;T1=Simp(a,b,n);doubleT2;T2=Simp(a,b,(n+1));if(fabs(T2-T1)>0.00000001){printf("达不到精度要求,请检查等分值是否求解正确!\n");}elseprintf("用复化Simpson积分方法所计算的积分的数值为:%.8lf\n",T1);}五、计算结果与分析5.1复化梯形积分计算结果与分析:利用复化梯形积分的误差估计式,求出的值,带入公式计算,是满足精度要求的。5.2复化Simpson积分计算结果与分析:这里同样利用复化Simpson的误差估计式,求出n的值,带入公式计算,求出数值。比较两种方法,可见满足同样精度的积分算式,复化Simpson比复化梯形要求的等分数小得多。六、参考文献[1]谭浩强.C语言程序设计[M].北京:清华大学出版社,2007.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011. 一、目的意义(1)利用有限个离散点构造n次Lagrange插值计算式来解决实际问题。(2)掌握利用分段线性插值计算式来解决实际问题。(3)进一步提高c语言编程能力,提高实际问题分析能力。二、内容要求机械设计问题:万能拉拨机中有一个圆柱形凸轮(见图1),其底圆半径R=30cm,凸轮的上端面不在同一平面上,要根据从动杆位移变化的需要进行设计制造。将底圆周长36等分为xi(i=0,1,…,36),每一圆弧段长为h=52.36mm,对应于每一分点的柱高为yi(i=0,1,…,36)。为方便,将圆柱展开为平面,柱面的的顶端成为图2所示的平面曲线,并已知该曲线上的37个点的坐标(表1)。yCAByiyix0Oxix17x36xxi图1凸轮模型图2展开曲线表1:测量数据表xix0x1x2x3x4x5x6x7x8yi502.75520.96525523.6514.3492451394.6326.5xiX0x10x11x12x13x14x15x16x17-x36yi256.7188.6132.192.268.959.658.262.2480.45-502.75xi=jh,x0=0,x36=1884.96mm,h=52.36mm。是直线段,AB是曲线段,为了数控加工,需要计算出圆周上任一点处的柱高,试构造算法、设计程序、编程计算。三、问题解决的方法与算法3.1解决方法:(1)利用Excle算出到各点的值;表2-3-1各坐标点对应的数值x0x1x2x3x4x5x6x7052.36104.72157.08209.44261.8314.16366.52x8x9x10x11x12x13x14x15418.88471.24523.6575.96628.32680.68733.04785.4x16x17x18x19x20x21x22x23837.76890.12942.48994.841047.21099.561151.921204.28x24x25x26x27x28x29x30x311256.6413091361.361413.721466.081518.441570.81623.16x32x33x34x35x361675.521727.881780.241832.61884.96(2)对于前17个点和后20个点分别构造Lagrange插值函数和分段线性插值函数。3.2算法设计:(1)输入要计算的坐标点值。(2)用if语句进行控制,对坐标值进行判断裁定,选择相应的插值计算式进行。(3)输出计算的圆柱体高度,结束程序。四、计算程序#include#includevoidmain(){doublea;printf("********请输入要求的点的坐标值(范围为0到1884.96mm):");scanf("%lf",&a);if(a>=0&&a<=837.76){inti,j,n;doubletmp=1,lagrange=0,e;doublefm=1,fz=1;doublel[20];n=16;doublex[17]={0,52.36,104.72,157.08,209.44,261.8,314.16,366.52,418.88,575.96,628.32,680.68,733.04,785.4,837.76},y[17]={502.75,520.96,525,523.6,514.3,492,451,394.6,326.5,256.7,188.6,132.1,92.2,68.9,59.6,58.2,62.24};e=a;for(j=0;j<=n;j++){fm=1;fz=1;for(i=0;i<=n;i++){if(i!=j){fm*=e-x[i];fz*=x[j]-x[i];}l[j]=fm/fz;}}for(j=0;j<=n;j++)lagrange=lagrange+l[j]*y[j];printf("\n得到圆柱体的高度为:%lf(mm)\n",lagrange);}if(a>837.76){doubleh=a;doubleq[2]={890.12,1884.96},w[2]={80.45,502.75};doublefq=(h-q[1])/(q[0]-q[1]);doublefw=(h-q[0])/(q[1]-q[0]);doubles=w[0]*fq+w[1]*fw;printf("\n得到圆柱体的高度为:%lf(mm)\n",s);}}五、计算结果与分析在程序中任意输入范围内的一点,得到(截图):对于计算的结果,前17个点用了Lagrange插值法,计算出的高度肯定存在一定的误差,但是可以满足数控加工的精度要求。后面的点运用点斜式编程求出计算式,在认为数据没有误差的前提下,求出的圆柱体的高度精确成立。c语言程序运用if结构,来选择输入的坐标值点满足哪个计算式,从而选择正确的计算式,计算出相应的近似结果。六、参考文献[1]谭浩强.C语言程序设计[M].北京:清华大学出版社,2007.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011. 一、目的意义(1)掌握三次样条的推导过程,并熟练运用。(2)熟练运用三弯矩算法来构造三次样条插值函数。(3)了解运用Matlab作三次周期样条函数轮廓图。(4)熟练运用c++编程来解决问题,学会运用追赶法来解方程式,并会正确设计程序。二、内容要求三、问题解决的方法和算法3.1解决方法:(1)根据三弯矩算法,利用周期函数的条件,求解出弯矩向量。(2)带入三次样条函数计算式,求解出每个小区间上的插值关系式。(3)利用Matlab,画出三次样条周期函数的近似图。3.2算法设计:(1)运用追赶法,求出弯矩向量。(2)求出每个小区间上的三次样条函数插值,并输出。(3)检验,输入一个坐标值,输出两个函数值,程序结束。四、计算程序#include#include#includeusingnamespacestd;constintMAX=50;constdoublex[19]={100,134,164,180,198,195,186,160,136,100,66,35,15,0,5,17,32,63,100};constdoubley[19]={503,525,514.3,451.0,326.5,188.6,92.2,59.6,62.2,102.7,147.1,191.6,236.0,280.5,324.9,369.4,413.8,458.3,503};floath[MAX];floatc[MAX],a[MAX],g[MAX];floatf(intx1,intx2,intx3){floata=(y[x3]-y[x2])/(x[x3]-x[x2]);floatb=(y[x2]-y[x1])/(x[x2]-x[x1]);return(a-b)/(x[x3]-x[x1]);}voidM(intn){//用追赶法求解出弯矩向量MfloatB[18];B[0]=c[0]/2;for(inti=1;iB[i]=c[i]/(2-a[i]*B[i-1]);for(i=1;i<=n;i++)g[i]=(g[i]-a[i]*g[i-1])/(2-a[i]*B[i-1]);for(i=n-1;i>=0;i--)g[i]=g[i]-B[i]*g[i+1];}voidprintout(intn);voidmain(){intn=18,i;for(i=0;ih[i]=x[i+1]-x[i];for(i=1;ig[i]=6*f(i-1,i,i+1);g[0]=(h[18]/6*g[17]+(503-458.3)/(100-63)+h[1]/6*g[1]-11/17)/(-h[1]/3-h[18]/6);g[n]=g[0];for(i=1;ia[i]=h[i]/(h[i]+h[i+1]);c[i]=1-a[i];}a[n]=h[n]/(h[1]+h[n]);c[n]=h[1]/(h[n]+h[1]);M(n);cout<<"\n输出三次样条插值函数:\n";printout(n);doubleu;cout<<"请输入横坐标x的值:";cin>>u;doubley1;doubley2;intj=0;for(i=0;iif(u>=x[i]&&u<=x[i+1])y1=g[i]/(6*h[i])*(x[i+1]-u)*(x[i+1]-u)*(x[i+1]-u)+g[i+1]/(6*h[i])*(u-x[i])*(u-x[i])*(u-x[i])+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(x[i+1]-u)+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(u-x[i]);}for(i=0;iif(u<=x[i]&&u>=x[i+1])y2=fabs(g[i]/(6*h[i])*(u-x[i+1])*(u-x[i+1])*(u-x[i+1])+g[i+1]/(6*h[i])*(x[i]-u)*(x[i]-u)*(x[i]-u)+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(u-x[i+1])+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(x[i]-u));}cout<<"x对应的函数值为:"<cout<<"y1="<}voidprintout(intn){cout<for(inti=0;icout<<"["<"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
{fm+=f(aa+(2*i-1)*h);}
for(i=1;i{fk+=f(aa+(2*i)*h);}S_n=h*(fz+4*fm+2*fk)/3;returnS_n;}voidmain(){intn;doublea=0.0;doubleb=4.0;printf("请输入等分值:");scanf("%d",&n);doubleT1;T1=Simp(a,b,n);doubleT2;T2=Simp(a,b,(n+1));if(fabs(T2-T1)>0.00000001){printf("达不到精度要求,请检查等分值是否求解正确!\n");}elseprintf("用复化Simpson积分方法所计算的积分的数值为:%.8lf\n",T1);}五、计算结果与分析5.1复化梯形积分计算结果与分析:利用复化梯形积分的误差估计式,求出的值,带入公式计算,是满足精度要求的。5.2复化Simpson积分计算结果与分析:这里同样利用复化Simpson的误差估计式,求出n的值,带入公式计算,求出数值。比较两种方法,可见满足同样精度的积分算式,复化Simpson比复化梯形要求的等分数小得多。六、参考文献[1]谭浩强.C语言程序设计[M].北京:清华大学出版社,2007.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011. 一、目的意义(1)利用有限个离散点构造n次Lagrange插值计算式来解决实际问题。(2)掌握利用分段线性插值计算式来解决实际问题。(3)进一步提高c语言编程能力,提高实际问题分析能力。二、内容要求机械设计问题:万能拉拨机中有一个圆柱形凸轮(见图1),其底圆半径R=30cm,凸轮的上端面不在同一平面上,要根据从动杆位移变化的需要进行设计制造。将底圆周长36等分为xi(i=0,1,…,36),每一圆弧段长为h=52.36mm,对应于每一分点的柱高为yi(i=0,1,…,36)。为方便,将圆柱展开为平面,柱面的的顶端成为图2所示的平面曲线,并已知该曲线上的37个点的坐标(表1)。yCAByiyix0Oxix17x36xxi图1凸轮模型图2展开曲线表1:测量数据表xix0x1x2x3x4x5x6x7x8yi502.75520.96525523.6514.3492451394.6326.5xiX0x10x11x12x13x14x15x16x17-x36yi256.7188.6132.192.268.959.658.262.2480.45-502.75xi=jh,x0=0,x36=1884.96mm,h=52.36mm。是直线段,AB是曲线段,为了数控加工,需要计算出圆周上任一点处的柱高,试构造算法、设计程序、编程计算。三、问题解决的方法与算法3.1解决方法:(1)利用Excle算出到各点的值;表2-3-1各坐标点对应的数值x0x1x2x3x4x5x6x7052.36104.72157.08209.44261.8314.16366.52x8x9x10x11x12x13x14x15418.88471.24523.6575.96628.32680.68733.04785.4x16x17x18x19x20x21x22x23837.76890.12942.48994.841047.21099.561151.921204.28x24x25x26x27x28x29x30x311256.6413091361.361413.721466.081518.441570.81623.16x32x33x34x35x361675.521727.881780.241832.61884.96(2)对于前17个点和后20个点分别构造Lagrange插值函数和分段线性插值函数。3.2算法设计:(1)输入要计算的坐标点值。(2)用if语句进行控制,对坐标值进行判断裁定,选择相应的插值计算式进行。(3)输出计算的圆柱体高度,结束程序。四、计算程序#include#includevoidmain(){doublea;printf("********请输入要求的点的坐标值(范围为0到1884.96mm):");scanf("%lf",&a);if(a>=0&&a<=837.76){inti,j,n;doubletmp=1,lagrange=0,e;doublefm=1,fz=1;doublel[20];n=16;doublex[17]={0,52.36,104.72,157.08,209.44,261.8,314.16,366.52,418.88,575.96,628.32,680.68,733.04,785.4,837.76},y[17]={502.75,520.96,525,523.6,514.3,492,451,394.6,326.5,256.7,188.6,132.1,92.2,68.9,59.6,58.2,62.24};e=a;for(j=0;j<=n;j++){fm=1;fz=1;for(i=0;i<=n;i++){if(i!=j){fm*=e-x[i];fz*=x[j]-x[i];}l[j]=fm/fz;}}for(j=0;j<=n;j++)lagrange=lagrange+l[j]*y[j];printf("\n得到圆柱体的高度为:%lf(mm)\n",lagrange);}if(a>837.76){doubleh=a;doubleq[2]={890.12,1884.96},w[2]={80.45,502.75};doublefq=(h-q[1])/(q[0]-q[1]);doublefw=(h-q[0])/(q[1]-q[0]);doubles=w[0]*fq+w[1]*fw;printf("\n得到圆柱体的高度为:%lf(mm)\n",s);}}五、计算结果与分析在程序中任意输入范围内的一点,得到(截图):对于计算的结果,前17个点用了Lagrange插值法,计算出的高度肯定存在一定的误差,但是可以满足数控加工的精度要求。后面的点运用点斜式编程求出计算式,在认为数据没有误差的前提下,求出的圆柱体的高度精确成立。c语言程序运用if结构,来选择输入的坐标值点满足哪个计算式,从而选择正确的计算式,计算出相应的近似结果。六、参考文献[1]谭浩强.C语言程序设计[M].北京:清华大学出版社,2007.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011. 一、目的意义(1)掌握三次样条的推导过程,并熟练运用。(2)熟练运用三弯矩算法来构造三次样条插值函数。(3)了解运用Matlab作三次周期样条函数轮廓图。(4)熟练运用c++编程来解决问题,学会运用追赶法来解方程式,并会正确设计程序。二、内容要求三、问题解决的方法和算法3.1解决方法:(1)根据三弯矩算法,利用周期函数的条件,求解出弯矩向量。(2)带入三次样条函数计算式,求解出每个小区间上的插值关系式。(3)利用Matlab,画出三次样条周期函数的近似图。3.2算法设计:(1)运用追赶法,求出弯矩向量。(2)求出每个小区间上的三次样条函数插值,并输出。(3)检验,输入一个坐标值,输出两个函数值,程序结束。四、计算程序#include#include#includeusingnamespacestd;constintMAX=50;constdoublex[19]={100,134,164,180,198,195,186,160,136,100,66,35,15,0,5,17,32,63,100};constdoubley[19]={503,525,514.3,451.0,326.5,188.6,92.2,59.6,62.2,102.7,147.1,191.6,236.0,280.5,324.9,369.4,413.8,458.3,503};floath[MAX];floatc[MAX],a[MAX],g[MAX];floatf(intx1,intx2,intx3){floata=(y[x3]-y[x2])/(x[x3]-x[x2]);floatb=(y[x2]-y[x1])/(x[x2]-x[x1]);return(a-b)/(x[x3]-x[x1]);}voidM(intn){//用追赶法求解出弯矩向量MfloatB[18];B[0]=c[0]/2;for(inti=1;iB[i]=c[i]/(2-a[i]*B[i-1]);for(i=1;i<=n;i++)g[i]=(g[i]-a[i]*g[i-1])/(2-a[i]*B[i-1]);for(i=n-1;i>=0;i--)g[i]=g[i]-B[i]*g[i+1];}voidprintout(intn);voidmain(){intn=18,i;for(i=0;ih[i]=x[i+1]-x[i];for(i=1;ig[i]=6*f(i-1,i,i+1);g[0]=(h[18]/6*g[17]+(503-458.3)/(100-63)+h[1]/6*g[1]-11/17)/(-h[1]/3-h[18]/6);g[n]=g[0];for(i=1;ia[i]=h[i]/(h[i]+h[i+1]);c[i]=1-a[i];}a[n]=h[n]/(h[1]+h[n]);c[n]=h[1]/(h[n]+h[1]);M(n);cout<<"\n输出三次样条插值函数:\n";printout(n);doubleu;cout<<"请输入横坐标x的值:";cin>>u;doubley1;doubley2;intj=0;for(i=0;iif(u>=x[i]&&u<=x[i+1])y1=g[i]/(6*h[i])*(x[i+1]-u)*(x[i+1]-u)*(x[i+1]-u)+g[i+1]/(6*h[i])*(u-x[i])*(u-x[i])*(u-x[i])+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(x[i+1]-u)+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(u-x[i]);}for(i=0;iif(u<=x[i]&&u>=x[i+1])y2=fabs(g[i]/(6*h[i])*(u-x[i+1])*(u-x[i+1])*(u-x[i+1])+g[i+1]/(6*h[i])*(x[i]-u)*(x[i]-u)*(x[i]-u)+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(u-x[i+1])+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(x[i]-u));}cout<<"x对应的函数值为:"<cout<<"y1="<}voidprintout(intn){cout<for(inti=0;icout<<"["<"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
{fk+=f(aa+(2*i)*h);}
S_n=h*(fz+4*fm+2*fk)/3;
returnS_n;
voidmain()
{intn;
T1=Simp(a,b,n);
T2=Simp(a,b,(n+1));
elseprintf("用复化Simpson积分方法所计算的积分的数值为:
五、计算结果与分析
5.1复化梯形积分计算结果与分析:
利用复化梯形积分的误差估计式
,求出
的值,带入公式计算,是满足精度要求的。
5.2复化Simpson积分计算结果与分析:
这里同样利用复化Simpson的误差估计式,求出n的值,带入公式计算,求出数值。
比较两种方法,可见满足同样精度的积分算式,复化Simpson比复化梯形要求的等分数小得多。
六、参考文献
[1]谭浩强.C语言程序设计[M].北京:
清华大学出版社,2007.
[2]秦新强.数值逼近[M].西安:
西安理工大学印刷厂,2011.
(1)利用有限个离散点构造n次Lagrange插值计算式来解决实际问题。
(2)掌握利用分段线性插值计算式来解决实际问题。
(3)进一步提高c语言编程能力,提高实际问题分析能力。
机械设计问题:
万能拉拨机中有一个圆柱形凸轮(见图1),其底圆半径R=30cm,凸轮的上端面不在同一平面上,要根据从动杆位移变化的需要进行设计制造。
将底圆周长36等分为xi(i=0,1,…,36),每一圆弧段长为h=52.36mm,对应于每一分点的柱高为yi(i=0,1,…,36)。
为方便,将圆柱展开为平面,柱面的的顶端成为图2所示的平面曲线,并已知该曲线上的37个点的坐标(表1)。
yC
A
B
yiyi
x0
Oxix17x36x
xi
图1凸轮模型图2展开曲线
表1:
测量数据表
x1
x2
x3
x4
x5
x6
x7
x8
yi
502.75
520.96
525
523.6
514.3
492
451
394.6
326.5
X0
x10
x11
x12
x13
x14
x15
x16
x17-x36
256.7
188.6
132.1
92.2
68.9
59.6
58.2
62.24
80.45-502.75
xi=jh,x0=0,x36=1884.96mm,h=52.36mm。
是直线段,AB是曲线段,为了数控加工,需要计算出圆周上任一点处的柱
高,试构造算法、设计程序、编程计算。
(1)利用Excle算出
到
各点的值;
表2-3-1各坐标点对应的数值
0
52.36
104.72
157.08
209.44
261.8
314.16
366.52
x9
418.88
471.24
575.96
628.32
680.68
733.04
785.4
x17
x18
x19
x20
x21
x22
x23
837.76
890.12
942.48
994.84
1047.2
1099.56
1151.92
1204.28
x24
x25
x26
x27
x28
x29
x30
x31
1256.64
1309
1361.36
1413.72
1466.08
1518.44
1570.8
1623.16
x32
x33
x34
x35
x36
1675.52
1727.88
1780.24
1832.6
1884.96
(2)对于前17个点和后20个点分别构造Lagrange插值函数和分段线性插值函数。
(1)输入要计算的坐标点值。
(2)用if语句进行控制,对坐标值进行判断裁定,选择相应的插值计算式进行。
(3)输出计算的圆柱体高度,结束程序。
voidmain(){
doublea;
printf("********请输入要求的点的坐标值(范围为0到1884.96mm):
scanf("%lf",&a);
if(a>=0&&a<=837.76){
inti,j,n;
doubletmp=1,lagrange=0,e;
doublefm=1,fz=1;
doublel[20];
n=16;
doublex[17]={0,52.36,104.72,157.08,209.44,261.8,314.16,366.52,418.88,575.96,
628.32,680.68,733.04,785.4,837.76},
y[17]={502.75,520.96,525,523.6,514.3,492,451,394.6,326.5,256.7,188.6,
132.1,92.2,68.9,59.6,58.2,62.24};
e=a;
for(j=0;j<=n;j++){
fm=1;fz=1;
for(i=0;i<=n;i++){
if(i!
=j)
{fm*=e-x[i];fz*=x[j]-x[i];}
l[j]=fm/fz;
for(j=0;j<=n;j++)
lagrange=lagrange+l[j]*y[j];
printf("\n得到圆柱体的高度为:
%lf(mm)\n",lagrange);
if(a>837.76){
doubleh=a;
doubleq[2]={890.12,1884.96},w[2]={80.45,502.75};
doublefq=(h-q[1])/(q[0]-q[1]);
doublefw=(h-q[0])/(q[1]-q[0]);
doubles=w[0]*fq+w[1]*fw;
%lf(mm)\n",s);
在程序中任意输入范围内的一点,得到(截图):
对于计算的结果,前17个点用了Lagrange插值法,计算出的高度肯定存在一定的误差,但是可以满足数控加工的精度要求。
后面的点运用点斜式编程求出计算式,在认为数据没有误差的前提下,求出的圆柱体的高度精确成立。
c语言程序运用if结构,来选择输入的坐标值点满足哪个计算式,从而选择正确的计算式,计算出相应的近似结果。
(1)掌握三次样条的推导过程,并熟练运用。
(2)熟练运用三弯矩算法来构造三次样条插值函数。
(3)了解运用Matlab作三次周期样条函数轮廓图。
(4)熟练运用c++编程来解决问题,学会运用追赶法来解方程式,并会正确设计程序。
三、问题解决的方法和算法
(1)根据三弯矩算法,利用周期函数的条件,求解出弯矩向量
。
(2)带入三次样条函数计算式,求解出每个小区间上的插值关系式。
(3)利用Matlab,画出三次样条周期函数的近似图。
(1)运用追赶法,求出弯矩向量。
(2)求出每个小区间上的三次样条函数插值,并输出。
(3)检验,输入一个坐标值,输出两个函数值,程序结束。
usingnamespacestd;
constintMAX=50;
constdoublex[19]={100,134,164,180,198,195,186,160,136,100,66,35,15,0,5,17,32,63,100};
constdoubley[19]={503,525,514.3,451.0,326.5,188.6,92.2,59.6,62.2,102.7,147.1,191.6,
236.0,280.5,324.9,369.4,413.8,458.3,503};
floath[MAX];
floatc[MAX],a[MAX],g[MAX];
floatf(intx1,intx2,intx3){
floata=(y[x3]-y[x2])/(x[x3]-x[x2]);
floatb=(y[x2]-y[x1])/(x[x2]-x[x1]);
return(a-b)/(x[x3]-x[x1]);
voidM(intn){//用追赶法求解出弯矩向量M
floatB[18];
B[0]=c[0]/2;
for(inti=1;iB[i]=c[i]/(2-a[i]*B[i-1]);for(i=1;i<=n;i++)g[i]=(g[i]-a[i]*g[i-1])/(2-a[i]*B[i-1]);for(i=n-1;i>=0;i--)g[i]=g[i]-B[i]*g[i+1];}voidprintout(intn);voidmain(){intn=18,i;for(i=0;ih[i]=x[i+1]-x[i];for(i=1;ig[i]=6*f(i-1,i,i+1);g[0]=(h[18]/6*g[17]+(503-458.3)/(100-63)+h[1]/6*g[1]-11/17)/(-h[1]/3-h[18]/6);g[n]=g[0];for(i=1;ia[i]=h[i]/(h[i]+h[i+1]);c[i]=1-a[i];}a[n]=h[n]/(h[1]+h[n]);c[n]=h[1]/(h[n]+h[1]);M(n);cout<<"\n输出三次样条插值函数:\n";printout(n);doubleu;cout<<"请输入横坐标x的值:";cin>>u;doubley1;doubley2;intj=0;for(i=0;iif(u>=x[i]&&u<=x[i+1])y1=g[i]/(6*h[i])*(x[i+1]-u)*(x[i+1]-u)*(x[i+1]-u)+g[i+1]/(6*h[i])*(u-x[i])*(u-x[i])*(u-x[i])+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(x[i+1]-u)+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(u-x[i]);}for(i=0;iif(u<=x[i]&&u>=x[i+1])y2=fabs(g[i]/(6*h[i])*(u-x[i+1])*(u-x[i+1])*(u-x[i+1])+g[i+1]/(6*h[i])*(x[i]-u)*(x[i]-u)*(x[i]-u)+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(u-x[i+1])+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(x[i]-u));}cout<<"x对应的函数值为:"<cout<<"y1="<}voidprintout(intn){cout<for(inti=0;icout<<"["<"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
B[i]=c[i]/(2-a[i]*B[i-1]);
for(i=1;i<=n;i++)
g[i]=(g[i]-a[i]*g[i-1])/(2-a[i]*B[i-1]);
for(i=n-1;i>=0;i--)
g[i]=g[i]-B[i]*g[i+1];
voidprintout(intn);
{
intn=18,i;
for(i=0;ih[i]=x[i+1]-x[i];for(i=1;ig[i]=6*f(i-1,i,i+1);g[0]=(h[18]/6*g[17]+(503-458.3)/(100-63)+h[1]/6*g[1]-11/17)/(-h[1]/3-h[18]/6);g[n]=g[0];for(i=1;ia[i]=h[i]/(h[i]+h[i+1]);c[i]=1-a[i];}a[n]=h[n]/(h[1]+h[n]);c[n]=h[1]/(h[n]+h[1]);M(n);cout<<"\n输出三次样条插值函数:\n";printout(n);doubleu;cout<<"请输入横坐标x的值:";cin>>u;doubley1;doubley2;intj=0;for(i=0;iif(u>=x[i]&&u<=x[i+1])y1=g[i]/(6*h[i])*(x[i+1]-u)*(x[i+1]-u)*(x[i+1]-u)+g[i+1]/(6*h[i])*(u-x[i])*(u-x[i])*(u-x[i])+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(x[i+1]-u)+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(u-x[i]);}for(i=0;iif(u<=x[i]&&u>=x[i+1])y2=fabs(g[i]/(6*h[i])*(u-x[i+1])*(u-x[i+1])*(u-x[i+1])+g[i+1]/(6*h[i])*(x[i]-u)*(x[i]-u)*(x[i]-u)+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(u-x[i+1])+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(x[i]-u));}cout<<"x对应的函数值为:"<cout<<"y1="<}voidprintout(intn){cout<for(inti=0;icout<<"["<"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
h[i]=x[i+1]-x[i];
for(i=1;ig[i]=6*f(i-1,i,i+1);g[0]=(h[18]/6*g[17]+(503-458.3)/(100-63)+h[1]/6*g[1]-11/17)/(-h[1]/3-h[18]/6);g[n]=g[0];for(i=1;ia[i]=h[i]/(h[i]+h[i+1]);c[i]=1-a[i];}a[n]=h[n]/(h[1]+h[n]);c[n]=h[1]/(h[n]+h[1]);M(n);cout<<"\n输出三次样条插值函数:\n";printout(n);doubleu;cout<<"请输入横坐标x的值:";cin>>u;doubley1;doubley2;intj=0;for(i=0;iif(u>=x[i]&&u<=x[i+1])y1=g[i]/(6*h[i])*(x[i+1]-u)*(x[i+1]-u)*(x[i+1]-u)+g[i+1]/(6*h[i])*(u-x[i])*(u-x[i])*(u-x[i])+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(x[i+1]-u)+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(u-x[i]);}for(i=0;iif(u<=x[i]&&u>=x[i+1])y2=fabs(g[i]/(6*h[i])*(u-x[i+1])*(u-x[i+1])*(u-x[i+1])+g[i+1]/(6*h[i])*(x[i]-u)*(x[i]-u)*(x[i]-u)+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(u-x[i+1])+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(x[i]-u));}cout<<"x对应的函数值为:"<cout<<"y1="<}voidprintout(intn){cout<for(inti=0;icout<<"["<"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
g[i]=6*f(i-1,i,i+1);
g[0]=(h[18]/6*g[17]+(503-458.3)/(100-63)+h[1]/6*g[1]-11/17)/(-h[1]/3-h[18]/6);
g[n]=g[0];
for(i=1;ia[i]=h[i]/(h[i]+h[i+1]);c[i]=1-a[i];}a[n]=h[n]/(h[1]+h[n]);c[n]=h[1]/(h[n]+h[1]);M(n);cout<<"\n输出三次样条插值函数:\n";printout(n);doubleu;cout<<"请输入横坐标x的值:";cin>>u;doubley1;doubley2;intj=0;for(i=0;iif(u>=x[i]&&u<=x[i+1])y1=g[i]/(6*h[i])*(x[i+1]-u)*(x[i+1]-u)*(x[i+1]-u)+g[i+1]/(6*h[i])*(u-x[i])*(u-x[i])*(u-x[i])+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(x[i+1]-u)+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(u-x[i]);}for(i=0;iif(u<=x[i]&&u>=x[i+1])y2=fabs(g[i]/(6*h[i])*(u-x[i+1])*(u-x[i+1])*(u-x[i+1])+g[i+1]/(6*h[i])*(x[i]-u)*(x[i]-u)*(x[i]-u)+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(u-x[i+1])+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(x[i]-u));}cout<<"x对应的函数值为:"<cout<<"y1="<}voidprintout(intn){cout<for(inti=0;icout<<"["<"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
a[i]=h[i]/(h[i]+h[i+1]);
c[i]=1-a[i];
a[n]=h[n]/(h[1]+h[n]);
c[n]=h[1]/(h[n]+h[1]);
M(n);
cout<<"\n输出三次样条插值函数:
\n";
printout(n);
doubleu;
cout<<"请输入横坐标x的值:
";
cin>>u;
doubley1;
doubley2;
intj=0;
for(i=0;iif(u>=x[i]&&u<=x[i+1])y1=g[i]/(6*h[i])*(x[i+1]-u)*(x[i+1]-u)*(x[i+1]-u)+g[i+1]/(6*h[i])*(u-x[i])*(u-x[i])*(u-x[i])+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(x[i+1]-u)+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(u-x[i]);}for(i=0;iif(u<=x[i]&&u>=x[i+1])y2=fabs(g[i]/(6*h[i])*(u-x[i+1])*(u-x[i+1])*(u-x[i+1])+g[i+1]/(6*h[i])*(x[i]-u)*(x[i]-u)*(x[i]-u)+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(u-x[i+1])+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(x[i]-u));}cout<<"x对应的函数值为:"<cout<<"y1="<}voidprintout(intn){cout<for(inti=0;icout<<"["<"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
if(u>=x[i]&&u<=x[i+1])
y1=g[i]/(6*h[i])*(x[i+1]-u)*(x[i+1]-u)*(x[i+1]-u)+g[i+1]/(6*h[i])*(u-x[i])*(u-x[i])*(u-x[i])+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(x[i+1]-u)+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(u-x[i]);
for(i=0;iif(u<=x[i]&&u>=x[i+1])y2=fabs(g[i]/(6*h[i])*(u-x[i+1])*(u-x[i+1])*(u-x[i+1])+g[i+1]/(6*h[i])*(x[i]-u)*(x[i]-u)*(x[i]-u)+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(u-x[i+1])+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(x[i]-u));}cout<<"x对应的函数值为:"<cout<<"y1="<}voidprintout(intn){cout<for(inti=0;icout<<"["<"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
if(u<=x[i]&&u>=x[i+1])
y2=fabs(g[i]/(6*h[i])*(u-x[i+1])*(u-x[i+1])*(u-x[i+1])+g[i+1]/(6*h[i])*(x[i]-u)*(x[i]-u)*(x[i]-u)+(y[i]-g[i]*h[i]*h[i]/6)/h[i]*(u-x[i+1])+(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i]*(x[i]-u));
cout<<"x对应的函数值为:
"<cout<<"y1="<}voidprintout(intn){cout<for(inti=0;icout<<"["<"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
cout<<"y1="<}voidprintout(intn){cout<for(inti=0;icout<<"["<"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
voidprintout(intn){
cout<for(inti=0;icout<<"["<"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
for(inti=0;icout<<"["<"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
cout<<"["<"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
"<floatt=g[i]/(6*h[i]);if(t>0)cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
floatt=g[i]/(6*h[i]);
if(t>0)
cout<elsecout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
else
cout<<-t<<"*(x-"<t=g[i+1]/(6*h[i]);if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
t=g[i+1]/(6*h[i]);
cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
cout<<"-"<<-t<<"*(x-"<t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
t=(y[i]-g[i]*h[i]*h[i]/6)/h[i];
cout<<"+"<elsecout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
cout<<"-"<<-t<<"*("<t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];if(t>0)cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
t=(y[i+1]-g[i+1]*h[i]*h[i]/6)/h[i];
cout<<"+"<elsecout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
cout<<"-"<<-t<<"*(x-"<cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
cout<}}五、计算结果与分析利用Matlab作出周期样条的轮廓图:图3-5-1周期样条函数轮廓图求出的周期三次样条插值函数为(截图):从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。可见求出的三次样条插值函数计算式近似正确。六、参考文献[1]姚全珠.C++面向对象程序设计[M].北京:电子工业出版社,2010.[2]秦新强.数值逼近[M].西安:西安理工大学印刷厂,2011.
利用Matlab作出周期样条的轮廓图:
图3-5-1周期样条函数轮廓图
求出的周期三次样条插值函数为(截图):
从程序运算结果截图中可以看出,作者对三次样条函数进行了检验,随便输入一个范围内的坐标值,得到两个函数值,与图3-5-1的函数值大体一致。
可见求出的三次样条插值函数计算式近似正确。
[1]姚全珠.C++面向对象程序设计[M].北京:
电子工业出版社,2010.
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2