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

📄 yalmip.m

📁 国外专家做的求解LMI鲁棒控制的工具箱,可以相对高效的解决LMI问题
💻 M
📖 第 1 页 / 共 2 页
字号:
function  varargout = yalmip(varargin)
%YALMIP Returns various information about YALMIP
%
%   YALMIP can be used to check version numbers and
%   find the SDPVAR and SET objects available in workspace
%
%   EXAMPLES
%    [V,D] = YALMIP('version') % Returns version and release date
%    YALMIP('nvars')           % Returns total number of declared variables
%    YALMIP('info')            % Display basic info.
%    YALMIP('solver','tag')    % Sets the solver 'solvertag' (see sdpsettings) as default solver
%
%   See also YALMIPTEST, YALMIPDEMO

% Author Johan L鰂berg
% $Id: yalmip.m,v 1.22 2005/07/18 15:01:31 joloef Exp $

persistent prefered_solver internal_sdpvarstate internal_setstate

if nargin==0
    help yalmip
    return
end

if isempty(internal_sdpvarstate)
    internal_sdpvarstate.monomtable = spalloc(0,0,0);   % Polynomial powers table
    internal_sdpvarstate.hashedmonomtable = [];         % Hashed polynomial powers table
    internal_sdpvarstate.hash = [];  
    internal_sdpvarstate.boundlist = [];  
    internal_sdpvarstate.variabletype = spalloc(0,0,0); % Pre-calc linear/quadratic/polynomial/sigmonial
    internal_sdpvarstate.intVariables = []; % ID of integer variables
    internal_sdpvarstate.binVariables = []; % ID of binary variables
    internal_sdpvarstate.uncVariables = []; % ID of uncertain variables (not used)
    internal_sdpvarstate.parVariables = []; % ID of parametric variables (not used)
    internal_sdpvarstate.extVariables = []; % ID of extended variables (for max,min,norm,sin, etc)
    internal_sdpvarstate.internalconstraints = [];
    internal_sdpvarstate.ExtendedMap = [];
    internal_sdpvarstate.sosid = 0;
    internal_sdpvarstate.sos_index = [];
    internal_sdpvarstate.sos_data = [];
    internal_sdpvarstate.sos_ParV = [];
    internal_sdpvarstate.sos_Q = [];
    internal_sdpvarstate.sos_v = [];    
    internal_sdpvarstate.optSolution.info = 'Initialized by YALMIP';
    internal_sdpvarstate.optSolution.variables = [];
    internal_sdpvarstate.optSolution.optvar  =[];
    internal_sdpvarstate.optSolution.values  =[];
end
if isempty(internal_setstate)
    internal_setstate.LMIid = 0;
    internal_setstate.duals_index = [];
    internal_setstate.duals_data = [];
    internal_setstate.duals_associated_index = [];
    internal_setstate.duals_associated_data  = [];
end

spaces = ['                                    '];

switch varargin{1}

    case 'addextendedvariable'

        varargin{2} = strrep(varargin{2},'sdpvar/',''); % Clean due to different behaviour of the function mfilename in ML 5,6 and 7
        
        % Is this operator variable already defined
        if ~isempty(internal_sdpvarstate.ExtendedMap)
            i = 1;
            while i<=length(internal_sdpvarstate.ExtendedMap)
                if isequal(varargin{2},internal_sdpvarstate.ExtendedMap(i).fcn) & isequal({varargin{3:end}}, internal_sdpvarstate.ExtendedMap(i).arg)
                    varargout{1} =  internal_sdpvarstate.ExtendedMap(i).var;
                    return
                end
                i = i + 1;
            end
        end
        
        switch varargin{2}

            case {'abs'}
                % Abs is a bit special since we need one
                % new variable for each element...              
                X = varargin{3:end};
                y = sdpvar(numel(X),1);
                for i = 1:numel(X)
                    yi = y(i);
                    internal_sdpvarstate.ExtendedMap(end+1).fcn = varargin{2};
                    internal_sdpvarstate.ExtendedMap(end).arg = {X(i)};
                    internal_sdpvarstate.ExtendedMap(end).var = yi;
                end
                internal_sdpvarstate.extVariables = [internal_sdpvarstate.extVariables getvariables(y)];
                y = reshape(y,size(X,1),size(X,2));
                
