适用平台:Matlab+Yalmip+Cplex

程序建立多区域互联双层优化模型来实现系统间的最优能源供应,采用滚动时间尺度优化来处理负荷和新能源的波动性。程序算例相当丰富、注释清晰、干货满满,可扩展性和创新性很高!码超所值!下面对文章和程序做简要介绍!

程序创新点:

1)对于每个能源系统的自优化调度,提出了一种凸理论和两个充分条件来松弛的互补约束,从而将问题公式化为凸模型;

2)为了协同优化互联能源系统,提出了一种保留每个能源系统隐私的双层框架,其中上层系统协调器和下层能源系统运行者互换激励/响应信号;

3)进一步建立了一种新的两阶段优化框架,以减少求解过程中的迭代次数,从而适用于日内滚动优化和实时优化。

主要工作:

基于多能源集成的优点,建立了一个基于内部控制的双层两阶段框架,以实现互联多能源系统之间的最优能源供应。在第一阶段,每个能源系统通过解决成本最小化问题自主确定其运行工况的最佳点,其中采用滚动时域优化来处理负载和可再生能源的随机特征。进一步实现了一种通过松弛互补约束来优化模型凸化的技术,其数学证明验证了放松的准确性。在第二阶段,协调负责最大限度地减少互联合能源系统的总成本,同时防止变压器过载。该协作问题在所提出的两阶段优化框架中迭代解决,该框架与操作时间要求兼容,同时保留每个能源系统的可扩展性、信息隐私和操作权限。通过仿真实例对协同自主优化机制进行了详细分析,验证了该框架的有效性。

主要框架:

程序模块详析:

电价出清模块:

%%定义出清电价函数
function clearPrice = clearing(demandArray, targetDemand) %一般targetDemand=0
global minMarketPrice maxMarketPrice step
leftIx = 1;rightIx = length(demandArray);
%demandArray是所有投标的聚合,且总是递减的
%测试1
if targetDemand > demandArray(leftIx)
%如果目标价格高于最高出价,则返回最低价格
clearPrice = minMarketPrice;
return % 使用return处理特殊情况
elseif targetDemand < demandArray(rightIx)
%如果目标价格低于最低出价,则返回最高价格
clearPrice = maxMarketPrice;
elseif targetDemand == demandArray(leftIx) %如果等于左端点,则右端点移到左端点

热网模块:

%%定义电储能以及热储能的等效参数
Aeq_ES = []; beq_ES = [];%%电储能等效参数
Aeq_HS = []; beq_HS = [];%%热储能等效参数
A1_Esoc = []; A2_Esoc = []; b1_Esoc = []; b2_Esoc = [];%%SOC等效参数
A1_Hsoc = []; A2_Hsoc = []; b1_Hsoc = []; b2_Hsoc = [];%%热储能SOC等效参数
if obj.ES_totalC ~= 0Aeq_ES = zeros(1, var);
A1_Esoc = zeros(time, var);b1_Esoc = zeros(time, 1);
b2_Esoc = zeros(time, 1);
%电、热储能平衡性约束
beq_ES = - (obj.ES_targetSOC - obj.ES_SOC(t_current) * obj.ES_selfd ^ time) * obj.ES_totalC;
for i=1:time
Aeq_ES(1, time * 3 + i) = obj.ES_selfd ^ (time - i) / obj.ES_eff; %放电
Aeq_ES(1, time * 4 + i) = - obj.ES_selfd ^ (time - i) * obj.ES_eff; %充电

气网模块:

% 气网特性
global gasPrice1 gasPrice3 % 不需要全局变量吧
gasPrice1 = 0.334; % 3.3元每立方米换算后的值
gasPrice3 = 0.284; % 2.8元每立方米换算后的值
gasLimit1 = 1e6; %暂时不考虑回售天然气
gasLimit2 = 1e6;gasLimit3 = 1e6;

输电阻塞模块:

%%阻塞管理场景下,电价的出清结果,LP和MILP场景
clearingPrice = elePrice;
gridClearDemandP2 = - sum(result_Ele(:, 1 : 3), 2);%LP
gridClearDemandP1 = - sum(result_Ele(:, 4 : 6), 2);%MILP
需求响应模块:
% 最低价格,一般都是需求大于供给
%%这个部分是研究最低价格场景下,实际的调度策略
%%通常情况下该场景是需求大于供给,论文中的算例也有体现
priceArray(pt) = minMarketPrice;
[x,~,~,~,~] = EH1.handlePrice(priceArray, gasPrice1, pt);%IES1居民区的价格计算
clearDemand_minPrice_EH1 = x(1);
[x,~,~,~,~] = EH2.handlePrice(priceArray, gasPrice1, pt);%IES2居民区的价格计算
clearDemand_minPrice_EH2 = x(1);
[x,~,~,~,~] = EH3.handlePrice(priceArray, gasPrice1, pt);%IES3居民区的价格计算
clearDemand_minPrice_EH3 = x(1);
if priceArray(pt) == elePrice(pt)%电价相等的情况下需求响应电量的计算
elseif  priceArray(pt)>  elePrice(pt)%大于电价的情况下需求响应电量的计算
%%出清电价的计算同样按照论文中的来,在此不赘述

需求响应模块:

% 最低价格,一般都是需求大于供给
   %%这个部分是研究最低价格场景下,实际的调度策略
   %%通常情况下该场景是需求大于供给,论文中的算例也有体现
   priceArray(pt) = minMarketPrice;
   [x,~,~,~,~] = EH1.handlePrice(priceArray, gasPrice1, pt);%IES1居民区的价格计算
   clearDemand_minPrice_EH1 = x(1);
   [x,~,~,~,~] = EH2.handlePrice(priceArray, gasPrice1, pt);%IES2居民区的价格计算
   clearDemand_minPrice_EH2 = x(1);
   [x,~,~,~,~] = EH3.handlePrice(priceArray, gasPrice1, pt);%IES3居民区的价格计算
   clearDemand_minPrice_EH3 = x(1);
   if priceArray(pt) == elePrice(pt)%电价相等的情况下需求响应电量的计算
   elseif priceArray(pt)> elePrice(pt)%大于电价的情况下需求响应电量的计算

集中式/分布式滚动优化模块:

%2 集中式滚动优化%0 分布式滚动优化
global caseType couldExport
caseType = 2;%第二种算例场景
couldExport = 1;%出口设置为1
para_init;%程序初始化,请转到该程序;
off_grid = 0; % 0表示正常运行,1表示IES1离网
priceArray = elePrice;%价格赋值
priceArray_record = zeros( 24 * period , 3);
% 2-stage%日前优化isDA = 1;
% 次梯度法all_temporal;
%日内优化isDA = 0;
%单时段滚动求解% 二分法
single_temporal;isCentral = 0;

程序结果:

区域间能量交互结果:

区域自调度结果:

部分内容源自网络,侵权联系删除!

相当精品,物超所值!欢迎感兴趣的小伙伴关注并获取完整版代码,小编会不定期更新高质量的学习资料、文章和程序代码,为您的科研加油助力!

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