xcsyb 发表于 2006-5-18 09:35

[求助]询问matlab中的spline函数

<BR>matlab中的spline是三次样条拟合函数吗?<BR>如果是的话,是按哪种边界条件的三次样条?<BR>怎么我用C语言编写的三次样条插值和matlab的spline得出的结果差别那么大?

suffer 发表于 2006-5-18 11:06

回复:(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&lt;stdio.h&gt;<BR>#include&lt;graphics.h&gt;<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(&amp;gdriver,&amp;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&lt;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&lt;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&lt;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&lt;n;++i)<BR>       {<BR>          j=n-1-i;<BR>         c=a*c+b;<BR>       }<BR>   for(i=0;i&lt;n-1;++i)<BR>       {<BR>          if(x+1&gt;=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&lt;=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&lt;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]
查看完整版本: [求助]询问matlab中的spline函数