关于二次程序,我将如何设置一个目标函数,例如
min∑a_i(x_i)^2
在矩阵形式中的" QuadProg"或" limsolve"的矩阵形式(对于此软件包,我不确定是否需要以矩阵形式为单位)?
从我到目前为止的讨论中,二次术语没有乘法。
让我们考虑您提到的表单的简单线性约束二次程序:
min 0.5x^2 + 0.7y^2
s.t. x + y = 1
x >= 0
y >= 0
使用quadprog
软件包
解决方案 quadprog
软件包接受以下形式的模型:
min −d'b + 1/2b'Db
s.t. A'b >= b0
要将我们的问题纳入此形式,我们需要以(2*0.5 2*0.7)
为主对角线构建一个矩阵D
,以及带有三个约束的矩阵A
,右侧b0
:
dvec <- c(0, 0)
Dmat <- diag(c(1.0, 1.4))
Amat <- rbind(c(1, 1), c(1, 0), c(0, 1))
bvec <- c(1, 0, 0)
meq <- 1 # The first constraint is an equality constraint
现在我们可以将其喂给solve.QP
:
library(quadprog)
solve.QP(Dmat, dvec, t(Amat), bvec, meq=meq)$solution
# [1] 0.5833333 0.4166667
使用limSolve
软件包
解决方案 limSolve
软件包的lsei
功能接受以下表格的模型:
min ||Ax-b||^2
s.t. Ex = f
Gx >= h
要获得我们的目标函数,我们需要用(sqrt(0.5) sqrt(0.7))
作为主角构建矩阵A
,将b
设置为0向量,以及编码其他信息的矩阵和向量:
A <- diag(c(sqrt(0.5), sqrt(0.7)))
b <- c(0, 0)
E <- rbind(c(1, 1))
f <- 1
G <- diag(2)
h <- c(0, 0)
现在我们可以将此信息提供给lsei
:
library(limSolve)
lsei(A, b, E, f, G, h)$X
# [1] 0.5833333 0.4166667