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)取得したスプライン グラフから区分方程式を取得するのに役立ちますか? もしそうなら、私はコマンドを理解する方法を知ることができますか? ありがとう!基本的に、カーブ フィット ツールボックスで取得したスプライン グラフ i を記述する方程式を取得できるようにしたいと考えています。どんな助けでも大歓迎です!

4

1 に答える 1

3

これは、Matlab で生成されたスプラインを分解して表示する方法を説明しようとしています。

モックデータの生成

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

3 次スプラインでデータを近似する

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;

以下に示すように、この情報を使用して作業を続けます。

3 次スプラインの場合、多項式は次の形式を持つため、多項式の次数は 4 であることに注意してください。

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

K = 4 の場合、各多項式には4 つの係数 C があります。最高次項 X^3 は、スプラインが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の関数) を使用することもできます。これは、たとえば 3 番目の部分に対して同じことを行います。

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 に答える