我正在尝试最小化上面显示的功能。我在(-1,1)之间搜索。我使用以下代码
optim(runif(1,min=-1,max=+1), ..., method = "Brent", lower = -1.0, upper = 1.0)
我注意到它总是返回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(b-a)。请注意,[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)
答案 0 :(得分:5)
您的函数不是凸的,因此您将具有多个局部/全局最小值或最大值。对于您的函数,我将运行非传统/衍生自由全局优化器,如模拟退火或遗传算法,并使用输出作为BFGS或任何其他本地优化器的起点,以获得精确的解决方案。多次重复上述步骤,您将找到所有全局和局部最佳点。