How to add constraint with condtions using fmincon?
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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!
0 commentaires
Réponse acceptée
xi
le 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.
5 commentaires
xi
le 10 Oct 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.
Plus de réponses (3)
xi
le 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)
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 commentaires
wiem abd
le 14 Oct 2019
2 commentaires
xi
le 14 Oct 2019
Modifié(e) : xi
le 14 Oct 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);
Voir également
Catégories
En savoir plus sur Get Started with Optimization Toolbox dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!