三次样条插值

2019-05-24  本文已影响0人  carry_xz

三次样条插值

   设S(x)满足样本点要求,则只需在每个子区间[x_j,x_{j+1}]上确定1个三次多项式,假设为:
S_j(x)=a_jx^3+b_jx^2+c_jx+d
   假设有n个点,需要n-1条线描述,每条线四个未知数, 则未知数个数为4(n-1)。显然中间(n-2)个点具有4个约束条件:
S(x_j) = f(x_j)
S'(x_j+0) = f'(x_j-0)
S''(x_j+0) = f''(x_j-0)
S'''(x_j+0) = f'''(x_j-0)
   两端端点存在约束S(x_i) = f(x_i),则约束方程有4(n-2)+2=4(n-1)-2,所以,总的未知数个数比方程个数多两个。所以需要额外的两个约束,于是就有了三种边界条件的插值算法。

推导过程

   S(x) 在 [x_j,x_{j+1}](j=1,2,⋯,n-1)上是三次多项式,于是S"(x)在[x_j,x_{j+1}]上是一次多项式,假设S"(x) 在[x_j,x_{j+1}](j=1,2,⋯,n-1)两端点上的值已知,设

S''(x) = \frac {x_{j+1}-x}{h_j}M_j+\frac {x-x_j}{h_j}M_{j+1}

  其中h_j = x_{j+1}- x_j
  对S''(x)进行两次积分可得:

S(x) = \frac{(x_{j+1}-x)^3}{6h_j}M_j+\frac{(x-x_j)^3}{6h_j}M_{j+1}+A_jx+B_j

  以上是在[x_j,x_{j+1}]上求得的S(x)同理可求[x_{j-1},x_j]上的S(x),将x_j同时代入两个函数联立方程,可以求得A_j、B_j

A_j = \frac{y_{j+1}-y_j}{h_j}-\frac{M_{j+1}-M_j}{6}h_j

B_j = y_{j+1}-\frac{M_{j+1}}{6}h_j^2-[\frac{y_{j+1}-y_j}{h_j}-\frac{M_{j+1}-M_j}{6}h_j]x_{j+1}
  将A_j、B_j代入S(x)可得
S(x) = -\frac{(x_{j+1}-x)^3}{6h_j}M_j+\frac{(x-x_{j})^3}{6h_j}M_{j+1}+[y_j-\frac{M_{j}}{6}h_j^2]\frac{x_{j+1}-x}{h_j}+[y_{j+1}-\frac{M_{j+1}}{6}h_j^2]\frac{x-x_{j}}{h_j}
  求导后得:
S'(x) = -\frac{(x_{j+1}-x)^2}{2h_j}M_j+\frac{(x-x_{j})^2}{2h_j}M_{j+1}+\frac{y_{j+1}-y_j}{h_j}-\frac{M_{j+1}-M_j}{6}h_j
  同理分别写出[x_{j-1},x_j],[x_j,x_{j+1}]上的S'(x),联立等式,简化后可得:

\gamma M_{j-1}+2M_j+\mu M_{j+1}=d_j

在matlab实现时注意:n个点,n-1条线,以上矩阵是由相邻的两条线的微分方程联立而来(一阶连续),因此方程总个数减少了1,矩阵中有n-2个方程。 另外,用matlab实现时需要注意,matlab中下标从1开始,其他语言下标可能从0开始。

上一篇下一篇

猜你喜欢

热点阅读