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 tried the following,
function out = rosenbrock(x) disp('rosenbrock()..........called'); coeff = load('coeff.txt'); a = coeff(1); b = coeff(2); xx = x(1); yy = x(2); out = (1 - xx + a)^2 + 100*(yy - b - (xx-a)^2)^2; end
But it is doing two things,
(1) Slowing down the performance of the optimization.
(2) The output is also not correct (the optimization isn't converging).
How can I solve this issue wile fulfilling my requirement?
Is it possible to pass the values of |a| and |b| as the arguments of |rosenbrockwithgrad()|?
I have tried the following,
rosenbrockwithgrad_p = @(x)[rosenbrock(x, a, b); (nargout > 1) * gradient(x)]; % calling fminunc [x, fval, eflag, output] = fminunc(@rosenbrockwithgrad_p, x0, options);
It doesn't work.
Relevant Source Code
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(@rosenbrockwithgrad, x0, options); iter = output.iterations; fcount = output.funcCount; % plot window title title 'Rosenbrock with Analytic Gradient...' disp('Optimization_With_Analytic_Gradient...'); end 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 [f,g] = rosenbrockwithgrad(x) % Calculate objective f f = rosenbrock(x); if nargout > 1 % gradient required g = gradient(x); end end
It looks like you're new here. If you want to get involved, click one of these buttons!