# fmincon optimization in matlab using OutputFcn

14 views (last 30 days)
mohammed hussein on 24 Sep 2020
Commented: mohammed hussein on 25 Sep 2020
Hi all
i have this example and i want to save the x viarable in each iteration not only see the final value How can i do it . all i found is using OutputFcn but i dont know how can i do it in this example below . thank you very much for your helping
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
x0 = [0,0];
options = optimoptions('fmincon','Display','iter');
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,[],options)

Mario Malic on 25 Sep 2020
Check here https://ch.mathworks.com/help/optim/ug/output-function.html there are some examples if you use the search option.
mohammed hussein on 25 Sep 2020

Michael Croucher on 25 Sep 2020
Edited: Michael Croucher on 25 Sep 2020
Following the advice at https://uk.mathworks.com/help/matlab/math/output-functions.html, we can use the 'OutputFcn' option. By putting the optimistion problem into a function, as shown below, we can take advantage of the fact that nested functions can access variables defined in the outer scope. That is, although I cannot explicitly pass the xvals array to outfun, it can access it anyway since it is a nested function.
function [x, xvals] = myproblem(x0)
xvals=[]; % This will contain the values of x where fun has been evaluated
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
options = optimoptions('fmincon','Display','iter','OutputFcn',@outfun);
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,[],options);
function stop = outfun(x,optimValues,state)
stop=false;
if isequal(state,'iter')
xvals = [xvals;x];
end
end
end
Use this as follows:
[x,xvals] = myproblem([0,0]);
x will have the final result and xvals will contain the history.

#### 1 Comment

mohammed hussein on 25 Sep 2020

Walter Roberson on 25 Sep 2020
shows an example complete with code. The runfmincon() function returns a structure in which you can ask to see all the x values.

Michael Croucher on 25 Sep 2020
That will teach me to hit 'refresh' before writing an answer :)
mohammed hussein on 25 Sep 2020