fmincon stop criterion for function with multiple outputs
Show older comments
I have a large complex function that takes in several (15+) arguments, calls local functions to perform many long calculations, and finally outputs several results. Now I want to vary 5 of the input arguments to find the minimum of one output under the constraint that another output is greater than or equal to some value. Here's a simplified example (these equations are just for illustrative purposes, the solution should not depend on them):
function out = myLongFunction(a, b, c, d, e, f, g, h, i, j, k, l, m, n)
[x, y]=localFunc1(a, b, c);
out=localFunc2(x,y);
end
function [x,y]=localFunc1(a,b,c)
x=a*b*c;
y=e^(x/sqrt(8));
end
function out=localFunc2(x,y)
out1=(x/y)^1.4;
out2=x/out1;
out3=sqrt(x*y)*1.4;
out =[out1, out2, out3];
end
In a separate file I have the following code to minimize out1 while out2 is greater than some value under a nonlinear constraint that depends on out3:
function output = optimization(M, ~, ~, ~, ~, ~, f, g, h, i, j, k, l, m, n) % im varying a, b, c, d, and e
ub=[2 2 2 2 2];
lb=[0 0 0 0 0];
X0=[1 1 1 1 1];
A=[];
b=[];
Aeq=[];
beq=[];
function out1=singleOut(x(1), x(2), x(3), x(4), x(5), f, g, h, i, j, k, l, m, n)
out=myLongFunction(x(1), x(2), x(3), x(4), x(5), f, g, h, i, j, k, l, m, n);
out1=out(1);
end
function stop = outfun(x,optimValues,state)
stop=false;
out= myLongFunction(x(1), x(2), x(3), x(4), x(5), f, g, h, i, j, k, l, m, n);
if out(2)<=M % M would be a global variable
stop=true;
end
end
options = optimoptions(@fmincon,'OutputFcn', @outfun);
function [c, ceq]=nonlcon1(x)
out= myLongFunction(x(1), x(2), x(3), x(4), x(5), f, g, h, i, j, k, l, m, n);
c=f*x(1)^2 - g/h*sqrt(x(3))*x(2) + out(3);
ceq=[];
end
function [c2, ceq2]= nonlcon2(x)
out= myLongFunction(x(1), x(2), x(3), x(4), x(5), f, g, h, i, j, k, l, m, n);
c2=i*x(1)^2 - j/k*sqrt(x(3))*x(3) + out(3);
ceq2=[];
end
output=fmincon(func,x0,A,b,Aeq,beq,lb,ub,{@nonlcon1, @nonlcon2},options); % 'output' should be a list of the five variables that result in minimum.
end
I was hoping someone could help me get this working and be as cheap as possible since I have no idea how to use fmincon on a function with multiple outputs and multiple nonlinear constraints. One error I was receiving was something like 'the output function must return a scalar value' which doesn't make sense to me. Any help would be appreciated. Sorry about any spelling/grammar/formatting errors (im on my phone).
Accepted Answer
More Answers (0)
Categories
Find more on Choose a Solver in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!