我是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
答案 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