上篇讲了nearest-neighbor(最近邻插值)。这篇说cubic interpolation(三次插值),之前说过,插值就是用已知的点模拟一个方程,然后求未知点。之前讲的插值是线性的。cubic interpolation就是求一个三次的方程。它的思想就是把已知的数分为一个一个小区间,人拟合到曲线上去。就是一个多分段函数高阶函数(此处的阶数为3)。给一个文档上的图可能比较清楚。 

cubic插值 python cubic插值_插值

    把区间[a,b]分为n个区间[x0,x1],[x1,x2].....[xn-1,xn]共有n+1个点。其中x0=a,xn=b。把函数定义为

cubic插值 python cubic插值_系数矩阵_02

如果满足一下三个条件,我们就称之为三次样条函数

cubic插值 python cubic插值_插值_03

(x)1,在每个分段小区间 [xi,xi+1] 上, 

cubic插值 python cubic插值_系数矩阵_04

(x)=  

cubic插值 python cubic插值_插值_03

(x)是一个三次方程2,满足插值条件,即 

cubic插值 python cubic插值_cubic插值 python_06

 

3, 曲线光滑,即 一阶,二阶导存在且连续

现在就是求目标就是求每一段的4个未知数。一共有n段所以有4n个未知数。那么我们需要4n个方程。现在我们就开始列这些方程

     首先 在区间[xi,xi+1]上 

cubic插值 python cubic插值_插值_07

,在区间[xi+1,x+2]中   

cubic插值 python cubic插值_边界条件_08

 。共有n-1个区间,所以有2(n-1)个方程,加上两个端点就有2个方程。其实简单的想就是n个区间[x0,x1],[x1,x2].....[xn-1,xn]共有n+1个点。每个点用了两次,2(n+1),但是第一个点和最后一个点只用了一次,所以减二。所以为2n。      还差2n个方程,现在就是每一个连接点处的一阶导和二阶导是相等的。

cubic插值 python cubic插值_系数矩阵_09

,

cubic插值 python cubic插值_cubic插值 python_10

 。这里有2(n-1)个方程。现在我们还差2个方程。

      有3种边界条件:

     1 自然边界: 指定端点二阶导数为0,

cubic插值 python cubic插值_边界条件_11

     2 固定边界:假设两个边界值分别为A和B,

cubic插值 python cubic插值_系数矩阵_12

     3 非节点边界:强制第一个插值点的三阶导数值等于第二个点的三阶导数值,最后第一个点的三阶导数值等于倒数第二个点的三阶导数值.

cubic插值 python cubic插值_系数矩阵_13

       

cubic插值 python cubic插值_cubic插值 python_14

 

     好我们四个方程就全部列完了。现在就开始求解吧。

  

cubic插值 python cubic插值_插值_15

  1    用

cubic插值 python cubic插值_cubic插值 python_16

     得出 

cubic插值 python cubic插值_cubic插值 python_17

      2 用 

cubic插值 python cubic插值_插值_18

 由  

cubic插值 python cubic插值_系数矩阵_19

       得出 

cubic插值 python cubic插值_边界条件_20

    3   用

cubic插值 python cubic插值_cubic插值 python_10

 可得       

cubic插值 python cubic插值_插值_22

         因为   

cubic插值 python cubic插值_cubic插值 python_10

 ,所以 

cubic插值 python cubic插值_系数矩阵_24

      4  用

cubic插值 python cubic插值_cubic插值 python_14

 得出          

cubic插值 python cubic插值_边界条件_26

        设  

cubic插值 python cubic插值_插值_27

,由

cubic插值 python cubic插值_边界条件_26

,得出          

cubic插值 python cubic插值_cubic插值 python_29

     5  由

       

cubic插值 python cubic插值_边界条件_20

       

cubic插值 python cubic插值_cubic插值 python_17


cubic插值 python cubic插值_插值_32


cubic插值 python cubic插值_cubic插值 python_29

      得出 

     

cubic插值 python cubic插值_系数矩阵_34

    6   因为   

cubic插值 python cubic插值_cubic插值 python_10

 ,所以 

cubic插值 python cubic插值_系数矩阵_24

,把

cubic插值 python cubic插值_系数矩阵_37

  代入其中。

         得出  

       

cubic插值 python cubic插值_系数矩阵_38

          经过上面的6步后,我们构成了关于m的未知线性方程。

 我们分别适应,前面边界条件的三种

  1 自然边界头尾的边界值都为0,首尾两端没有受到任何让它们弯曲的力。二阶导数为0,于是看把

cubic插值 python cubic插值_cubic插值 python_39


cubic插值 python cubic插值_边界条件_40

写成矩阵相乘的形式。

cubic插值 python cubic插值_系数矩阵_41

(mi表示的是二阶求导)和

cubic插值 python cubic插值_插值_42

都等于0,把矩阵写成:

cubic插值 python cubic插值_边界条件_43

 

cubic插值 python cubic插值_cubic插值 python_44

  2 固定边界

cubic插值 python cubic插值_cubic插值 python_45

   

cubic插值 python cubic插值_边界条件_46

          系数矩阵为

cubic插值 python cubic插值_cubic插值 python_47

 3 当为 非节点边界时,同理可得系数矩阵为:

 

cubic插值 python cubic插值_插值_48

好了这个就是三次插值,总的来说就是求一个在三阶函数的点,用已知的点来划分区域,形成分段多阶函数。求4n个未知数。列4n个方程,最后用矩阵表示。下一篇讲bicubic interpolation。