插值(四)cubic interpolation(三次插值)

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

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

如果满足一下三个条件,我们就称之为三次样条函数_{Si}(x)

1,在每个分段小区间 [xi,xi+1] 上, _{S}(x)=  _{Si}(x)是一个三次方程

2,满足插值条件,即 S_{i}(x)=y_{i} (i=0,1,2,3....n) 

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

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

     首先 在区间[xi,xi+1]上 S_{i}(x_{i+1})=y_{i+1},在区间[xi+1,x+2]中   S_{i+1}(x_{i+1})=y_{i+1} 。共有n-1个区间,所以有2(n-1)个方程,加上两个端点就有2个方程。其实简单的想就是n个区间[x0,x1],[x1,x2].....[xn-1,xn]共有n+1个点。每个点用了两次,2(n+1),但是第一个点和最后一个点只用了一次,所以减二。所以为2n。

      还差2n个方程,现在就是每一个连接点处的一阶导和二阶导是相等的。S^{'}_{i}(x_{i+1})=S^{'}_{i+1}(x_{i+1}),S^{''}_{i}(x_{i+1})=S^{''}_{i+1}(x_{i+1}) 。这里有2(n-1)个方程。现在我们还差2个方程。

      有3种边界条件:

     1 自然边界: 指定端点二阶导数为0,S^{'}(x_{0})=S^{'}(x_{n})=0

     2 固定边界:假设两个边界值分别为A和B,S^{'}(x_{0})=A \, \, \, S^{'}(x_{n})=B

     3 非节点边界:强制第一个插值点的三阶导数值等于第二个点的三阶导数值,最后第一个点的三阶导数值等于倒数第二个点的三阶导数值.S^{''}(x_{0})=S^{''}(x_{1})       S^{'''}(x_{n-1})=S^{'''}(x_{n})

 

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

  

  1    用S_{i}(x_{i}) =a_{i}+b_{i}(x_{i}-x_{i})+c_{i}(x_{i}-x_{i})^{2}+d_{i}(x_{i}-x_{i})^{3}=y_{i}

     得出 a_{i}=y_{i}  

    2 用 h_{i}=x_{i+1}-x_{i} 由  S_{i}=y_{i+1}

       得出 a_{i}+h_{i}b_{i}+h_{i}^{2}c_{i}+h_{i}^{3}d_{i}=y_{i+1}

    3   用S^{''}_{i}(x_{i+1})=S^{''}_{i+1}(x_{i+1}) 可得

       

         因为   S^{''}_{i}(x_{i+1})=S^{''}_{i+1}(x_{i+1}) ,所以 b_{i}+2h_{i}c_{i}+3h_{i}^{2}d_{i}=b_{i+1}

      4  用S^{'''}(x_{n-1})=S^{'''}(x_{n}) 得出

          2c_{i}+6h_{i}d_{i}=2c_{i+1}

        设  m_{i}=S^{''}_{i}(x_{i})= 2c_{i},由2c_{i}+6h_{i}d_{i}=2c_{i+1},得出 

         d_{i}=\frac{m_{i+1}-m_{i}}{h_{i}}

     5  由

       a_{i}+h_{i}b_{i}+h_{i}^{2}c_{i}+h_{i}^{3}d_{i}=y_{i+1}

       a_{i}=y_{i}m_{i}=2c_{i}d_{i}=\frac{m_{i+1}-m_{i}}{h_{i}}

      得出 

     b_{i}=\frac{y_{i+1}-y_{i}}{h_{i}}-\frac{h_{i}}{2}m_{i}-\frac{h_{i}}{6}(m_{i+1}-m_{i})

    6   因为   S^{''}_{i}(x_{i+1})=S^{''}_{i+1}(x_{i+1}) ,所以 b_{i}+2h_{i}c_{i}+3h_{i}^{2}d_{i}=b_{i+1},把a_{i},b_{i},c_{i},d_{i}  代入其中。

         得出  

       

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

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

  1 自然边界头尾的边界值都为0,首尾两端没有受到任何让它们弯曲的力。二阶导数为0,于是看把h_{i}m_{i}写成矩阵相乘的形式。m_{0}(mi表示的是二阶求导)和m_{n}都等于0,把矩阵写成:

 

  2 固定边界

   

          系数矩阵为

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

 

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

 

三次插值(bicubic interpolation)是一种二元插值方法,用于在二维平面上对离散的数据点进行插值,以获取平滑的曲面。双三次插值是基于三次多项式的插值方法,因此又称为cubic函数。 双三次插值的基本思想是:对于给定的离散数据点,利用局部的16个数据点,构建一个三次多项式,然后在每个小方块内进行插值,从而得到平滑的曲面。在插值的过程中,为了保证曲面的连续性和光滑性,需要满足一定的边界条件。 双三次插值函数的数学表达式如下: ``` f(x,y) = [1 x x^2 x^3] * M * [1 y y^2 y^3]' ``` 其中,M是一个4x4的矩阵,其元素为: ``` M = [ 0.0 1.0 0.0 0.0; -0.5 0.0 0.5 0.0; 1.0 -2.5 2.0 -0.5; -0.5 1.5 -1.5 0.5 ] ``` 双三次插值函数的实现需要对数据进行预处理,计算出每个小方块内的16个数据点和相应的M矩阵。然后,在需要进行插值的位置,根据相应的小方块内的数据点和M矩阵,计算出插值结果。 以下是MATLAB代码示例,用于实现双三次插值函数: ```matlab function f = bicubic_interp(x, y, data) % x, y: 插值位置 % data: 数据矩阵 % f: 插值结果 % 计算插值所在的小方块 i = floor(y); j = floor(x); % 计算插值位置相对于小方块的偏移量 u = x - j; v = y - i; % 构建M矩阵 M = [ 0.0 1.0 0.0 0.0; -0.5 0.0 0.5 0.0; 1.0 -2.5 2.0 -0.5; -0.5 1.5 -1.5 0.5 ]; % 计算插值结果 f = 0; for ii=0:3 for jj=0:3 % 计算当前数据点的坐标 idx_i = i + ii - 1; idx_j = j + jj - 1; % 处理边界情况 if idx_i < 1 || idx_i > size(data, 1) || idx_j < 1 || idx_j > size(data, 2) continue; end % 计算权值 wx = cubic(u - jj + 1); wy = cubic(v - ii + 1); % 计算插值结果 f = f + wx * wy * data(idx_i, idx_j); end end function w = cubic(x) % 计算三次插值权值 a = -0.5; if abs(x) < 1 w = (a+2) * abs(x)^3 - (a+3) * abs(x)^2 + 1; elseif abs(x) < 2 w = a * abs(x)^3 - 5*a * abs(x)^2 + 8*a * abs(x) - 4*a; else w = 0; end ``` 运行以上代码,可以得到双三次插值函数bicubic_interp的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值