
我正在尝试最小化上面显示的功能.我在(-1,1)之间搜索.我使用以下代码
optim(runif(1,min=-1,max=+1), ..., method = "Brent", lower = -1.0, upper = 1.0)
Run Code Online (Sandbox Code Playgroud)
而且我注意到它总是返回x = -0.73的值,而不是正确的x = 0.88答案.原因在optimise帮助页面中给出:
f的第一次评估总是在x_1 = a +(1-φ)(ba),其中(a,b)=(下,上)和phi =(sqrt(5)-1)/ 2 = 0.61803 ..是黄金分割比例.几乎总是,第二次评估是在x_2 = a + phi(ba).请注意,[x_1,x_2]内的局部最小值将作为解,即使f在那里是常数,请参见最后一个示例.
我很好奇是否有任何方式使用布伦特的方法而不是每次都达到相同的局部最小值.
将方法更改为"L-BFGS-B"的效果更好(每次返回一个随机的局部最小值):
optim(runif(1,min=-1,max=+1), ..., method = "L-BFGS-B", lower = -1.0, upper = 1.0)
Run Code Online (Sandbox Code Playgroud)
您的函数不是凸的,因此您将具有多个局部/全局最小值或最大值.对于您的函数,我将运行非传统/衍生自由全局优化器,如模拟退火或遗传算法,并使用输出作为BFGS或任何其他本地优化器的起点,以获得精确的解决方案.多次重复上述步骤,您将找到所有全局和局部最佳点.