Spline の連続性および端条件
|
返される結果の区分的関数の形は、次数 d が奇数か偶数かに依存します。
|
|
奇数の次数
|
|
|
CurveFitting[Spline] で作成される結果の関数は、piecewise(v<x[1], p[1], ..., p[n]) の形となります。ここで n 個のスプラインセクション {p[1], p[2], ..., p[n]} は、多くても d 次の多項式になります。これら多項式は、以下の (d+1)*n 個の条件によって与えられます:
|
|
2*n 個の補間条件
|
|
|
p (x ) = y and p (x ) = y for i=1,2,...,n
i i-1 i-1 i i i
|
|
|
(d-1)*(n-1) 個の連続性条件
|
|
•
|
節における 1, 2, ..., d-1 次導関数の強制的な連続性
|
|
(k) (k)
p (x ) = p (x ) for i=1,2,...,n-1 and
i i i+1 i
k=1,2,...,d-1
|
|
|
d-1 個の端条件
|
|
•
|
自然なスプラインは、endpoints='natural' で指定されます。
|
|
端の節点における (d+1)/2, ..., d-1 次の導関数は、0 に等しくなります。
|
|
(k) (k)
p (x ) = 0 and p (x ) = 0 for k=(d+1)/2,...,d-1
1 0 n n
|
•
|
"Not-a-knot" スプラインは、endpoints='notaknot' で指定されます。
|
|
節 x[i] (i=1, 2, ..., (d-1)/2 および i=n-(d-1)/2, ..., n-1)における d 次の導関数の、強制的な連続性
|
|
(d) (d)
p (x ) = p (x )
i i i+1 i
and for i=1,2,...,(d-1)/2
(d) (d)
p (x ) = p (x )
n-i n-i n-i+1 n-i
|
•
|
周期スプラインは、endpoints='periodic' で指定されます。
|
|
端の節点では、1, 2, ..., d-1次の導関数が一致するするようにします。
|
|
(k) (k)
p (x ) = p (x ) for k=1,2,...,d-1
1 0 n n
|
•
|
Clamped スプラインは、endpoints=Vで指定されます。
|
|
端の節点における 1, 2, ..., (d-1)/2 次の導関数は、V に与えられた指定の値に等しくなります。ここで V は、指定された clamped 条件を含む、 d-1 次元のリスト、ベクトル、または配列を表します。特に、
|
|
(1) [(d-1)/2]
V = [ p (x ), ..., p (x ),
1 0 1 0
(1) [(d-1)/2]
p (x ), ..., p (x ) ], with
n n n n
(k)
p (x ) = V
1 0 k
and for k=1,2,...,(d-1)/2
(k)
p (x ) = V
n n k+(d-1)/2
|
•
|
一般化スプラインは、endpoints=G で与えられます。
|
|
一般化された端条件は、(節点 x[0], x[1], x[n-1] および x[n] (ここで n > 1)における任意の次数の)、導関数値の任意の線形結合を用いて指定されます。このような端条件は、x が 4*d 次元の(以下に示すような)ベクトルであるところの、Ax=b という形の線形系で表現することが可能です。
|
|
(1) (1)
x = [ p (x ), p (x ), ...,
1 0 2 1
(d-1) (d-1) (d) (d)
p (x ), p (x ), p , p ,
1 0 2 1 1 2
(1) (1)
p (x ), p (x ), ...,
n-1 n-1 n n
(d-1) (d-1) (d) (d)
p (x ), p (x ), p , p ]
n-1 n-1 n n n-1 n
|
|
A は、d-1 × 4*d 次元の対応する係数行列となります。また b は、線形系の右辺を表す d-1 次元のベクトルです。
|
|
一般化された端条件は、オプションパラメータ endpoints=G (ここで G は行列または配列)を用いて指定されます。ここで G は、d-1 ×4*d+1 次元の拡大線形系を表します。
|
|
|
|
偶数の次数
|
|
|
CurveFitting[Spline] で作成される結果の関数は、piecewise(v<z[1], p[1], ..., v<z[n], p[n], p[n+1]) の形となります。ここで、i = 1, 2, ..., n に関して、z[i] = 1/2*(x[i-1]+x[i]) であり(これはスプラインの節が節点の中間点に定義されるという意味)、そして n+1 個のスプラインセクション {p[1], p[2], ..., p[n]} は、多くても d 次の多項式になります。これら多項式は、以下の (d+1)*(n+1) 個の条件によって与えられます:
|
|
節点における n+1 個の補間条件
|
|
|
p (x ) = y for i=1,2,...,n+1
i i-1 i-1
|
|
|
節における n 個の補間関数
|
|
|
p (z ) = p (z ) for i=1,2,...,n
i i i+1 i
|
|
|
(d-1)*n 個の連続性条件
|
|
•
|
節における 1, 2, ..., d-1 次導関数の強制的な連続性
|
|
(k) (k)
p (z ) = p (z ) for i=1,2,...,n and
i i i+1 i
k=1,2,...,d-1
|
|
|
d 個の端条件
|
|
•
|
自然なスプラインは、endpoints='natural' で指定されます。
|
|
端の節点における d/2, ..., d-1 次の導関数は、0 に等しくなります。
|
|
(k) (k)
p (x ) = 0 and p (x ) = 0 for k=d/2,...,d-1
1 0 n+1 n
|
•
|
"Not-a-knot" スプラインは、endpoints='notaknot' で指定されます。
|
|
節 z[i] (i=1, 2, ..., d/2 および i=n+1-d/2, ..., n-1)における d 次の導関数の、強制的な連続性
|
|
(d) (d)
p (z ) = p (z )
i i i+1 i
and for i=1,2,...,d/2
(d) (d)
p (z ) = p (z )
n+1-i n+1-i n+2-i n+1-i
|
•
|
周期スプラインは、endpoints='periodic' で指定されます。
|
|
端の節点では、1, 2, ..., d 次の導関数が一致するするようにします。
|
|
(k) (k)
p (x ) = p (x ) for k=1,2,...,d
1 0 n+1 n
|
•
|
Clamped スプラインは、endpoints=V で指定されます。
|
|
端の節点における 1, 2, ..., d/2 次の導関数は、V に与えられた指定の値に等しくなります。ここで V は、指定された clamped 条件を含む、 d 次元のリスト、ベクトル、または配列を表します。特に、
|
|
(1) (d/2)
V = [ p (x ), ..., p (x ),
1 0 1 0
(1) (d/2)
p (x ), ..., p (x ) ], with
n+1 n n+1 n
(k)
p (x ) = V
1 0 k
and for k=1,2,...,d/2
(k)
p (x ) = V
n+1 n k+d/2
|
•
|
一般化スプラインは、endpoints=G で指定されます。
|
|
一般化された端条件は、(節点 x[0] および x[n] における任意の次数 1, 2, ..., d の)、導関数値の任意の線形結合を用いて指定されます。このような端条件は、x が2*d 次元の(以下に示すような)ベクトルであるところの、Ax=b という形の線形系で表現することが可能です。
|
|
(1) (d-1) (d)
x = [ p (x ), ..., p (x ), p ,
1 0 1 0 1
(1) (d-1) (d)
p (x ), ..., p (x ), p ]
n+1 n n+1 n n+1
|
|
A は、d-1 × 2*d 次元の対応する係数行列となります。また b は、線形系の右辺を表す d 次元のベクトルです。
|
|
一般化された端条件は、オプションパラメータ endpoints=G (ここで G は行列または配列)を用いて指定されます。ここで G は、d-1 ×2*d+1 次元の拡大線形系を表します。
|
|
|
|
例
|
|
>
|
with(CurveFitting):
data := [[0,0],[1,5],[2,-1],[3,0]];
|
| (3.1) |
端条件 'natural' を使用した、5次のスプライン
>
|
Spline(data, v, degree=5, endpoints='natural');
|
| (3.2) |
端条件 'periodic' を使用した、3次のスプライン
>
|
Spline(data, v, degree=3, endpoints='periodic');
|
| (3.3) |
端条件 'notaknot' を使用した、2次のスプライン
>
|
Spline(data, v, degree=2, endpoints='notaknot');
|
| (3.4) |
2つの端節点で勾配 A および B を用いた、3次の clamped スプライン
>
|
Spline(data, v, endpoints=[A,B]);
|
| (3.5) |
端節点における2次導関数が5に等しくなるという一般化された端条件を用いた、3次のスプライン
>
|
G := Matrix(2,13,{(1,3)=1,(1,13)=5,(2,10)=1,(2,13)=5}):
Spline(data, v, endpoints=G);
|
| (3.6) |
|
|