# Energy storage optimisation problem - separate charge and discharge constraint

16 ビュー (過去 30 日間)
hussain askar 2021 年 11 月 23 日
コメント済み: Iñigo Azpiri 2022 年 1 月 25 日
Hi
I'm currently working on an optimization problem to minimize the cost of energy dispatch where we have solar generation and energy storage system. My fmincon function is working, however after i added the constraints for the battery charging and discharging I'm getting an error :
Unable to perform assignment because value of type 'optim.problemdef.OptimizationExpression' is not convertible to 'double'.
Caused by:
Error using double
Conversion to double from optim.problemdef.OptimizationExpression is not possible.
Failure in initial nonlinear constraint function evaluation. FMINCON cannot continue.
I'm not sure what is causing the issue, any help would be great in fixing this.
options = optimoptions('fmincon',...
'Algorithm','sqp','Display', 'iter', 'ConstraintTolerance', 1e-10);
[p, C] = fmincon (@myfun, p0, [], [], [], [], lb, ub, @mycon, options);
% Cost Function that needs to be minimized..
function C = myfun (p)
C =0;
for t = 1:24
for i = 1:4
cost = ce(i) + b(i)*p(t,i) + a(i)*p(t,i)^2;
C = C + cost;
end
end
end
function [c, ceq] = mycon(p) % function [ceq] = mycon(p) in Octave
global Pd P_solar
N= 24;
dt = 1;
BattEnergy = 650;
Einit = 0.5 * BattEnergy;
Emax = 0.8*BattEnergy;
Emin = 0.2*BattEnergy;
Pch = optimvar('Pch',N,'LowerBound',0,'UpperBound',Emax);
Pdisch = optimvar('Pdisch',N,'LowerBound',0,'UpperBound',Emin);
c =0;
c1 =zeros(24,1);
c2 =zeros(24,1);
c3 =zeros(24,1);
c4 =zeros(24,1);
c5 =zeros(24,1);
c6 =zeros(24,1);
for t = 1:24
c1(t) = ( 0 - Pdisch(t));
c2(t) = ( Pdisch(t) - Pdischmax(t));
c3(t) = ( 0 - Pch(t));
c4(t) = ( Pch(t) - Pchmax(t));
c5(t) = Emin - (sum(Pch(t) - Pdisch(t)) * dt) ;
c6(t) = (sum(Pch(t) - Pdisch(t)) * dt) - Emax;
end
c = [c1;c2;c3;c4;c5;c6];
c=c(:);
ceq=0;
for t = 1:24
ceq1(t) = Pch(t) * Pdisch(t);
ceq2(t) = sum(Pch(t) - Pdisch(t)) * dt;
ceq3(t) = sum(p(t,:)) + Pdisch(t) - Pch(t) - Pd(t);
ceq = [ceq1;ceq2;ceq3];
ceq=ceq(:);
end
end
##### 1 件のコメント-1 件の古いコメントを表示-1 件の古いコメントを非表示
Iñigo Azpiri 2022 年 1 月 25 日
Dear Hussain,
Could you share the code with the solution you reached? I am also trying to solve a similar problem.
Thanks,
Iñigo

サインインしてコメントする。

### 採用された回答

Alan Weiss 2021 年 11 月 24 日
You are mixing up the problem-based and solver-based formulations. You need to choose one or the other. If you are using the solver-based formulation so that you can call fmincon, then do not create any optimization variables using optimvar. Alternatively, if you are using the problem-based formulation, do not call fmincon. In all cases, don't create optimization variables in the nonlinear constraint function. Create them, if they are needed, in the main workspace.
If you want to create your constraints using the problem-based formulation and then export to the solver-based, use prob2struct. But I think that you will be happier and more successful if you choose just one approach rather than a hybrid.
For documentation of the problem-based approach, see Problem-Based Optimization Workflow. For a simple example, see Solve a Constrained Nonlinear Problem, Problem-Based. For an example related to your application, see Optimal Dispatch of Power Generators: Problem-Based.
Good luck,
Alan Weiss
MATLAB mathematical toolbox documentation
##### 4 件のコメント2 件の古いコメントを表示2 件の古いコメントを非表示
hussain askar 2021 年 11 月 26 日
hey Alan,
Can you help me with this issue:
Pmin = -100; % Max Discharge Rate [W]
Pmax = 100; % Max Charge Rate [W]
PbattV = optimvar('PbattV',N,'LowerBound',Pmin,'UpperBound',Pmax);
I would like to introduce a new cost term in my objective function (cost function) so that when PbattV is positive (charging) between t=8:20 then there will be a cost.
I tried this:
for t = 8:20
if PbattV(t) >= 0
c5 = c5 + 300 * PbattV(t);
else
c5 = c5 + 0 * PbattV(t);
end
end
but i'm getting this error " Conversion to logical from optim.problemdef.OptimizationInequality is not possible." How can I solve this?
Alan Weiss 2021 年 11 月 26 日
Sorry, you are going to have to reformulate your if statements along the lines of Integer and Logical Modeling. This requires you to create binary variables and link them to your optimization variables. It takes some thought and possibly experimentation. Take it one step at a time, you'll be pleased with the results.
Alan Weiss
MATLAB mathematical toolbox documentation

サインインしてコメントする。

### カテゴリ

Help Center および File ExchangeGet Started with Optimization Toolbox についてさらに検索

R2021b

### Community Treasure Hunt

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

Start Hunting!

Translated by