0
votes

Is it possible to use the optimization function fmincon with a Matlab defined function?

I wrote a function where I give few constant parameters (real or complex) and for now, every time I change these parameters, the result changes (you don't say).

[output1, output2] = my_function(input1,input2,input3,input4)

I saw that fmincon function allows to find the optimum result with a given constraint. Let's say that I want to find the optimum output acting only on input1 and keeping constant all the others inputs. Is it possible to define something like

fmincon(@(input1)my_function,[1,2],[],mean)

for input1 that goes from 1 to 2 for the best value mean, where mean is the mean value of some other results.

I know that is a quite vague question but I'm not able to give a minimum example, since function makes a lot of things

The first attept with multiple outputs gave me the error Only functions can return multiple values.

Then I tried with only one output and if I use

output1 = @(input1)function(input2,input3);
fmincon(@output1,[1,2],[],mean)

I get the error

Error: "output1" was previously used as a variable, conflicting with its use here as the name of a function or command. See "How MATLAB Recognizes Command Syntax" in the MATLAB documentation for details.

With fmincon(@my_function,[1,2],[],mean) I get Not enough input arguments.

1
Have you tried it? If so, show us. Else, shows us your failed attempt. MATLAB defined functions are only different to user defined functions in that they are proprietary and often closed source, there is nothing different programming-wise to something you write. - Ander Biguri
I added few attempts - Shika93
Your problem doesnt seem to have anything to do wit fmincon and its just bad use of MATLAB syntax. you can not use the word function as it is reserved. Use something else like my_fun. Similarly, anonymous functions ( e.g. @(input1) sum(input1)) only output 1 value, so you may need to create a fucntion in a separate file that does what you want. I can not help more without a real example, a real minimal reproducible example - Ander Biguri

1 Answers

2
votes

The input should be used in your function definition - read up on how anonymous functions should be written. You don't have to use anonymous functions to define the actual objective function (myFunction below), you can use functions in their own file. The key is that the objective function should return a scalar to be minimised.

Here is a very simple example, using fmincon to find the minima in myFunction, based on the initial guess [1.5,1.5].

% myFunction is min when x=1,y=2
myFunction = @(x,y) (x-1).^2 + (y-2).^2;
% Define the optimisation function.
% This should take one input (can be an array) 
% and output a scalar to be minimised
optimFunc = @(P) myFunction( P(1), P(2) );

% Use fmincon to find the optimum solution, based on some initial guess
optimSoln = fmincon( optimFunc, [1.5, 1.5] );

% >> optimSoln
% optimSoln =
%     0.999999990065893   1.999999988824129

% Optimal x = optimSoln(1), optimal y = optimSoln(2);

You can see the calculated optimum isn't exactly [1,2], but it's within the default optimality tolerance. You can change the options for the fmincon solver - read the documentation.


If you wanted to keep y=1 as a constant, you just need to update the function definition:

% We only want solutions with y=1
optimFunc_y1 = @(P) myFunction( P(1), 1 ); % y=1 always
% Find new optimal solution
optimSoln_y1 = fmincon( optimFunc_y1, 1.5 );

% >> optimSoln_y1
% optimSoln_y1 = 
%    0.999999990065893
% Optimal x when y=1 = optimSoln(1)

You can add inequality constraints using the A, B, Aeq and Beq inputs to fmincon, but that's too broad to go into here, please refer to the docs.


Note that you're using the keyword function in a way which is invalid syntax. I've instead used valid variable names for the functions in my demo.