样条函数
spline function
一类分段(片)光滑、并且在各段交接处也有一定光滑性的函数。简称样条。样条一词来源于工程绘图人员为了将一些指定点连接成一条光顺曲线所使用的工具,即富有弹性的细木条或薄钢条。由这样的样条形成的曲线在连接点处具有连续的坡度与曲率。分段低次多项式、在分段处具有一定光滑性的函数插值就是模拟以上原理发展起来的,它克服了高次多项式插值可能出现的振荡现象,具有较好的数值稳定性和收敛性,由这种插值过程产生的函数就是多项式样条函数。样条函数的研究始于20世纪中叶,到了60年代它与计算机辅助设计相结合,在外形设计方面得到成功的应用。样条理论已成为函数逼近的有力工具。它的应用范围也在不断扩大,不仅在数据处理、数值微分、数值积分、微分方程和积分方程数值解等数学领域有广泛的应用,而且与最优控制、变分问题、统计学、计算几何与泛函分析等学科均有密切的联系。
在计算机被使用之前,数字演算用手工完成。虽然分段定义的象signum函数或阶梯函数这样的函数也被用到,一般人更喜欢多项式因为它们比较容易算。随着计算机的发展,样条变得越来越重要。它们一开始是作为多项式在插值中的替代品,后来又作为在计算机图形学中构造光滑和可变形状的工具
定义给定k个点ti,称为节点(knot),分布在一个区间[a,b]满足
<IMG class=tex alt="a=t_0 < t_1 < ldots < t_{k-2} 对于一个给定的节点向量,所有n次样条构成一个向量空间。这个空间的一个基是n次B样条基。
一个参数曲线
称为n次样条,如果
并且在限制到每个子区间时,
换句话说,在每个子区间或者说节点长度(knot span)
S和一个n次多项式相同。
S(ti) 称为节点值而(ti,S(ti))称为内部控制点(internal control point). (t0,...,tk-1) 称为节点向量(knot vector). 如果节点等距分布在区间[a,b]上,我们称样条均匀(uniform),否则为非均匀(non-uniform).
例子最简单的样条是一次的,它也叫做线性样条,或者多边形。
一般的样条是自然的三次样条。自然定义为样条多项式的二阶导数在插值区域的两端相等。
S''(a) =S''(b) = 0 在区间 [a,b]
这使得样条在插值区间外为直线而不影响光滑程度。
样条插值使用多项式插值,对给定数据集进行插值的n阶多项式就被给定数据点所唯一地定义出来。但是,对同样的数据进行插值的n阶样条并不是唯一的,为了构建一个唯一的样条插值式它还必须满足另外n-1 个自由度。
线性样条插值线性样条插值是最简单的样条插值。数据点使用直线进行连接,结果样条是一个多边形。
从代数的角度来看,每个Si都是一个如下
的线性函数。 样条在每个数据点都必须连续,即
我们很容易得到
所以以上论述成立。
二次样条插值二次样条插值可以构建为
通过选择z0,然后用递推关系就可以得到系数:
三次样条插值对于n+1 个给定点的数据集 {xi} ,我们可以用n三次多项式在数据点之间构建一个三次样条。如果
表示对函数f进行插值的样条函数,那么需要:
插值特性,S(xi)=f(xi) 样条相互连接,Si-1(xi) =Si(xi),i=1,...,n-1 两次连续可导,S'i-1(xi) =S'i(xi) 以及S''i-1(xi) =S''i(xi),i=1,...,n-1. 由于每个三次多项式需要四个条件才能确定曲线形状,所以对于组成S的n个三次多项式来说,这就意味着需要 4n个条件才能确定这些多项式。但是,插值特性只给出了n+ 1 个条件,内部数据点给出n+ 1 − 2 =n− 1 个条件,总计是 4n− 2 个条件。我们还需要另外两个条件,根据不同的因素我们可以使用不同的条件。
其中一项选择条件可以得到给定u与v的钳位三次样条,
另外,我们可以设
. 这样就得到自然三次样条。自然三次样条几乎等同于样条设备生成的曲线。
在这些所有的二次连续可导函数中,钳位与自然三次样条可以得到相对于待插值函数f的最小震荡。
如果选择另外一些条件,
可以得到周期性的三次样条。
如果选择,
可以得到complete三次样条。
三次样条的最小性
三次样条有另外一个非常重要的解释,实际上它是在索伯列夫空间H([a;b]) 最小化函数
的函数。
函数J包含对于函数f(x) 全曲率 的近似,样条是f(x) 最小曲率的近似。
由于弹性条的总体能量与曲率成比例,所以样条是受到n个点约束的弹性条的最小能量形状。样条也是基于弹性条设计的工具。
使用自然三次样条的插值
它可以定义为
以及
. 通过解下面的方程可以得到它的系数。
线性样条插值假设要为带有节点
的函数
找一个线性样条。直接代入样条公式,我们得到如下样条:
样条函数(蓝线)以及所近似的函数(红点)如下图所示:
二次样条插值
下图是一个k=4 的样条函数(蓝线)与所近似的函数(红线)的例子:
二.基数样条函数
使用基数样条函数可以创建一些平滑线来连接给定的点集,如图1-4所示。
图1-4 使用样条函数创建一条连接点集的平滑曲线
从图1-4中可以看到,该样条曲线确定了起点和终点(图1-4中,起点和终点用1和4标识),另外两个点紧靠这条曲线,但样条曲线并不通过它们(点2和点3)。
1. 使用3x3矩阵变换对象当处理一系列图形变换时,应用变换(旋转、平移或缩放)方法非常有用,它可以加速图形变换的执行。图1-5显示了图形变换的一个示例。
图1-5 对图形实施旋转和缩放变换
2. 模糊模糊用来对图形进行平滑处理以避免出现阶梯状外观,比如当对图像放大时。图1-6显示的是实施了该操作的一个示例。
图1-6 对图像实施模糊操作
注意
《基数样条函数》书中,给出GDI+前两种新特点的示例:本章给出路径梯度的示例,下一章给出α混合的示例。对于GDI+的其他特点,在.NET Framework的SDK中有很多相应的示例代码。
拉格朗日插值,分段插值,样条插值
(样条插值的要求是还要知道这些数据点的一阶导数)
两点确定一条直线(一次多项式),三点确定一条抛物线(二次多项式),有10个点就可以确定一个9次多项式(9次多项式里面还有一个常数项,就是10个未知数,我们有10个数据点,刚好可以求解)
1.拉格朗日插值就是上面的这种插值。但是它就是把这些多项式系数重新表示了一下(就是不用去求上面所说的10个系数)。你求出这些系数后,只要将你想要的x的值往里一代,马上就得到你想要的函数值。但这种插值在头尾附近会出现一些不好的振荡现象(龙格现象)
2.分段插值,还是按照上面的原则,比如说,我两个点两个点地确定一条直线(比如1,2点连起来,2,3点连起来),最后所有直线的集合(这时应当是一系列的折线)这个分段函数也是经过所有的数据点。当然你也可以三个点三个点地确定一条抛物线。用这一方面时,你要先确定你想要的x值在哪一个区间里,然后用这一区间的表达式来计算出函数值就可以了。本方法不会出现龙格现象
3.样条插值,上面提到分段插值是一系列折线,折线使得不光滑,样条就是用其导数值,使得它们变光滑。
下面说计算方法吧,计算方法的书上面都有表达式。应当不难。
可以借助于MATLAB这样的软件来计算。
比如原始数据是X,Y,想要求y(x=5)的值
X=[2,6,10,14,18,22,26,30,34,38,41,42,45,49,53,57,61,65,69,73,77,81]; %自变量的值
Y=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]; %自变量相应的函数值
X0=5; %想要的点的值
N=22; %这个是点的个数
Doc=2; %分段插值中想用几个点插值
你可以用下面的语句得到y(x=5);
Y1=lagrange(X,Y,X0) %拉格朗日插值
Y2=interp1(X,Y,X0,'linear') %分段两点线性插值
Y2=interp1(X,Y,X0,'spline') %分段两点线性插值