[求助]询问matlab中的spline函数
<BR>matlab中的spline是三次样条拟合函数吗?<BR>如果是的话,是按哪种边界条件的三次样条?<BR>怎么我用C语言编写的三次样条插值和matlab的spline得出的结果差别那么大?回复:(xcsyb)[求助]询问matlab中的spline函数
spline三次样条多项式拟合,数据点处光滑--左导等于右导<BR><BR>你试一下下面的c语言写的函数的结果是否一致?<BR><BR><P>/****************************************************************/<BR>/* 具体步骤: */<BR>/* ①根据给出的样本点x(i),y(i)计算边界条件系数r(i),t(i) */<BR>/* ②在边界条件下求c(1),c(2)......c(n) */<BR>/* ③计算个子区间上各点的函数值然后用画线函数绘出*/<BR>/* 具体过程请参考计算方法 */<BR>/******************************************************************/<BR>#include<stdio.h><BR>#include<graphics.h><BR>main()<BR>{<BR> int x={0,150,260,370,450,520,600};<BR> int y={0,80,120,20,60,100,50};<BR> int gdriver=DETECT,gmode;<BR> initgraph(&gdriver,&gmode,"");<BR> Wbox(x,y,6);<BR> spline(x,y,7,3);<BR> getch();<BR> closegraph();<BR>}<BR>spline(x,y,n,color)<BR>int x[],y[],n,color;<BR>{<BR> float a,b,r,t,c,h,u2,u3,v2,v3;<BR> register int i,x0,y0,x1,y1,j;<BR> for(i=0;i<n-1;++i)<BR> h=(float)(x-x);<BR> r=1.0;<BR> r=0.0;<BR> t=(float)(y-y)*3.0/h;<BR> t=(float)(y-y)*3.0/h;<BR> for(i=1;i<n-1;++i)<BR> {<BR> r=h/(h+h);<BR> t=3.0*((1-r)*(float)(y-y)/h+r*(float)(y-y)/h);<BR> }<BR> a=-r/2.0;<BR> b=t/2.0;<BR> for(i=1;i<n;++i)<BR> {<BR> a=-r/(2.0+(1.0-r)*a);<BR> b=(t-(1.0-r)*b)/(2.0+(1.0-r)*a);<BR> }<BR> c=b;<BR> for(i=1;i<n;++i)<BR> {<BR> j=n-1-i;<BR> c=a*c+b;<BR> }<BR> for(i=0;i<n-1;++i)<BR> {<BR> if(x+1>=x)<BR> {<BR> setcolor(color);<BR> line(x,y,x,y);<BR> }<BR> else<BR> {<BR> x0=x;<BR> y0=y;<BR> for(j=x+1;j<=x;++j)<BR> {<BR> u2=((float)(x-j)/h)*((float)(x-j)/h);<BR> u3=u2*((float)(x-j)/h);<BR> v2=((float)(j-x)/h)*((float)(j-x)/h);<BR> v3=v2*((float)(j-x)/h);<BR> y1=(int)((3.0*u2-2.0*u3)*y+(3.0*v2-2.0*v3)*y<BR> +h*c*(u2-u3)-h*c*(v2-v3));<BR> x1=j;<BR> setcolor(color);<BR> line(x0,y0,x1,y1);<BR> x0=x1;<BR> y0=y1;<BR> }<BR> }<BR> }<BR>}<BR> Wbox(int x[],int y[],int n)<BR>/*int x[],y[],n;*/<BR>{<BR> int i;<BR> for(i=0;i<n;++i)<BR> {<BR> putpixel((x-1),(y-1),6);<BR> putpixel((x-1),y,6);<BR> putpixel(x-1,y+1,6);<BR> putpixel(x,y-1,6);<BR> putpixel(x,y+1,6);<BR> putpixel(x+1,y-1,6);<BR> putpixel(x+1,y,6);<BR> putpixel(x+1,y+1,6);<BR> }<BR>}</P>
页:
[1]