Minimizing a function using fmincon with special constraints and intervals
17 views (last 30 days)
Show older comments
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/9 <=x(i)/x(j)<=9, for i,j=1,2,3,4 by considering i<j.
- x(1) + x(2) + x(3) + x(4) = 1;
- 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)
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;
0 Comments
Accepted Answer
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
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.
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!