【问题标题】:How to pass MATLAB syms/symbolics to cvx sdp solver?如何将 MATLAB 符号/符号传递给 cvx sdp 求解器?
【发布时间】:2016-05-04 15:14:07
【问题描述】:

我有一个 3D 矩阵 Atn x n x nvarnvar 变量 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 解决任意数量/组合的总线的最佳功率流,而不必每次都单独创建变量。

【问题讨论】:

    标签: matlab cvx


    【解决方案1】:

    发布后,我又花了 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;
    

    【讨论】:

      猜你喜欢
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 2016-01-13
      • 1970-01-01
      • 2013-07-26
      相关资源
      最近更新 更多