首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在cvx的内容中,subs()不能工作?

为什么在cvx的内容中,subs()不能工作?
EN

Stack Overflow用户
提问于 2022-06-07 05:54:00
回答 1查看 28关注 0票数 2

TLDR我编写了一个解决SDP问题的代码。在cvx内容之前,我使用subs将syms转换为数字值,并且在输出变量之后,我确实看到了数值。但是whos()确实表明变量仍然是syms类型,我认为这可能是我出错的关键。错误消息显示如下所示:

代码语言:javascript
复制
Unable to convert 'cvx' to 'sym'.

trace(rhot*X_ele(:,:,i)) == value(i);行中,rhot是符号而不是数字,这是错误的。

Details我正在尝试编写一个SDP问题,如下所示:

代码语言:javascript
复制
function [res] = NH_SDP(rhot,p,value,t)
dim = size(rhot,1);
for i = 1:p
    drhot(:,:,i) = diff(rhot,t(i));
end
drhot = subs(drhot,t,value);
rhot = subs(rhot,t,value);
rhott = kron(eye(p),rhot);

% cvx process
cvx_begin sdp
%     cvx part
    variable L_ele(dim,dim,(1+p)*p/2) hermitian;
    variable X_ele(dim,dim,p) hermitian;
    cnt = 1;
    for i = 1:p
        for j = i:p
            if i == j
                L((i-1)*dim+1:i*dim,(j-1)*dim+1:j*dim) = L_ele(:,:,cnt);
                cnt = cnt + 1;
            else
                L((i-1)*dim+1:i*dim,(j-1)*dim+1:j*dim) = L_ele(:,:,cnt);
                L((j-1)*dim+1:j*dim,(i-1)*dim+1:i*dim) = L_ele(:,:,cnt);
                cnt = cnt + 1;
            end
        end
    end
    for i = 1:p
        X((i-1)*dim+1:i*dim,1:dim) = X_ele(:,:,i);
    end
    for i = 1:p
        X2(1:dim,(i-1)*dim+1:i*dim) = X_ele(:,:,i);
    end
% rhott = [[0,    0,    0, 0, 0,    0,    0, 0]
% [0,  1/2, 7/20, 0, 0,    0,    0, 0]
% [0, 7/20,  1/2, 0, 0,    0,    0, 0]
% [0,    0,    0, 0, 0,    0,    0, 0]
% [0,    0,    0, 0, 0,    0,    0, 0]
% [0,    0,    0, 0, 0,  1/2, 7/20, 0]
% [0,    0,    0, 0, 0, 7/20,  1/2, 0]
% [0,    0,    0, 0, 0,    0,    0, 0]];
    rhott = double(rhott);
    rhot = double(rhot);
    drhot = double(drhot);
    minimize(trace(rhott*L));
    subject to
%     rhot = [0 0 0 0;0 1/2 7/20 0;0 7/20 1/2 0;0 0 0 0];
%     drhot
        for i =1:p
            trace(rhot*X_ele(:,:,i)) == value(i);
        end
        for i = 1:p
            for j = 1:p
                if i == j
                    trace(drhot(:,:,i)*X_ele(:,:,j)) == 1;
                else
                    trace(drhot(:,:,i)*X_ele(:,:,j)) == 0;
                end
            end
        end
%         semidefinit constraint.
        [L X; X2 eye(dim)] >= 0;
cvx_end
res = cvx_optval;
X_ele
end

以上代码中有三行代码:

代码语言:javascript
复制
    rhott = double(rhott);
    rhot = double(rhot);
    drhot = double(drhot);

如果删除这三行,就会出现错误Unable to convert 'cvx' to 'sym'.,而我的rhot已经被subs函数更改为数值,我打印出来以查看数字,尽管whos函数显示rhot的类型仍然是syms。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-07 05:59:36

引用the documentation on subs()

snew = subs(s,old,new)返回s的副本,用new替换old的所有出现,然后计算s。这里,s是符号标量变量或符号函数的表达式,old指定要替换的符号标量变量或符号函数。

强调我的。换句话说:subs()将您的符号表达式更改为新的符号表达式。

另一方面,double()将输入它的任何内容转换为type double,即一个数值。因此,rhott最初包含一个符号值,即使它是一个数字。然后,double(rhott)将其计算为一个数字数字,而不是一个符号数字。

我想问题就在这里

代码语言:javascript
复制
drhot = subs(drhot,t,value);
rhot = subs(rhot,t,value);
rhott = kron(eye(p),rhot);

您正在将drhot中所有出现的drhot替换为value,然后再在rhot上替换。如果drhot已经是符号化的,即如果输入rhot, value, t是符号的,那么这是有意义的,实际上,double调用将使您的系统成为数字,而不是符号。另一方面,如果所有输入都是数字输入,则subs()不必要地将所有输入转换为符号变量,从而减慢执行速度。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72526471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档