How to add constraint with condtions using fmincon?

3 visualizaciones (últimos 30 días)
wiem abd
wiem abd el 10 de Oct. de 2019
Respondida: wiem abd el 22 de Oct. de 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!

Respuesta aceptada

xi
xi el 10 de Oct. de 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.
  5 comentarios
xi
xi el 10 de Oct. de 2019
Assuming your x and y array length is n, you have 2n variables, not 2. So
X= (x1,x2,...xn,y1,y2...yn)
The constraint should be written in the vectorized format of AX-b<0;
for example, x1<y1 and x2<y2,... should be written as
A= [ 1,0,0...-1,0,0,...;
0,1,0...0,-1,0,...;
...]
b= [0,0,...]
I don't quite understand what in {1,length(x)} means. You can either use the trick I described and write A in an (n by 2n) matrix, or find out how many total contraints (=m) you have, and write A in an (m by 2n) matrix, where m<n.
wiem abd
wiem abd el 13 de Oct. de 2019
Editada: wiem abd el 13 de Oct. de 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

Iniciar sesión para comentar.

Más respuestas (3)

xi
xi el 13 de Oct. de 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)
So you define your new variable X'=X(index); and solve X' instead.
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.
  6 comentarios
xi
xi el 13 de Oct. de 2019
no longer need count, just A(i, index(i)), or you need count++
wiem abd
wiem abd el 14 de Oct. de 2019
Thank you very much.
It is working correctly now.

Iniciar sesión para comentar.


wiem abd
wiem abd el 14 de Oct. de 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 comentarios
xi
xi el 14 de Oct. de 2019
Editada: xi el 14 de Oct. de 2019
Now you have 2N variables, and 2*(N-1) constraints, only need small modifications of the above code
A=zeros(2*(N-1), 2*N);
[~,index] = sort(L)
for i=1:N-1 % write two constraints for each i
A(i,index(i))=1;
A(i,index(i+1))=-1;
% ******* just add two lines here, I leave it to you to figure out what the index of A should be.
end
b=zeros(N-1,1);
wiem abd
wiem abd el 15 de Oct. de 2019
Editada: wiem abd el 15 de Oct. de 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 !

Iniciar sesión para comentar.


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

Categorías

Más información sobre Solver Outputs and Iterative Display en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by