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

Rsolnp:In cbind(temp,funv):结果行数不是向量长度(arg 1)的倍数,r,mathematical-optimization,R,Mathematical Optimization,我是stackoverflow的新手,搜索了很多,但找不到问题的答案。我正试图通过优化包Rsolnp将下面的问题最小化。尽管解算器为我提供了解决方案,但每次运行代码时,我都会收到以下警告消息: 警告消息:1:在cbind(临时、funv)中: 结果的行数不是向量长度(arg 1)的倍数 此外,该解决方案与我使用ipop和solve.QP得到的解决方案完全不同。他们的解决方案几乎相同(0.2480,0.0000,0.0121,0.7400)。 我试过许多不同的方法来解决这个问题,但都不知道我做错了

我是stackoverflow的新手,搜索了很多,但找不到问题的答案。我正试图通过优化包Rsolnp将下面的问题最小化。尽管解算器为我提供了解决方案,但每次运行代码时,我都会收到以下警告消息:

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

此外,该解决方案与我使用ipop和solve.QP得到的解决方案完全不同。他们的解决方案几乎相同(0.2480,0.0000,0.0121,0.7400)。 我试过许多不同的方法来解决这个问题,但都不知道我做错了什么。我感谢所有的帮助和信息

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
库(Rsolnp)
#起始值
欢迎来到SO

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

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

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

但是,看起来包中有一个bug。 当你跑的时候

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)
options(warn=2)#将警告变为错误并中断代码
调试(solnp)

sol使目标函数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)
}
fn