Effacer les filtres
Effacer les filtres

Error in Rosenbrock Optimization with Analytic Hessian

1 vue (au cours des 30 derniers jours)
Ba Ba Black Sheep!
Ba Ba Black Sheep! le 5 Jan 2017
The following program is not working.
It is generating the following error:
Error using gradient (line 6)
Not enough input arguments.
Error in rosenbrockwithgradhess (line 7)
g = gradient(x);
Error in Optimization_With_Analytic_Hessian>@(x)rosenbrockwithgradhess(x,
double(a),double(b)) (line 27)
[x, fval, eflag, output] = fminunc(@(x)rosenbrockwithgradhess(x,
double(a), double(b)), x0, options);
Error in fminunc (line 280)
[f,GRAD,HESS] = feval(funfcn{3},x,varargin{:});
Error in Optimization_With_Analytic_Hessian (line 27)
[x, fval, eflag, output] = fminunc(@(x)rosenbrockwithgradhess(x,
double(a), double(b)), x0, options);
Error in main (line 57)
[x, fval, eflag, iter, fcount] =
Optimization_With_Analytic_Hessian(starting_point);
Caused by:
Failure in initial user-supplied objective function evaluation.
FMINUNC cannot continue.
Optimization_With_Analytic_Hessian.m
function [x, fval, eflag, iter, fcount] =
Optimization_With_Analytic_Hessian(start_point)
% assign start point
x0 = start_point;
% read coefficients a, b
coeff = load('coeff.txt');
a = coeff(1);
b = coeff(2);
% options setup
options = optimoptions( 'fminunc', ...
'Display','off',...
'OutputFcn',@bananaout,...
'Algorithm','trust-region', ...
'GradObj','on',...
'Hessian', 'on');
% calling fminunc
[x, fval, eflag, output] = fminunc(@(x)rosenbrockwithgradhess(x,
double(a), double(b)), x0, options);
iter = output.iterations;
fcount = output.funcCount;
% plot window title
title 'Optimization with Analytic Hessian...'
disp('Optimization_With_Analytic_Hessian...');
end
Relevant Source Code:
function [f, g, h] = rosenbrockwithgradhess(x, a, b)
% Calculate objective f
f = rosenbrock(x, a, b);
% gradient required
if nargout > 1
g = gradient(x);
end
% hessian required
if nargout > 2
h = hessian(x);
end
end
rosenbrock.m
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
gradient.m
function out = gradient(coord, a, b )
x = coord(1);
y = coord(2);
out = [2 *(-200 *(a - x) *(a^2 - 2*a*x + b + x^2 - y) - a + x - 1);
200 *(-(a - x)^2 - b + y)];
end
hessian.m
function out = hessian(coord, a, b )
x = coord(1);
y = coord(2);
out = 400 * (200 * (a-x)^2 + 200*b - 200*y + 1);
end
main.m
function main()
% initial data
points_count = 4;
coeff_file_name = 'coeff.txt';
start_points_file_name = 'data.txt';
file_write_mode = 'w';
a = gen_const();% integer
b = gen_const();% integer
% write coefficients to a file
write_to_file(coeff_file_name, [a, b], file_write_mode)
% generate 4 random points
m = gen_points(a, b, points_count);
% write the points to a file
write_to_file(start_points_file_name, m, file_write_mode);
% load points from file
points = load(start_points_file_name);
plot_ban();
% iterate through the points and use them in optimization
for i = 1:points_count
starting_point = points(i,:);
if i==1
file_write_mode = 'w' ;
else
file_write_mode = 'a';
end
% Optimization with Analytic Hessian
[x, fval, eflag, iter, fcount] =
Optimization_With_Analytic_Hessian(starting_point);
write_to_file('Optimization_With_Analytic_Hessian.txt',
[a, b,starting_point, x, fval, eflag, iter, fcount], file_write_mode);
end
end

Réponse acceptée

Walter Roberson
Walter Roberson le 5 Jan 2017
Your rosenbeckwitgradhess routine is receiving a and b as arguments but is not passing them to your gradient.m

Plus de réponses (0)

Community Treasure Hunt

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

Start Hunting!

Translated by