在间隔中查找未知函数的最大值

时间:2019-06-26 21:04:00

标签: javascript algorithm function optimization max

给定一个连续但未知的函数f(x),如何通过尽可能少地调用f(x)来找到封闭时间间隔内达到的最大值?

该函数是未知的,因此我不能明确地使用派生函数。检查值的唯一方法是调用它。在给定的时间间隔内,f(x)仅具有一个临界点,但最大值可以位于端点。

我不需要超高精度。假设如果该方法超过一定的迭代次数,它将停止并返回当前的最大值。

1 个答案:

答案 0 :(得分:1)

这是一个分而治之的过程。

端点(a,f(a))和(b,f(b))将y轴分为三个区域,水平边界分别位于f(a)和f(b)。 w.l.o.g.假设f(b)> f(a)

,我将讨论限制在第一象限
     |
     |
f(b)-+-------------------------*-----------
     |
     |
     |
     |
f(a)-+-*-----------------------------------
     |
     |
     +-a-------r--------s------b-----

采用其他两个值,例如r和r,使a < r < s < b。由于拐点不超过一个,因此对f(r)和f(s)与端点一起排序的各种可能性有一些限制。

如果两者均小于f(b),则最大点必须位于s的右边,即间隔[s,b]。

如果f(r)高,则f(s)也高。
f(r)> f(s)> f(b)表示最大值在区间[a,s]
f(s)> f(r)> f(b)表示最大值在区间[r,b]

其余情况为f(a) f(b)。再次,我们得到最大值必须在f(r)的右边,f(r)是前一种情况的第二个点,间隔[r,b]。

做出此确定后,迭代剩余间隔。对于[a,s]或[r,b],间隔中已经有一个点;在较大的一侧再选择一个(如果两者大小相等,则选择其中一个);对于[s,b],我们还需要两个点。

选择点的简单方法是将所讨论的区间简单地二等分或三等分。如果您想尝试更高级的方法,请使用点的历史记录来近似函数(例如样条拟合),然后选择点以更快地收敛。

这能让你前进吗?