Borrar filtros
Borrar filtros

Problem using 'deal' for objective and gradient in comb. with 'DerivativeCheck'

10 visualizaciones (últimos 30 días)
When using optimization tools I usually keep my objective function and gradient function as separate subfunctions and then use 'deal' to combine them as output of one function (see example 'f_opt' below).
This has always worked fine, but now that i try to run 'DerivativeCheck' it gives me an error:
??? Error using ==> deal at 38 The number of outputs should match the number of inputs.
I dont understand why matlab suddenly has problems understanding what i want. Can somebody explain why and give a solution?? (of course i can make subfunction instead of a handle, but say i wanted to keep my 'deal')
Here is an example program: x1 and x2 solve without problem, but x3 does not give a solution but the error.
function main_fun_grad();
f_opt=@(x)deal(fun_obj(x),fun_grad(x));
x0=1;
x1=fminunc(f_opt,x0,optimset('GradObj','on'))
x2=fminunc(@fun_all,1,optimset('GradObj','on','DerivativeCheck','on'))
x3=fminunc(f_opt,x0,optimset('GradObj','on','DerivativeCheck','on'))
end
%%auxiliary
function [f]=fun_obj(x)
f = x^2;
end
function [g]=fun_grad(x);
g=2*x;
end
function [f, g]=fun_all(x)
f = x^2;
g = 2*x;
end

Respuesta aceptada

Richard Brown
Richard Brown el 5 de Jul. de 2012
Editada: Richard Brown el 5 de Jul. de 2012
An internal routine (in this case finDiffEvalAndChkErr) is calling your routine with only one output. For a regular function that returns two outputs, this is fine, as you are allowed to do this (the second output gets ignored).
But for your function with deal, you are requiring it to always be called with two outputs, rather than optionally.
I suggest you just resign yourself to writing a wrapper function for your two routines (you can also save yourself evaluating the gradient too if it's not required).
function [f, g] = fun_all(x)
f = fun_obj(x);
if nargout == 2
g = fun_grad(x);
end
end
  3 comentarios
Richard Brown
Richard Brown el 5 de Jul. de 2012
Yes indeed. No point in computing the derivative if you don't need it!
Sargondjani
Sargondjani el 5 de Jul. de 2012
thanks alot!! (forgot to mention that, haha)

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Get Started with Optimization Toolbox en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by