Argument passing issue.
1 次查看(过去 30 天)
显示 更早的评论
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()?
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
0 个评论
采纳的回答
Walter Roberson
2017-1-3
2 个评论
Walter Roberson
2017-1-3
编辑:Walter Roberson
2017-1-3
function [x, fval, eflag, iter, fcount] =
Optimization_With_Analytic_Gradient(start_point, a, b)
x0 = start_point;
% options setup
options = optimoptions( 'fminunc', ...
'Display','off',...
'OutputFcn',@bananaout,...
'Algorithm','trust-region', ...
'GradObj','on');
% calling fminunc
[x, fval, eflag, output] = fminunc(@(x) rosenbrockwithgrad(x, a, b), 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, a, b )
%this routine probably needs to be changed to take a and b into account
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, a, b)
% Calculate objective f
f = rosenbrock(x, a, b);
if nargout > 1 % gradient required
g = gradient(x, a, b);
end
end
更多回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!