Error: Not enough input arguments.

1 vue (au cours des 30 derniers jours)
Ba Ba Black Sheep!
Ba Ba Black Sheep! le 3 Jan 2017
The following code works fine.
See the inline function fungrad.
function [x, fval, eflag, iter, fcount] =
Optimization_With_Analytic_Gradient(start_point)
x0 = start_point;
% inline function defitions
fungrad = @(x)deal(fun(x),grad(x));
% options setup
options = optimoptions( 'fminunc', ...
'Display','off',...
'OutputFcn',@bananaout,...
'Algorithm','trust-region', ...
'GradObj','on');
% calling fminunc
[x,fval,eflag,output] = fminunc(fungrad,x0,options);
iter = output.iterations;
fcount = output.funcCount;
% plot window title
title 'Rosenbrock solution via fminunc with gradient'
disp('Optimization_With_Analytic_Gradient...');
end
But, when I call it using the following code,
function out = fungrad(x)
out = deal(fun(x),grad(x));
end
It displays the following error:
Error using fungrad (line 2)
Not enough input arguments.
Error in Optimization_With_Analytic_Gradient (line 24)
[x,fval,eflag,output] = fminunc(fungrad,x0,options);
Error in main (line 48)
[x, fval, eflag, iter, fcount] =
Optimization_With_Analytic_Gradient(starting_point);
Rest of the code:
function out = fun(x)
out = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
end
function out = grad( x )
out = [-400*(x(2) - x(1)^2)*x(1) - 2*(1 - x(1));
200*(x(2) - x(1)^2)];
end

Réponse acceptée

Walter Roberson
Walter Roberson le 3 Jan 2017
[x,fval,eflag,output] = fminunc(@fungrad,x0,options);
However, your code will not work. Your objective function must return the gradient information only when nargout > 1. Your use of deal() always returns two outputs, and that is going to fail.
  2 commentaires
Ba Ba Black Sheep!
Ba Ba Black Sheep! le 3 Jan 2017
Modifié(e) : Ba Ba Black Sheep! le 3 Jan 2017
Your objective function must return the gradient information
only when nargout > 1.
which one? banana? or, fungrad?
_
N.B. Sorry! I am absolutely new.
Walter Roberson
Walter Roberson le 3 Jan 2017
You have
fungrad = @(x)deal(fun(x),grad(x));
so your fungrad is always returning two outputs. fungrad is being used as your objective function for fminunc . The objective function must only assign the gradient when it is asked to do so. See the example https://www.mathworks.com/help/optim/ug/fminunc.html#butzm_r-1 and notice that it tests nargout

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Dialog Boxes dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by