How to do 'less than but not equal to' nonlinear constraints in fmincon?

8 visualizaciones (últimos 30 días)
Lex
Lex el 15 de Sept. de 2020
Comentada: Lex el 16 de Sept. de 2020
How can I set the constraints for the solution (x1,x2,x3,x4) so that it has a non-linear constraint (x1*x2)/(x3*x4)<1 a.k.a. c = (x1*x2)/(x3*x4)-1?
I already have a separate time I test the non-linear constraint (ceq) (x1*x2)/(x3*x4)=1, and I do not want the solution of the less-than condition to necessarily overlap with the equals condition since it's usually c(x)<=0.
I am using Matlab r2019a or b.

Respuestas (2)

Ameer Hamza
Ameer Hamza el 16 de Sept. de 2020
Numerical optimization algorithms already satisfy constraints with a tolerance value, so the less than (<) or less than equal to (<=) constraints are not fundamentally different. If you want to avoid (x1*x2)/(x3*x4)=1, then you will need to manually set the other constraint like this (x1*x2)/(x3*x4)<=0.99.
  1 comentario
Lex
Lex el 16 de Sept. de 2020
Thank you, I had not considered the tolerance value when asking this question.

Iniciar sesión para comentar.


Walter Roberson
Walter Roberson el 16 de Sept. de 2020
A/B < 1 implies A < B implies A - B < 0,
A-B < 0 implies A - B + epsilon <= 0 for positive epsilon and epsilon goes to 0.
So... we arrive at the constraint
x1*x2 - x3*x4 + eps(realmin)
with implied <= 0
But keep in mind that two different ways of calculating the same "algebraic" number do not necessarily give the same result in floating point.
For example let x1 = 25 and x2 = 1/3, and let x3 = 1 and x4 = 25/3 . Then algebraically 25 * 1/3 should equal 1 * 25/3 . But 25 * (1/3) - 25/3 = -1.77635683940025e-15 in double precision, because 1/3 cannot be exactly represented in binary floating point. The above calculation x1*x2 - x3*x4 + eps(realmin) is negative so the constraint would be satisfied, and yet "morally" the constraint should not be satisfied, since "morally" the two expressions should be equal. If you were to switch the variables then x1*x2 - x3*x4 would be positive instead of 0 so the constraint would fail, but "accidentally" so.
  1 comentario
Lex
Lex el 16 de Sept. de 2020
Thank you for your answer. I am confused though on how to avoid the issue you bring up. Are you saying then I should run the optimization for case where x1*x2-x3*x4+eps(realmin) would be negative separate from when the variables would be switch and would be positive instead?

Iniciar sesión para comentar.

Categorías

Más información sobre Introduction to Installation and Licensing en Help Center y File Exchange.

Productos


Versión

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by