Filter löschen
Filter löschen

use fmincon with 0<x1<x2<x3

1 Ansicht (letzte 30 Tage)
xone92_
xone92_ am 27 Okt. 2022
Beantwortet: Steven Lord am 22 Okt. 2023
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

Akzeptierte Antwort

Torsten
Torsten am 27 Okt. 2022
Bearbeitet: Torsten am 27 Okt. 2022
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 Kommentare
Matt J
Matt J am 28 Okt. 2022
@xone92_ If it worked, then you should Accept-click Torsten's answer.
Marko
Marko am 22 Okt. 2023
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];

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Steven Lord
Steven Lord am 22 Okt. 2023
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]
d = 1×3
1.0000 0.2500 3.0000
x = cumsum(d)
x = 1×3
1.0000 1.2500 4.2500
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]
d = 1×4
1.0000 0.2500 0 3.0000
x = cumsum(d)
x = 1×4
1.0000 1.2500 1.2500 4.2500

Produkte


Version

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by