一阶边界条件三次样条插值C++编程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

/*杭州电子科技大学数值计算方法期末作业C++三次样条插值函数*//*解决了网上流行版本中三次样条插值函数显示结果没把X相同次幂合并的不足*//*删去了其它情况,只保留了一阶导数边界条件的情况*//*各语句结构上也更有条理性*/#includeiostream#includeiomanip#includemath.husingnamespacestd;//全局变量constintMAX=50;floatx[MAX],y[MAX],h[MAX];floatc[MAX],a[MAX],fxym[MAX];//函数声明floatf(intx1,intx2,intx3);//求差分voidcal_m(intn);//用追赶法求解出弯矩向量M……voidprintout(intn);//计算结果中X不同次幂的系数,并输出结果voidmain(){intn,i;cout请输入点的个数:;cinn;n=n-1;for(i=0;i=n;i++){coutendl请输入Xi:;cinx[i];cout请输入Yi:;ciny[i];}for(i=0;in;i++)h[i]=x[i+1]-x[i];//求步长floatf0,f1;coutendl请输入Y0\':;cinf0;cout请输入Yn\':;cinf1;c[0]=1;a[n]=1;fxym[0]=6*((y[1]-y[0])/(x[1]-x[0])-f0)/h[0];fxym[n]=6*(f1-(y[n]-y[n-1])/(x[n]-x[n-1]))/h[n-1];for(i=1;in;i++)fxym[i]=6*f(i-1,i,i+1);for(i=1;in;i++){a[i]=h[i-1]/(h[i]+h[i-1]);c[i]=1-a[i];}a[n]=h[n-1]/(h[n-1]+h[n]);cal_m(n);cout\n此三次样条插值函数为:\n;printout(n);}//以下都是自定义函数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]);}voidcal_m(intn)//用追赶法求解出弯矩向量M……{floatB[MAX];B[0]=c[0]/2;for(inti=1;in;i++)B[i]=c[i]/(2-a[i]*B[i-1]);fxym[0]=fxym[0]/2;for(i=1;i=n;i++)fxym[i]=(fxym[i]-a[i]*fxym[i-1])/(2-a[i]*B[i-1]);for(i=n-1;i=0;i--)fxym[i]=fxym[i]-B[i]*fxym[i+1];}voidprintout(intn){coutsetprecision(6);//有效数字为6位for(inti=0;in;i++){couti+1:[x[i],x[i+1]]\n\t;floatt1,t2,t3,t4;//用t1到t4表示未合并时各项系数floata,b,c,d;//用abcd表示合并后各项的系数floateps=0.00001;t1=fxym[i]/(6*h[i]);t2=fxym[i+1]/(6*h[i]);t3=(y[i]-fxym[i]*h[i]*h[i]/6)/h[i];t4=(y[i+1]-fxym[i+1]*h[i]*h[i]/6)/h[i];a=-t1+t2;b=3*(t1*x[i+1]-t2*x[i]);c=3*(-t1*x[i+1]*x[i+1]+t2*x[i]*x[i])-t3+t4;d=t1*pow(x[i+1],3)-t2*pow(x[i],3)+t3*x[i+1]-t4*x[i];if(fabs(a)eps)a=0;//用一个接近于0的eps判断a是否为0,fabs是绝对值函数couta*X^3;if(fabs(b)eps)b=0;if(b=0)cout+b*X^2;elsecout--b*X^2;if(fabs(c)eps)c=0;if(c=0)cout+c*X;elsecout--c*X;if(fabs(d)eps)d=0;if(d=0)cout+d;elsecout--d;coutendlendl;}coutendl;}

1 / 3
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功