【发布时间】:2015-10-23 11:57:24
【问题描述】:
如果您尝试在 matlab 中执行线性插值,它显然会使用“网格”插值。
通常,我希望线性插值函数看起来像这样:
方法一:
我们希望知道 y(u) 在 u 处的值。
然而,matlab 似乎使用以下公式:
方法 B:
因此,如果您使用方法 A 并将答案与 方法 B 进行比较,结果实际上会有所不同。 在某些输入的双精度浮点运算中,我发现结果的差异约为 2^-18。
我的问题:
为什么 MATLAB 选择使用方法 B?看来方法 A 将涉及较少的计算。另外,任一公式“更多”是否正确?
执行方法A应涉及以下内容:
温度 = (y(k+1)-y(k))/(x(k+1)-x(k))
y(u) = y1 + temp*(u-x(k))
【问题讨论】:
-
一个原因是在方法中您可以轻松地迭代并使用上一步中的数据。该公式称为时间计算。
-
2^{-18}in difference 真的没什么好担心的......这基本上是 0。你可以通过做一些非常基本的代数运算从方法 A 推导出方法 B。我也同意 NKN 关于时间计算的观点。 -
@rayryeng,我知道它很小,但出于我的目的,我想知道结果中所有可能的差异发生在哪里。特别是因为我正在实现一个 ASIC,微小的差异使我无法“区分”结果以执行功能验证。
-
@starbox - 这很可能是由于操作顺序的不同。例如,执行
(5.0 / 3.0)和执行5 * (1.0/3.0)实际上会给您带来两者之间的小浮点错误。如果您尝试这样做,您将获得几乎eps = 2.22e-16的差异。 -
虽然这些公式在数学上是等价的,但它们在数值上并不等价。 MATLAB 使用的 Eq2 广受青睐,因为它保证在存在浮点舍入误差的情况下可以可靠地命中两个端点。稍加改动后,Eq2 也适用于非常高效和准确的双 FMA 计算:
fma (fma (-t_u, y_k, y_k), t_u, y_k1)。
标签: matlab math floating-point linear-interpolation