Optim 函数返回错误的解决方案

Optim function returning wrong solution

我正在尝试使用 R 中的 optim 获得一个函数最小值,问题是该方法返回的 par 解不正确,如果我引入不同的初始点会发生变化。我将向您展示一些代码和获取中的输出。 我错过了什么?

> funx = function(vx) (vx[1] -2)^4 + (vx[1]-2*vx[2])^2 + -10/(vx[1]^2-vx[2])
> optim(c(0,1), funx)
$par
[1] 0.7080021 1.5315815

$value
[1] 18.03898

$counts
function gradient 
      61       NA 

$convergence
[1] 0

$message
NULL

> optim(c(0,3), funx)
$par
[1] 1.271924 1.617791

$value
[1] -4.5036e+16

$counts
function gradient 
     237       NA 

$convergence
[1] 0

$message
NULL

> funx(c(1.271924, 1.617791))
[1] 29566209

例如,您可以在您的优化中添加method = "L-BFGS-B",并根据您对函数的定义来定义参数的上限和下限。它可能会产生超出其原始间隔的值。

的确,这是一个四舍五入的问题。如果您将 精确的 值反馈给 funx(),您会得到一个很小的(即非常负的)值:如果您四舍五入到六位数,您会得到一个很大的值。

oo <-optim(c(0,3), funx)
funx(oo$par)
## [1] -4.5036e+16
 funx(round(oo$par,6))
## [1] 29566209

这确实是一个行为不端的函数,您在使用它时可能需要考虑到这一点。 (我还强烈建议使用基于导数的优化,要么自己计算导数,要么使用 deriv()。)