我正在尝试学习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的向量。
请提供任何有用的建议。
谢谢。
答案 0 :(得分:1)
您需要将索引编号提高1,分别在最后一行的第二个和第三个中x[,1] == x_0
和x[,T1+1] == 0
。否则,您永远不会设置T1+1
条目。