📄 fmincon.m
字号:
['Medium-scale method is a Quasi-Newton method and does not use\n' ...
'analytic Hessian. Hessian flag in options will be ignored.'])
elseif isequal(funfcn{1},'fun_then_grad_then_hess')
funfcn{1}='fun_then_grad';
warning('optim:fmincon:HessianIgnored', ...
['Medium-scale method is a Quasi-Newton method and does not use\n' ...
'analytic Hessian. Hessian flag in options will be ignored.'])
end
hessflag = 0;
OUTPUT.algorithm = medium;
elseif line_search
OUTPUT.algorithm = medium;
if issparse(Aeq) || issparse(A)
warning('optim:fmincon:ConvertingToFull', ...
'Cannot use sparse matrices with medium-scale method: converting to full.')
end
if line_search && hessflag % conflicting options
hessflag = 0;
warning('optim:fmincon:HessianIgnored', ...
['Medium-scale method is a Quasi-Newton method and does not use analytic Hessian.\n' ...
'Hessian flag in options will be ignored (user-supplied Hessian will not be used).']);
if isequal(funfcn{1},'fungradhess')
funfcn{1}='fungrad';
elseif isequal(funfcn{1},'fun_then_grad_then_hess')
funfcn{1}='fun_then_grad';
end
end
% else call nlconst
else
error('optim:fmincon:InvalidOptions', ...
'Unrecognized combination of OPTIONS flags and calling sequence.')
end
lenvlb=length(l);
lenvub=length(u);
if isequal(OUTPUT.algorithm,medium)
%
% Ensure starting point lies within bounds
%
i=1:lenvlb;
lindex = XOUT(i)<l(i);
if any(lindex),
XOUT(lindex)=l(lindex)+1e-4;
end
i=1:lenvub;
uindex = XOUT(i)>u(i);
if any(uindex)
XOUT(uindex)=u(uindex);
end
X(:) = XOUT;
else
%
% If initial x not within bounds, set it a to a "box-centered" point
%
arg = (u >= 1e10); arg2 = (l <= -1e10);
u(arg) = inf*ones(length(arg(arg>0)),1);
l(arg2) = -inf*ones(length(arg2(arg2>0)),1);
if min(min(u-XOUT),min(XOUT-l)) < 0,
XOUT = startx(u,l);
X(:) = XOUT;
end
end
% Evaluate function
GRAD=zeros(numberOfVariables,1);
HESS = [];
switch funfcn{1}
case 'fun'
try
f = feval(funfcn{3},X,varargin{:});
catch
error('optim:fmincon:ObjectiveError', ...
['FMINCON cannot continue because user supplied objective function' ...
' failed with the following error:\n%s'], lasterr)
end
case 'fungrad'
try
[f,GRAD(:)] = feval(funfcn{3},X,varargin{:});
catch
error('optim:fmincon:ObjectiveError', ...
['FMINCON cannot continue because user supplied objective function' ...
' failed with the following error:\n%s'], lasterr)
end
case 'fungradhess'
try
[f,GRAD(:),HESS] = feval(funfcn{3},X,varargin{:});
catch
error('optim:fmincon:ObjectiveError', ...
['FMINCON cannot continue because user supplied objective function' ...
' failed with the following error:\n%s'], lasterr)
end
case 'fun_then_grad'
try
f = feval(funfcn{3},X,varargin{:});
catch
error('optim:fmincon:ObjectiveError', ...
['FMINCON cannot continue because user supplied objective function' ...
' failed with the following error:\n%s'], lasterr)
end
try
GRAD(:) = feval(funfcn{4},X,varargin{:});
catch
error('optim:fmincon:GradError', ...
['FMINCON cannot continue because user supplied objective gradient function' ...
' failed with the following error:\n%s'], lasterr)
end
case 'fun_then_grad_then_hess'
try
f = feval(funfcn{3},X,varargin{:});
catch
error('optim:fmincon:ObjectiveError', ...
['FMINCON cannot continue because user supplied objective function' ...
' failed with the following error:\n%s'], lasterr)
end
try
GRAD(:) = feval(funfcn{4},X,varargin{:});
catch
error('optim:fmincon:GradientError', ...
['FMINCON cannot continue because user supplied objective gradient function' ...
' failed with the following error:\n%s'], lasterr)
end
try
HESS = feval(funfcn{5},X,varargin{:});
catch
error('optim:fmincon:HessianError', ...
['FMINCON cannot continue because user supplied objective Hessian function' ...
' failed with the following error:\n%s'], lasterr)
end
otherwise
error('optim:fmincon:UndefinedCallType','Undefined calltype in FMINCON.');
end
% Evaluate constraints
switch confcn{1}
case 'fun'
try
[ctmp,ceqtmp] = feval(confcn{3},X,varargin{:});
c = ctmp(:); ceq = ceqtmp(:);
cGRAD = zeros(numberOfVariables,length(c));
ceqGRAD = zeros(numberOfVariables,length(ceq));
catch
if findstr(xlate('Too many output arguments'),lasterr)
if isa(confcn{3},'inline')
error('optim:fmincon:InvalidInlineNonlcon', ...
['The inline function %s representing the constraints\n' ...
' must return two outputs: the nonlinear inequality constraints and\n' ...
' the nonlinear equality constraints. At this time, inline objects may\n' ...
' only return one output argument: use an M-file function instead.'], ...
formula(confcn{3}))
elseif isa(confcn{3},'function_handle')
error('optim:fmincon:InvalidHandleNonlcon', ...
['The constraint function %s must return two outputs:\n' ...
' the nonlinear inequality constraints and\n' ...
' the nonlinear equality constraints.'],func2str(confcn{3}))
else
error('optim:fmincon:InvalidFunctionNonlcon', ...
['The constraint function %s must return two outputs:\n' ...
' the nonlinear inequality constraints and\n' ...
' the nonlinear equality constraints.'],confcn{3})
end
else
error('optim:fmincon:NonlconError', ...
['FMINCON cannot continue because user supplied nonlinear constraint function\n' ...
' failed with the following error:\n%s'],lasterr)
end
end
case 'fungrad'
try
[ctmp,ceqtmp,cGRAD,ceqGRAD] = feval(confcn{3},X,varargin{:});
c = ctmp(:); ceq = ceqtmp(:);
catch
error('optim:fmincon:NonlconError', ...
['FMINCON cannot continue because user supplied nonlinear constraint function\n' ...
' failed with the following error:\n%s'],lasterr)
end
case 'fun_then_grad'
try
[ctmp,ceqtmp] = feval(confcn{3},X,varargin{:});
c = ctmp(:); ceq = ceqtmp(:);
[cGRAD,ceqGRAD] = feval(confcn{4},X,varargin{:});
catch
error('optim:fmincon:NonlconFunOrGradError', ...
['FMINCON cannot continue because user supplied nonlinear constraint function\n' ...
'or nonlinear constraint gradient function failed with the following error:\n%s'],lasterr)
end
case ''
c=[]; ceq =[];
cGRAD = zeros(numberOfVariables,length(c));
ceqGRAD = zeros(numberOfVariables,length(ceq));
otherwise
error('optim:fmincon:UndefinedCalltype','Undefined calltype in FMINCON.');
end
non_eq = length(ceq);
non_ineq = length(c);
[lin_eq,Aeqcol] = size(Aeq);
[lin_ineq,Acol] = size(A);
[cgrow, cgcol]= size(cGRAD);
[ceqgrow, ceqgcol]= size(ceqGRAD);
eq = non_eq + lin_eq;
ineq = non_ineq + lin_ineq;
if ~isempty(Aeq) && Aeqcol ~= numberOfVariables
error('optim:fmincon:WrongNumberOfColumnsInAeq','Aeq has the wrong number of columns.')
end
if ~isempty(A) && Acol ~= numberOfVariables
error('optim:fmincon:WrongNumberOfColumnsInA','A has the wrong number of columns.')
end
if cgrow~=numberOfVariables && cgcol~=non_ineq
error('optim:fmincon:WrongSizeGradNonlinIneq', ...
'Gradient of the nonlinear inequality constraints is the wrong size.')
end
if ceqgrow~=numberOfVariables && ceqgcol~=non_eq
error('optim:fmincon:WrongSizeGradNonlinEq', ...
'Gradient of the nonlinear equality constraints is the wrong size.')
end
if diagnostics > 0
% Do diagnostics on information so far
msg = diagnose('fmincon',OUTPUT,gradflag,hessflag,constflag,gradconstflag,...
line_search,options,defaultopt,XOUT,non_eq,...
non_ineq,lin_eq,lin_ineq,l,u,funfcn,confcn,f,GRAD,HESS,c,ceq,cGRAD,ceqGRAD);
end
% call algorithm
if isequal(OUTPUT.algorithm,medium)
[X,FVAL,lambda,EXITFLAG,OUTPUT,GRAD,HESSIAN]=...
nlconst(funfcn,X,l,u,full(A),B,full(Aeq),Beq,confcn,options,defaultopt, ...
verbosity,gradflag,gradconstflag,hessflag,meritFunctionType,...
f,GRAD,HESS,c,ceq,cGRAD,ceqGRAD,varargin{:});
LAMBDA=lambda;
else
if (isequal(funfcn{1}, 'fun_then_grad_then_hess') || isequal(funfcn{1}, 'fungradhess'))
Hstr=[];
elseif (isequal(funfcn{1}, 'fun_then_grad') || isequal(funfcn{1}, 'fungrad'))
n = length(XOUT);
Hstr = optimget(options,'HessPattern',defaultopt,'fast');
if ischar(Hstr)
if isequal(lower(Hstr),'sparse(ones(numberofvariables))')
Hstr = sparse(ones(n));
else
error('optim:fmincon:InvalidHessPattern', ...
'Option ''HessPattern'' must be a matrix if not the default.')
end
end
end
if isempty(Aeq)
[X,FVAL,LAMBDA,EXITFLAG,OUTPUT,GRAD,HESSIAN] = ...
sfminbx(funfcn,X,l,u,verbosity,options,defaultopt,computeLambda,f,GRAD,HESS,Hstr,varargin{:});
else
[X,FVAL,LAMBDA,EXITFLAG,OUTPUT,GRAD,HESSIAN] = ...
sfminle(funfcn,X,sparse(Aeq),Beq,verbosity,options,defaultopt,computeLambda,f,GRAD,HESS,Hstr,varargin{:});
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -