0

我有一组数据,我想在 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 中的值的重要性。谢谢!基本上我希望能够获得一个方程/方程来描述我通过曲线拟合工具箱获得的样条图。任何帮助将不胜感激!

4

1 回答 1

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;

因此,没有必要调用unmkppifpp是一个包含所有信息的结构(如上),而您只需要系数和中断。相反,您只需键入

 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 与样条曲线一致

要评估分段多项式:

(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

在此处输入图像描述

于 2013-09-24T12:55:51.407 回答