2013-09-24 49 views
0

我有一組數據,我想在matlab中使用曲線擬合工具箱來繪製數據的樣條曲線圖。我已經做到了這一點:spline的分段方程

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中值的重要性。謝謝!基本上我想能夠獲得一個方程/方程來描述我通過曲線擬合工具箱獲得的樣條曲線圖。任何幫助將不勝感激!

+0

見http://www.mathworks.co.uk/help/matlab/ref/unmkpp.html – am304

+1

在一般情況下,如果你想了解一個命令嘗試使用幫助或文檔,例如:'help unmkpp'或'doc unmkpp'。你當然可以使用谷歌,但這將保證文檔符合你的版本的Matlab。 –

+0

@ am304 Thanks.i的確遇到了這個頁面,對我來說太困難/抽象了。 –

回答

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,其中包含有關p的所有信息iecewise多項式:

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,因此每個多項式具有係數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 
評價多項式

enter image description here

+0

謝謝努力..我仍然試圖消化this.cause我是一個matlab初學者。無論如何,我可以問一下curvefit工具箱中的三次樣條曲線和平滑樣條曲線選項是否有區別? –

+0

@BenjaminAlonsoTan平滑樣條曲線用於「減少」噪聲,假設分段多項式是對基礎信號進行建模的精確方法。這與通常使用樣條來模擬數據(例如出於插值的目的)不同。我的答案是那些是兩種不同的應用程序,結果不一定相同 –