将python CVXPY代码移植到R CVXR

时间:2018-01-15 06:10:15

标签: r

我正在尝试学习CVXR包的工作原理,我正在移植一个  Python示例  史蒂夫钻石在这里: https://groups.google.com/forum/#!topic/cvxpy/5hBSB9KVbuI   和 http://nbviewer.jupyter.org/github/cvxgrp/cvx_short_course/blob/master/intro/control.ipynb

代码的R等价物如下:

set.seed(1)
n = 8
m = 2
T1 = 50
alpha = 0.2
beta = 5
A = diag(n) + alpha*replicate(n, rnorm(n))
B = replicate(m, rnorm(n))
x_0 = beta*replicate(1, rnorm(n))

# Form and solve control problem.
x = Variable(n, T1+1)
u = Variable(m, T1)

states = c()
for (t in 1:T1) {
   cost = sum_squares(x[,t+1]) + sum_squares(u[,t])
   constr = list(x[, t+1] == A%*%x[, t] + B%*%u[, t],
      norm_inf(u[,t]) <= 1)
   states = c(states, Problem(Minimize(cost), constr) )
}
# sums problem objectives and concatenates constraints.
prob <- Reduce("+", states)
constraints(prob) <- c(constraints(prob), x[ ,T1] == 0)
constraints(prob) <- c(constraints(prob), x[ ,0] == x_0)
sol <- solve(prob)

我遇到了倒数第二行的挑战(它会引发错误):

constraints(prob) <- c(constraints(prob), x[ ,0] == x_0)

我的猜测是x[ , 0]指向的第零个索引位置  变量,x,这在R.中不存在。但是从Python中可以看到  程序是从,从第零个索引位置转换而来的  for循环(对于范围(T)中的t)。 range(T)是从0开始的向量   - 49。  但在R中,for循环(for (t in 1:T1))用于1 - 50的向量。

请提供任何有用的建议。

谢谢。

1 个答案:

答案 0 :(得分:1)

您需要将索引编号提高1,分别在最后一行的第二个和第三个中x[,1] == x_0x[,T1+1] == 0。否则,您永远不会设置T1+1条目。