CVXR:变量矩阵的某些子集

时间:2019-07-07 00:36:23

标签: cvxr

library("CVXR");

n <- c(1,1,1)
s <- c(1e3,1e5,1e4)
p <- c(0.99,0.93,0.95)
q <- 1-p
K <- length(n)
m <- n-1

A <- Variable(K,K) # for A[i,j] is alpha[i,j]
B <- Variable(K) # B[j] is alpha^*[jj]
D <- diag(A) # extract the diagonal elements from A

constraints <- list( ((t(A)-D)%*%(n*s*p))*q - (((A-D)%*%(n*q))*(p*s)) == 0, B*m + diag(D) + (A-D)%*%n == rep(1,K) )
fnc <- sum(D^2) - (m%*%sqrt(B)) - sum(sqrt(A-D) %*% n);
objective <- Minimize(fnc)
problem <- Problem(objective,constraints);

result <- solve(problem)
result$A
result$B

厌倦了将我的数学模型重新映射为连续编号的变量, 从现在起,我决定忠实地代表他们。 因此,在这里我们要解决一个优化问题, 变量为KxK矩阵AK维向量B。 现在,我有一定的约束要求国家对A的非对角元素进行此类限制,因此我想将其排除在考虑范围之外。 希望A-D将其删除,但显然不会, 我收到incompatible shapes错误。 那么,如何正确说出(语义上的)A-D呢? 因此,澄清一下,如果我对变量声明一些线性约束, 我可以说A%*%x == b,但A-D怎么做?

编辑:在this example中,有一个变量矩阵P,并设置了约束,例如P%*%ones == ones。现在,让D = diag(P)(或类似的效果)。就链接中的示例而言,我的问题本质上是如何编写(P-D) %*% ones == onesCVXR不允许P-D -它表示“形状不兼容”。实际上,DDiagMat控制台中显示为R,而P显示为Variable(3,3)

0 个答案:

没有答案