Minimizing a function using fmincon with special constraints and intervals

조회 수: 25 (최근 30일)
HAT
HAT 2023년 1월 6일
편집: HAT 2023년 1월 6일
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;

채택된 답변

Jon
Jon 2023년 1월 6일
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
Jon
Jon 2023년 1월 6일
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.
HAT
HAT 2023년 1월 6일
편집: HAT 2023년 1월 6일
Thank you all very much. It helps a lot.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Get Started with Optimization Toolbox에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by