Background

前面提到,可以用合理选择插值点来避免Runge现象


YcoFlegs:[数值计算] 函数近似理论、Runge现象、Chebyshev点、Lesbegue常数zhuanlan.zhihu.com



另一种流行的方法是,使用样条插值,分段处理。k阶样条插值可以连续可微k-1次。

还是以



为例:





三次样条python 三次样条插值_三次样条插值 实验


一个trivial的情况是,线性样条,Credit to http://iacs-courses.seas.harvard.edu/courses/am205/schedule/

样条插值是CAD、矢量图、字体设计的基础之一,CAD软件使用的是NURB样条,而字体设计是Bezier样条。

三次样条

每一个分段上,都是一个三次函数。由于有连续的两阶导数,所以肉眼看上去是很光滑的。


三次样条python 三次样条插值_三次样条python_02

Credit to http://iacs-courses.seas.harvard.edu/courses/am205/schedule/


如果有n+1个节点


,那么一共有n个分段,即

4n个未知参数

其中每个分段两端的值已知,所以有n个分段,因此有2n个已知等式



剩下还要限制两个相邻分段在边界上的一阶和二阶导数连续,一共2*(n-1)个已知等式,因为只有n-1个边界





还剩下两个条件,有不同的方法来处理:

  • 自然三阶样条插值 Natural cubic spline,设置首尾的二阶导数为零:
  • Not-a-knot样条插值: 以及
  • End Slope样条插值,加入了首尾的导数项: 以及
  • 周期样条插值Periodic Spline,首尾的一二阶导数相等: 以及

插值的基函数选取与系数求解

对于多项式拟合,需要选择基函数,通过求解Ax=B,计算基函数前面的系数。此处有n个区间,因此需要把n个区间组合起来,构成一个更大的Ax=B的问题,其中x是基函数们前面的系数组成的列向量。三次样条的一个区间有4个参数,因此,列向量的尺寸是(4n,1)。

之前在条件数里提到过,多项式拟合的时候选择monomial基函数


+ Vandermonde矩阵会出现条件数过高,而不稳定的情况。

YcoFlegs:[数值计算] 条件数zhuanlan.zhihu.com



在计算样条插值的时候也要注意这个问题。如果插值区间数较少的情况下问题不会太明显。但随着插值区间数增多,需要选用更好的基函数,比如:



这组基函数是线性不相关的,这点可以通过展开c0~c3,得到系数矩阵来检查。比较好的性质是,


三次样条python 三次样条插值_三次样条插值matlab_03


http://iacs-courses.seas.harvard.edu/courses/am205/notes/am205_cspline.pdf

对于具体的计算,有兴趣的可以参考Homework的Q4 (a-c)