📜  约束三次样条

📅  最后修改于: 2022-05-13 01:58:09.174000             🧑  作者: Mango

约束三次样条

三次样条插值

三次样条插值是一种查找连接度数为 3 或更少的数据点的曲线的方法。样条曲线是多项式,在给定图上是平滑且连续的,并且在它们连接处也是连续的一阶和二阶导数。

对于函数y = f(x),我们为 i = 0, 1, ..., n 取一组点 [x i , y i ]。三次样条插值是一条分段连续曲线,通过表中的每个值。

  • 以下是 K=3 次样条的条件:
    • s 的域在 [a, b] 的区间内。
    • S, S', S”都是[a,b]上的连续函数。

S(x) =\begin{bmatrix} S_0 (x), x \epsilon [x_0, x_1] \\ S_1 (x), x \epsilon [x_1, x_2] \\ ... \\ ... \\ ... \\ S_{n-1} (x), x \epsilon [x_1, x_2] \end{bmatrix}

这里 S i (x) 是将在子区间 [x i , x i+1 ] 上使用的三次多项式。

样条曲线的主要因素是它结合了不同的多项式,并且不使用单个n次多项式来一次拟合所有点,它避免了高次多项式,从而避免了潜在的过度拟合问题。这些低次多项式需要使得它们形成的样条不仅是连续的而且是平滑的。

但是为了使样条曲线平滑连续,两个连续的多项式和 S i (x) 和 S i+1 (x) 必须在 x i处连接。

S_i (x_i) = S_{i+1} (x_i)= f(x_i) = y_i

或者,S i (x) 必须经过两个端点:

S_{i-1} (x_{i-1}) = S_{i} (x_i)= f(x_{i-1}) ; S_i (x_i) = S_{i+1} (x_i)= f(x_i) = y_i

假设,S” (x) = M i (i= 0,1,2, … , n)。由于 S(x) 是三次多项式,所以 S” (x) 是 [x i , x i+1 ] 中的线性多项式,则 S”' (x) 将是:

