# How to add constraint with condtions using fmincon?

7 views (last 30 days)
wiem abd on 10 Oct 2019
Answered: wiem abd on 22 Oct 2019
I have am optimization problem with two variables x and y where x and y are vectors.
I would like to add the foollowing constraint to fmincon :
if a<b then x<y
where a and b are known values.
I would like also to add in general x<y for every value of both vectors.
Many thanks!

xi on 10 Oct 2019
Your constraint could be written as:
x-y < 1/(a<b)-1
when a<b, a<b=1, so, 1/(a<b)-1=0
when a>=b, a<b=0, so, 1/(a<b)-1=Inf, it is equivalent to not having constraint.
wiem abd on 13 Oct 2019
Thank you ! That was exactly what I needed.
Now let us consider that I have a vector L of lenght N where the known values are the elements of L.
I want to check for the vector X of lenght N that
for i=1:N
for j=1:N
if L(i)<L(j) then X(i)<=X(j) or X(i)-X(j)<1/(L(i)<L(j))-1
end
end
How to translate this into Matrix because I need to insert it as a constraint in fmincon

xi on 13 Oct 2019
Ask yourself 3 question: How many vairable? how many constraints? and then how to write A and b.
Now you are saying L is a known vector, then, your vairables are just X of length N. you can write your constraint in this way:
-----------------------------
A=zeros(N^2, N);
b=ones(N^2,1);
count=0;
for i=1:N
for j=1:N
count=count+1;
A(count,i)=1;
A(count,j)=-1;
b(count)= 1/(L(i)<L(j))-1;
end
end
---------------------------------
or using N(N-1)/2 constraints instead of N^2
for i=1:N-1
for j=i:N
................
end
end
---------------------------------------
A better way is to sort L first, and get the ordering index using [~,index] = sort(L)
then, you only need to write N-1 constraints:
X'(1)<X'(2), X'(2)<X'(3), ... X'(N-1)<X'(N)
b is simply b=zeros(N-1,1); You can figure out A. This should be much faster.
wiem abd on 14 Oct 2019
Thank you very much.
It is working correctly now.

wiem abd on 14 Oct 2019
Now let us consider that my variable X is of length 2*N and my known values are in a vector L of lenght N.
I want that :
for i=1:N
for j=1:N
if L(i)<L(j) then X(i)<=X(j) and X(N+i)<X(N+j)
end
end
How can I find A such that A*X<zeros(N-1,1).
##### 2 CommentsShowHide 1 older comment
wiem abd on 15 Oct 2019
I think these should be the lines to add :
A(i+N,N+index(i))=1;
A(i+N,N+index(i+1))=-1;
b size should also be modified as follows :
b=zeros(2*N-1,1);
It is working and giving correct results .
Many thanks !

wiem abd on 22 Oct 2019
Is there a way to formulate this anlytically using equations ?

R2018b

### Community Treasure Hunt

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

Start Hunting!