2015-12-09 40 views
0

您好,我嘗試過在Matlab中進行樣條插值。我有以下數據:用R樣條插值創建包絡

N = 36 

我也有數據 「最大」

> max 
    1 
    5 
    7 
    10 
    12 
    14 
    16 
    20 
    24 
    27 
    31 
    33 
    35 

和 「HMAX」

> hmax 
    157 
    124 
    207 
    208 
    170 
    178 
    163 
    160 
    146 
    151 
    160 
    173 
    172 

然後我想創建與Matlab的樣條插值信封,以下代碼:

maxenv = spline(max,hmax,1:N); 

該代碼會顯示結果

> maxenv 
    157 
    86.564389 
    67.53534827 
    84.9886334 
    124 
    169.6452037 
    207 
    224.3964594 
    223.1919113 
    208 
    185.4207867 
    170 
    172.1744995 
    178 
    172.7562154 
    163 
    158.1641553 
    157.9081319 
    159.4480425 
    160 
    157.5512022 
    153.1731874 
    148.7085789 
    146 
    146.3035305 
    148.5290764 
    151 
    152.5114649 
    153.7458399 
    155.857295 
    160 
    166.578645 
    173 
    175.921355 
    172 
    157.893225 

現在,我想在同一編碼R創建具有樣條插值信封:

maxenv <- spline(max,hmax,n=36) 

,但我得到不同的結果與我的Matlab代碼。我如何在R中獲得相同的結果?或者Matlab和R上的「樣條」是不同的函數?

謝謝你非常

+0

你是否嘗試用R改變方法:'maxenv < - spline(x,y,n,method =「fmm」)'?可能的值是「fmm」,「自然」和「週期性」。我不確定,但我認爲自然方法對應於matlab中的三次方法。 – obchardon

+0

你好@ bchardon謝謝你的回答。我試圖改變方法,但結果仍然與matlab不同。 – Dikabari

回答

1

spline功能,n指定的「相等間隔的點跨越間隔[XMIN,XMAX]」的數量。但是,您的Matlab點包括x=36,它是x=35的最大輸入數據點之外的1,因此R和Matlab結果不適用於相同的x值。爲了進行比較,您可能需要使用xout =序列1:36以獲得最直接的比較結果。使用這種修正並使用默認的R樣條方法(Forsythe,Malcolm和Moler),最大的差異在於初始值,這可能與R和Matlab使用略微不同的方法來開始樣條插值有關。

EDITED

xx <- 1:36 
maxenvR <- data.frame(spline(max, hmax, xout=xx, method="fmm")) 
maxenvRnat <- data.frame(spline(max, hmax, xout=xx, method="natural")) 
plot(xx, maxenv[1:length(xx)], type="l", col="black", ylab = "hmax") 
lines(maxenvR, col="blue") 
lines(maxenvRnat, col="green") 
points(max, hmax, col="red", pch=16) 
legend("bottomright", legend=c("Matlab spline", "R fmm spline", "R natural spline", "Data Points"), 
     text.col=c("black","blue","green", "red"), col=c("black","blue","green","red"), lty="solid") 

插值樣條的算法可以通過它們的處理中的數據的末端的邊界條件不同。對於一般樣條插值,R spline允許選擇使用natural三次樣條,這些樣條將插值三次樣條的二階導數設置爲數據的每一端爲零,或者將三次多項式擬合到每一端的前四個點數據,然後將它們與樣條方程相連接。從圖中可以看出,對於前幾個點,這可以給出非常不同的結果,但隨後趨於收斂於內部點。它的樣條函數的Matlab文檔似乎沒有描述它如何處理邊界條件,我沒有訪問它給出的參考,但從圖中看來,它非常接近R的fmm方法。內插內點同意至少三位有效數字。然而,根據這個例子,似乎Matlab和R的spline功能與fmm不相同。
enter image description here

+0

非常感謝。它的平均樣條使用matlab和R從來沒有得到相同的結果? @WaltS – Dikabari

+0

請參閱上面的編輯版本。 – WaltS