Fmincon passing on variables between functions

조회 수: 50 (최근 30일)
Jorrit
Jorrit 2011년 6월 13일
댓글: Maximilian Hoffmann 2017년 7월 13일
I have two questionw about the fmincon function in matlab. I'm using it for a large optimization. The objective function takes about 20sec per call.
The first question is: I calculate a lot of data in the objective function, which I also need in the constraint function. Is there a way to pass this data from the objective function to the constraints function. I know that it is possible to transfer data from the main function to the constraint function and from the main function to the objective function by using function handles. I cannot figure out how to transfer data between the objective and constraint function, however. Right now I use a quick fix; I save the data created in the objective function to a .mat file and then load it again in the constraint function. I prefer a neater solution though.
The second question is also about variable transfer. My optimization features 30 variables. I use an active-line approach, which means that the objective function is called 31 times for each iteration. I would like to have a waitbar which displays the status of each iteration. Therefore I'd like to have access to the amount of iterations and function calls in a separate function. A bit like the OutputFcn, but instead one that is called after each function call. A second solution would be to have the number of iterations/function calls available within the objective function.
Any help would be greatly appreciated.

채택된 답변

Walter Roberson
Walter Roberson 2011년 6월 14일
Your objective function has two outputs, but objective functions for fmincon must have a single scalar output.
Your objective function is not being created correctly.
Your constraint function must accept a vector of x values as its only input.
Your constraint function is not being created correctly.
Variables will never be considered to be nested in a function if they appear as an input or output argument.
Any variables that you want to share, you have to define in the outer scope before you define the functions that will use them.
Putting these together:
function [] = objectiveconstraints(previous_variables)
objective=@(x) obj(previous_variables,x);
constraint=@con;
aircraft = []; %must initialize shared variables
function f = obj(previous_variables,x)
aircraft = calculations(previous_variables,x)
f = aircraft.objectivevalue;
end
function [c,ceq] = con(x)
%non linear inequalities at x
c = aircraft.c;
% Compute nonlinear equalities at x.
ceq = 0;
end
%Define problem
problem.x0 = x0;
%Define Objective function
problem.objective = objective;
%Define constraint function
problem.nonlcon = constraint;
%Perform optimization
[x,fval] = fmincon(problem);
end
  댓글 수: 4
Walter Roberson
Walter Roberson 2017년 7월 12일
It is not guaranteed that the nonlinear constraint function will be called after each call to the objective function, and the nonlinear constraint function might be called multiple times in a row to try to find a position in range to evaluate. You therefore cannot count on the value having been calculated in the other routine.
If you have R2017a or later, see https://www.mathworks.com/matlabcentral/answers/348109-approximating-derivative-of-numerical-solution-within-event-function#comment_468397 for my demonstration of using memoization to save duplicate calculations.
Maximilian Hoffmann
Maximilian Hoffmann 2017년 7월 13일
Thank you very much! This was my initial doubt about it, because my function needs only 0,03 seconds per call due to my optimization of it. So shifting those variables between two functions every tenth call in obj-function for the constraint-function will probably take longer than running the function when needed. However many many thanks and best regards! Max :)

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Walter Roberson
Walter Roberson 2011년 6월 13일
You could use nested functions and shared variables; see here
  댓글 수: 1
Jorrit
Jorrit 2011년 6월 14일
Thank you. Could you maybe elaborate a bit on the exact usage of the nested functions in combination with fmincon? I've added an answer, since the code it getting unreadable in this comment.

댓글을 달려면 로그인하십시오.


Jorrit
Jorrit 2011년 6월 14일
Thanks Walter. I did a lot of searching and as I understand, the overall structure needs to be something like this:
function [] = objectiveconstraints(previous_variables)
objective=@obj
constraint=@con
function [f,aircraft] = obj(previous_variables,x)
aircraft = calculations(previous_variables,x)
f = aircraft.objectivevalue;
end
function [c,ceq] = con(aircraft)
%non linear inequalities at x
c = aircraft.c;
% Compute nonlinear equalities at x.
ceq = 0;
end
%Define problem
problem.x0 = x0;
%Define Objective function
problem.objective = objective(previous_variables,x0);
%Define constraint function
problem.nonlcon = constraint(aircraft);
%Perform optimization
[x,fval] = fmincon(problem);
end
I thought this should work, but I cannot seem to extract the aircraft structure, containing all calculation data from the objective and making it available inside the constraints function. I do really appreciate any help on this.

카테고리

Help CenterFile Exchange에서 Solver-Based Nonlinear Optimization에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by