Help in understanding optimization problems and solving them in Matlab (choise of appropriate solver)

3 vues (au cours des 30 derniers jours)
Hello
Maybe a classical phrase: I have been trying to understand this since several days but not succeed - really about me!
Lets take a simple constrained optimization problem from here maximazing revenu with bubget constraints. So the problem is
We can solve it in Matlab with fmincon
objective = @(x) -200*x(1)^(2/3)*x(2)^(1/3);
[X,FVAL,EXITFLAG,OUTPUT,LAMBDA,GRAD,HESSIAN] = fmincon(objective,[1,1],[],[],[20, 170],20000,[],[],[])
>> X =
666.6669 39.2157
LAMBDA =
struct with fields:
eqlin: 2.5927
OR we can use Lagrangian cost function and rewrite these to unconstrained optimization problem (Am I right at this stage?)
Then solving this objective function with fminsearch or fminunc (even tried with ga)
lambda = 2.5927;
>> objective = @(x) -200*x(1)^(2/3)*x(2)^(1/3)-lambda*(20*x(1) + 170*x(2) - 20000);
x = fminuncfminunc(objective,[1, 1])
>> Problem appears unbounded.
fminunc stopped because the objective function value is less than
or equal to the value of the objective function limit.
<stopping criteria details>
x =
1.0e+19 *
0.2504 6.4423
>> x = fminsearch(objective,[1, 1])
Exiting: Maximum number of function evaluations has been exceeded
- increase MaxFunEvals option.
Current function value: -51855.290146
x =
0.1088 1.7458
gives different results and even not close to constrained solution with fmincon. I tried to change the sign, put lambda = 1....
So why its like this, where I am wrong or I dont understand something?

Réponse acceptée

Matt J
Matt J le 17 Mai 2019
Modifié(e) : Matt J le 17 Mai 2019
You have to reformulate the problem with a convex objective to be certain that the Lagrangian minimization will behave as you're expecting (see Sufficient Conditions for Strong Duality). You can do this as follows:
objective = @(x) -2/3*log(x(1))-1/3*log(x(2));
[Xcon,FVAL,EXITFLAG,OUTPUT,LAMBDA,GRAD,HESSIAN] = fmincon(objective,[1,1],[],[],[20, 170],20000,[],[],[])
objectiveUC = @(x) -2/3*log(x(1))-1/3*log(x(2))+LAMBDA.eqlin*(20*x(1) + 170*x(2) - 20000);
Xunc = fminunc(objectiveUC,[1, 1])
This leads to
Xcon =
666.6664 39.2157
Xunc =
666.6533 39.2154
  3 commentaires
Yurii Iotov
Yurii Iotov le 20 Mai 2019
And Matt, please, what I dont understand also is why with these 3 different objective functions
"original"
objective_1 = @(x) -200*x(1)^(2/3)*x(2)^(1/3);
you showed me
objective_2 = @(x) -2/3*log(x(1))-1/3*log(x(2));
and with 200 term
objective = @(x) (-2/3*log(x(1))-1/3*log(x(2)))*200;
with constrained optimization:
[Xcon,FVAL,EXITFLAG,OUTPUT,LAMBDA,GRAD,HESSIAN] = fmincon(objective,[1,1],[],[],[20, 170],20000,[],[],[])
...Gives the same solution for Xcon, but others are differ, especially LAMBDA in wich I am also interested for results interpretation?
it blows my brain a little bit!
Is it because objective_1 and objective_2 have duality property?
And term 200 in objective is just a csaling factor?
...I feel I have some gaps in math...
Matt J
Matt J le 20 Mai 2019
All 3 objectives differ by monotonic transformations, e.g.,
objective_2=-log(-objective_1/200)
is a monotonic function of objective_1. Therefore if one increases or decreases, so does the other, and they therefore have minima at the same locations.

Connectez-vous pour commenter.

Plus de réponses (0)

Community Treasure Hunt

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

Start Hunting!

Translated by