插值建议(线性,立方?)

时间:2009-09-20 19:48:45

标签: interpolation linear approximation cubic

我需要找到未定义函数与阈值相交的点的良好近似值。我正踩过我的空间,每当我发现后面两个步骤位于阈值的不同侧面时,我在其间的某处添加一个点:

ActualSituation

(来源:ning.com

我的第一个方法是选择中间点,但这显然是一个可怕的解决方案:

Midpoint

(来源:ning.com

我现在使用的是线性插值,它给出了一个合理的结果,但基本功能实际上永远不会是线性的。因此,只有当我的步长足够小时,这才有效:

LinearInterpolation

(来源:ning.com

对基本函数进行采样可能非常昂贵,但是为了得到更好的近似值,添加一个或两个额外的样本是我想要尝试的。可以在这里使用立方插值吗?像这样:

CubicInterpolation
(来源:ning.com

还是有更好的方法吗?

非常感激, 大卫拉滕

PS。我正在用C#编写,但这是一个与语言无关的问题。

3 个答案:

答案 0 :(得分:3)

你的最后一张照片只显示了三个点,这只能定义一个二次多项式,而不是立方多项式。对于三次插值,您需要四个点。三次多项式可以以不同的方式拟合;这是两个。

最直接的方法是简单地让(唯一的)多项式通过所有四个点。

另一种方法是使用切线。同样,我们需要四点。让左边的两个点定义一个斜率。让多项式通过第二点(通常,它不会通过第一个点),并匹配该点的计算斜率。对于第四点和第三点,右侧也是如此。

顺便说一下,任何高阶多项式都可能是一个坏主意,因为它们在存在一点点输入噪声的情况下往往变得非常不稳定。

如果您提供有关问题域的更多详细信息,我可以提供更具体的答案。例如,您的数据点来自哪里,您通常可以期望什么样的曲线,如果需要,您可以返回并采样更多吗?如果需要,我也可以提供方程式和伪代码。

更新:愚蠢的我留下了一个句子,指的是两种方式,而不是输入它们。现在输入它们。

答案 1 :(得分:2)

我的数学非常生疏,但你可能会发现Newton Raphson method给你带来了很好的效果。一般来说,假设迭代开始“足够接近”所需的根,它会非常快速地收敛到准确的解决方案。

答案 2 :(得分:2)

神奇的词是“根解算器”;数学根是函数等于零的值。通过添加/减去阈值,您可以使用根查找器。

如果您知道要插入的功能,可以设置一个非常快速的根寻找器。如果有你的帖子建议的线索(“未定义”),最好的方法是“布伦特方法”,“割线方法”和“二分法”的组合,或者“割线方法“单独。维基百科有这个方法的条目。

与您的观点相反,使用更复杂的功能并不是一个好主意。主要的性能障碍是功能评估,其随着更多点/获得导数或更复杂的插值函数而增加。

如果你接近最大值/最小值/拐点,Newton-Raphson方法非常糟糕,因为接近于零的导数会让你远离该点,并且还存在其他一些问题。在你知道自己在做什么之前不要使用它。