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

时间:2019-04-25 20:14:53

标签: r mathematical-optimization nonlinear-optimization

我正在尝试使用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

2 个答案:

答案 0 :(得分:2)

确实,这是一个四舍五入的问题。如果将 exact 值反馈回funx(),则会得到较小的值(即,非常负):如果舍入为六位数,则会得到较大的值。

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

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

答案 1 :(得分:0)

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