2016-03-04 89 views
0

我想在邊界結上實現一個具有零斜率(平面外推)的夾緊三次樣條,但是我無法獲得所需的結果。用平面外推法夾緊三次樣條

例如設置:

x = [3 4 7 9]; 
y = [2 1 2 0.5]; 

我可以使用CSAPE函數來獲取分段多項式

pp = csape(x,y,'variational'); 

接着,在範圍評價第[0-10]的產量,

xx = 0:0.1:10; 
yy =ppval(pp,xx); 
plot(xx,yy) 

enter image description here

然而,該方法沒有達到[3-9]範圍外的平坦外推(即對於x < 3 y的所有值應該是2,和對於x> 9 y的所有值應爲0.5)

有什麼辦法可以達到預期的效果嗎?

編輯:在邊界結連續性應該被保留

回答

1

我不認爲有任何需要使用csape,你可以只使用spline。從spline的文檔:

如果Y是包含兩個以上值比x具有條目的向量,Y中的 第一個和最後值被用作endslopes用於三次樣條 。

此外,花鍵允許您直接獲得插值yy值,因此:

x = [3 4 7 9]; 
y = [2 1 2 0.5]; 
xx = 0:0.1:10; 
yy = spline(x,[0 y 0], xx); 
plot(xx,yy) 

這列出了我的陰謀。在此

Spline Plot

尋找,斜率是在邊界處(X = 3和X = 9),這是我們所要求的「夾持」花鍵與在邊界處零梯度爲零。如果你想擁有零梯度超越了界限,我會建議只是做了以下內容:

yy(xx<x(1)) = y(1); 
yy(xx>x(length(x))) = y(length(y)); 

,並提供:

enter image description here

編輯

這給出了一個連續y功能在結節處,但是y'在末端不平滑。如果你想y'平滑你可以填充你的輸入陣列,並將其用作spline函數的輸入。這會給你一些振盪,如下所示,但是,這可能會或可能不是你想要的。

% Spline on padded input arrays 
x = [0 1 2 3 4 7 9 10 11 12]; 
y = [2 2 2 2 1 2 0.5 0.5 0.5 0.5]; 
yy = spline(x,y, xx); 

enter image description here

+0

謝謝RPM。這非常有用。事實上,我需要的是在邊界之外有一個零梯度,就像在第二個圖中一樣。還有一個問題:用y(1)和y(長度(y))替代邊界外的值是否保留了邊界節點上函數的連續性? – sets

+0

好吧,看看情節,你可以看到'y'是連續的,但我不認爲'y''會平滑。如果你想讓這些變得平滑,你可以放置你的數組(在你的案例中加入'2'到開頭和'0.5's到最後),但是你會發現曲線振盪而不是平坦。我將對此進行編輯。 – RPM