Optimization with MATLAB

164 Views Asked by At

I have a requirement that, I use the following modified Rosenbrock function,

enter image description here

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