fmincon get the wrong answer

조회 수: 1 (최근 30일)
encieh baqeri
encieh baqeri 2024년 5월 12일
편집: Torsten 2024년 5월 14일
i have a optimization problem that fmincon get the wrong answer, there are a demand power(2) that can be generate or buy with different price, the codes are as follow:
a = 0.005;
b = 6;
c = 100;
% Define the cost function for generating energy (quadratic cost function) for the current microgrid
Cg_i = @(Ec, a, b, c) a * Ec^2 + b * Ec + c;
% Given prices
prices = [33, 26];
mprice = 27; % Given value of mprice
% Define the cost function for buying energy
Cb_i = @(Ec, price) price * Ec;
% Given total energy constraint
Ec_total = 2; % Given value of Ec_total
% Define the objective function
objective = @(X) Cg_i(X(1), a, b, c) + Cb_i(X(2), prices(1)) + Cb_i(X(3), prices(2)) + Cb_i(X(4), mprice);
% Initial guess for Ec_g, Ec1, Ec2
initial_guess = [Ec_total / 3, Ec_total / 3, Ec_total / 3, Ec_total / 3];
% initial_guess = [0, 0, Ec_total, 0];
% Linear equality constraint for the sum of Ec_g, Ec1, Ec2
Aeq = [1, 1, 1, 1];
beq = Ec_total;
% Options for fmincon
options = optimoptions('fmincon', 'Display', 'iter');
% Define solver options
% Call fmincon with specified options
X = fmincon(objective, initial_guess, [], [], Aeq, beq, [0, 0, 0,0], [], [], options)
First-order Norm of Iter F-count f(x) Feasibility optimality step 0 5 1.613356e+02 6.667e-01 1.700e+01 1 10 1.244878e+02 5.104e-01 1.585e+01 1.761e+00 2 15 1.175907e+02 4.127e-01 6.932e-01 2.443e-01 3 20 1.122426e+02 1.234e-03 1.529e-01 3.250e-01 4 25 1.120220e+02 2.220e-16 3.175e-03 1.134e-02 5 30 1.120200e+02 0.000e+00 5.612e-06 1.112e-04 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 = 1x4
2.0000 0.0000 0.0000 0.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
the matlab answer is X=[2 0 0 0]; that means generat 2 and no buy, that obviously is wrong because cost of buy with price 26 is 26*2=52 while generating cost is 112!

채택된 답변

Torsten
Torsten 2024년 5월 12일
편집: Torsten 2024년 5월 12일
Cost of buy with price 26 is 2*26 + c = 152 in your setting. Note that although you don't generate energy, Cg_i(0,a,b,c) = c - thus you always add c to the cost of buying energy which obviously is not correct. Or do you want to treat c as fixed costs that always have to be paid - independent of whether energy is generated or not ?
  댓글 수: 3
