Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing additional arguments through function handle in Matlab

I have a function to optimize, say Function, in Matlab. This function depends on variables (say x) over which I want to optimize and one parameter (say, Q) which does not need to be optimized.Hence, the function Function(x,Q). In other words, I have an array of values for Q and want to find optimal x values for each Q. However, I cannot find a way how to pass those Q values when using function handle @Function in optimization function.

So, my question is how to pass those Q values when using function handle in optimization functions, for example fmincon(@Function,x0,A,b)?

like image 820
Tomas Avatar asked Feb 18 '13 18:02

Tomas


2 Answers

Try using anonymous function:

x = cell( 1, numel(Q) );
for qi = 1:numel( Q )
   x{qi} = fmincon( @(x) Function(x, Q(qi)), A, b );
end 
like image 165
Shai Avatar answered Sep 23 '22 01:09

Shai


As described in MATLAB documentation, there are actually 3 solutions for this problem:

  1. Anonymous Functions
    which is described in the Shai's answer of this post.
  2. Nested Functions:
    in this approach the outer function accepts all arguments, and the inner function only accepts parameters that optimization takes place on them.
    this is an example taken from MATLAB documentation: function [x,fval] = runnested(a,b,c,x0) [x,fval] = fminunc(@nestedfun,x0); % Nested function that computes the objective function function y = nestedfun(x) y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)x(2) +... (-c + cx(2)^2)*x(2)^2; end end
  3. Global Variables
    in this approach you should define the parameters that are needed in objective function as global in workspace, and use them in objective function with declaring them as global.
    here is an example again from MATLAB documentation:
    • Defining objective function: function y = globalfun(x) global a b c y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)x(2) + ... (-c + cx(2)^2)*x(2)^2; end
    • Optimization: global a b c; a = 4; b = 2.1; c = 4; % Assign parameter values x0 = [0.5,0.5]; [x,fval] = fminunc(@globalfun,x0)
like image 43
Alireza Mirian Avatar answered Sep 24 '22 01:09

Alireza Mirian