Group Constraints for FMINCON

1 view (last 30 days)
Hi all! I'm writing a model that needs to minimize 6 variables through FMINCON: o, a, b, w, kappa, gamma. The variable options is defined as follows:
The variables are already subject to the following lower/upper boundaries:
  • o, a, b, w between 0 and Inf;
  • kappa, gamma strictly positive between (2 * options.TolCon) and Inf;
I need to ensure a few constraints are respected:
  • o, a, b, w must approximately sum to 1;
  • kappa * gamma must be approximately equal to 1;
If I didn't have to consider the last two variables, I would have probably used A and b parameters of FMINCON as follows:
A = [-eye(3); ones(1,3)];
b = [(zeros(3,1) + (2 * options.TolCon)); (1 - (2 * options.TolCon))];
But going for that approach with two distinct constraints (an additive one and a multiplicative one) is pretty weird and I really have no clue about how to set A and b.
It seems that the nonlcon parameter may be what I'm looking for, but it's unclear to me how to formulate it properly.

Accepted Answer

John D'Errico
John D'Errico on 26 Apr 2020
Approximately equals is NOT an equality constraint.
But you can write it as TWO inequality constraints. So if you want kappa*gamm approximately equal to 1, then that means you want the product to be within some given tolerance of 1. That is:
kappa*gamm >= 1 - tol
kappa*gamm <= 1 + tol
You can then swap the inequality direction on the first constraint by multiplying by -1.
-kappa*gamm <= -(1 - tol)
Note my use of gamm as a variable name, instead of gamma. Since there is a function called gamma that is often quite useful, I strongly suggest not using a variable named gamma.
  1 Comment
Tommaso Belluzzo
Tommaso Belluzzo on 26 Apr 2020
Edited: Tommaso Belluzzo on 26 Apr 2020
Thanks for your answer. May I kindly as you how I can implement this on the point of view of Matlab code?
I think I have to write a nonlcon function like this?
function [c,ceq] = my_nonlcon(x,options)
kappa = x(5);
gamm = x(6);
kg = kappa * gamm;
c1 = kg - (1 - (2 * options.TolCon));
c2 = kg - (1 + (2 * options.TolCon));
c = [c1; c2];
ceq = [];
Together with A and b contraints formulated as follows:
A = [[-eye(3) zeros(3)]; [ones(1,4) zeros(1,2)]; zeros(2,6)];
b = [(zeros(3,1) + (2 * options.TolCon)); (1 - (2 * options.TolCon)); zeros(2,1)];
Am I right?

Sign in to comment.

More Answers (0)


Find more on Programming 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!