R nloptr包中的最小化问题-多个等式约束

10

在R的nloptr函数中,是否可能指定多个等式约束条件?我正在尝试运行以下代码:

eval_f <- function( x ) {
  return( list( "objective" = x[3]^2+x[4]^2,
                "gradient" = c( 0,
                                0,
                                2*x[3],
                                2*x[4] ) ) )
}
# constraint functions
# equalities
eval_g_eq <- function( x ) {
  constr <- c( x[1] + x[2] + x[3] - 4,  
               x[1]^2 + x[2]^2 + x[4] - 15
  )
  grad <- c( c(1, 1, 1, 0),
             c(2*x[1], 2*x[2], 0, 1)
  )
  return( list( "constraints"=constr, "jacobian"=grad ) )
}
# initial values
x0 <- c( 1, 5, 5, 1 )
local_opts <- list( "algorithm" = "NLOPT_LD_MMA",
                    "xtol_rel" = 1.0e-7 )
opts <- list( "algorithm" = "NLOPT_LD_AUGLAG",
              "xtol_rel" = 1.0e-7,
              "maxeval" = 1000,
              "local_opts" = local_opts )
res <- nloptr( x0=x0,
               eval_f=eval_f,
               eval_g_eq=eval_g_eq,
               opts=opts)
print( res )

它产生的结果如下:

Current value of controls: -1.035323 3.093593 2.409501 0.2708714

然而,这些值并不满足等式约束条件,即

-1.035323 + 3.093593 + 2.409501 = 4.467771
(-1.035323)^2 + 3.093593^2 + 0.2708714 = 10.91308

我猜在nloptr函数中指定多个等式约束可能是不可能的,或者我传递它们的方式是错误的。 在软件包文档中没有找到任何具有多个等式约束的示例。

更新

好的,问题解决了。情况是在eval_g_eq中指定constrgrad时,应该使用rbind()而不是c()


你想要的质量约束条件是什么?一次方、二次方和四次方的平方和等于15吗? - Colonel Beauvel
是的,这正是我想要的。 - Paweł Orliński
您好,请问这个能用于价格与需求优化吗?我想使用自然语言处理技术。 - Abhishek Singh
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接