S''' (x) = \frac{M_{i+1} - M_i }{x_{i+1} - x_i} \, \forall x \epsilon [x_i, x_{i+1}]

通过应用泰勒级数:

S(x) = S(x_i) + S'(x_i)(x-x_{i}) + \frac{S'' (x)}{2!}(x-x_i)^{2} + \frac{M_{i+1}-M_i}{3! (x_{i+1} - x_i)} (x -x_i)^{3}

让 x = x i+1

y_{i+1} = y_i + S'(x_i)(x_{i+1} - x_i) + \frac{M_i}{2!}(x_{i+1} - x_i)^{2} + \frac{M_{i+1} - M_i}{3!} (x_{i+1} - x_i)^{2} \\ \\ \\ S'(x_i) = \frac{y_{i+1} - y_i}{x_{i+1} -x_i} - \frac{1}{6}(M_{i+1} + 2M_i)(x_{i+1}- x_i)

类似地,我们应用上面的等式 b/w range [x i-1 , x i ]:

S'(x_i) = \frac{y_{i} - y_{i-1}}{x_{i} -x_{i-1}} - \frac{1}{6}(M_{i} + 2M_{i-1})(x_{i}- x_{i-1})

设 h i =x i – x i-1

\mu_i = \frac{h_i }{h_{i+1} + h_i} \\ \\ \lambda_i = 1-\mu_i =  \frac{h_{i+1} }{h_{i+1} + h_i}

现在,我们有 n-1 个方程,但有 n+1 个变量,即 M 0 , M 1 , M 2 ,...M n-1 , M n 。因此,我们需要再得到 2 个方程。为此,我们将使用额外的边界条件。

假设我们知道 S' (x 0 ) = f 0 ' 和 S' (x n ) = f n ',特别是如果 S' (x 0 ) 和 S' (x n ) 都为 0。这称为钳位边界条件。

S_{1}'(x_0) = \frac{y_{1} - y_{0}}{h_i} - \frac{1}{6}(M_{1} + 2M_{0})(h_1)

f_{0}^{'} = - M_0 \frac{h}{2} + f[x_0, x_1] - \frac{M_1 - M_0}{6}h_1

2M_0 + M_1 = \frac{6}{h_1} (f[x_0, x_1] - f_{0}')

同样,对于 M n

2M_{n} + M_{n-1} = \frac{6}{h_n} (f_{n}' -f[x_{n-1}, x_n]  )

或者

2M_{n} + M_{n-1} = {6}f[x_0, x_0, x_1] \\ d_n = f[x_{n-1}, x_n, x_n]

将上述方程组合成矩阵形式,我们得到以下矩阵:

\begin{bmatrix} 2&  \lambda_0 &  &  &  &  &  &  &  &  &  &  & \\ \mu_1&  2&  \lambda_1&  &  &  &  &  &  &  &  &  & \\ &  .&  .&  .&  &  &  &  &  &  &  &  & \\ &  &  .&  .&  .&  &  &  &  &  &  &  & \\ &  &  &  .&  .&  .&  &  &  &  &  &  & \\ &  &  &  &  .&  .&  .&  &  &  &  &  & \\ &  &  &  &  &  .&  .&  .&  &  &  &  & \\ &  &  &  &  &  &  .&  .&  .&  &  &  & \\ &  &  &  &  &  &  & & \mu_{n-1}&  2&  \lambda_{n-1}&  &   \\ &  &  &  &  &  &  &  &  &  &  \mu_n&  2& \\ \end{bmatrix} \begin{bmatrix} M_0 \\ M_1\\ .\\ .\\ .\\ .\\ .\\ .\\ M_{n-1}\\ M_n \end{bmatrix} = \begin{bmatrix} d_0 \\ d_1 \\ .\\ .\\ .\\ .\\ .\\ .\\ d_{n-1}\\ d_n \end{bmatrix}

约束三次样条

CJC Kruger 在他的文章中提出了约束三次样条。该算法是三次样条插值的扩展。其中重要的一步是计算每个点的斜率。斜率计算背后的想法是,一个点的斜率将是 b/w 连接该点的两条相邻线的斜率,如果其中一条为 0,则该点的斜率也应为 0。

让我们取点 (x_0, y_0), (x_1, x_2) ...\, ...\, ... \, (x_{i-1}, y_{i-1}),(x_{i}, y_{ i}), (x_{i+1}, y_{i+1})...\, ...\, ...\, (x_n, y_n)。三次曲线可由下式给出:

f_i(x) = a_i  + b_i x + c_i x^{2} + d_i x^{3}

上述曲线通过以下所有点:

f_i (x) = f_{i+1}(x) = y_i

一阶导数在中间点必须是连续的:

f_i^{'}(x_i) = f_{i+1}^{'}(x_i) = f^{'}(x)

中间点可以通过以下公式计算:

f^{'}(x_i) = \frac{2}{\frac{x_{i+1} - x_i}{y_{i+1} - y_i} + \frac{x_{i} - x_{i-1}}{y_{i} - y_{i-1}} } =0       如果斜率在点改变符号。

每个端点的一阶导数(斜率)由以下公式计算:

f_1^{'}(x_0) = \frac{3(y_1- y_0)}{2(x_1 -x_0)} - \frac{f^{'}(x_1)}{2} \\ f_n^{'}(x_{n+1}) = \frac{3(y_n - y_{n-1})}{2(x_n -x_{n-1})} - \frac{f^{'}(x_{n-1})}{2}

二阶导数由以下公式计算:

f_i^{''}(x_{i-1}) = \frac{2 [f_i^{'}(x_{i}) + 2f_i^{'}(x_{i-1}) ]}{x_i - x_{i-1}} + \frac{6(y_i - y_{i-1})}{(x_i - x_{i-1})^2} \\ f_i^{''}(x_{i}) = \frac{2 [2f_i^{'}(x_{i}) + f_i^{'}(x_{i-1}) ]}{x_i - x_{i-1}} - \frac{6(y_i - y_{i-1})}{(x_i - x_{i-1})^2}

求解曲线系数给出:

d_i = \frac{f_i^{''}(x_{i}) - f_i^{''}(x_{i-1})}{6(x_i - x_{i-1})} \\ c_i = \frac{x_i f_i^{''}(x_{i-1}) -  x_{i-1} f_i^{''}(x_{i}) }{2(x_i - x_{i-1})} \\ b_i = \frac{(y_i - y_{i-1}) - c_i (x_i^2 - x_{i-1}^2) - d_i (x_i^3 - x_{i-1}^3)}{x_i - x_{i-1}} \\ a_i = y_{i-1} - b_{i} x_{i-1} - c_i x_{i-1}^2 - d_i x_{i-1}^3

结论

约束与自然样条(向上)

约束与三次(向下)

与标准三次样条插值相比,约束三次样条插值具有以下优点。

  • 与标准三次样条相比,它生成相对平滑的曲线
  • 在不求解方程组的情况下计算内插值。
  • 它永远不会超过立即值。

参考:

  • CJC kruger 的约束三次样条插值