Nonlinear inequality constraint in Fmincon produces optimized x values only where constraint value equals zero

1 view (last 30 days)
When using the nonlinear inequality constraint function in fmincon, the optimized x values have been limited where c(x) = 0 instead of c(x) <= 0.
Objective function
function fun = fgoptprac(x)
%Load these initial values into the workspace before running (x0, lb, ub)
%x0 = [.75;.05];
%lb = [.6;.02];
%ub = [.9;.1];
FGcost = 3;
PCcost = 120;
FAcost = 50;
FGion = 0.6245;
PCion = 0.0466;
FAion = 0.0408;
Md = 88;
Vs = 62.4;
As = 89.7;
C0 = 2.52;
a = [1.5323;3.2456;4.4511;5.4375;1.3112;5.9278;3.5471;9.7522;1.1443;10.1803;11.6411;13.5043;10.6609;10.8304;9.7646;3.0424;8.7430];
b = [-36.4593;-525.0273;-69.7738;-271.1375;-108.3028;-89.6767;51.8115;-196.8059;-1631.6804;476.9985;-627.1805;-60.4963;-482.9669;-804.7777;-1356.6831;-1184.5658;-2072.8314];
c = [7.6043;2.3144;-20.9358;-22.1573;-53.1397;-20.613;-38.6912;-9.8625;-32.7446;-15.3286;4.9522;20.7256;1.1675;8.0776;10.1853;-12.5374;-2.0985];
d = [42.5919;578.303;76.8362;311.1605;153.3032;77.0661;-58.4724;189.645;1864.9115;-566.1635;675.7103;30.411;509.1583;881.4849;1492.1294;1378.4112;2299.2668];
e = [-9.8215;-9.7098;38.1797;35.9569;93.4644;25.7382;61.4931;4.5864;49.8227;24.3662;-17.3297;-44.1011;-12.3811;-28.7089;-36.184;33.7396;-18.6562];
f = [40.2246;607.0888;105.9604;285.1265;93.4722;195.0361;-19.3576;263.1551;1827.219;-543.1824;691.8505;65.2143;582.846;906.2586;1555.2136;1177.1889;2392.7099];
texp = [.08;.29;1;2;3;4;5;7;10;14;21;28;35;42;49;63;77];
t0 = [1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1];
function C = conc(fgoptprac)
C = (((x(1)*FGion +x(2)*PCion + (1 - x(1) - x(2))*FAion)*Md*1000/Vs) - C0);
end
function Cb = Bulk(fgoptprac)
Cb = ((x(1)*FGion +x(2)*PCion + (1 - x(1) - x(2))*FAion)*Md*1000/Vs);
end
function cost = COST(fgoptprac)
cost = (x(1)*FGcost + x(2)*PCcost + (1 - x(1) - x(2))*FAcost + 5);
end
function ionr = IONR(fgoptprac)
ionr = (x(1)*FGion +x(2)*PCion + (1 - x(1) - x(2))*FAion);
end
function delta = DELTA(fgoptprac)
delta = 1 - (Mtc*As/(Bulk*Vs));
function mtc = Mtc(DELTA)
k1 = (conc*t0);
k2 = (conc*sqrt(texp));
k3 = (conc*texp);
X = [k1 k2 k3];
Mint = [a(1)*x(1) + b(1)*x(2) + c(1)*(1 - x(1) - x(2)) + d(1)*x(1)*x(2) + ...
e(1)*x(1)*(1-x(1)-x(2)) + f(1)*x(2)*(1-x(1)-x(2));
a(2)*x(1) + b(2)*x(2) + c(2)*(1 - x(1) - x(2)) + d(2)*x(1)*x(2) + ...
e(2)*x(1)*(1-x(1)-x(2)) + f(2)*x(2)*(1-x(1)-x(2));
a(3)*x(1) + b(3)*x(2) + c(3)*(1 - x(1) - x(2)) + d(3)*x(1)*x(2) + ...
e(3)*x(1)*(1-x(1)-x(2)) + f(3)*x(2)*(1-x(1)-x(2));
a(4)*x(1) + b(4)*x(2) + c(4)*(1 - x(1) - x(2)) + d(4)*x(1)*x(2) + ...
e(4)*x(1)*(1-x(1)-x(2)) + f(4)*x(2)*(1-x(1)-x(2));
a(5)*x(1) + b(5)*x(2) + c(5)*(1 - x(1) - x(2)) + d(5)*x(1)*x(2) + ...
e(5)*x(1)*(1-x(1)-x(2)) + f(5)*x(2)*(1-x(1)-x(2));
a(6)*x(1) + b(6)*x(2) + c(6)*(1 - x(1) - x(2)) + d(6)*x(1)*x(2) + ...
e(6)*x(1)*(1-x(1)-x(2)) + f(6)*x(2)*(1-x(1)-x(2));
a(7)*x(1) + b(7)*x(2) + c(7)*(1 - x(1) - x(2)) + d(7)*x(1)*x(2) + ...
e(7)*x(1)*(1-x(1)-x(2)) + f(7)*x(2)*(1-x(1)-x(2));
a(8)*x(1) + b(8)*x(2) + c(8)*(1 - x(1) - x(2)) + d(8)*x(1)*x(2) + ...
e(8)*x(1)*(1-x(1)-x(2)) + f(8)*x(2)*(1-x(1)-x(2));
a(9)*x(1) + b(9)*x(2) + c(9)*(1 - x(1) - x(2)) + d(9)*x(1)*x(2) + ...
e(9)*x(1)*(1-x(1)-x(2)) + f(9)*x(2)*(1-x(1)-x(2));
a(10)*x(1) + b(10)*x(2) + c(10)*(1 - x(1) - x(2)) + d(10)*x(1)*x(2) + ...
e(10)*x(1)*(1-x(1)-x(2)) + f(10)*x(2)*(1-x(1)-x(2));
a(11)*x(1) + b(11)*x(2) + c(11)*(1 - x(1) - x(2)) + d(11)*x(1)*x(2) + ...
e(11)*x(1)*(1-x(1)-x(2)) + f(11)*x(2)*(1-x(1)-x(2));
a(12)*x(1) + b(12)*x(2) + c(12)*(1 - x(1) - x(2)) + d(12)*x(1)*x(2) + ...
e(12)*x(1)*(1-x(1)-x(2)) + f(12)*x(2)*(1-x(1)-x(2));
a(13)*x(1) + b(13)*x(2) + c(13)*(1 - x(1) - x(2)) + d(13)*x(1)*x(2) + ...
e(13)*x(1)*(1-x(1)-x(2)) + f(13)*x(2)*(1-x(1)-x(2));
a(14)*x(1) + b(14)*x(2) + c(14)*(1 - x(1) - x(2)) + d(14)*x(1)*x(2) + ...
e(14)*x(1)*(1-x(1)-x(2)) + f(14)*x(2)*(1-x(1)-x(2));
a(15)*x(1) + b(15)*x(2) + c(15)*(1 - x(1) - x(2)) + d(15)*x(1)*x(2) + ...
e(15)*x(1)*(1-x(1)-x(2)) + f(15)*x(2)*(1-x(1)-x(2));
a(16)*x(1) + b(16)*x(2) + c(16)*(1 - x(1) - x(2)) + d(16)*x(1)*x(2) + ...
e(16)*x(1)*(1-x(1)-x(2)) + f(16)*x(2)*(1-x(1)-x(2));
a(17)*x(1) + b(17)*x(2) + c(17)*(1 - x(1) - x(2)) + d(17)*x(1)*x(2) + ...
e(17)*x(1)*(1-x(1)-x(2)) + f(17)*x(2)*(1-x(1)-x(2));];
y = cumsum(Mint);
beta = regress(y,X);
K1 = beta(1);
K2 = beta(2);
K3 = beta(3);
tc = (K2/(2*K3))^2;
mtc = (K1*conc + K2*conc*sqrt(tc) + K3*conc*tc);
end
end
fun = (COST/(DELTA*IONR));
%Insert following code [x,fval]=.... directly into command window
%[x,fval] = fmincon(@fgoptprac,x0,[],[],[],[],lb,ub,@confun);
end
Constraint function
function [con,ceq]=confun(x)
FGcost = 3;
PCcost = 120;
FAcost = 50;
FGion = 0.6245;
PCion = 0.0466;
FAion = 0.0408;
Md = 88;
Vs = 62.4;
As = 89.7;
C0 = 2.52;
a = [1.5323;3.2456;4.4511;5.4375;1.3112;5.9278;3.5471;9.7522;1.1443;10.1803;11.6411;13.5043;10.6609;10.8304;9.7646;3.0424;8.7430];
b = [-36.4593;-525.0273;-69.7738;-271.1375;-108.3028;-89.6767;51.8115;-196.8059;-1631.6804;476.9985;-627.1805;-60.4963;-482.9669;-804.7777;-1356.6831;-1184.5658;-2072.8314];
c = [7.6043;2.3144;-20.9358;-22.1573;-53.1397;-20.613;-38.6912;-9.8625;-32.7446;-15.3286;4.9522;20.7256;1.1675;8.0776;10.1853;-12.5374;-2.0985];
d = [42.5919;578.303;76.8362;311.1605;153.3032;77.0661;-58.4724;189.645;1864.9115;-566.1635;675.7103;30.411;509.1583;881.4849;1492.1294;1378.4112;2299.2668];
e = [-9.8215;-9.7098;38.1797;35.9569;93.4644;25.7382;61.4931;4.5864;49.8227;24.3662;-17.3297;-44.1011;-12.3811;-28.7089;-36.184;33.7396;-18.6562];
f = [40.2246;607.0888;105.9604;285.1265;93.4722;195.0361;-19.3576;263.1551;1827.219;-543.1824;691.8505;65.2143;582.846;906.2586;1555.2136;1177.1889;2392.7099];
texp = [.08;.29;1;2;3;4;5;7;10;14;21;28;35;42;49;63;77];
t0 = [1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1];
function C = conc2(confun)
C = (((x(1)*FGion +x(2)*PCion + (1 - x(1) - x(2))*FAion)*Md*1000/Vs) - C0);
end
function Cb = Bulk2(confun)
Cb = ((x(1)*FGion +x(2)*PCion + (1 - x(1) - x(2))*FAion)*Md*1000/Vs);
end
function cost = COST2(confun)
cost = (x(1)*FGcost + x(2)*PCcost + (1 - x(1) - x(2))*FAcost + 5);
end
function ionr = IONR2(confun)
ionr = (x(1)*FGion +x(2)*PCion + (1 - x(1) - x(2))*FAion);
end
function delta = DELTA2(confun)
delta = 1 - (Mtc*As/(Bulk2*Vs));
function mtc = Mtc(DELTA2)
k1 = (conc2*t0);
k2 = (conc2*sqrt(texp));
k3 = (conc2*texp);
X = [k1 k2 k3];
Mint = [a(1)*x(1) + b(1)*x(2) + c(1)*(1 - x(1) - x(2)) + d(1)*x(1)*x(2) + ...
e(1)*x(1)*(1-x(1)-x(2)) + f(1)*x(2)*(1-x(1)-x(2));
a(2)*x(1) + b(2)*x(2) + c(2)*(1 - x(1) - x(2)) + d(2)*x(1)*x(2) + ...
e(2)*x(1)*(1-x(1)-x(2)) + f(2)*x(2)*(1-x(1)-x(2));
a(3)*x(1) + b(3)*x(2) + c(3)*(1 - x(1) - x(2)) + d(3)*x(1)*x(2) + ...
e(3)*x(1)*(1-x(1)-x(2)) + f(3)*x(2)*(1-x(1)-x(2));
a(4)*x(1) + b(4)*x(2) + c(4)*(1 - x(1) - x(2)) + d(4)*x(1)*x(2) + ...
e(4)*x(1)*(1-x(1)-x(2)) + f(4)*x(2)*(1-x(1)-x(2));
a(5)*x(1) + b(5)*x(2) + c(5)*(1 - x(1) - x(2)) + d(5)*x(1)*x(2) + ...
e(5)*x(1)*(1-x(1)-x(2)) + f(5)*x(2)*(1-x(1)-x(2));
a(6)*x(1) + b(6)*x(2) + c(6)*(1 - x(1) - x(2)) + d(6)*x(1)*x(2) + ...
e(6)*x(1)*(1-x(1)-x(2)) + f(6)*x(2)*(1-x(1)-x(2));
a(7)*x(1) + b(7)*x(2) + c(7)*(1 - x(1) - x(2)) + d(7)*x(1)*x(2) + ...
e(7)*x(1)*(1-x(1)-x(2)) + f(7)*x(2)*(1-x(1)-x(2));
a(8)*x(1) + b(8)*x(2) + c(8)*(1 - x(1) - x(2)) + d(8)*x(1)*x(2) + ...
e(8)*x(1)*(1-x(1)-x(2)) + f(8)*x(2)*(1-x(1)-x(2));
a(9)*x(1) + b(9)*x(2) + c(9)*(1 - x(1) - x(2)) + d(9)*x(1)*x(2) + ...
e(9)*x(1)*(1-x(1)-x(2)) + f(9)*x(2)*(1-x(1)-x(2));
a(10)*x(1) + b(10)*x(2) + c(10)*(1 - x(1) - x(2)) + d(10)*x(1)*x(2) + ...
e(10)*x(1)*(1-x(1)-x(2)) + f(10)*x(2)*(1-x(1)-x(2));
a(11)*x(1) + b(11)*x(2) + c(11)*(1 - x(1) - x(2)) + d(11)*x(1)*x(2) + ...
e(11)*x(1)*(1-x(1)-x(2)) + f(11)*x(2)*(1-x(1)-x(2));
a(12)*x(1) + b(12)*x(2) + c(12)*(1 - x(1) - x(2)) + d(12)*x(1)*x(2) + ...
e(12)*x(1)*(1-x(1)-x(2)) + f(12)*x(2)*(1-x(1)-x(2));
a(13)*x(1) + b(13)*x(2) + c(13)*(1 - x(1) - x(2)) + d(13)*x(1)*x(2) + ...
e(13)*x(1)*(1-x(1)-x(2)) + f(13)*x(2)*(1-x(1)-x(2));
a(14)*x(1) + b(14)*x(2) + c(14)*(1 - x(1) - x(2)) + d(14)*x(1)*x(2) + ...
e(14)*x(1)*(1-x(1)-x(2)) + f(14)*x(2)*(1-x(1)-x(2));
a(15)*x(1) + b(15)*x(2) + c(15)*(1 - x(1) - x(2)) + d(15)*x(1)*x(2) + ...
e(15)*x(1)*(1-x(1)-x(2)) + f(15)*x(2)*(1-x(1)-x(2));
a(16)*x(1) + b(16)*x(2) + c(16)*(1 - x(1) - x(2)) + d(16)*x(1)*x(2) + ...
e(16)*x(1)*(1-x(1)-x(2)) + f(16)*x(2)*(1-x(1)-x(2));
a(17)*x(1) + b(17)*x(2) + c(17)*(1 - x(1) - x(2)) + d(17)*x(1)*x(2) + ...
e(17)*x(1)*(1-x(1)-x(2)) + f(17)*x(2)*(1-x(1)-x(2));];
y = cumsum(Mint);
beta = regress(y,X);
K1 = beta(1);
K2 = beta(2);
K3 = beta(3);
tc = (K2/(2*K3))^2;
mtc = (K1*conc2 + K2*conc2*sqrt(tc) + K3*conc2*tc);
end
end
a00 = -208.28;
a01 = 815.50;
a02 = -1009.08;
a03 = 404.27;
a10 = 3082.11;
a11 = -11411.57;
a12 = 13930.50;
a13 = -5622.92;
a20 = -2418.38;
a21 = 8758.37;
a22 = -10446.88;
a23 = 4116.15;
function Sc = Cstr(confun)
Sc = a00 + a01*x(1) + a02*(x(1))^2 + a03*(x(1))^3 + a10*(x(2)*10) ...
+ a11*(x(2)*10)*x(1) + a12*(x(2)*10)*(x(1))^2 + a13*(x(2)*10)*(x(1))^3 ...
+ a20*(x(2)*10)^2 + a21*(x(2)*10)^2*x(1) ...
+ a22*(x(2)*10)^2*(x(1))^2 + a23*(x(2)*10)^2*(x(1))^3;
end
con(1) = -DELTA2;
con(2) = -Cstr + 4.137;
ceq = [];
end
The output of the code above has been confirmed to be correct when run with a defined x. However, when the fmincon procedure is called with these constraint functions, the output x is given when con(2) = -Cstr + 4.137 = 0.
Effectively this only outputs values of x where con(2) = 0 instead of minimizing the function, fun.
Please recommend how to make the nonlinear inequality constraint perform correctly.
Thanks

Accepted Answer

Alan Weiss
Alan Weiss on 11 Oct 2016
I am not sure that I understand why you believe that there is a problem with the result. Often, the minimum for a constrained function occurs on the constraint boundaries.
If you think that fmincon is not finding a global minimum, well, look at the suggestions in the documentation for improving results, and look at Searchng for a Smaller Minimum.
Good luck,
Alan Weiss
MATLAB mathematical toolbox documentation

More Answers (0)

Community Treasure Hunt

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

Start Hunting!