Minimizing a function using fmincon with special constraints and intervals

22 views (last 30 days)
I would like to minimize a function using fmincon as follows:
The function to be minimized is: fun = @(x)x(1)^2 + 3*x(2)/x(3) - x(4)^2 ;
The constraints are:
  1. 1/9 <=x(i)/x(j)<=9, for i,j=1,2,3,4 by considering i<j.
  2. x(1) + x(2) + x(3) + x(4) = 1;
  3. x(i) > 0 for i=1,2,3,4.
My challenge is how to apply the first constraint (1) in fmincon. Without the first constraint, I was able to solve it using only the second and the third constraints as follows:
clear; clc
% function to be minimized
fun = @(x)x(1)^2 + 3*x(2)/x(3) - x(4)^2 ;
%initial value
x0=ones(1,4);
%bound limits
lb=0.0001*ones(1,4); % lower bound as x(i)>0
ub=[]; %no upper bound
% normalize x inside fmincon as x(1)+...+x(4) = 1
Aeq = ones(1,4);
beq = 1;
% using Matlab's fmincon
x= fmincon(fun,x0,[],[],Aeq,beq,lb,ub)
Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
x = 1×4
0.0001 0.0001 0.0123 0.9875
I was trying to convert the first constraint into a set of 12 inequalites below. But still I couldn't manage to implement it inside the fmincon. I wonder if you could provide me help. Thank you in advance!
% writing inequalities for: 1/9 <=x(i)/x(j)<=9, for i,j=1,2,3,4 by
% considering i<j.
% (1) for x(i)/x(j)<=9:
x(1)-9*x(2)<=0;
x(1)-9*x(3)<=0;
x(1)-9*x(4)<=0;
x(2)-9*x(3)<=0;
x(2)-9*x(4)<=0;
x(3)-9*x(4)<=0;
%(2) for 1/9<=x(i)/x(j), i,j=1,2,3,4:
1/9*x(2)-x(1)<=0;
1/9*x(3)-x(1)<=0;
1/9*x(4)-x(1)<=0;
1/9*x(3)-x(2)<=0;
1/9*x(4)-x(2)<=0;
1/9*x(4)-x(3)<=0;

Accepted Answer

Jon
Jon on 6 Jan 2023
Here is one approach
% function to be minimized
fun = @(x)x(1)^2 + 3*x(2)/x(3) - x(4)^2 ;
%initial value
x0=ones(1,4);
%bound limits
lb=0.0001*ones(1,4); % lower bound as x(i)>0
ub=[]; %no upper bound
% normalize x inside fmincon as x(1)+...+x(4) = 1
Aeq = ones(1,4);
beq = 1;
% using Matlab's fmincon
x = fmincon(fun,x0,[],[],Aeq,beq,lb,ub,@mycon)
function [c,ceq] = mycon(x)
% compute nonlinear inequality constraints
c = zeros(12,1); % preallocate
k = 0;
for i = 1:3
for j = i+1:4
k = k+1;
c(k) = 1/9 - x(i)/x(j);
c(k+6) = x(i)/x(j) - 9;
end
end
% compute nonlinear equality constraints at x.
ceq = []; % no nonlinear equality constraints
end
  6 Comments
Jon
Jon on 6 Jan 2023
Thanks @John D'Errico for reinforcing that point. This is an interesting case, because at first glance the constraints are non-linear, but with the additional constraint that the x's are all positive you can multiply through (without the possibility of a reversal in the direction of the inequality) to clear the denominator and obtain the linear constraints.

Sign in to comment.

More Answers (0)

Categories

Find more on Get Started with Optimization Toolbox in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!