如何最小化具有两个约束的 R 中的函数?
How to minimize a function in R with two constraints?
我想用 R 中的两个约束解决最小化问题。
问题:最小 x^THx
s.t
(1) e^T*x = 1,
(2) 0 < x_i <= 1 , i=1,..,20.
H
是一个 20x20 矩阵,e
是长度为 20
的向量
我该怎么做?我查看了 optimize
、optim
和 optimix
,但不知如何开始。
我开始创建我的 objective 函数:
f<- function(x) {t(x)%*%H%*%x}
和约束(1)
g<- function(x) {t(e)*x=1}
但我不知道如何制定约束条件(2)。
我也不知道哪个优化函数适合这个问题。
我感谢任何建议。
最后我想接收一个有 20 个值的向量 x。
检查 quadprog
包。
它有一个函数solve.QP
来求解下面的二次规划:
min(-d^T b + 1/2 b^T D b) 约束 A^T b >= b_0.
在你的例子中 D=H*2,d = 0。
以下是如何为您的问题构建矩阵 A 和向量 b0:
Amat <- t(rbind(rep(1, n), diag(1, 20), -diag(1, 20))
b0 <- c(1, rep(0, 20), rep(-1, 20))
那你可以运行
library(quadprog)
solve.QP(Dmat = 2*H, dvec = 0, Amat = Amat, bvec = b0, meq = 1)
注意meq = 1
表示第一个不等式应该是等式。
如果您只想要最优的 x
值,那么试试这个:
solve.QP(Dmat = 2*H, dvec = 0, Amat = Amat, bvec = b0, meq = 1)$solution
希望对您有所帮助。
下面是如何使用 CVXR
包。
注意(1)与sum(x_i) = 1
相同,(2)可以简化为x_i > 0
,因为sum(x_i) = 1
和x_i > 0
=>x_i <= 1
。
H <- rWishart(1, df = 30, diag(20))[,,1] # a 20x20 symmetric positive matrix
library(CVXR)
# the variable
x <- Variable(20)
# objective
objective <- Minimize(quad_form(x, H))
# define problem
constraint1 <- sum(x) == 1
constraint2 <- x > 0
problem <- Problem(objective, constraints = list(constraint1, constraint2))
# solve problem
result <- solve(problem)
# results
result$getValue(x) # optimal x
result$value # value of objective at optimal x
我想用 R 中的两个约束解决最小化问题。
问题:最小 x^THx s.t
(1) e^T*x = 1,
(2) 0 < x_i <= 1 , i=1,..,20.
H
是一个 20x20 矩阵,e
是长度为 20
我该怎么做?我查看了 optimize
、optim
和 optimix
,但不知如何开始。
我开始创建我的 objective 函数:
f<- function(x) {t(x)%*%H%*%x}
和约束(1)
g<- function(x) {t(e)*x=1}
但我不知道如何制定约束条件(2)。
我也不知道哪个优化函数适合这个问题。 我感谢任何建议。
最后我想接收一个有 20 个值的向量 x。
检查 quadprog
包。
它有一个函数solve.QP
来求解下面的二次规划:
min(-d^T b + 1/2 b^T D b) 约束 A^T b >= b_0.
在你的例子中 D=H*2,d = 0。
以下是如何为您的问题构建矩阵 A 和向量 b0:
Amat <- t(rbind(rep(1, n), diag(1, 20), -diag(1, 20))
b0 <- c(1, rep(0, 20), rep(-1, 20))
那你可以运行
library(quadprog)
solve.QP(Dmat = 2*H, dvec = 0, Amat = Amat, bvec = b0, meq = 1)
注意meq = 1
表示第一个不等式应该是等式。
如果您只想要最优的 x
值,那么试试这个:
solve.QP(Dmat = 2*H, dvec = 0, Amat = Amat, bvec = b0, meq = 1)$solution
希望对您有所帮助。
下面是如何使用 CVXR
包。
注意(1)与sum(x_i) = 1
相同,(2)可以简化为x_i > 0
,因为sum(x_i) = 1
和x_i > 0
=>x_i <= 1
。
H <- rWishart(1, df = 30, diag(20))[,,1] # a 20x20 symmetric positive matrix
library(CVXR)
# the variable
x <- Variable(20)
# objective
objective <- Minimize(quad_form(x, H))
# define problem
constraint1 <- sum(x) == 1
constraint2 <- x > 0
problem <- Problem(objective, constraints = list(constraint1, constraint2))
# solve problem
result <- solve(problem)
# results
result$getValue(x) # optimal x
result$value # value of objective at optimal x