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
Best Answer