首页 > 解决方案 > 在不计算导数的情况下最大化函数 f(x)

问题描述

我是一名实验物理学家,试图在我的测量中自动化一个相对简单(但敏感)的优化,目前完全手动完成,占用了我很多时间。经过评论中的一些思考和提示,我将问题简化为以下内容:

我想最大化一些函数 f(x)。但是,我只能评估 f(x); 我无法明确评估它的导数。此外,我无法对大范围的 x 进行采样;如果 f(x) < 阈值,我就有麻烦了(我需要一天多的时间才能恢复)。幸运的是,我有一个起始值 x_0 使得 f(x_0) > 阈值,我可以猜测一些初始步长 eps 其中 f(x_0 + eps) > 阈值也成立(但是,我不知道 f(x_0 + eps) > 或 < f(x_0) 在评估之前)。有人可以建议一种算法/自适应/反馈协议来找到将 f(x) 最大化到某个容差 x_tol 的 x 吗?到目前为止,我已经找到了黄金分割搜索,但这需要选择一些你想要最大化的范围(a,b),而我无法做到;我不能从某个广泛的范围开始,因为这可能会使我低于我的容忍度。

我目前如何手动执行如下操作:我评估 f(x_0),然后评估 f(x_0 + eps)。如果这导致减少,我将评估 f(x_0-eps)。基于梯度(基本上我只看是否有大步或大步超出我无法跨越的阈值),我要么增加或减少 eps 并继续沿同一方向搜索,直到找到最大值,我注意到这是因为 f (x) 开始减少。然后我回到那个最大值。这样,我总是在探查最大值的顶部,因此保持在安全范围内。

标签: pythonalgorithmmeasurementfeedback

解决方案


我会说您需要定义问题或将其分解,例如找到局部最优值或梯度下降


推荐阅读