Python数值计算(18)——三次样条曲线概述

1. 概述

前面介绍到了多种插值方法,但是这些插值方法都无法避免龙格现象,即高阶多项式可能存在剧烈的振动,而且在区间的一个点处的微小扰动,都可能引起整个范围内的巨大振动,一种替代方式是使用类似线性插值的方式,将区间分成多个子区间,然后在每个子区间上构造不同的多项式来逼近,这种方式就是分段多项式。

但是,线性插值的表现会存在一个显著的现象就是插值点处一阶导不存在,在曲线上表现出来的是尖点,如果使用分段的Hermite多项式,虽然可以保证可导性,但是导数值有时并不是可以预先获取的。

最后,一个普遍的分段多项式是在使用三次多项式,即所谓的三次样条(Cubic Spline)插值。样条,英语为Spline,是Sample line的含义,意思是指通过一组给定点集来生成平滑曲线的柔性带。此概念源于生产实践,“样条”是绘制曲线的一种绘图工具,是富有弹性的细长条。绘图时用压铁使样条通过指定的点(这个也叫样点,结点(knot)),并调整样条使它具有满意的形状,然后沿样条画出曲线。

最初,样条曲线都是借助于物理样条得到的,放样员把富有弹性的细木条(或有机玻璃条),用压铁固定在曲线应该通过的给定型值点处,样条做自然弯曲所绘制出来的曲线就是样条曲线。样条曲线不仅通过各有序型值点,并且在各型值点处的一阶和二阶导数连续,也即该曲线具有连续的、曲率变化均匀的特点,但是需要注意的是,三次样条曲线并不能像Hermite多项式那样,在给定点处与被插函数具有相同的导函数值。

2. 数学知识

一个三次多项式具有f(x)=a+bx+cx^2+dx^3的形式,那么问题的重点就是确定系数a,b,c,d。对于给定区间[s,t]上的函数f(x)和一组插值点s = x_0<x_1<...<x_n=tf(x)的一个三次样条插值多项式应满足如下条件:

  1. 对于j=0,1,...,n-1S(x)是子区间[x_j,x_{j+1}]上的一个三次多项式,记作S_j(x)
  2. 对于j=0,1,...,n-1S_j(x_j)=f(x_j)S_j(x_{j+1})=f(x_{j+1}) 
  3. 对于j=0,1,...,n-2S_j(x_{j+1})=S_{j+1}(x_{j+1})
  4. 对于j=0,1,...,n-2S'_j(x_{j+1})=S'_{j+1}(x_{j+1})
  5. 对于j=0,1,...,n-2S''_j(x_{j+1})=S''_{j+1}(x_{j+1})

由于我们将区间分为了n段,然后每段上需要确定多项式的系数a_j,b_j,c_j,d_j,因此一共要计算4n个常数。由条件2和3,每个子区间上首位函数值,可以构造2n个方程,由条件4和5各可以构造(n-1)个方程,总共可以构造2n+2*(n-1)=(4n-2)个方程,方程数量少于未知数数量(4n),因此还缺少条件,不能完全求解。为了构造可求解的方程组,需要补充边界条件,通常是两个端点处的导数值,一般分为三种情况:

1. 紧固(Clamped)三次样条曲线:端点处的一阶导数值为给定值,即S'(x_0)=f'(x_0),S'(x_n)=f'(x_n),也叫做夹持三次样条曲线,这种情况相当于是在两个端点也增加了约束;

2. 自然(Natural)三次样条曲线:端点处的二阶导数值为0,S''(x_0)=S''(x_n)=0,也叫自由三次样条曲线,这种情况相当于两个端点被放开,没有约束;

3. 非扭结(Not-a-knot)三次样条曲线:起始2个点和结尾两个点的三阶导数值相同,S'''(x_0)=S'''(x_1),S'''(x_{n-2})=S'''(x_{n-1}),这表明最开始两个子区间和最后的两个子区间,其多项式相同,因此,[x_0,x_2]上是同一个三次多项式,[x_{n-2},x_n]上也是同一个三次多项式,x_1,x_{n-1}实际上是可有可无的,也就是说,它们起不到扭结点的作用了,所以被称作not-a-knot样条曲线,这种是方式是一般在无法获取端点处导数值时比较好的一种选择。

此外,由于紧固样条曲线使用到了更多被查函数的信息,因此拟合的效果会比自然三次样条曲线更好一些。

3. 公式推导

3.1 紧固三次样条曲线

如果用h_j=x_{j+1}-x_j表示各区间的步长,则a_{j+1}=a_j+b_jh_j+c_jh_j^2+d_jh_j^3,且显然有a_j=f(x_j),但需要注意,最后所求的曲线方程为:S_j(x)=a_j+b_j(x-x_j)+c_j(x-x_j)^2+d_j(x-x_j)^3

可以得到紧固三次样条曲线的方程为:

Ax=b

其中:

由于以上方程是严格对角占优的,因此一定存在解,所求x就是待求系数a_j,b_j,c_j,d_jc_j的值,再使用:

c_{j+1}=c_j+3d_jh_j

可计算d_j

最后可以通过:

b_{j+1}=b_j+2c_jh_j+3d_jh_j^2

计算出b_j

3.2 自然三次样条曲线

对于自然三次样条曲线,其计算过程相同,但是方程需要有所调整,即A与b的第一行和最后一行,调整如下:

 3.3 非扭结三次样条曲线

根据前面的定义,方程变为:

4. 总结

三种不同三次样条曲线的边界条件,如下:

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值