2014-04-01 109 views
1

我在MATLAB中有兩個2D點p1, p2,每個點有一個正常的n1, n2。我希望找到連接兩個點的(立方)多項式,並與每端的指定法線一致。有沒有內置到MATLAB來做到這一點?在MATLAB中擬合曲線,其中點已指定法線

當然,我可以手動推導多項式方程,但MATLAB的curve fitting toolbox有很多內置的,我認爲這是可能的。我無法找到任何指定法線的曲線,樣條或多項式擬合的例子。

作爲這種推斷,我想擬合每個數據點具有正常指定的樣條線。

回答

2

1.如果您的點是一個函數的點,那麼需要cubic Hermite spline interpolation

在數值分析,立方樣條厄米或三次Hermite內插 是一個花鍵,其中每個片是第三-degree polynomial 以Hermite形式指定:也就是說,通過它的值和一階導數在相應域間隔的 端點處。

三次Hermite花鍵 通常用於在給定的 參數值x指定(1),X(2),...,X(N),以獲得光滑 連續函數數字數據的內插。數據應包含所需的函數 值和每個x(k)的導數。 (如果僅提供值,則必須從它們估計導數。)Hermite公式分別應用於每個區間(x(k),x(k + 1)) 。由此產生的 樣條將是連續的並且將具有連續的一階導數。

三次多項式樣條曲線可以用其他方式指定,Bézier 最常見。但是,這兩種方法提供了相同的樣條集,並且數據可以在 Bézier和Hermite形式之間輕鬆轉換;所以這些名字經常被用作好像是他們的代名詞 。

指定每個點的法線與指定切線(斜率,1階導數)相同,因爲後者垂直於前者。

在Matlab中,計算分段三次Hermite插值多項式的函數是pchip。唯一的問題是,pchip is a bit too clever

細心的讀者會發現,pchip取函數值作爲 輸入,但沒有導數值。這是因爲pchip使用函數值f(x)來估計導數值。 [...]做一個 良好的導數近似,函數必須使用一個 近似使用4個或更多點幸運的是,使用Matlab我們 可以寫我們自己的函數來做插值使用真正立方體 Hermite花鍵。

...作者說明了如何使用函數mkpp來做到這一點。

2.如果點是不的函數的一定點,則每個間隔應通過一個quadratic Bezier curve插值:

enter image description here

在這個例子中,3個點中給出:在端點P(0)和P(2)以及P(1),它們是端點處的切線的交點。 P(1)的位置可以很容易地從P(0)和P(2)的座標以及這些點的法線上計算出來。

在Matlab中,您可以使用spmak,請參閱示例herehere

1

你可以做這樣的事情:

function neumann_spline(p, m, q, n) 

% example data 
p = [0; 1]; 
q = [2; 5]; 
m = [0; 1]; 
n = [1; 1]; 

if (m(2) ~= 0) 
    s1 = atan(-m(1)/m(2)); 
else 
    s1 = pi/2; 
end 

if (n(2) ~= 0) 
    s2 = atan(-n(1)/n(2)); 
else 
    s2 = pi/2; 
end 

hold on 
grid on 
axis equal 

plot([p(1) p(1)+0.5*m(1)], [p(2) p(2)+0.5*m(2)], 'r', 'Linewidth', 1) 
plot([q(1) q(1)+0.5*n(1)], [q(2) q(2)+0.5*n(2)], 'r', 'Linewidth', 1) 

sp = csape([p(1) q(1)], [s1 p(2) q(2) s2], [1 1]); 
fnplt(sp) 

plot(p(1), p(2), 'k.', 'MarkerSize', 16) 
plot(q(1), q(2), 'k.', 'MarkerSize', 16) 

title('Cubic spline with prescribed normals at the endpoints') 

end 

結果是

enter image description here