📄 model.m
字号:
function [F,convex,defining_sets,arguments]=model(X,aimforconvexity)
%MODEL Models complex SDPVAR objects
%
% [F,CONVEXCONCAVE] = epigraph(x)
%
% MODEL defines the constraints needed to
% model a variable related to an extended operator
% such as min, max, abs, norm, detinv, ...
%
% CONVEXCONCAVE = 1 means that the underlying
% operator is convex (max,abs,norm)
%
% CONVEXCONCAVE = 0 means that the underlying
% operator is concave (min, detinv)
%
% CONVEXCONCAVE = -1 means that the underlying
% operator is neither convex or concave, and has to
% be modelled using an equality (fractional functions)
%
% Examples :
%
% sdpvar x y;
% t = min(x,y);
% [F,convexconcave] = epigraph(t)
% Gives (F = set(t<x) + set(t<y), convexconcave = -1)
%
% sdpvar x y
% t = max(norm([x;y],1+y))
% [F,convexconcave] = epigraph(t)
% Gives (F = set(u<t) + set(1+y<t), convexconcave = 1)
% where u is the variable modelling norm([x;y])
% Author Johan L鰂berg
% $Id: model.m,v 1.17 2005/05/23 12:02:09 joloef Exp $
% Not official, but it is possible
% to send several variables, so we need
% to loop.
extvar = getvariables(X);
F = set([]);
defining_sets = cell(1,length(extvar));
arguments = cell(1,length(extvar));
%convex = zeros(1,length(extvar));
old_size = 0;
if nargin == 1
aimforconvexity = ones(1,length(extvar)); % Not really used yet...
end
for i = 1:length(extvar)
extstruct = yalmip('extstruct',extvar(i));
switch extstruct.fcn
case 'mpower'
F = F + set(extstruct.arg{1} == extstruct.var);
convex{i} = 0;
arguments{i} = extstruct.arg;
case 'max'
for j = 1:length(extstruct.arg)
F = F + set(extstruct.var - extstruct.arg{j});
end
convex{i} = [1 1 0];
arguments{i} = extstruct.arg;
case 'min'
for j = 1:length(extstruct.arg)
F = F + set(extstruct.arg{j} - extstruct.var);
end
convex{i} = [-1 1 0];
arguments{i} = extstruct.arg;
case {'rank','dualrank'}
convex{i} = 0;
arguments{i} = extstruct.arg;
otherwise
try
if aimforconvexity(i)
[Ftemp,convex{i}] = feval(extstruct.fcn,'graph',extstruct.var,extstruct.arg{:});
else
[Ftemp,convex{i}] = feval(extstruct.fcn,'pwagraph',extstruct.var,extstruct.arg{:});
end
% [Ftemp,convex{i},arguments{i}] = feval(extstruct.fcn,'graph',extstruct.var,extstruct.arg{:});
F = F + Ftemp;
catch
error(['Failed when trying to create a model for the "' extstruct.fcn '" operator']);
end
end
convex{i} = [convex{i}(:)' zeros(1,3-length(convex{i}))];
defining_sets{i} = 1+old_size:length(F);
old_size = length(F);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -