⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 catsdp.m

📁 国外专家做的求解LMI鲁棒控制的工具箱,可以相对高效的解决LMI问题
💻 M
字号:
function [catstring,integer_variables,binary_variables,parametric_variables,quad_info] = catsdp(F,G,h,relax)
%catsdp          Internal function: tries to determine the type of
%optimization problem

% Author Johan L鰂berg 
% $Id: catsdp.m,v 1.11 2005/02/04 10:10:26 johanl Exp $

% Constraints
%
% Eigenvalue       (CV) 
% Semidefinite     (CS)
% Sec. ord. cone   (CC)
% Element-wise     (CE)
% KYP              (CK)
% Bilinear         (CB)
% Polynomial       (CP)
% Convex quadratic (CQ) 
%
% Objective functions
%
% MAXDET           (OM)
% Convex quadratic (OQ)
% Non-convex quad. (NQ) 
% Polynomial       (OP) 
%
% Datatypes
%
% Complex          (DX)
% Integer          (DI)
% Binary           (DB)
% Multi-parametric (MP)


Counter = size(F.clauses,2);
Ftype = zeros(Counter,1);

real_data = 1;
int_data  = 0;
bin_data  = 0;
par_data  = 0;
poly_constraint = 0;
bilin_constraint = 0;
sigm_constraint = 0;
integer_variables = [];
binary_variables = [];
parametric_variables = [];
kyp_prob  = 0;

integer_variables = yalmip('intvariables');
binary_variables = yalmip('binvariables');
for i = 1:Counter
    if F.clauses{i}.type==7
        integer_variables = union(integer_variables,getvariables(F.clauses{i}.data));
    elseif F.clauses{i}.type==8
        binary_variables = union(binary_variables,getvariables(F.clauses{i}.data));
    elseif F.clauses{i}.type==13
        parametric_variables = union(parametric_variables,getvariables(F.clauses{i}.data));
    end   
end

monomtable = yalmip('monomtable');

% Linear or implied linear from compund objects like max(x,y,z)=t implying
% t is linear is the final problem
temp = ((sum(abs(monomtable),2)==1) & (any(monomtable==1,2))) | any(isnan(monomtable),2);
linear_variables = find(temp);
nonlinear_variables = find(~temp);
sigmonial_variables = find(any(0>monomtable,2) | any(monomtable-fix(monomtable),2));

discrete_data = ~isempty(integer_variables) | ~isempty(binary_variables);
allvars = getvariables(F);
nononlinear = isempty(find(ismembc(nonlinear_variables,allvars)));
for i = 1:Counter
    Ftype(i) = F.clauses{i}.type;
    real_data = real_data & isreal(F.clauses{i}.data); %Complex
    if discrete_data
        int_data = int_data | any(ismember(getvariables(F.clauses{i}.data),integer_variables));
        bin_data = bin_data | any(ismember(getvariables(F.clauses{i}.data),binary_variables));
        par_data = par_data | any(ismember(getvariables(F.clauses{i}.data),parametric_variables));
    end
    if ~nononlinear%no_nonlinear_inF
        vars = getvariables(F.clauses{i}.data);
       % if ~isempty(nonlinear_variables)
            %FIX : Verify logic on ismembc
            %usednonlins = find(ismember(nonlinear_variables,vars));
            usednonlins = find(ismembc(nonlinear_variables,vars));
            if ~isempty(usednonlins)
                usedsigmonials = find(ismember(sigmonial_variables,vars));
                if ~isempty(usedsigmonials)
                    sigm_constraint = 1;
                    poly_constraint = 1;
                else
                    deg = degree(F.clauses{i}.data);
                    bilin_constraint = bilin_constraint | (deg==2);
                    poly_constraint = poly_constraint | (deg>2);
                end
            end
       % end
    end
end

if relax
    int_data  = 0;
    bin_data  = 0;
    poly_constraint = 0;
    bilin_constraint = 0;
    sigm_constraint = 0;
    integer_variables = [];
    binary_variables = [];
end

any_LMI  = find(Ftype==1);
any_ELM  = find(Ftype==2);
any_EQU  = find(Ftype==3);
any_SOCC = find(Ftype==4);
any_ROTL = find(Ftype==5);
any_KYP  = find(Ftype==9);

% **************************************************
% Element-wise, 2-cone, semidefinite, KYP constraint
% **************************************************
catstring = '';
if ~isempty(any_ELM)
    catstring = ['CE' catstring];
end

if (~isempty(any_SOCC)) | (~isempty(any_ROTL))
    catstring = ['CC' catstring];
end

if ~isempty(any_LMI)
    catstring = ['CS' catstring];
end

if ~isempty(any_KYP)
    catstring = ['CK' catstring];
end

if ~isempty(any_EQU)
    catstring = ['C=' catstring];
end


% *******************************************
% Complex, integer, boolen variables
% *******************************************
if ~(real_data==1)
    catstring = [catstring 'DX']; 
end

d_x = depends(h);
int_obj = (~isempty(h) & any(ismember(d_x,yalmip('intvariables'))));
bin_obj = (~isempty(h) & any(ismember(d_x,yalmip('binvariables'))));
if (int_data) | int_obj
    catstring = [catstring 'DI'];
end;

if bin_data | bin_obj
    catstring = [catstring 'DB'];
end;

if ~(int_data | bin_data | int_obj | bin_obj)
    integer_variables = [];
    binary_variables = [];
end

if par_data
    catstring = [catstring 'MP'];
end

% *******************************************
% Bilinear, Polynomial, Sigmonial constraints
% *******************************************
if poly_constraint & ~sigm_constraint
    catstring = [catstring 'CP'];
end;

if bilin_constraint & ~sigm_constraint
    catstring = [catstring 'CB'];
end

if sigm_constraint
    catstring = [catstring 'CG'];
end

% *******************************************
% Objective function
% *******************************************
if ~isempty(G)
    catstring = ['OM' catstring];
end

quad_info = [];
if (~isempty(h)) & ~is(h,'linear') &~relax

%     if no_nonlinear_inF
%         temp = (sum(abs(monomtable),2)==1) & (any(monomtable==1,2));
%         linear_variables = find(temp);
%         nonlinear_variables = find(~temp);
%         sigmonial_variables = find(any(0>monomtable,2) | any(monomtable-fix(monomtable),2));
%     end
    
    if any(ismember(getvariables(h),sigmonial_variables))
        catstring = ['OG' catstring];           
    else
        [Q,c,f,x,info] = quaddecomp(h);
        if info==0
            [R,p]=chol(Q);
            if p~=0
                if min(eig(Q))>=-1e-10
                    p=0;
                    [U,S,V]=svd(Q);
                    i = find(diag(S)>1e-10);
                    R = sqrt(S(1:max(i),1:max(i)))*V(:,1:max(i))';
                end
            end
            if p==0
                catstring = ['OQ' catstring];
            else
                catstring = ['NQ' catstring];
            end
            quad_info.Q = Q;
            quad_info.c = c;
            quad_info.f = f;
            quad_info.x = x;
            quad_info.R = R;
            quad_info.p = p;
        else
            %  error
            catstring = ['OP' catstring];   
        end
    end
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -