插值 101

多年前,NumXL 支持插值功能,作为满足用户建模需求的实用工具或辅助方法。出乎我们意料的是,该功能受到了广泛关注,因此我们决定在此汇编一些有关该功能的常见问题。

什么是插值?

插值法是一种数值方法,用于根据离散的已知数据点的范围估算新数据点的值。

举例说明,假设函数 $y=f(x)$ 的值是一组五(5)个不同的 x 值,如下图所示。
该图显示了由五个不同 x 值组成的输入数据集。

现在,我们希望估计(即插值)函数在$x=5$处的值,使用给定的五个(5)数据点。

为了进行插值,所需的目标 x 值必须在原始数据集的范围内(例如,$2\le x\le 12$)。

在进一步讨论之前,让我们先回答几个我们经常听到的基本问题:

  1. 那么外推法呢?有什么不同?
    外推法是对超出给定数据集范围的 x 值的函数值进行估计的过程。
  2. NumXL 支持外推法吗?
    是的,功能相同 NxINTRPL(.) 可用于外推法。请确保在 "外推法 "参数中输入 "true "或 1。
  3. 曲线拟合(如回归)和插值是否相同?
    曲线拟合和插值法经常被互换使用,但两者之间有细微的差别:插值法必须完全拟合数据点,而曲线拟合必须尽可能接近数据点。
  4. 我应该使用插值法还是曲线拟合法?
    这要看情况。插值法假定数据点是完全已知的(或至少是非常精确的),而曲线拟合法假定数据点存在一定程度的噪声。

数据准备

如前所述,所有插值方法都接受一组离散的已知数据点。为了处理真实世界的数据集,NumXL 插值函数 (NxINTRPL) 对数据进行预处理,以便

  • 将数据点按升序排序(基于 X)。
  • 无声删除缺失值的数据点
  • 用平均值替换相同 X 值的多个读数。

常见问题:

Q: 数据点是否应该均匀分开?

A: 不,数据点之间的间隔长度不需要一致,但我们建议数据点分散在 x 范围内,以提高插值精度,并将异常值的影响降至最低。

插值法

  1. 阶跃插值 1:正向平插值:

    阶跃插值法利用最后一个已知值,在已知数据点之间建立未知函数的平直/恒定模型。
    该图描述的是 '前向平差' 插值法。

  2. 阶跃插值 2:后向平插值:

    在后向平坦法中,未知函数也被建模为已知数据点之间的平坦/常数,但它使用的是紧接着的下一个数据点的水平。
    该图描述的是 '后向平坦' 插值法。

  3. 步骤插值 3:最近邻插值:

    使用近邻法时,未知函数的建模仍然是平坦/恒定的,但其电平由最近数据点的电平决定。
    该图描述了

  4. 线性插值

    通过线性插值,我们用直线将每个数据点与其邻近点连接起来。
    该图描述的是 '线性' 插值法。

    请注意,两个数据点之间的函数值完全由这两个数据点决定。

  5. 立方样条:自然样条:

    利用三次样条曲线法,我们在每个区间上构建了一个片断三次多项式,其在所提供数据点上的一阶导数和二阶导数相匹配。二阶导数在第一个点和最后一个点均为零。
    该图描述的是 '自然样条' 插值法。

    结果曲线是平滑的,但它不是 "局部的",这意味着如果函数发生较大变化(如 x=4),周围各点的曲线就会 "摇摆不定"(即在中间点出现过冲)。

  6. 立方样条:AKIMA样条:

    为了避免自然三次样条曲线的摇摆不定,我们放宽了数据点(结点)周围二次导数的连续性,从而产生了非圆角。
    该图描述了 'AKIMA Spline' 插值方法。

    如上图所示,数据点周围的曲线是连续的,但并不平滑。

  7. 立方样条曲线 Steffen Spline:

    Steffen 的样条曲线增加了一个新的约束条件:数据点之间的立方样条曲线段是单调的。在此期间,不会出现晃动。
    该图描述了 'Steffen Spline' 插值方法。

    由此得出的曲线在数据点周围是平滑的,在数据点之间没有任何晃动。因此,最小值和最大值只能恰好出现在数据点上。

    Steffen 的样条曲线及其一阶导数保证是连续的,但二阶导数可能是不连续的。

  8. 立方样条曲线 约束(克鲁格)样条曲线

    克鲁格提出了一种约束立方样条曲线,通过牺牲平滑度来防止超调,因此我们不再要求在每个点上都有连续的二阶导数,而是利用周围的点来数值计算一阶导数值。
    该图描述了 '约束(克鲁格)样条曲线' 插值方法。

    使用约束(克鲁格)样条曲线,我们避免了三次样条曲线的过冲摇摆效应,也无需添加单调性约束。

还有其他类型的三次样条曲线,但我们只介绍了 NumXL 1.68 版目前支持的几种。

常见问题:

Q: 我应该使用哪种类型的立体花键?

A: 这取决于数据的性质,以及平滑曲线和/或过冲副作用的重要性。在许多情况下,我们建议选择约束(克鲁格)立方样条曲线作为安全的选择。

Q: 我在 NumXL 中看到两个插值函数: INTERPOLATE(.)NxINTRPL(.). 我该用哪一个?

A: INTERPOLATE(.) 函数是我们早期的实现函数,但现在已被弃用。上面提到的所有插值方法只有在 NxINTRPL(.) 中可用,因此您只应使用该函数。

Q: NxINTRPL(.) 函数既接受单个值,也接受目标参数数组。为什么?

A: NxINTRPL(.) 在一次对多个值进行插值时运行速度更快,而不是对每个值分别调用。我们建议在几次函数调用中传递所有 x 值。

  附件

评论

登录写评论。

这篇文章有帮助吗?
0 人中有 0 人觉得有帮助