Problem using 'deal' for objective and gradient in comb. with 'DerivativeCheck'
9 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
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
0 Kommentare
Akzeptierte Antwort
Richard Brown
am 5 Jul. 2012
Bearbeitet: Richard Brown
am 5 Jul. 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 Kommentare
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Get Started with Optimization Toolbox finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!