如何将 MATLAB syms/symbolics 传递给 cvx sdp 求解器?
How to pass MATLAB syms/symbolics to cvx sdp solver?
我有一个 3D 矩阵 At
、n x n x nvar
和 nvar
个变量 y1...y25
。我很容易就能将变量输入 cvx:
cvx_begin sdp;
variable A(2*nbus,2*nbus) symmetric;
variable y(1,nvar);
maximize sum(y*Mfun);
A == subs(At,yt,y(1,nvar));
但是,最后一行的相等性给我这个错误:
Error using sym/subs>normalize (line 197)
Substitution expression X must be a symbolic, cell, or numeric array.
Error in sym/subs>mupadsubs (line 137)
[X2,Y2,symX,symY] = normalize(X,Y); %#ok
Error in sym/subs (line 125)
G = mupadsubs(F,X,Y);
我已经尝试通过几种不同的方式建立这种平等:
首先使用我创建 At
的相同 for
循环(使用 Cfun
,一个双精度矩阵):
A == for k = 1:nvar
At = At + yt(k)*Cfun(:,:,k);
end
这给出了这个错误:
Error: File: proj.m Line: 124 Column: 11
Illegal use of reserved keyword "for".
我真的没想到那个能奏效,但认为值得一试。
我也曾尝试使用 bsxfun
在 cvx 中创建矩阵,但我认为 bsxfun 无法处理符号。 repmat
是我现在正在研究的 'bsxfun'(有人告诉我)的替代品。
我尝试以这种方式解决问题的原因是创建一个例程,该例程可以使用 cvx 来解决任何 number/combination 总线的最佳功率流,而不必每次都单独创建变量.
发布后,我又花了 30 分钟才弄明白。我没有在等式约束中写 for 循环,而是在变量声明之后写了 cvx_begin:
cvx_begin sdp;
variable A(2*nbus,2*nbus) symmetric;
variable y(1,nVar);
maximize sum(y*Mfun);
for k = 1:nVar
At = At + y(k)*Cfun(:,:,k);
end
for k = 1:size(cY,3)
At = At + cY(:,:,k);
end
A == At;
for k = 1:nIneq
y(k)>=0;
end
A>=0;
cvx_end;
我有一个 3D 矩阵 At
、n x n x nvar
和 nvar
个变量 y1...y25
。我很容易就能将变量输入 cvx:
cvx_begin sdp;
variable A(2*nbus,2*nbus) symmetric;
variable y(1,nvar);
maximize sum(y*Mfun);
A == subs(At,yt,y(1,nvar));
但是,最后一行的相等性给我这个错误:
Error using sym/subs>normalize (line 197)
Substitution expression X must be a symbolic, cell, or numeric array.
Error in sym/subs>mupadsubs (line 137)
[X2,Y2,symX,symY] = normalize(X,Y); %#ok
Error in sym/subs (line 125)
G = mupadsubs(F,X,Y);
我已经尝试通过几种不同的方式建立这种平等:
首先使用我创建 At
的相同 for
循环(使用 Cfun
,一个双精度矩阵):
A == for k = 1:nvar
At = At + yt(k)*Cfun(:,:,k);
end
这给出了这个错误:
Error: File: proj.m Line: 124 Column: 11
Illegal use of reserved keyword "for".
我真的没想到那个能奏效,但认为值得一试。
我也曾尝试使用 bsxfun
在 cvx 中创建矩阵,但我认为 bsxfun 无法处理符号。 repmat
是我现在正在研究的 'bsxfun'(有人告诉我)的替代品。
我尝试以这种方式解决问题的原因是创建一个例程,该例程可以使用 cvx 来解决任何 number/combination 总线的最佳功率流,而不必每次都单独创建变量.
发布后,我又花了 30 分钟才弄明白。我没有在等式约束中写 for 循环,而是在变量声明之后写了 cvx_begin:
cvx_begin sdp;
variable A(2*nbus,2*nbus) symmetric;
variable y(1,nVar);
maximize sum(y*Mfun);
for k = 1:nVar
At = At + y(k)*Cfun(:,:,k);
end
for k = 1:size(cY,3)
At = At + cY(:,:,k);
end
A == At;
for k = 1:nIneq
y(k)>=0;
end
A>=0;
cvx_end;