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

📄 selectsolver.m

📁 国外专家做的求解LMI鲁棒控制的工具箱,可以相对高效的解决LMI问题
💻 M
字号:
function [solver,problem] = select_solver(options,ProblemString,solvers,socp_are_really_qc);
%SELECT_SOLVER Internal function to select solver based on problem category

% Author Johan L鰂berg
% $Id: selectsolver.m,v 1.6 2005/01/11 15:27:44 johanl Exp $

% ***************************************************
% Maybe the user is stubborn and wants to pick solver
% ***************************************************
problem = 0;
force_solver = yalmip('solver');
if length(force_solver)>0
    options.solver = force_solver;
end
if length(options.solver)>0
    % Create tags with version also
    temp = solvers;
    for i = 1:length(temp)
        if length(temp(i).version)>0
            temp(i).tag = lower([temp(i).tag '-' temp(i).version]);
        end
    end
    index = find(strcmp({solvers.tag},options.solver));
    index2 = find(strcmp({temp.tag},options.solver));
    if isempty(index) & isempty(index2)
        solver = [];
        problem = -3;
        return;
    else
        solvers = solvers(union(index,index2));
    end
end

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

if findstr(ProblemString,'C=') & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if solvers(i).equalities==0 & solvers(i).lp==0
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

if findstr(ProblemString,'OM') & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if solvers(i).maxdet==0 & solvers(i).sdp==0
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

if findstr(ProblemString,'OP') & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if isfield(solvers(i),'po') & ~isempty(solvers(i).po)
            keep(i)=1;
        else
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

if findstr(ProblemString,'CK') & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if solvers(i).sdp==0
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

if findstr(ProblemString,'CS') & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if solvers(i).sdp==0
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

if findstr(ProblemString,'CE') & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if solvers(i).lp==0
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

if  ~isempty(findstr(ProblemString,'DI')) & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if solvers(i).integer==0
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

if ~isempty(findstr(ProblemString,'DB')) & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if solvers(i).binary==0 & solvers(i).integer==0
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

if ~isempty(findstr(ProblemString,'MP')) & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if solvers(i).parametric==0
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

% if ismember('B',ProblemString) & ~isempty(solvers)
%     keep = ones(length(solvers),1);
%     for i = 1:length(solvers)
%         if solvers(i).binary==0
%             keep(i)=0;
%         end
%     end
%     solvers = solvers(find(keep));
% end

if findstr(ProblemString,'CC') & ~isempty(solvers) & socp_are_really_qc
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if (solvers(i).qc==0) & (solvers(i).socp==0) & (solvers(i).sdp==0)
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
elseif  findstr(ProblemString,'CC') & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if (solvers(i).socp==0) & (solvers(i).sdp==0) %SPECIAL CASE, SOCP->SDP automatically
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

if findstr(ProblemString,'NQ') & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if (solvers(i).ncqp==0 ) & (~options.relax)
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

% if ismember('Q',ProblemString) & ~isempty(solvers)
%     keep = ones(length(solvers),1);
%     for i = 1:length(solvers)
%         if solvers(i).qp==0 
%             keep(i)=0;
%         end
%     end
%     solvers = solvers(find(keep));
% end

if findstr(ProblemString,'OQ') & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if solvers(i).qp==0 & (solvers(i).socp==0) & (solvers(i).sdp==0) %SPECIAL CASE, QP->SOCP->SDP automatically
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

if findstr(ProblemString,'CB') & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if (solvers(i).bmi==0 ) & (~options.relax)
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

if findstr(ProblemString,'CP') & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if (solvers(i).pi==0 ) & (~options.relax)
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

if findstr(ProblemString,'CG') & ~isempty(solvers)
    keep = ones(length(solvers),1);
    for i = 1:length(solvers)
        if (solvers(i).gp==0 ) & (~options.relax)
            keep(i)=0;
        end
    end
    solvers = solvers(find(keep));
end

if isempty(solvers)
    solver = [];
else
    solver = solvers(1);
end

if isempty(solver)
    if length(options.solver)>0 % User selected available solver, but it is not applicable
        problem = -4;
    else
        problem = -2;
    end
end

⌨️ 快捷键说明

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