%             case {'eig'}
%                 % EIG is a bit special since we need one
%                 % new variable for each eigenvalue...               
%                 X = varargin{3:end};
%                 y = sdpvar(length(X),1);
%                 for i = 1:length(X)
%                     yi = y(i);
%                     internal_sdpvarstate.ExtendedMap(end+1).fcn = 'yeig';
%                     internal_sdpvarstate.ExtendedMap(end).arg = {X(i),i};
%                     internal_sdpvarstate.ExtendedMap(end).var = yi;
%                 end
%                 internal_sdpvarstate.extVariables = [internal_sdpvarstate.extVariables getvariables(y)];                
                
            otherwise
                % This is the standard operators. INPUTS -> 1 scalar output
                y = sdpvar(1,1);
                internal_sdpvarstate.ExtendedMap(end+1).fcn = varargin{2};
                internal_sdpvarstate.ExtendedMap(end).arg = {varargin{3:end}};
                internal_sdpvarstate.ExtendedMap(end).var = y;
                internal_sdpvarstate.extVariables = [internal_sdpvarstate.extVariables getvariables(y)];
        end
        varargout{1} = y;
        return

    case 'extvariables'
        varargout{1} = internal_sdpvarstate.extVariables;

    case  'logicextvariables'
        logicextvariables = [];
        for i = 1:length(internal_sdpvarstate.ExtendedMap)
            if ismember(internal_sdpvarstate.ExtendedMap(i).fcn,{'or','and'})
                logicextvariables = [logicextvariables internal_sdpvarstate.extVariables(i)];
            end
        end
        varargout{1} = logicextvariables;
    case 'extstruct'
        found = 0;
        varargout{1} = [];
        i = 1;
        while ~found & i <=length(internal_sdpvarstate.ExtendedMap)
            if varargin{2} == getvariables(internal_sdpvarstate.ExtendedMap(i).var)
                found = 1;
                varargout{1} = internal_sdpvarstate.ExtendedMap(i);
            end
            i = i + 1;
        end

    case 'rankvariables'
        i = 1;
        rankvariables = [];
        for i = 1:length(internal_sdpvarstate.ExtendedMap)
            if isequal('rank',internal_sdpvarstate.ExtendedMap(i).fcn)
                rankvariables = [rankvariables getvariables(internal_sdpvarstate.ExtendedMap(i).var)];
            end
        end
        varargout{1} = rankvariables;

    case 'dualrankvariables'
        i = 1;
        rankvariables = [];
        for i = 1:length(internal_sdpvarstate.ExtendedMap)
            if isequal('dualrank',internal_sdpvarstate.ExtendedMap(i).fcn)
                rankvariables = [rankvariables getvariables(internal_sdpvarstate.ExtendedMap(i).var)];
            end
        end
        varargout{1} = rankvariables;        

    case 'lmiid'
        if not(isempty(internal_setstate.LMIid))
            internal_setstate.LMIid = internal_setstate.LMIid+1;
            varargout{1}=internal_setstate.LMIid;
        else
            internal_setstate.LMIid=1;
            varargout{1}=internal_setstate.LMIid;
        end

    case 'setnonlinearvariables'
        error('Internal error (ref. setnonlinearvariables). Report please.')

    case {'clear'}
        %sdpvar('clear')
        W = evalin('caller','whos');
        for i = 1:size(W,1)
            if strcmp(W(i).class,'sdpvar') | strcmp(W(i).class,'lmi')
                evalin('caller', ['clear ' W(i).name ';']);
            end
        end

        internal_setstate.LMIid = 0;
        internal_setstate.duals_index = [];
        internal_setstate.duals_data = [];
        internal_setstate.duals_associated_index = [];
        internal_setstate.duals_associated_data  = [];


        internal_sdpvarstate.sosid = 0;
        internal_sdpvarstate.sos_index = [];
        internal_sdpvarstate.sos_data = [];
        internal_sdpvarstate.sos_ParV = [];
        internal_sdpvarstate.sos_Q    = [];
        internal_sdpvarstate.sos_v    = [];

        internal_sdpvarstate.monomtable = spalloc(0,0,0);
        internal_sdpvarstate.hashedmonomtable = [];   % Polynomial powers table
        internal_sdpvarstate.hash = [];   % Polynomial powers table
        internal_sdpvarstate.boundlist = [];
        internal_sdpvarstate.variabletype = spalloc(0,0,0);
        internal_sdpvarstate.intVariables = [];
        internal_sdpvarstate.binVariables = [];
        internal_sdpvarstate.uncVariables = [];
        internal_sdpvarstate.parVariables = [];
        internal_sdpvarstate.extVariables = [];
        internal_sdpvarstate.internalconstraints = [];
        internal_sdpvarstate.ExtendedMap = [];
        internal_sdpvarstate.optSolution.info = 'Initialized by YALMIP';
        internal_sdpvarstate.optSolution.variables = [];
        internal_sdpvarstate.optSolution.optvar  =[];
        internal_sdpvarstate.optSolution.values  =[];

    case 'cleardual'
        if nargin==1
            internal_setstate.duals_index = [];
            internal_setstate.duals_data = [];
            internal_setstate.duals_associated_index = [];
            internal_setstate.duals_associated_data = [];
        else
            if ~isempty(internal_setstate.duals_index)
                internal_setstate.lmiid = varargin{2};
                for i = 1:length(varargin{2})
                    j = find(internal_setstate.duals_index==internal_setstate.lmiid(i));
                    if ~isempty(j)
                        internal_setstate.duals_index = internal_setstate.duals_index([1:1:j-1 j+1:1:length(internal_setstate.duals_index)]);
                        internal_setstate.duals_data = {internal_setstate.duals_data{[1:1:j-1 j+1:1:length(internal_setstate.duals_data)]}};
                    end
                end
            end
        end

    case 'associatedual'
        internal_setstate.duals_associated_index = [internal_setstate.duals_associated_index varargin{2}];
        internal_setstate.duals_associated_data{end+1} = varargin{3};
    case 'setallsolution'
        internal_sdpvarstate.optSolution.optvar = varargin{2}.optvar;
        internal_sdpvarstate.optSolution.variables = varargin{2}.variables;
        internal_sdpvarstate.optSolution.values = [];
        return
    case 'setvalues'
        internal_sdpvarstate.optSolution.values = varargin{2};
        
    case 'setsolution'
        if isempty(internal_sdpvarstate.optSolution.variables)
            internal_sdpvarstate.optSolution = varargin{2};
        else
            % Just save some stuff first
            newSolution = varargin{2};
            oldSolution = internal_sdpvarstate.optSolution;
            optSolution = varargin{2};
            keep_these = find(~ismember(oldSolution.variables,newSolution.variables));
            internal_sdpvarstate.optSolution.optvar    = [oldSolution.optvar(keep_these);newSolution.optvar(:)];
            internal_sdpvarstate.optSolution.variables = [oldSolution.variables(keep_these);newSolution.variables(:)];
        end
        % clear evaluated values (only used cache-wise)
        internal_sdpvarstate.optSolution.values = [];
        return
        
    case 'getsolution'
        varargout{1} = internal_sdpvarstate.optSolution;
        return

    case 'setdual'
        internal_setstate.duals_index = varargin{2};
        internal_setstate.duals_data = varargin{3};

        if ~isempty(internal_setstate.duals_associated_index)
            if ~isempty(intersect(internal_setstate.duals_index,internal_setstate.duals_associated_index))
                for i = 1:length(internal_setstate.duals_index)
                    itshere = find(internal_setstate.duals_associated_index==internal_setstate.duals_index(i));
                    if ~isempty(itshere)
                        assign(internal_setstate.duals_associated_data{itshere},internal_setstate.duals_data{i});
                    end
                end
            end
        end

    case 'dual'
        if isempty(internal_setstate.duals_index)
            varargout{1}=[];
        else
            LMIid = varargin{2};
            index_to_dual = find(LMIid==internal_setstate.duals_index);
            if isempty(index_to_dual)
                varargout{1}=[];
            else
                varargout{1} = internal_setstate.duals_data{index_to_dual};
            end
        end

    case 'clearsos'
        if nargin==1
            internal_sdpvarstate.sos_index = [];
            internal_sdpvarstate.sos_data = [];
            internal_sdpvarstate.sos_ParV = [];
            internal_sdpvarstate.sos_Q    = [];
            internal_sdpvarstate.sos_v    = [];

        end

    case 'setsos'
        if ~isempty(internal_sdpvarstate.sos_index)
            where = find(internal_sdpvarstate.sos_index==varargin{2});
            if ~isempty(where)
                internal_sdpvarstate.sos_index(where) = varargin{2};
                internal_sdpvarstate.sos_data{where} = varargin{3};
                internal_sdpvarstate.sos_ParV{where} = varargin{4};
                internal_sdpvarstate.sos_Q{where} = varargin{5};

⌨️ 快捷键说明

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