五次B樣條曲線
MATLAB 的實作
B樣條曲線有節點向量(knot vector)和控制頂點(control points)組成,在給出待插值點,先根據點的特征确定節點向量,再根據插值點以及邊界條件列舉等式方程進而确定控制頂點。MATLAB 中B樣條插值實作的函數是spapi()
spline = spapi(knots,x,y) returns the spline f (if any) of order
k = length(knots) - length(x)
with knot sequence knots for which
f(x(j)) = y(:,j), all j.
If some of the entries of x are the same, then:
D m ( j ) f ( x ( j ) ) = y ( : , j ) D^{m(j)} f(x(j))=y(:, j) Dm(j)f(x(j))=y(:,j)
注意:此處 x ( j ) x(j) x(j)有m重,目的是為了添加限制,同理,我們可以添加邊界條件。
MATLAB曲線官方執行個體:
spapi([0 0 0 0 1 2 2 2 2],[0 1 1 1 2],[2 0 1 2 -1])
其手動設定了節點向量,根據節點向量的節點的重複度判斷是三次B樣條插值,節點值為0,1,2,且在節點值1處設定其速度和加速度限制條件(注:三次B樣條插值需要補充兩個等式方程,否則方程欠定,解不唯一)。限制條件為:
f ( 0 + ) = 2 , f ( 1 ) = 0 , Df ( 1 ) = 1 , D 2 f ( 1 ) = 2 , f ( 2 − ) = − 1 f(0+)=2, f(1)=0, \operatorname{Df}(1)=1, D^{2} f(1)=2, f(2-)=-1 f(0+)=2,f(1)=0,Df(1)=1,D2f(1)=2,f(2−)=−1
當然可以使用
spapi(k,x,y)
令aptknt function自動确定節點向量,其中k為B樣條的order(注:order = degree + 1).
五次B樣條插值執行個體
采用邊界速度和加速度均為零邊界條件,即多添加了四個等式限制。待插值點為:
P = [90 0 50; 80 25 60;60 45 75;-30 80 80; -60 120 100;40 50 120; 70 20 130;90 -30 150]';
節點向量采用:
uniqueknot = [0 0 0 0 0 0 1 2 3 4 5 6 7 7 7 7 7 7]; % knot vector
全部代碼為:
clc,clear
P = [90 0 50; 80 25 60;60 45 75;-30 80 80; -60 120 100;40 50 120; 70 20 130;90 -30 150]';
uniqueknot = [0 0 0 0 0 0 1 2 3 4 5 6 7 7 7 7 7 7]; % knot vector
% interpolation points and boundary conditions
x = [0 0 0 1 2 3 4 5 6 7 7 7]; % Data sites
y = [P(:,1) zeros(3,1) zeros(3,1) P(:,2:end) zeros(3,1) zeros(3,1)]; % Data values to fit
f = spapi(uniqueknot, x, y); % B-spline curve
df = fnder(f,1); ddf = fnder(f,2); % derivatives
v0 = fnval(df,0)
a0 = fnval(ddf,0)