原文参考 Cubic Spline Interpolation
样条的由来
样条来源于早期工程制图,为了将一些固定点连成一条光滑的曲线,采用具有弹性的木条固定在这些点上,如图1所示,通过样条画出来的曲线不仅经过各固定点,而且连续光滑。后来这一技术发展成了数学工具——样条函数,在很多领域都有应用,样条插值就是典型的应用场景。
图1,利用样条进行工程绘图
样条函数
介绍原理前先了解一下样条函数,顾名思义就是描述图1中那个木条的函数,在数学上把它定义成一个分段多项式函数,以三次多项式为例:
f(x)=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧a1x3+b1x2+c1x+d1a2x3+b2x2+c2x+d2…anx3+bnx2+cnx+dnif x∈[x1,x2]if x∈(x2,x3]if x∈(xn,xn+1].(1)
也就是说,每两个点之间用一个多项式来表示,这些多项式的阶数相同,但是系数是不一样的。样条插值的目的就是求这些多项式系数,已知系数,那些中间点的值就能唯一确定了。不难想象,随着多项式阶数的提升,端点处会更加平滑,但计算量也越大。
图2,不同阶数样条插值结果
样条插值原理
简单来说样条插值的原理遵循四个字:连续、光滑。还有一个关键要素:边界条件。以三次样条插值(Cubic Spline Interpolation)为例,它的样条函数如公式(1)所示,
(x1,y1),...(xn+1,yn+1)是已知的n+1个数据点,整个函数有
4n个未知数,既
a1,b1,c1,d1,...,an,bn,cn,dn。若想求得
4n个未知系数,需要构建
4n个方程。
首先,根据连续性原则,每个分段函数都经过其两侧端点,因此,可得到
2n个方程:
a1x13+b1x12+c1x1+d1=y1a1x23+b1x22+c1x2+d1=y2a2x23+b2x22+c2x2+d2=y2a2x33+b2x32+c2x3+d2=y3…anxn3+bnxn2+cnxn+dn=ynanxn+13+bnxn+12+cnxn+1+dn=yn+1.(2)
其次,根据光滑行原则,相邻的两个分段函数连接处低阶导数相等,在三次样条函数中,它的低阶导数有一阶导数:
dxdfi(x)=3aix2+2bix+ci和二阶导数
dx2d2fi(x)=6aix+2bi,这样,又得到
2(n−1)个方程:
3a1x22+2b1x2+c1=3a2x22+2b2x2+c23a2x32+2b2x3+c2=3a3x32+2b3x3+c3…3an−1xn2+2bn−1xn+cn−1=3anxn2+2bnxn+cn.(3)
6a1x2+2b1=6a2x2+2b26a2x3+2b2=6a3x3+2b3…6an−1xn+2bn−1=6anxn+2bn.(4)
边界条件
通过上面的连续、光滑原则得到的公式(2)、(3)、(4)总共包含
4n−2个方程,还不足以得到
4n个系数的解。由于在公式(3)(4)中,第1个点和第n+1个点处在边界,只被使用了一次,导致整个方程组还差2个方程才能求解。此时,可以假设不同的边界条件来构成
4n个方程。需要注意的是,不同的边界条件导致插值结果也有所不同。
Natural Spline
Natural Spline 假设第1个和最后一个端点的二阶导为0,即:
6a1x1+2b1=06anxn+1+2bn=0.
Not-a-Knot Spline
Not-a-Knot Spline 假设第一段和第二段函数的三阶导在端点处相等;第n-1段和第n段函数的三阶导在端点处也相等,既:
dx3d3f1(x)=dx3d3f2(x)∣x=x2dx3d3fn−1(x)=dx3d3fn(x)∣x=xn.
推到后等价于:
a1=a2an−1=an;
Periodic Spline
Periodic Spline 假设最后一个分段函数的一阶段和二阶导于第一个分段的一阶导和二阶导相等,这种假设特别适合用在周期函数中,尤其是第一点与最后一点相等时
3a1x12+2b1x1+c1=3anxn+12+2bnxn+1+cn6a1x1+2b1=6anxn+1+2bn.
Quadratic Spline
Quadratic Spline 是最简单的假设,强制第一个与最后一个分段函数的第一个系数为0,即:
a1=an=0
简单实例
给定5个数据点
D={(0,21),(1,24),(2,24),(3,18),(4,16)},利用自然边界(Natural Spline)条件,求三次样条插值函数。5个数据点包含4个区间,所以样条函数是4分段函数,设每个分段函数表达式为:
fi=aix3+bix2+cix+di,i=1,2,3,4,根据连续规则,得到8个方程:
f1(0)=21f1(1)=24f2(1)=24f2(2)=24f3(2)=24f3(3)=18f4(3)=18f4(4)=16.
根据光滑原则,各分段函数一阶导与二阶导在端点处相等得到6个方程:
3a1+2b1+c1=3a2+2b2+c212a2+8b2+c2=12a3+8b3+c327a3+18b3+c3=27a4+18b4+c46a1+2=6a2+212a2+2=12a3+218a3+2=18a4+2
根据Natural Spline假设条件,得到2个方程:
2b1=024a4+2b4=0.
以上方程可以联立成为一个包含16个方程得方程组,该方程组可进一步写成矩阵形式:
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡010000003006000001000000200200200100000010000000110000000000000000180000−3120−61200000140000−240−2200000120000−1100000000110000000000000000827000−12270−121800000049000−460−2200000023000−11000000000110000000000000000276400−2700−1802400000091600−600−2020000003400−1000000000001100000000⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡a1b1c1d1a2b2c2d2a3b3c3d3a4b4c4d4⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡212424242418181600000000⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
该线性系统可以利用常规方法进行求解,可得到样条函数结果:
f(x)=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧−0.30357x3+3.3036x+21−1.4821x3+3.5357x2−0.23214x+22.1793.2321x3−24.750x2+56.339x−15.536−1.4464x3+17.357x2−69.982x+110.79if x∈[0,1]if x∈(1,2]if x∈(2,3]if x∈(3,4].
插值结果如下图所示
总结
样条插值可以看作是一个分段函数估计问题,主要的原理就是连续性和光滑性假设,连续性在数学上的表现就是分段函数相接点处相等,光滑性表现为相接点的低阶导数相等;但光有这些条件还不够组成正定方程组,还要引入边界条件,不同的边界条件导致插值结果也有不同;此外,样条函数的阶数也是权衡计算效率和平滑性的重要参数,实际使用时根据需要来选择。
评论(0)