I have a requirement that, I use the following modified Rosenbrock function,
where the coefficients a and b are to be read from a text file.
I have tried to do it like the following,
function [f,g] = rosenbrockwithgrad(x, a, b)
% Calculate objective f
f = rosenbrock(x, a, b);
% gradient required
if nargout > 1
g = gradient(x);
end
end
function out = rosenbrock(x, a, b)
xx = x(1);
yy = x(2);
out = (1 - xx + a)^2 + 100*(yy - b - (xx-a)^2)^2;
end
And then,
% calling fminunc
[x, fval, eflag, output] = fminunc(@rosenbrockwithgrad, x0, options);
But, that is generating the following error,
>> main
Error using rosenbrockwithgrad (line 3)
Not enough input arguments.
Error in fminunc (line 271)
[f,GRAD] = feval(funfcn{3},x,varargin{:});
Error in Optimization_With_Analytic_Gradient (line 24)
[x, fval, eflag, output] = fminunc(@rosenbrockwithgrad, x0, options);
Error in main (line 53)
[x, fval, eflag, iter, fcount] =
Optimization_With_Analytic_Gradient(a, b, starting_point);
Caused by:
Failure in initial user-supplied objective function evaluation.
FMINUNC cannot continue.
>>
Relevent Source Code,
function out = gradient( x )
out = [-400*(x(2) - x(1)^2)*x(1) - 2*(1 - x(1));
200*(x(2) - x(1)^2)];
end
function [x, fval, eflag, iter, fcount] =
Optimization_With_Analytic_Gradient(a, b, 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(@rosenbrockwithgrad, x0, options);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
iter = output.iterations;
fcount = output.funcCount;
% plot window title
title 'Rosenbrock with Analytic Gradient...'
disp('Optimization_With_Analytic_Gradient...');
end
