use fmincon with 0<x1<x2<x3
1 次查看(过去 30 天)
显示 更早的评论
Hello there,
I would be interested if I can use fmincon in a way that 0<x1<x2<x3 when i have a function f(x) with x=[x1 x2 x3....]
Greetings
0 个评论
采纳的回答
Torsten
2022-10-27
编辑:Torsten
2022-10-27
Strict inequality is not possible. If you are satified with <= instead of <, use
-x1 <= 0
x1 - x2 <= 0
x2 - x3 <= 0
or in the A,b setting of fmincon
A = [-1 0 0;1 -1 0;0 1 -1]
b = [0;0;0]
3 个评论
Marko
2023-10-22
This thread is "solved" and almost 1year old.
But maybe, somebody need a solution which is strictly "<" instead of "<=".
I suggest this workaround: choose a small number as delta, e.g.:
dx = 2*eps
-x1 <= dx
x1 - x2 <= dx
x2 - x3 <= dx
or in the syntax for fmincon:
dx = eps;
A = [-1 0 0;1 -1 0;0 1 -1];
b = [dx;dx;dx];
更多回答(1 个)
Steven Lord
2023-10-22
Another possible solution is to redefine your code in terms of d(1), d(2), d(3), etc. Constrain all the elements of the d vector to be greater than eps (or some other small value, whatever difference you want to be the minimum that the elements of x can be separated by) using a lower bound. Inside your objective function compute the x vector as cumsum(d) and use it in your calculations.
d = [1 0.25 3]
x = cumsum(d)
If you want to allow some of the consecutive elements of x to be equal, the lower bound for that element in d is 0.
d = [1 0.25 0 3]
x = cumsum(d)
0 个评论
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!