Torsten
Torsten 2024년 5월 13일
편집: Torsten 2024년 5월 14일
One way is to use "ga": it can handle discontinuous objective functions:
rng("default")
a = 0.005;
b = 6;
c = 100;
% Define the cost function for generating energy (quadratic cost function) for the current microgrid
Cg_i = @(Ec, a, b, c) (a * Ec^2 + b * Ec + c)*(Ec>0);
% Given prices
prices = [33, 26];
mprice = 27; % Given value of mprice
% Define the cost function for buying energy
Cb_i = @(Ec, price) price * Ec;
% Given total energy constraint
Ec_total = 2; % Given value of Ec_total
% Define the objective function
objective = @(X) Cg_i(X(1), a, b, c) + Cb_i(X(2), prices(1)) + Cb_i(X(3), prices(2)) + Cb_i(X(4), mprice);
% Initial guess for Ec_g, Ec1, Ec2
initial_guess = [Ec_total / 3, Ec_total / 3, Ec_total / 3, Ec_total / 3];
% initial_guess = [0, 0, Ec_total, 0];
% Linear equality constraint for the sum of Ec_g, Ec1, Ec2
Aeq = [1, 1, 1, 1];
beq = Ec_total;
X = ga(objective,4,[],[],Aeq,beq,zeros(4,1),inf(4,1))
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
X = 1x4
0 0.0000 2.0000 0.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
objective(X)
ans = 52.0000
Torsten
Torsten 2024년 5월 14일
편집: Torsten 2024년 5월 14일
Maybe somebody sees the problem - I don't know why "fmincon" has to shift the initial guess to [1 1 2 1] . In my opinion, [0 0 2 0] as given should satisfy lower and upper bounds as well as the linear equality constraint.
% Given total energy constraint
Ec_total = 2; % Given value of Ec_total
% Initial guess for Ec_g, Ec1, Ec2
initial_guess = [0, 0, Ec_total, 0];
% Linear equality constraint for the sum of Ec_g, Ec1, Ec2
Aeq = [1, 1, 1, 1];
beq = Ec_total;
% Options for fmincon
options = optimoptions('fmincon', 'Display', 'iter');
% Define solver options
% Call fmincon with specified options
[X,fval,flag] = fmincon(@objective, initial_guess, [], [], Aeq, beq, zeros(1,4), inf(1,4), [], options)
Initial point X0 is not between bounds LB and UB; FMINCON shifted X0 to strictly satisfy the bounds.
X = 1x4
0.9900 0.9900 2.0000 0.9900
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
0.9900 0.9900 2.0000 0.9900
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
0.9900 0.9900 2.0000 0.9900
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
0.9900 0.9900 2.0000 0.9900
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
0.9900 0.9900 2.0000 0.9900
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
First-order Norm of Iter F-count f(x) Feasibility optimality step 0 5 2.173449e+02 2.970e+00 1.739e+01
X = 1x4
3.8590 0.2305 0.0100 0.0220
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
3.8590 0.2305 0.0100 0.0220
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
3.8590 0.2305 0.0100 0.0220
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
3.8590 0.2305 0.0100 0.0220
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
3.8590 0.2305 0.0100 0.0220
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
1 10 1.316905e+02 2.122e+00 1.666e+01 3.702e+00
X = 1x4
3.8050 0.1582 0.0001 0.0112
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
3.8050 0.1582 0.0001 0.0112
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
3.8050 0.1582 0.0001 0.0112
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
3.8050 0.1582 0.0001 0.0112
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
3.8050 0.1582 0.0001 0.0112
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
2 15 1.284243e+02 1.974e+00 1.087e+00 9.153e-02
X = 1x4
2.0519 0.0008 0.0048 0.0049
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
2.0519 0.0008 0.0048 0.0049
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
2.0519 0.0008 0.0048 0.0049
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
2.0519 0.0008 0.0048 0.0049
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
2.0519 0.0008 0.0048 0.0049
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
3 20 1.126136e+02 6.233e-02 5.803e-01 1.760e+00
X = 1x4
1.9972 0.0007 0.0010 0.0010
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
1.9972 0.0007 0.0010 0.0010
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
1.9972 0.0007 0.0010 0.0010
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
1.9972 0.0007 0.0010 0.0010
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
1.9972 0.0007 0.0010 0.0010
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
4 25 1.120824e+02 1.110e-15 1.078e-02 5.499e-02
X = 1x4
2.0000 0.0000 0.0000 0.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
2.0000 0.0000 0.0000 0.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
2.0000 0.0000 0.0000 0.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
2.0000 0.0000 0.0000 0.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
2.0000 0.0000 0.0000 0.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
5 30 1.120206e+02 2.220e-16 6.481e-04 3.221e-03
X = 1x4
2.0000 0.0000 0.0000 0.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
2.0000 0.0000 0.0000 0.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
2.0000 0.0000 0.0000 0.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
2.0000 0.0000 0.0000 0.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
X = 1x4
2.0000 0.0000 0.0000 0.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
6 35 1.120200e+02 0.000e+00 9.988e-07 3.269e-05 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 = 1x4
2.0000 0.0000 0.0000 0.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
fval = 112.0200
flag = 1
objective(X)
X = 1x4
2.0000 0.0000 0.0000 0.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
ans = 112.0200
function value = objective(X)
X
a = 0.005;
b = 6;
c = 100;
% Define the cost function for generating energy (quadratic cost function) for the current microgrid
Cg_i = @(Ec, a, b, c) a * Ec^2 + b * Ec + c;
% Given prices
prices = [33, 26];
mprice = 27; % Given value of mprice
% Define the cost function for buying energy
Cb_i = @(Ec, price) price * Ec;
% Define the objective function
value = Cg_i(X(1), a, b, c) + Cb_i(X(2), prices(1)) + Cb_i(X(3), prices(2)) + Cb_i(X(4), mprice);
end

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

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Surrogate Optimization에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by