适用平台/参考文献:Matlab+Yalmip+Cplex/Gurobi;
参考文献:中国电机工程学报首发论文《平抑风电波动的电-氢混合储能容量优化配置》
程序首先利用EMD将原始风电功率信号分解为直接并网分量和混合储能系统(HESS)功率任务;然后,在电化学储能和氢储能的充放电功率约束和存储状态约束的基础上,制定计及碱性电解槽运行特性的能量管理策略;基于此策略,建立以HESS的总成本最小为目标函数,用于平抑风电波动的HESS容量配置模型;最后利用遗传算法求解得到配置结果。程序中算例丰富、注释清晰、干货满满,超级精品,创新性很高!下面对文章和程序做简要介绍!
程序创新点:
提出以氢储能为主,电化学储能为辅的混合储能系统能量管理策略;
采用K-means算法对某区域全年风电数据进行聚类,得到8个风电出力场景;
充分挖掘碱性电解槽运行特性,通过强化电化学储能和氢储能之间的互补机制,应对碱性电解槽的低功率运行问题;
主要工作:
针对电-氢混合系统协同平抑接入新型电力系统的新能源波动问题,提出考虑碱性电解槽运行特性的电-氢混合储能容量优化配置方案。首先基于经验模态分解,将原始风电功率信号分解为符合波动量限值的直接并网分量和混合储能功率任务;在综合考虑电化学储能和氢储能介质充放电功率约束和存储状态约束的基础上,制定计及碱性电解槽运行特性的混合储能能量管理策略。基于此策略,以综合成本最小为目标,建立用于平抑风电波动的电-氢混合储能容量配置模型,并通过实际数据进行计算分析,算例结果表明,所提策略下的容量配置方案,在满足平抑需求的前提下,可以有效提高系统经济性。
经验模态分解(EMD):
EMD其实就是一种对信号进行分解的方法,与傅里叶变换、小波变换的核心思想一致,大家都想将信号分解为各个相互独立的成分的叠加;只不过傅里叶变换以及小波变换都要求要有基函数,而EMD却完全抛开了基函数的束缚,仅仅依据数据自身的时间尺度特征来进行信号分解,具备自适应性。由于无需基函数,EMD几乎可以用于任何类型信号的分解,尤其是在非线性、非平稳信号的分解上具有明显的优势。
EMD的目的是将信号分解为多个本征模函数(IMF)的叠加。IMF必需要满足以下两个条件:
(1)函数在整个时间范围内,局部极值点和过零点的数目必须相等,或最多相差一个;
(2)在任意时刻点,局部最大值的包络(上包络线)和局部最小值的包络(下包络线) 平均必须为零。
碱性电解槽:
碱性电解水制氢是指在碱性电解质环境下进行电解水制氢的过程,电解质一般为30%质量浓度的KOH溶液或者26%质量浓度的NaOH溶液。在这种电解槽中,水分子在阳极分解为氧气和负离子,负离子随后通过电解质迁移到阴极,在那里结合以产生氢气。碱性电解槽主要优点是成本低、操作简便。然而,它们的效率相对较低,并且在较高温度下可能会失效。
混合储能框架:
程序结果:
(1)生成全年级风电出力数据
(2)生成K-means聚类风电典型场景
(3)不同波动量限值下并网功率与平抑功率结果
(4)计算并网波动功率限值下的典型日平抑需求
(5)超级电容容量配置与改进
改进前:
改进后:
部分程序:
P_Wind1=P_Wind1'/max(P_Wind1)*2348*0.65; %MW 最大出力按照容量的0.65折算
plot(P_Wind1);xlabel('时刻/min'); ylabel('功率/MW');
title('风电分度值出力');
%%将风电钟分度值的出力折算成15min的
P_Wind15 = zeros(1,30*24*4);
for i = 1:30*24*4
P_Wind15(1,i) = sum(P_Wind1(1,15*i-14:15*i))/15;
plot(P_Wind15);
xlabel('时刻/min'); ylabel('功率/MW');
title('5月份某月风电15分钟分度值的出力');
%% 将不同时间级别相比的波动值画出来
P_Wind15_1 = zeros(1,30*24*60);
for i = 1:30*24*4
P_Wind15_1(1,15*i-14:15*i) = P_Wind15(1,i);
P_Wind1_bodong = P_Wind1(1,1:43200)-P_Wind15_1;
plot(P_Wind1_bodong);
xlabel('时刻/min'); ylabel('功率/MW');
title('1min相对于15min的风电出力波动');
%%引入另一个15min分度值的的风电出力数据
load('风电全年出力数据15min');
P_WindY15 = sum(Wind_Power,1);
P_WindY15 = P_WindY15/max(P_WindY15)*2348*0.65; %MW最大出力按照容量的0.65折算
%% 将15min扩充为1min
for i = 1:35040P_WindY1(1,15*i-14:15*i) = P_WindY15(1,i);
plot(P_WindY1);xlabel('时刻/15min'); ylabel('功率/MW');
title('全年15min的风电出力');
%% 引入风电出力1min的波动量
P_Wind_bodong365_1 =repmat(P_Wind1_bodong,1,13);
%% 将这个波动量加在年15min运行数据上
P_WindY1 = P_WindY1+P_Wind_bodong365_1(1,1:525600);
P_WindY1 = max(0,P_WindY1);
plot(P_WindY1);xlabel('时刻/1min');
ylabel('功率/MW'); title('全年1min的风电出力');
save('WindY1.mat','WindY1');%保存min数据
P_WindY5 = zeros(1,365*24*12);
for i = 1:365*24*12
P_WindY5(1,i)=sum(P_WindY1(1,5*i-4:5*i))/5;
save('WindY5.mat','WindY5');%保存15min数据
欢迎感兴趣的小伙伴关注,小编会不定期更新高质量的学习资料、文章和程序代码,为您的科研加油助力!