【问题标题】:nonlinear optimizaion in RR中的非线性优化
【发布时间】:2014-02-12 22:49:31
【问题描述】:

我尝试最小化以下功能:

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

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 不能?

提前谢谢你

【问题讨论】:

    标签: r wolfram-mathematica precision nonlinear-optimization


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

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

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

        给出:

        expression(0)
        

        【讨论】:

          猜你喜欢
          • 2016-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-15
          • 1970-01-01
          • 2013-04-20
          • 1970-01-01
          相关资源
          最近更新 更多