目录
1 主要内容
程序主要复现《基于GA_BFGS算法的配电网故障恢复性重构研究_郑海广》,采用matlab编程软件实现,依据网络结构和DG供电方式对配电网进行孤岛划分,将含有 DG 的配电网拓扑结构看成一个树,搭建成连通图模型,使得将孤岛的划分变成了求取最小生成树,以网损和开关开断次数作为目标,采用 IEEE33 节点配电网为算例,通过遗传算法寻优计算,从而得到最佳的重构方案。
1.1 背景
当配电网系统发生系统故障由正常的运行状态进入故障状态运行时,一般的恢复性重构的做法是控制一些开关的通断来将故障线路断开,并将非故障线路重新恢复供电,当配电网中含有 DG 并网运行时,这种做法有可能会导致 DG被迫断开停止供电或者转为孤岛运行,只有等到电力系统的故障排除恢复正常后DG 才能重新接入电网运行,这种做法使得 DG 的利用率和供电能力大大降低,使得 DG 无法充分利用。所以当系统发生故障时,如何使 DG 能够充分的参与到网络的恢复性重构,而不是中断供电,对于提高 DG 的利用率和供电可靠性、降低系统中线路的有功损耗、提高系统的电能质量。
恢复重构目标:当配电系统发生系统故障时,具有独立供电能力的 DG 划为孤岛,使得失电负荷量尽可能最小;孤岛外的配电网可以通过控制开关的通断实现故障后的恢复。对孤岛外的配电网进行恢复性重构的过程中,需要检测岛外是否还有失电负荷,若有,则需要利用联络开关将其接入剩余的配电网中,若存在能够和主网相连接且不具有独立供电能力的 DG,将其接入主网,进行配电网重构。
1.2 流程图
2 部分代码
clear,clc,close all currentFolder = pwd; addpath(genpath(currentFolder));% 将matpower加入搜索路径 dgData.dgBus = [6 13 24 31]+1; dgData.bFlag = [0 1 1 1];% 是否具有独立供电能力 dgData.sFlag = [1 1 0 1];% 故障后能够与主网保持连接 dgData.cFlag = [1 1 1 1];% 是否具有控制调度中心保持通信的能力 dgData.factor = [0.85 0.9 0.8 0.9]; dgData.power = [700 500 1000 650]; netData = case33bw; disp('****************划分孤岛******************'); island = SetIsland(dgData,netData);% 设置孤岛 falutBranch = [28]; % falutBranch = [9 22];% 故障支路 disp('****************发生故障******************'); netData = RunIsland(netData,dgData,island,falutBranch);%根据故障确定实际孤岛 disp('****************恢复重构******************'); netData = Reconfig(netData);% 恢复重构 rmpath(genpath(currentFolder)); if nargin<1 dgBus = [6 13 24 31]+1; bFlag = [0 1 1 1];% 是否具有独立供电能力 sFlag = [0 0 1 0];% 故障后能够与主网保持连接 cFlag = [1 1 1 1];% 是否具有控制调度中心保持通信的能力 dgPower = [700 500 1000 650]; netData = case33bw; else dgBus = dgData.dgBus; bFlag = dgData.bFlag;% 是否具有独立供电能力 sFlag = dgData.sFlag;% 故障后能够与主网保持连接 cFlag = dgData.cFlag;% 是否具有控制调度中心保持通信的能力 dgPower = dgData.power; end bus = netData.bus; busPower = bus(:,3)'*1e3;% 有功功率 busQower = bus(:,4)'*1e3;% 无功功率 branch = netData.branch; branch(branch(:,11)==0,:) = [];% 删除联络开关 busNum = length(netData.bus(:,1));% 节点数量 island = zeros(1,busNum); w = zeros(1,busNum); w([5 6 12 13 23 24 29 31]+1) = 100;% 一类负荷 w([7 11 15 22 26 30 32]+1) = 10;% 二类负荷 w([1 2 3 4 8 9 10 14 16 17 18 19 20 21 25 27 28]+1) = 1;% 三类负荷 M1 = sparse(branch(:,1),branch(:,2),branch(:,3),busNum,busNum); % tril returns the lower triangular part of the matrix. islandPower = zeros(1,length(dgBus)); M2 = tril(M1+M1'); for idg = 1:length(dgBus) if bFlag(idg)==1% 是否具有独立供电能力 island(dgBus(idg)) = idg; islandPower(idg) = busPower(dgBus(idg)); flag = 1; while flag% 当flag=0跳出循环 islandBus = find(island==idg);% 已纳入孤岛的节点 willBus = []; willPower = []; willDis = []; for ibus = 1:busNum if island(ibus)==0% 节点ibus尚未纳入孤岛 [dist,path] = graphshortestpath(M2,dgBus(idg),ibus,'Directed',false); path(end) = []; if all(ismember(path,islandBus))% 拟加入节点到DG的路径上的节点已经被纳入孤岛 willPower = [willPower,busPower(ibus)*w(ibus)]; willDis = [willDis,dist]; willBus = [willBus,ibus]; end end end [~,idx] = sort(willPower,'descend');% 排序 % willPower = willPower(idx); % willDis = willDis(idx); willBus = willBus(idx); flag = 0; for ift = 1:length(willBus) if islandPower(idg)+busPower(willBus(ift))<=dgPower(idg)% 判断新纳入的节点容量是否超过DG容量 island(willBus(ift)) = idg; islandPower(idg) = islandPower(idg)+busPower(willBus(ift)); flag = 1; break; end end end end end for idg = 1:length(dgData.dgBus) fprintf('DG%d对应的孤岛\n',idg); disp(find(island==idg)); fprintf('岛内负荷%d+j%d\n',sum(busPower(island==idg)),sum(busQower(island==idg))); end end