【配电网重构】【SOE】随机配电网重构中的开关开换方法研究(Matlab代码实现)

news/2024/11/26 7:17:47/
💥 💥 💞 💞 欢迎来到本博客 ❤️ ❤️ 💥 💥


🏆 博主优势: 🌞 🌞 🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。


座右铭:行百里者,半于九十。

📋 📋 📋 本文目录如下: 🎁 🎁 🎁
目录
💥1 概述
📚2 运行结果
2.1 算例结果
2.2 仿真结果
2.3 结论
🎉3 参考文献
🌈4 Matlab代码、数据、文章讲解

💥1 概述

摘要:配电网重构(DNR)的目的是确定配电网的最优拓扑结构,是降低电网功率损耗的有效措施。电力负荷需求和光伏(PV)输出是不确定的,并随时间变化,将影响最佳网络拓扑结构。单小时确定性DNR无法处理这种不确定性和可变性。为此,本文提出了求解多小时随机DNR (SDNR)的方法。现有的DNR求解方法要么不准确,要么过于耗时,因此无法求解大型配电网的多小时sdnr。为此,提出了一种开关开交换(SOE)方法。从所有开关关闭的环路网络开始,SOE由三个步骤组成。第一步是依次打开开关,直到打开所有循环。第二步和第三步修改第一步中获得的分支的状态,以获得更好的径向拓扑。通过5个试验系统验证了该方法的准确性和快速求解速度,以及多小时SDNR优于单小时确定性DNR的优越性。

📚2 运行结果

2.1 算例结果

编辑

2.2 仿真结果

2.3 结论

提出了一个多小时的SDNR来处理可变和不确定的负载和PV输出。现有的SDNR方法要么不准确,要么太耗时。因此,提出了一种精确、快速的启发式方法SOE,同时求解SDNR和DDNR。SOE由三个步骤组成。第一步可以快速获得相对准确的初始解,第二步和第三步进一步提高精度。仿真结果表明,与其他启发式方法相比,SOE 1)精度更高,2)在单小时DDNRs中的精度几乎与MP相当(99.71% ~ 100%),3)在求解多小时DDNRs时明显优于MP(例如损失减少19.65%)。SOE的解决速度明显快于MP(例如,快72-2325倍)。因此,SOE在精度和/或求解速度方面优于MP和其他启发式方法,特别是在求解大规模多小时DDNRs时。仿真结果还表明:1)解决多小时DDNR/SDNR比解决单小时DDNR/SDNR能获得更好的结果,即具有更低的损耗和/或满足电压限制;2)阻塞DDNR/SDNR能在损耗和开关动作数之间实现良好的平衡,而小时DDNR/SDNR有很多开关动作,24小时DDNR/SDNR有很高的损耗;3) SDNR优于DDNR,当负载(PV输出)低于(高于)其预测值时,DDNR的结果可能会违反电压上限。

部分代码:

warning('off')

addpath(pathdef)

mpopt = mpoption;

mpopt.out.all = 0; % do not print anything

mpopt.verbose = 0;

version_LODF = 0 % 1: use decrease_reconfig_algo_LODF.m

% 0: use decrease_reconfig_algo.m

distancePara = 10

combine3 = 1

candi_brch_bus = []; % candidate branch i added to bus j

% mpc0 = case417;

casei=4

d417_v2

substation_node = 1; n_bus = 417;

n1 = 3

n2 = 2

n1_down_substation = n1+1; n2_up_ending = n2;

Branch0 = Branch;

brch_idx_in_loop0 = unique(brch_idx_in_loop(:));

show_biograph1 = 0;

show_biograph = 0;

%% original network's power flow (not radial)

% show_biograph(Branch, Bus)

from_to = show_biograph_not_sorted(Branch, substation_node, show_biograph1);

mpc = generate_mpc(Bus, Branch, n_bus);

res_orig = runpf(mpc, mpopt);

losses = get_losses(res_orig.baseMVA, res_orig.bus, res_orig.branch);

loss0 = sum(real(losses));

fprintf('case417_tabu: original loop network''s loss is %.5f \n\n', loss0)

% for each branch in a loop,

% if open that branch does not cause isolation, check the two ending buses

% of that branch for connectivity, realized by shortestpath or conncomp

% calculate the lowest loss increase, print out the sorted loss increase

% open the branch with lowest loss increase

% stop criterion: number of buses - number of branches = 1

%% ------------------------ Core algorithm ------------------------%%

ff0 = Branch(:, 1); ff = ff0;

tt0 = Branch(:, 2); tt = tt0;

t1 = toc;

if version_LODF

[Branch] = decrease_reconfig_algo_LODF(Bus, Branch, brch_idx_in_loop, ...

ff0, tt0, substation_node, n_bus, loss0, distancePara); %%% core algorithm

else

[Branch] = decrease_reconfig_algo(Bus, Branch, brch_idx_in_loop, ff0, tt0, ...

substation_node, n_bus, loss0); %%% core algorithm

end

t2 = toc;

time_consumption.core = t2 - t1

% output of core algorithm

from_to = show_biograph_not_sorted(Branch(:, [1 2]), substation_node, ...

show_biograph1);

from_to0 = from_to;

mpc = generate_mpc(Bus, Branch, n_bus);

