Rsolnp:在cbind(temp,funv)中:结果行数不是向量长度的倍数(arg 1)

时间:2016-12-02 08:37:28

标签: r mathematical-optimization

我是stackoverflow的新手并经常搜索,但无法找到我的问题的答案。我试图通过优化包Rsolnp来减少问题。虽然解算器给了我一个解决方案,但每次运行代码时都会收到以下警告消息:

警告消息:1:在cbind(temp,funv)中:   结果行数不是向量长度的倍数(arg 1)

此外,该解决方案与我使用ipop和solve.QP获得的解决方案完全不同。他们的解决方案几乎相同(0.2480,0.0000,0.0121,0.724)。 我尝试了很多不同的问题,但无法弄清楚我做错了什么。我感谢所有的帮助和信息!

library(Rsolnp)
# Starting Values
x0 <- c(0.25,0,0.01,0.75)


fn <- function(x){
  d <- c(0.0308, 0.0269, 0.0145, 0.0130)
  d <- -d
  D <- cbind(c(0.1486, 0.0778, -0.0240, -0.0154), 
         c(0.0778, 0.1170, 0.0066, 0.0029), 
         c(-0.0240, 0.0066, 0.0444, 0.0193), 
         c(-0.0154, 0.0029, 0.0193, 0.0148))
 out <- t(d) %*% x + 0.5 * (t(x) %*% D %*% x)
 out
}


# Inequality Constraint: 0 =< x 0 =< 1
lx <- rep(0,4)
ux <- rep(1,4)



sol <- solnp(pars = x0, 
         fun = fn, 
         eqfun = sum, 
         eqB = 1, 
         ineqLB = lx, 
         ineqUB = ux)
sol$pars

2 个答案:

答案 0 :(得分:2)

欢迎来到SO。

你有两个问题a)问题w.r.t结果和b)一条你无法理解的警告信息。

ad a) 这仅仅是因为LaGrange优化通常通过最小化负值而不是最大化正值来完成。这就是区别。将d设置为-d时(我在编辑中这样做),解决方案与其他解算器生成的解决方案相同。

ad b) 警告信息问题有点棘手。消息本身意味着cbind尝试绑定两个不同长度的列。 R的作用是在必要时重复较短列中的值,以获得两个相等长度的列进行绑定。如果较长时间不是较短的倍数,则会收到此警告,但如果R表示有一些未使用的余数,则R继续重复较短的值。

然而,看起来包装中存在一个错误。 当你运行

options(warn = 2) # turns warnings to errors and breaks code
debug(solnp)
sol <- solnp(pars = x0, 
     fun = fn, 
     eqfun = sum, 
     eqB = 1, 
     ineqLB = lx, 
     ineqUB = ux)

您意识到有一个名为tempdf的对象正在创建,导致问题。但是,此对象永远不会再在solnp的代码中使用。我会问提交人,也许他们可以确认这是一个错误或以其他方式显示。

答案 1 :(得分:1)

将目标函数fn的结果显式为数字:

fn <- function(x){
  d <- c(0.0308, 0.0269, 0.0145, 0.0130)
  d <- -d
  D <- cbind(c(0.1486, 0.0778, -0.0240, -0.0154), 
             c(0.0778, 0.1170, 0.0066, 0.0029), 
             c(-0.0240, 0.0066, 0.0444, 0.0193), 
             c(-0.0154, 0.0029, 0.0193, 0.0148))
  out <- t(d) %*% x + 0.5 * (t(x) %*% D %*% x)
  as.numeric(out)
}

我得到了

  

Iter:1 fn:-0.01153 Pars:0.24798607502 0.00000002295 0.01205720515   0.73995669928 Iter:2 fn:-0.01153 Pars:0.247984418270 0.000000003318 0.012080555874 0.739935021900 solnp - &gt;在2次迭代中完成

     

溶胶$收杆   [1] 2.479844e-01 3.317577e-09 1.208056e-02 7.399350e-01