我在MATLAB中有兩個2D點p1, p2
,每個點有一個正常的n1, n2
。我希望找到連接兩個點的(立方)多項式,並與每端的指定法線一致。有沒有內置到MATLAB來做到這一點?在MATLAB中擬合曲線,其中點已指定法線
當然,我可以手動推導多項式方程,但MATLAB的curve fitting toolbox有很多內置的,我認爲這是可能的。我無法找到任何指定法線的曲線,樣條或多項式擬合的例子。
作爲這種推斷,我想擬合每個數據點具有正常指定的樣條線。
我在MATLAB中有兩個2D點p1, p2
,每個點有一個正常的n1, n2
。我希望找到連接兩個點的(立方)多項式,並與每端的指定法線一致。有沒有內置到MATLAB來做到這一點?在MATLAB中擬合曲線,其中點已指定法線
當然,我可以手動推導多項式方程,但MATLAB的curve fitting toolbox有很多內置的,我認爲這是可能的。我無法找到任何指定法線的曲線,樣條或多項式擬合的例子。
作爲這種推斷,我想擬合每個數據點具有正常指定的樣條線。
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插值:
在這個例子中,3個點中給出:在端點P(0)和P(2)以及P(1),它們是端點處的切線的交點。 P(1)的位置可以很容易地從P(0)和P(2)的座標以及這些點的法線上計算出來。
你可以做這樣的事情:
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
結果是