👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆下载资源链接👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆
《《《《《《《《更多资源还请持续关注本专栏》》》》》》》
论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html
论文可参考《Collaborative Autonomous Optimization of Interconnected Multi-Energy Systems with Two-Stage Transactive Control Framework》
代码主要做的是一个多能源微网的优化调度问题,首先对于下层多能源微网模型,考虑以其最小化运行成本为目标函数,通过多时间尺度滚动优化求解其最优调度策略,对于上层模型,考虑运营商以最小化运营成本为目标函数,同时考虑变压器过载等问题,构建了一个两阶段优化模型,通过互补松弛条件以及KKT条件,对模型进行了化简求解。
部分代码展示:
%%文章复现《Collaborative Autonomous Optimization of Interconnected Multi-Energy
%%Systems with Two-Stage Transactive Control Framework》
%%全时段的优化问题,与single_temporal比较
%全时段的优化问题,与single_temporal比较
%次梯度法求解
% 用于日前预测或日内作为对比
global EH1 EH2 EH3 elePrice period couldExport minimumPower
delta_lambda_max = 1e-4;
maxIteration = 3000; %最大迭代次数
iterativeStep = 1;
ee = 0.001;
%%按照不同的输出场景,选择不同的约束
if couldExport == 1
minimumPower = eleLimit_total(2);
else
minimumPower = 0;
end
if isDA
%%获取不同IES的参数值
EH1.predict(0);
EH2.predict(0);
EH3.predict(0);
priceArray_record(:,1) = elePrice;
prePrice = elePrice;
temporal = 1;
st = 1;
else
temporal = 24* period;%%确定为24h的算例
st = time;
end
for pt = st : temporal
if isDA == 0
%%获取不同IES的参数值
EH1.predict(pt);
EH2.predict(pt);
EH3.predict(pt);
end
number = 1; k = 1;
lamda_old = -10 * ones(24 * period - pt + 1, 1);
lamda_new = zeros(24 * period - pt + 1, 1); %取初始值:对预测电价没有偏差
lamda_record = zeros(24 * period - pt + 1 , maxIteration + 1);
lamda_record(: , number) = lamda_new;
max_balance=zeros (1 , maxIteration + 1);
%如果前后两次价格的偏差太大,则返回第1步
while number <= 2 || max(abs(balanceDemand)) > 100
% max(abs(lamda_new - lamda_old)) > ee || %| max(abs(clearDemand_new - clearDemand_old)) > 1e-4 %1e-6, 不能直接取0
% 后一个条件是因为即使lamda收敛后,供需也不平衡,所以需要取一正一负两个点,来求零点
% && || 的前一个为否,则后一个就不计算了
% 要求至少迭代两次(number=1,2)
% if number > maxIteration
% error('超出最大迭代次数');
% end
if number > 1% number=2时才记录第一次
clearDemand_old = clearDemand_new;
end
%%依次根据priceArray, gasPrice1, pt三个输入值计算优化结果以及响应结果
[x1,f1,~,~,~] = EH1.handlePrice(priceArray, gasPrice1, pt);
%根据priceArray, gasPrice1, pt三个输入值计算EH1优化结果以及响应结果
clearDemand_EH1_new = x1(1: 24 * period - pt + 1);
%根据priceArray, gasPrice1, pt三个输入值计算EH2优化结果以及响应结果
[x2,f2,~,~,~] = EH2.handlePrice(priceArray, gasPrice1, pt);
%根据priceArray, gasPrice1, pt三个输入值计算EH2优化结果以及响应结果
clearDemand_EH2_new = x2(1: 24 * period - pt + 1);
%根据priceArray, gasPrice1, pt三个输入值计算EH3优化结果以及响应结果
[x3,f3,~,~,~] = EH3.handlePrice(priceArray, gasPrice1, pt);
clearDemand_EH3_new = x3(1: 24 * period - pt + 1);
%%根据lamda_new(i)的取值,计算不同情况下的电网侧出清结果(上层)
clearDemand_grid_new=zeros(24 * period - pt + 1 ,1);
for i = 1: 24 * period - pt + 1
if lamda_new(i) == 0
clearDemand_grid_new(i) = clearDemand_EH1_new(i) + clearDemand_EH2_new(i) + clearDemand_EH3_new(i) - EH_res_total(pt + i - 1);
if clearDemand_grid_new(i) > eleLimit_total(1)
clearDemand_grid_new(i) = eleLimit_total(1);
end
%%按照minimumPower的大小进行计算
if clearDemand_grid_new(i) < minimumPower
clearDemand_grid_new(i) = minimumPower;
end
elseif lamda_new(i) > 0
clearDemand_grid_new(i) = eleLimit_total(1);
else
clearDemand_grid_new(i) = minimumPower;
end
end
%%根据lamda_new(i)的取值,计算不同情况下的需求侧出清结果(下层)
clearDemand_new = [-clearDemand_grid_new, clearDemand_EH1_new , clearDemand_EH2_new , clearDemand_EH3_new, - EH_res_total] ;
phi(number) = f1 + f2 + f3 - lamda_new'* clearDemand_grid_new;
if number == 1
balanceDemand = sum(clearDemand_new, 2) ;%%更新平衡需求电量
balanceDemand_reocrd(:,1) = balanceDemand;%%更新平衡需求电量
lamda_record(: , 1) = lamda_new;
step_record(1) = step;
price_record(:,1) = priceArray;%%更新平衡价格
delta_lambda = balanceDemand .* iterativeStep /sqrt(sum(balanceDemand.^2)) ;%%计算新的平衡价格
step = iterativeStep;
lamda_old = lamda_new;
lamda_new = lamda_old + delta_lambda;%%叠加计算
number = 2;
elseif phi(number) - phi(number-1) > -1
balanceDemand_reocrd(:,number) = balanceDemand;%%更新平衡需求电量
lamda_record(: , number) = lamda_new;%%更新平衡需求电量
step_record(number) = step;
price_record(:,number) = priceArray;
balanceDemand = sum(clearDemand_new, 2) ;
delta_lambda = balanceDemand .* iterativeStep /sqrt(sum(balanceDemand.^2)) ;;%%计算新的平衡价格
step = iterativeStep;
lamda_old = lamda_new;
lamda_new = lamda_old + delta_lambda;
if number> 5 && max(step_record(number-5: number))< 1e-3%%按照文中的要求讨论确定优化结果
break;
end
number = number + 1;
k = k + 1;
else
step = step / 2;
delta_lambda = balanceDemand .* step /sqrt(sum(balanceDemand.^2)) ;%%更新优化结果
lamda_new = lamda_old + delta_lambda;
k = k + 1;
end
%当前价格下的出力
priceArray(pt : 24* period) = prePrice(pt : 24* period) + lamda_new;
priceArray(priceArray>maxMarketPrice) =maxMarketPrice;
priceArray(priceArray<minMarketPrice) =minMarketPrice;
end
效果展示:
85号资源-源程序:论文可在知网下载《基于多时间尺度滚动优化的多能源微网双层调度模型》本人博客有解读资源-CSDN文库https://download.csdn.net/download/LIANG674027206/89205278👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆下载资源链接👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆
《《《《《《《《更多资源还请持续关注本专栏》》》》》》》
论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html