res_pf_dec = runpf(mpc, mpopt);

losses = get_losses(res_pf_dec.baseMVA, res_pf_dec.bus, res_pf_dec.branch);

loss0_dec = sum(real(losses)); %

fprintf('case417_tabu: radial network obtained by my core algorithm''s loss is %.5f \n\n', loss0_dec)

Branch_loss_record = [];

% record Branch and loss

Branch_loss_record.core.Branch = Branch;

Branch_loss_record.core.loss = loss0_dec;

%% prepare force open branches for tabu: branch_idx_focused

if get_brch_tabu_v2 == 1

[branch_idx_focused] = get_branch_idx_focused_for_tabu_v2( ...

from_to, Branch0, Branch, substation_node, brch_idx_in_loop0, n_bus, ...

n1_down_substation, n2_up_ending); % to answer reviewer 5-5's question

else

[branch_idx_focused] = get_branch_idx_focused_for_tabu( ...

from_to, Branch0, Branch, substation_node, brch_idx_in_loop0, n_bus, ...

n1_down_substation, n2_up_ending);

end

%% ------------------------ Tabu algorithm ------------------------%%

% run the core program for each upstream branch connected to the idx_force_open

% idx_considered = [35 69]

% for iter = idx_considered

for iter = 1:length(branch_idx_focused)

fprintf('iter=%d/%d\n', iter, length(branch_idx_focused));

Branch = Branch0;

Branch(branch_idx_focused(iter), :) = [];

ff0 = Branch(:, 1); ff = ff0;

tt0 = Branch(:, 2); tt = tt0;

brch_idx_in_loop = brch_idx_in_loop0;

idx_tmp = find(brch_idx_in_loop == branch_idx_focused(iter));

if isempty(idx_tmp)

else

brch_idx_in_loop(idx_tmp) = [];

brch_idx_in_loop(idx_tmp:end) = brch_idx_in_loop(idx_tmp:end)-1;

end

t1 = toc;

%%------------------- core algorithm in Tabu loop--------------------%%

if version_LODF

[Branch] = decrease_reconfig_algo_LODF(Bus, Branch, brch_idx_in_loop, ...

ff0, tt0, substation_node, n_bus, loss0, distancePara); %%% core algorithm

else

[Branch] = decrease_reconfig_algo(Bus, Branch, brch_idx_in_loop, ff0, tt0, ...

substation_node, n_bus, loss0); %%% core algorithm

end

t2 = toc;

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

🌈4 Matlab代码、数据、文章讲解


http://www.ppmy.cn/news/49054.html

相关文章

Ubuntu 常用命令50个含示例

以下是 Ubuntu 常用命令,按照最容易忘记的命令优先,前 50 个: sudo:用于在 Ubuntu 中以管理员权限执行命令的命令。例如:以管理员权限编辑文件 /etc/hosts:sudo nano /etc/hosts。 apt-get:用于…

大数据技术之集群数据迁移

在大数据集群数据迁移的项目中涉及到很多技术细节,本博客记录了迁移的大致的操作步骤。 迁移借用Hadoop自带的插件:distcp。 一、Hadoop集群数据迁移 **DistCp(分布式拷贝)**是用于大规模集群内部和集群之间拷贝的工具。它使用M…

一篇文章快速入门Spring AMQP

文章目录 一、AMQP二、Spring AMQP2.1 介绍2.2 SpringAMQP发送消息2.3 SpringAMQP接收消息2.4 WorkQueue模型2.4.1 概念2.4.2 示例 2.5 发布订阅模型2.5.1 介绍2.5.2 Fanout Exchange2.5.3 Direct Exchange2.5.4 Topic Exchange 2.6 消息转换器2.6.1 介绍2.6.2 切换消息转换器 …

【vue2】近期bug收集与整理02

⭐【前言】 在使用vue2构建页面时候,博主遇到的问题难点以及最终的解决方案。 🥳博主:初映CY的前说(前端领域) 🤘本文核心:博主遇到的问题与解决思路 目录 ⭐数据枚举文件的使用⭐elementUI中分页组件使用的注意事项⭐…

4、Symbol-ES6新基础类型

symbol是 ES6 新增的一种基本数据类型,它和 number、string、boolean、undefined 和 null 是同类型的,object 是引用类型。它用来表示独一无二的值,通过 Symbol 函数生成。 本小节代码都是纯JavaScript代码,建议在非TypeScript环境…

让HR眼前一亮:30个APP项目软件测试经验,点燃你的简历

在求职过程中,我们都希望自己的简历能够吸引面试官的眼球,从而获得更多的面试机会。作为一名软件测试人员,丰富的实战经验是让自己脱颖而出的关键之一。 在我多年从事APP项目软件测试的工作中,我积累了大量的实践经验&#xff0c…

2023年3月 青少年软件编程(C 语言) 等级考试试卷(一级)

2023. 03 青少年软件编程(C 语言) 等级考试试卷(一级) 1.字符长方形 给定一个字符, 用它构造一个长为 4 个字符, 宽为 3 个字符的长方形, 可以参考样例输出。 时间限制: 1000 内存限…

第4章 Ribbon负载均衡服务调用

4.1概述 4.1.1什么是Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。 Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在…