目录
1 主要内容
1.1 背景
1.2 流程图
2 部分代码
3 程序结果
4 下载链接
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<1dgBus = [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;elsedgBus = dgData.dgBus;bFlag = dgData.bFlag;% 是否具有独立供电能力sFlag = dgData.sFlag;% 故障后能够与主网保持连接cFlag = dgData.cFlag;% 是否具有控制调度中心保持通信的能力 dgPower = dgData.power;endbus = 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:busNumif 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];endendend[~,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;endendendendendfor 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