Trans论文复现:基于模型预测控制的微网两阶段储能优化调度程序代码!~

本程序主要参考论文《A Two-layer Energy Management System for Microgrids with Hybrid Energy Storage considering Degradation Costs》,文中包含模型预测控制算法,微电网优化调度模型,储能优化调度和损耗成本模型,下面对文章和程序作简要介绍。

Trans论文复现:基于模型预测控制的微网两阶段储能优化调度程序代码!~_第1张图片

提出了一种由电池和超级电容器组成的混合ESS微电网双层预测能量管理系统。结合混合ESS在充电深度和寿命方面的退化成本,对电池和超级电容器的长期成本进行建模,并将其转化为与实时操作相关的短期成本。为了在最低运行成本下保持较高的系统鲁棒性,提出了一种分层调度模型来确定短时间范围内微电网的调度出力,其中上层EMS使总运行成本最小化,下层EMS消除了预测误差引起的波动。

程序组成:程序文件包含多个文件夹,复现过程非常详细,注释清晰易于理解!

Trans论文复现:基于模型预测控制的微网两阶段储能优化调度程序代码!~_第2张图片

程序结果:

Trans论文复现:基于模型预测控制的微网两阶段储能优化调度程序代码!~_第3张图片

Trans论文复现:基于模型预测控制的微网两阶段储能优化调度程序代码!~_第4张图片

Trans论文复现:基于模型预测控制的微网两阶段储能优化调度程序代码!~_第5张图片

限于篇幅,还有部分结果图片没有列出!!!

部分程序:

%% Initialization
global fst_output_data ;
global snd_output_data ;
fst_output_data = [];
snd_output_data = [];
fst = fcnSetStageParam('fst');
snd = fcnSetStageParam('snd');

%import datasets
fprintf('Import data....');
importDataTic = tic;
mpcdata = fcnImportData('data/data_all.csv','data/price_seq_RT.csv');
pv_5m_data_all = xlsread('data/pv_5m_5percent.xlsx');
wind_5m_data_all = xlsread('data/wind_5m_5percent.xlsx');
importDataTic = toc(importDataTic);
fprintf('Finish. Time: %4fs\n', importDataTic);
clearvars importDataTic;

% Step (2) of the Nonlinear MPC algorithm:
options = fcnChooseOption(opt_option, tol_opt, fst.u0);


%% Start iteration: first layer
fst.mpciter = 0; % Iteration index
while( fst.mpciter < fst.iter )
    % Read data
    fst.load = mpcdata.load(fst.mpciter+1:fst.mpciter+fst.horizon,:);
    fst.PV = mpcdata.PV(fst.mpciter+1:fst.mpciter+fst.horizon,:);
    fst.wind = mpcdata.wind(fst.mpciter+1:fst.mpciter+fst.horizon,:);
    fst.price = mpcdata.price(fst.mpciter+1:fst.mpciter+fst.horizon,:);
    % FIRST mpc calculation
    tic
    [fst.f_dyn, fst.x_dyn, fst.u_dyn] = fst_mpc( fst, fst_output_data );
    toc
    
%Second Layer Initialization
    snd.pv_all = [];
    snd.load_all = [];
    snd.price_all = [];
    snd.u0_ref = [];

    if snd.flag == 0 % initial state of supercap
        snd.xmeasure = [fst.x_dyn(1,:),50]; 
    else
        snd.xmeasure = [fst.x_dyn(1,:),snd.xmeasure(1,3)];
    end
        
    for i = 1:1:snd.from_fst %take care the value of MPCITER
        snd.load_all = [snd.load_all ; repmat(mpcdata.load(fst.mpciter+i),snd.iter,1)];
        snd.price_all = [snd.price_all;repmat(mpcdata.price(fst.mpciter+i), snd.iter,1)];
        snd.u0_ref = [snd.u0_ref, repmat([ fst.u_dyn(:,i);0],1,snd.iter)]; % reference of variables in snd layer  
    end

    snd.u0 = snd.u0_ref(:,1:snd.horizon);

    %% Start iteration: second layer
    snd.mpciter = 0; %iteration Index 
    snd.option = options;
    while (snd.mpciter < snd.iter)
        % data changed in every 5 min
        snd.PV = pv_5m_data_all(snd.mpciter+1+12*fst.mpciter, 1:12)';
        snd.wind = wind_5m_data_all(snd.mpciter+1+12*fst.mpciter, 1:12)';
        % data not changed in every 5 min
        snd.load = snd.load_all(snd.mpciter+1:snd.mpciter+snd.horizon,:);
        snd.price = snd.price_all(snd.mpciter+1:snd.mpciter+snd.horizon,:);
        %%
        %SECOND mpc calculation
        [snd.f_dyn, snd.x_dyn, snd.u_dyn] = snd_mpc( snd, snd_output_data );

        %Next iteration:
        snd.u0 = shiftHorizon(snd.u_dyn); %Estimated control variables
        snd.xmeasure = snd.x_dyn(2,:);
        snd.mpciter = snd.mpciter+1;
        
        snd.x = [ snd.x; snd.x_dyn(1,:) ];
        snd.u = [ snd.u; snd.u_dyn(:,1)' ];
    end

以上就是本次介绍的主要内容,欢迎感兴趣的小伙伴关注下方公众号获得完整版代码,小编会继续推送更有质量的学习资料、文章和程序代码~

Trans论文复现:基于模型预测控制的微网两阶段储能优化调度程序代码!~_第6张图片

你可能感兴趣的:(matlab,算法)