# 曲线拟合工具箱样条与 Syslab 样条
# 曲线拟合工具箱样条
曲线拟合工具箱样条函数包含论文 A Practical Guide to Splines, (Applied Math. Sciences Vol. 27, Springer Verlag, New York (1978), xxiv + 392p; revised edition (2001), xviii+346p)(下文简称其为 PGS)描述的 B 样条包。工具箱使得创建与处理分段多项式函数更为容易了。
工具箱的典型用处包括对分段多项式逼近的构建与使用。这样的构建与数据拟合相关,且能够使用的数据范围很广。在最简单的情形,给定点 (ti,yi) 然后寻找分段多项式函数 f 满足对于所有的 i,f(ti)=yi。精确的等号意味着插值,而约等号问题则成为了最小二乘逼近或者平滑样条。有时想要逼近的函数也可能没有显式表达,比如微分或积分方程的解,这种情况下,数据值应该取形式 (Af)(ti),其中 A 为微分或积分算子。另一方面,有时也想要得到一条大概形状比具体位置更加重要的样条曲线。最后,有时有可能想要一个多元函数,比如张量积样条。
我们在把上面所描述的工作变得简单直观做出了许多努力。比如,用户不必担心样条是如何构造或存储的,或者诸如“断点”、“节点”、“系数”这些术语,而只用把这些函数所返回的结果视为普通的变量,可以自由地作为许多指令的输入即可(如果可以的话)。这些指令包括以 fn 开头的所有指令,fn 表示函数(function)。有时也需要知道,在工具箱内部,样条是以不同形式所存储的,而 fn2fm 可以在这些形式之间转换。
目前,工具箱支持分段多项式函数的两种主要表达形式,因为这两个形式在一般的情形要优于其他形式。B 型在样条构造中尤其有用,而 pp 型则在大规模计算分段多项式函数时很有效率。这两种形式也正是 PGS 中所描述的 B 表达与 pp 表达。
当然,经过了这么多年,目前曲线拟合工具箱的函数要远比 PGS 的程序要来得多。工具箱目前还支持“散射变换”(scatted translates)型(或 st 型),这是为了构造与使用二元薄板样条,以及其他两种描述有理样条的方法:rB 型与 rp 型,这是为了处理 NURBS。
样条有时在数据拟合中尤其有效,因为求解样条的线性系统是带状的,因此求解工作随着数据点的增加仅为线性增长。特别地,Syslab 对稀疏矩阵的支持也同样应用在了曲线拟合工具箱样条函数中,并且工具箱自己的方程求解器 slvblk 会更加有效率,这实际上是因为这里的有些线性系是几乎块对角的。
所有的多项式构造指令都可以用来生成二元(或多元)分段多项式函数,这里的多元指的是单变元函数的张量积,而不同的 fn 指令同样对这些多变元函数适用。
这里有一些例子,您最好能看看一些,这样能够帮助您处理样条。
# 样条
考虑
这个集合是一个线性空间,因为
对应地,
其中
特别地,根据 Curry-Schoenberg 定理,我们的空间
中出现 次 与 对于每个
, 中出现 次 序列非减且仅包含
中的元素。
注意其中节点重数与样条在该节点附近的光滑度之间的对应关系。特别地,对于单节点,也即仅在节点序列出现一次的节点,只有第
# 基础数学工具箱中的样条
基础数学工具箱通过函数 spline 提供了样条逼近。如果像 cs = spline(x,y) 调用函数,它返回在所有 x[i] 取值 y[i],满足非扭结端点条件,具有断点序列 x 的三次样条的 pp 型。换句话说,cs = spline(x,y) 与曲线拟合工具箱样条函数 cs = csapi(x,y) 具有相同的效果。但是仅有后者同样支持描述多变元网格数据的 x,y。在基础数学工具箱中,多元网格数据的三次样条插值是使用指令 interpn(x1,...,xd,v,y1,...,yd,"spline") 来完成的,这会返回插值张量积三次样条在由 y1,...,yd 指定的网格点的值。
任何曲线拟合工具箱的样条 fn 指令都可以应用到 spline(x,y) 的输出,而曲线拟合工具箱中的指令 fnval, ppmak, fnbrk 在 基础数学工具箱中都有一个对应的简化版本 ppval, mkpp, unmkpp。
# 期望背景
曲线拟合工具箱样条函数最开始是基础数学工具箱的拓展,该板块的开发主要是为了帮助您构造与测试样条拟合的新办法,不过您需要了解 PGS 中的相关知识。
然后,创建与使用样条拟合的基础指令并不要求某种前置知识,只需要对名字有基础的理解即可,比如为数据构造插值或者最小二乘拟合,或者什么叫做函数微分或积分。
三次样条拟合板块就完全是可以被初学者所使用的,这里面有一些很详细的示例,比如关于构造 Chebyshev 样条的和关于使用张量积样条的,这些示例可以帮助用户开发自己的样条函数。
# 向量数据类型支持
曲线拟合工具箱样条函数支持向量值函数,即在
在该工具箱中,这样的向量,或者说一组数,可能是以列向量格式,也可能是以单行矩阵格式存储,这些存储满足以下的条件。
在
对于其他的一组数(比如节点序列和断点序列),这样的格式要求也是存在的,因此,当以某种格式提供数据无法满足要求时,可以尝试另外的格式。
# 样条函数命名规范
工具箱中的大多数样条指令都满足以下的某种格式:
cs... 指令构造三次样条(pp 型)
sp... 指令构造 B 样条
fn... 指令操作样条函数
..2.. 为转换指令
..api 构造插值逼近
..aps 构造平滑逼近
..ap2 构造最小二乘逼近
..knt 构造特定的节点序列(的一部分)
# 曲线拟合工具箱样条函数输入
为了方便使用,绝大多数曲线拟合工具箱样条函数都存在默认输入。在帮助文档的输入参数一栏。我们通常都是先展示函数的必要输入参数,然后再展示所有可选输入参数。当存在多个可选输入参数时,则有时采取 key=values 的关键字参数形式(这要求用户必须明确 key 的具体表示),有时采取 "key",value 的键值参数形式,有时采取带默认值的一般参数形式(具体采取的参数形式可以参照函数的帮助文档)。帮助文档中通常都有这些可选参数的默认值。
正如其他的 Julia 函数一样,曲线拟合工具箱样条函数会返回采取同一算法能够返回的所有返回值,因此,如果您只需要第一个返回值,可以使用 x, = func() 完成,而如果您不需要某个返回值,可以使用 _ 进行占位,比如 a,_,c,=fun() 可以得到 fun 函数的第一和第三个返回值。