How to | スプライン関数を使う方法
Wolfram言語の強力なスプライン機能には,数値計算と記号計算の両方へのサポートが含まれている.組込みの基底多項式および効率的なスプライン関数は,スプラインを使ったさまざまな数学的タスクを行うためだけでなく,スプラインの特性を研究するための方法を提供する.
Wolfram言語は,BSplineBasisおよびBernsteinBasisという2つのスプライン基底を提供する.その他の特殊関数と同様,この基底は数値を使って評価することができる:
BSplineBasis[3, 1 / 2]BernsteinBasis[3, 0, 0.5]Plotを使って基底関数を可視化できる:
Plot[BSplineBasis[3, x], {x, 0, 1}]基底関数は記号的に表示するためにPiecewiseExpandを使って拡張することができる:
PiecewiseExpand[BSplineBasis[3, x]]BSplineBasisは基底関数に対する詳細な抑制をサポートする.例えば以下のプロットは,第2引数を0から任意の正の整数に変化させることによって,非一様二次Bスプライン基底関数のファミリを示す:
Plot[Evaluate[Table[BSplineBasis[2, i, x], {i, 0, 3}]], {x, 0, 2}]非一様Bスプライン基底は,「ノット」と呼ばれる減少しない実数列を指定することによって表すことができる.ノット列はBスプラインの集合を定義する.個々の基底は0から
の範囲の第2引数によって指定することができる.ここで
はノット列の長さ,
はBスプラインの次数である:
d = 3;knots = {0, 0, 0, 0, (1/7), (2/7), (4/7), (4/7), (4/7), (5/7), 1, 1, 1, 1};
Plot[Evaluate[Table[BSplineBasis[{d, knots}, i, x], {i, 0, Length[knots] - d - 2}]], {x, 0, 1}, PlotRange -> All]曲線や曲面といったBスプライン多様体は,Bスプライン基底関数と領域空間内の点との積の和として表すことができる.例えば,二次元の典型的なBスプライン曲線はDotを使って表すことができる:
pts = {{0, 0}, {1, 1}, {2, 0}, {3, 1}};
knots = {0, 0, 0, 0, 1, 1, 1, 1};
f[t_] := Dot[Table[BSplineBasis[{3, knots}, i, t], {i, 0, 3}], pts]曲線はParametricPlotを使って表すことができる:
ParametricPlot[f[t], {t, 0, 1}, Epilog -> {Red, Point[pts]}]BSplineFunctionはBスプライン曲線を表す便利で効率的な方法を提供する:
g = BSplineFunction[pts, SplineDegree -> 3, SplineKnots -> knots]InterpolatingFunctionのように,BSplineFunctionからの結果は与えられた領域上の点で評価したり,ParametricPlotを使ってプロットしたりすることができる:
g[0.5]ParametricPlot[g[t], {t, 0, 1}, Epilog -> {Red, Point[pts]}]BSplineFunctionの導関数は結果として1レベル低い次数のBSplineFunctionになる.以下の例では,導関数を使ってBスプライン曲線の上に正接ベクトルを描く:
dg = g'ParametricPlot[g[t], {t, 0, 1}, Epilog -> Table[Arrow[{g[t], g[t] + (dg[t]/5)}], {t, 0, 1, (1/10)}]]BSplineFunctionはBスプライン曲面を表すことも可能で,この曲面は3Dの点の配列で指定することができる.これはParametricPlot3Dを使ってプロットできる:
pts = {{{0, 0, 2}, {1, 0, 1}, {3, 0, 2}, {4, 0, 0}},
{{0, 1, 3}, {1, 1, 2}, {3, 1, 3}, {4, 1, 1}}, {{0, 2, 3}, {1, 2, 2}, {3, 2, 3}, {4, 2, 1}}, {{0, 3, 2}, {1, 3, 1}, {3, 3, 2}, {4, 3, 0}}};
s = BSplineFunction[pts]ParametricPlot3D[s[u, v], {u, 0, 1}, {v, 0, 1}]パラメータの数は第2引数としてBSplineFunctionに与えることができる.例えば,以下は二変数Bスプライン関数を生成する:
f = BSplineFunction[RandomReal[1, {10, 10}], 2]これは
上の関数であるので,表示にPlot3Dが使える:
Plot3D[f[x, y], {x, 0, 1}, {y, 0, 1}]