0

我试图最小化以下功能:

func <- function(qq){
  x <- qq[1]
  y <- qq[2]
  output <- 1 - 2 * x + x^2 - 2 * y + 2 * x * y + y^2
  return(output)
}

当 x+y=1 且 0<=x,y<=1 时。要在 Rsolnp 包中使用 gosolnp,首先,我定义了 cons 以在 eqfun 参数中使用它:

cons <- function(qq)
  sum(qq)

然后我应用了 gosolnp 函数:

install.packages("Rsolnp")
require(Rsolnp)
gosolnp(fun = func, LB = c(0, 0), UB = c(1, 1), eqfun = cons, eqB = 1)

res$pars
[1] 0.8028775 0.1971225
res$value
[1]  2.606528e-09 -5.551115e-17

答案应该是 x = 0 和 y = 1,但是你可以在每次运行 gosolnp 时尝试,你会得到新的点,在那个点上 func 大约为 0(不完全是)。Mathematica 和 Maple 非常快地对此函数进行优化,并给出了正确的答案,即 x = 0 和 y = 1,但是 R 中的每次运行都会给出一个不正确的新解决方案。

我还在阿拉巴马州或 DEoptim 中尝试了另一个优化函数 spg(),但问题仍未解决。

所以我的问题是:

1-有什么解决方案可以最小化R中的func吗?

2- R 和 Mathematica 的精度之间有什么区别,为什么 Mathematica 可以给我确切的答案,但 R 不能?

先感谢您

4

3 回答 3

4

如果你有两个变量xyy = 1 - x那么你真的只有一个变量有问题x。请注意,您可以将函数重新参数化为

1 - 2 * x + x^2 - 2 * (1 - x) + 2 * x * (1 - x) + (1 - x)^2

并且通过代数表明这是常数作为 的函数x。因此in (0, 1) 的任何x都是一个解决方案,您的算法收敛到哪个值基本上是随机的:基于数值舍入和您选择的起点。

的返回值在数值精度范围内为零的事实gosolnp应该是一个提示,甚至只是绘制曲线。

于 2014-02-13T00:26:50.783 回答
2

您的函数完全等于 0,因此尝试将其最小化是没有意义的。

library(Ryacas)
x <- Sym("x")
y <- 1-x
Simplify( 1 - 2 * x + x^2 - 2 * y + 2 * x * y + y^2)

这使:

expression(0)
于 2014-02-13T00:58:51.070 回答
2

我无法谈论这些特定的包,但nloptr(...)在包中nloptr似乎运作良好:

# Non-Linear Optimization (package::nloptr)
F <- function(v){  
  x=v[1]
  y=v[2]
  output <- 1 - 2 * x + x^2 - 2 * y + 2 * x * y + y^2
}
Hc <- function(v) return(1-sum(v))

library(nloptr)
opt <- nloptr(x0=c(1/2,1/2), eval_f=F, lb = c(0,0), ub = c(1,1), 
              eval_g_eq = Hc, 
              opts = list(algorithm="NLOPT_GN_ISRES",maxeval=1e6))
opt$solution
# [1] 0.0005506997 0.9994492982
于 2014-02-12T23:38:40.057 回答