fmincon--How to use multivariable optimization

조회 수: 25 (최근 30일)
Young
Young 2022년 3월 2일
댓글: Matt J 2022년 3월 3일
Hi, I am using 3 or 4 variables to get the min or max of one function
But I cannot get the right answer, I don't know why,could anyone help me solve this problem?
fun=@(x)(x(1)+x(2)+x(3)).*x(2)./(x(1).*(x(2)-x(3)));
lb = [10,10,10];
ub = [100,100,100] ;
x0 = [10,50,100]; % Starting guess at the solution
[x1,fval] = fmincon(fun,x0,[],[],[],[],lb,ub);
Local minimum possible. Constraints satisfied. fmincon stopped because the size of the current step is less than the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance.
xmax2 = x1(1)
xmax2 = 10.0036
ymax2 = x1(2)
ymax2 = 84.8926
zmax2 = x1(3)
zmax2 = 84.8926
max = fval
max = -2.7102e+11
First of all ,how to add the constraint of X(2) =/(unequal) X(3)?
Second, the right answer is
x = 10 99 100
f =-2.0691e+03
How to get it ? Thank you!!!
  댓글 수: 3
Young
Young 2022년 3월 2일
I think they are the different algorithm do you mind explain why?
Torsten
Torsten 2022년 3월 2일
편집: Torsten 2022년 3월 2일
"fmincon" does not support solution variables that are integers. It will treat each variable as real-valued.
Is it this what you wanted to know ( since I can't understand exactly what you are asking) ?

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

답변 (2개)

Walter Roberson
Walter Roberson 2022년 3월 2일
You would need to use a non-linear constraint to force that x2 ~= x3
However... by examination we can see that if x(2)-x(3) is negative then you are dividing by a negative and the result would be negative. The other terms are all positive or sums of positive, so getting a negative expression due to x(2)-x(3) being negative is going to give you a result that is less positive than any possible answer when x(2)>x(3) .
That tells us that you would be better off constraining x(2)<x(3) . Which is something you can implement as a linear constraint:
A = [0 1 -1]
b = -eps(realmin)
Here, b is the first representable number that is less than 0. You do not use 0 itself because the test is A*x.' <= b and in the case of the two being equal, 1*x(2)+-1*x(3) would be exactly 0 and you do not want 0 as an allowed outcome.
  댓글 수: 2
Young
Young 2022년 3월 3일
Hi Walter, thank you
I tried ga to solve this problem, here is another question, Could I get multi objectives with multi variables using fmincon?
I search the solution, fminmax is utlized instead of fmincon.
Are there any examples?
Walter Roberson
Walter Roberson 2022년 3월 3일
Single objective only for fmincon.

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


Matt J
Matt J 2022년 3월 2일
편집: Matt J 2022년 3월 2일
For such a small number of variables, this is very easy to do with a discrete exhaustive search. Here, I use ndgridVecs (download here) instead of ndgrid to save memory.
lb = [10,10,10];
ub = [100,100,100] ;
ranges=arrayfun(@(a,b)a:b, lb,ub,'uni',0);
[x1,x2,x3]=ndgridVecs(ranges{:});
F=(x1+x2+x3).*x2./(x1.*(x2-x3));
[fval,imin]=min(F(:));
[i,j,k]=ind2sub(size(F),imin);
x1=x1(i),
x1 = 10
x2=x2(j),
x2 = 99
x3=x3(k)
x3 = 100
fval,
fval = -2.0691e+03
  댓글 수: 3
Walter Roberson
Walter Roberson 2022년 3월 3일
No, fmincon can use a vector of unknown values, but it cannot do multiple objectives.
Matt J
Matt J 2022년 3월 3일
@Young, what is the status of your original question? Has it been addressed by either my answer or Walter's. If so, please Accept-click the appropriate answer and post your new question in a new thread.
However, for multi-objective problems you could look at either fgoalattain , paretosearch, or gamultiobj.

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

제품


릴리스

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by