fmincon check Hessian (in DerivativeCheck)

7 visualizaciones (últimos 30 días)
Zohar
Zohar el 6 de Jul. de 2014
Editada: Matt J el 8 de Jul. de 2014
When I set opts.DerivativeCheck='on' in fmincon, it checks only the gradient. How do I tell it to check the Hessian as well?
EDIT: My options
opts = optimset();
opts.MaxIter = 1e4;
opts.MaxFunEvals = 1e6;
opts.TolFun = 1e-4;
opts.Algorithm = 'interior-point'; % 'trust-region-reflective'
opts.GradObj = 'on';
opts.GradConstr = 'on';
opts.DerivativeCheck = 'on';
opts.Diagnostics = 'on';
opts.Display = 'iter';
%opts.Display = 'none';
opts.FinDiffType = 'central';
if 1
opts.HessMult = fH;
opts.Hessian = 'user-supplied';
%opts.Hessian = 'fin-diff-grads';
opts.SubproblemAlgorithm = 'cg';
else
opts.Hessian = 'lbfgs';
end

Respuesta aceptada

Matt J
Matt J el 6 de Jul. de 2014
Editada: Matt J el 8 de Jul. de 2014
I don't think you can, but an indirect way would be to run like below with MaxIter=1 and have fmincon return the Hessian with the 'Hessian' option turned both on and off. Then you can check the Hessian error manually.
I agree it is counter-intuitive, but I think it might be deliberate that the DerivativeCheck does not test the Hessian. Often, minimization algorithms will work with fairly crude approximations to the Hessian, so maybe it is expected that your user-supplied Hessian will not always be exact. Or, maybe it is with large dimensional problems in mind, where finite difference derived Hessians are too expensive to compute, even for testing purposes, but you still might want to use DerivativeCheck to verify the gradient.
Q=[2 1;1,2];
Q=Q+Q.';
opts=optimoptions(@fmincon,'DerivativeCheck','on',...
'GradObj','on','Hessian','off','MaxIter',1);
[x,fval,exitflag,output,lambda,grad,H_off]=...
fmincon(@(x)objfun(x,Q),[1,2],[],[],[],[],[-1,-1],[1,1],[],opts)
opts=optimoptions(@fmincon,'DerivativeCheck','on',...
'GradObj','on','Hessian','on','MaxIter',1);
[x,fval,exitflag,output,lambda,grad,H_on]=...
fmincon(@(x)objfun(x,Q),[1,2],[],[],[],[],[-1,-1],[1,1],[],opts)
HessianError=H_on-H_off
keyboard
function [f,g,H]=objfun(x,Q)
x=x(:);
f=x.'*Q*x/2;
g=Q*x;
H=eye(2);

Más respuestas (0)

Categorías

Más información sobre Solver Outputs and Iterative Display en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by