样条的概念源自制图技术,即让富有弹性的细长木条(称为样条)通过一组点,然后得到光滑的曲线。这些点可以使用钉子或者大头针标出,用样条绕过这些点,就得到了样条曲线。这种曲线是光滑的三次曲线(为什么是三次的就不清楚了)。
三次样条克服了二次样条曲线的缺点,即最前面的两个点是直线连接,最后一个区间的摆动过大。而且高次样条曲线可能会造成龙格现象,所以使用也很少,三次样条曲线是使用最广泛的样条曲线。给定n个数据点,共有n-1个区间,每个区间的方程是:
需要确定4(n-1)个未知系数,因此需要同样多的条件。
通过连续性、节点处一阶导数相等、二阶导数相等,可以得到4n-6个方程因此需要人为添加2个边界条件,一般有以下三种:
自然边界:两个端点处的二阶导数为0,这个时候c1=cn=0
固定边界:指定第一个和最后一个节点处的一阶导数值
非节点边界:要求第二个和倒数第二个节点处的三阶导数连续,即要求前两个和最后两个相邻区域使用相同的三次函数,让前四个点确定一个三次多项式,最后四个点确定一个三次多项式。这个时候由于第二个和倒数第二个节点已经不是两个不同三次曲线的连接点了,所以被称为非节点条件。
MATLAB中实现三次样条
使用内置函数spline可以计算三次样条,一般用法是:
yy=spline(x,y,xx)
其中x和y是由待插值量组成的向量,yy是根据样条插值函数在向量xx处计算的结果向量。
注意spline默认使用非节点边界条件,如果y中变量数目比x多两个时,那么y的第一个和最后一个值将作为端点处的导数值,从而使用固定边界条件。
例如下面一组数据:
x | 1 | 2 | 2.5 | 3 | 4 | 5 |
y | 1 | 5 | 7 | 8 | 2 | 1 |
分别使用自然边界、固定边界(两端导数分别是-10和10)、非节点边界绘制图形的M文件如下:
x=[1 2 2.5 3 4 5];
y=[1 5 7 8 2 1];
y0=[0 1 5 7 8 2 1 0];
y1=[-10 1 5 7 8 2 1 10];
xx=1:0.05:5;
yy1=spline(x,y0,xx);%自然边界条件
yy2=spline(x,y1,xx);%固定边界条件
yy3=spline(x,y,xx);%默认,非节点边界条件
plot(x,y,'r*');%画出采样点
grid on;
hold on;
plot(xx,yy1,'b');%蓝色的自然边界条件
plot(xx,yy2,'g');%绿色的固定边界条件
plot(xx,yy3,'r');%红色的非节点边界条件
绘制结果如下:
评论