天天看點

五次B樣條曲線五次B樣條曲線

五次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)
           

繼續閱讀