样条的分段方程

时间:2013-09-24 08:16:24

标签: matlab

我有一组数据,我想在matlab中使用曲线拟合工具箱来绘制数据的样条图。我这样做了:

x =

  Columns 1 through 10

     0    1.2500    1.8800    2.5000    5.0000    6.2500    6.8800    7.1900    7.5000   10.0000

  Columns 11 through 13

   12.5000   15.0000   20.0000
y =

  Columns 1 through 10

      -85.9300  -78.8200  -56.9500  -34.5600  -33.5700  -39.6400  -41.9600  -49.2800  -66.6000  -66.6100

      Columns 11 through 13

      -59.1600  -48.7800  -41.5300
    cftool
 [breaks,coefs,l,k,d] = unmkpp(pp)

breaks =

  Columns 1 through 10

         0    1.2500    1.8800    2.5000    5.0000    6.2500    6.8800    7.1900    7.5000   10.0000

  Columns 11 through 13

   12.5000   15.0000   20.0000


coefs =

   -4.8535   30.6309  -25.0170  -85.9300
   -4.8535   12.4304   28.8095  -78.8200
  -11.9651    3.2573   38.6927  -56.9500
    3.0330  -18.9977   28.9337  -34.5600
   -0.2294    3.7501   -9.1852  -33.5700
  -11.6351    2.8899   -0.8852  -39.6400
  -68.6157  -19.1004  -11.0978  -41.9600
  130.6350  -82.9130  -42.7220  -49.2800
   -6.3971   38.5776  -56.4659  -66.6000
    1.6010   -9.4008   16.4760  -66.6100
   -0.2967    2.6064   -0.5099  -59.1600
   -0.2967    0.3814    6.9597  -48.7800


l =

    12


k =

     4


d =

     1

如果我错了,请纠正我,命令[breaks,coefs,l,k,d] = unmkpp(pp)是否能够帮助我从我获得的样条曲线图中获得分段方程式?如果是这样,我可以知道我如何理解命令,所以我可以利用我自己的优势以及coefs,k,d中值的重要性。谢谢!基本上我希望能够获得方程式/方程来描述通过曲线拟合工具箱获得的样条图。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

这试图解释如何分离和显示在Matlab中生成的样条线。

生成模拟数据

xx = [1:10];
yy = cos(xx);

使用三次样条拟合数据

pp = spline(xx,yy);

用分段多项式插值,在x

中的更精细网格上进行评估
xxf = linspace(min(xx),max(xx),100);
yyf=ppval(pp,xxf);

首先检查pp,其中包含有关分段多项式的所有信息:

 pp = 

   form: 'pp'
 breaks: [1 2 3 4 5 6 7 8 9 10]
  coefs: [9x4 double]
 pieces: 9
  order: 4
    dim: 1

功能

[breaks,coefs,l,k,d] = unmkpp(pp)

仅展开结构pp的内容,以便:

 d = pp.dim; 
 l = pp.pieces; 
 breaks = pp.breaks; 
 coefs = pp.coefs;
 k = pp.order;

因此,如果unmkpp是包含所有信息的结构(如上所述),则无需调用pp,您只需要系数和中断。相反,你只需输入

即可
 breaks = pp.breaks; 
 coefs = pp.coefs;

并继续使用此信息,如下所示。

请注意,对于三次样条曲线,多项式的阶数为4,因为多项式的形式为

  

C(1)* X ^(K-1)+ C(2)* X ^(K-2)+ ... + C(K-1)* X + C(K)

,K = 4,因此每个多项式都有 4 系数C.最高阶项X ^ 3与样条 cubic 一致。

评估分段多项式:

(1)选择您要评估的作品 由breaks

定义的多项式

(2)选择存储在coefs中的该片段的正确系数。

因为这些是分段多项式,我们对它们进行评估 根据实际值,范围0-1然后拉伸移位 x。我们使用范围0-1来使用标准函数polyval来评估所选部分的多项式系数,以评估在感兴趣的范围内具有已知系数的多项式。

因此,我们找到与该片相对应的系数cf并评估点xev处的多项式:

xev = linspace(0,1,100);
cf = pp.coefs(1,:);  
yyp=polyval(cf,xev);

我们为绘图保留了一些额外的信息:

br = pp.breaks(1:2); % find the breaks (beginning and end of stretch of interest)
xxp = linspace(br(1),br(2),100);

我们可以概括这个程序。因此对于第n件(比如说#6):

n = 6;

cf = pp.coefs(n,:);
yyp2=polyval(cf,xev);

br = pp.breaks(n:n+1);
xxp2 = linspace(br(1),br(2),100);

当然,您可以跳过上述内容,只需使用ppval(函数专用来处理spline函数系列),这将执行 对你来说也是一样,对第三件说:

br = pp.breaks(3:4); % limits of the piece
xxp3 = linspace(br(1),br(2),100);
yyp3=ppval(pp,xxp3);

最后我们plot上面评估的所有多项式

plot(xx,yy,'.')
hold on
plot(xxf,ppval(pp,xxf),'k:')
plot(xxp,yyp,'g-','linewidth',2)
plot(xxp2,yyp2,'r-','linewidth',2)    % <-- generated with polyval
plot(xxp3,yyp3,'c-','linewidth',2)    % <-- generated with ppval
axis tight

enter image description here