How to| 运用样条函数
Wolfram 语言强大的样条函数功能同时包括数值和符号支持. 内置的基本多项式与有效的样条构建为研究样条性质以及各种关于样条的数学任务提供了方法.
Wolfram 语言提供有两种样条基,BSplineBasis 与 BernsteinBasis. 与其它特殊函数相似,它们可以用数字值进行运算:
BSplineBasis[3, 1 / 2]BernsteinBasis[3, 0, 0.5]通过 Plot 制作基函数的视图:
Plot[BSplineBasis[3, x], {x, 0, 1}]基函数可通过 PiecewiseExpand 扩展,以看到它们的符号表示:
PiecewiseExpand[BSplineBasis[3, x]]BSplineBasis 支持基函数的细节控制. 例如,下图通过将第二个参数由 0 到任意正整数变化,绘出了均匀二次B样条基函数族:
Plot[Evaluate[Table[BSplineBasis[2, i, x], {i, 0, 3}]], {x, 0, 2}]非均匀B样条基函数可通过指定一个非递减实数序列(称作节点)来表示. 节点序列定义一个B样条集合. 独立基可由范围在 0 到
之间的第二个参数指定,其中,
为节点序列的长度,
为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样条曲线可用 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 的导数是一个阶数降低一次的 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样条曲面,通过三维点数组指定. 用 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}]参数个数可作为 BSplineFunction 的第二个参数给出. 例如,这将生成一个双变量B样条曲线:
f = BSplineFunction[RandomReal[1, {10, 10}], 2]由于这是一个在
上的函数,我们可用 Plot3D 来显示它的图形:
Plot3D[f[x, y], {x, 0, 1}, {y, 0, 1}]