5

我需要找到未定义函数与阈值相交点的良好近似值。我正在步入我的空间,每当我发现两个后续步骤位于阈值的不同侧时,我都会在两者之间添加一个点:

实际情况

(来源:宁网

我的第一种方法是只选择中点,但这显然是一个糟糕的解决方案:

中点

(来源:宁网

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

线性插值

(来源:宁网

对基本函数进行采样可能会非常昂贵,但是我想尝试添加一两个额外的样本以获得更好的近似值。是否可以在这里使用三次插值?像这样:

三次插值
(来源:宁网

还是有更好的方法?

非常感谢,大卫·鲁滕

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

4

3 回答 3

3

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

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

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

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

于 2009-12-07T22:36:32.833 回答
2

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

于 2009-09-20T19:58:47.383 回答
2

您的上一张图片仅显示三个点,仅足以定义二次多项式,而不是三次。对于三次插值,您需要四个点。三次多项式可以用不同的方式拟合;这里有两个。

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

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

顺便说一句,任何高阶多项式都可能不是一个好主意,因为即使存在一点输入噪声,它们也会变得非常不稳定。

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

更新:愚蠢的我留下了一个句子,提到了两种方法,没有把它们打出来。现在把它们打出来。

于 2009-09-20T20:02:12.803 回答