给定一个连续但未知的函数f(x)
,如何通过尽可能少地调用f(x)
来找到封闭时间间隔内达到的最大值?
该函数是未知的,因此我不能明确地使用派生函数。检查值的唯一方法是调用它。在给定的时间间隔内,f(x)
仅具有一个临界点,但最大值可以位于端点。
我不需要超高精度。假设如果该方法超过一定的迭代次数,它将停止并返回当前的最大值。
答案 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)
做出此确定后,迭代剩余间隔。对于[a,s]或[r,b],间隔中已经有一个点;在较大的一侧再选择一个(如果两者大小相等,则选择其中一个);对于[s,b],我们还需要两个点。
选择点的简单方法是将所讨论的区间简单地二等分或三等分。如果您想尝试更高级的方法,请使用点的历史记录来近似函数(例如样条拟合),然后选择点以更快地收敛。
这能让你前进吗?