(文章复现)考虑分布式电源不确定性的配电网鲁棒动态重构

参考文献:

[1]徐俊俊,吴在军,周力,等.考虑分布式电源不确定性的配电网鲁棒动态重构[J].中国电机工程学报,2018,38(16):4715-4725+4976.

1.摘要

        间歇性分布式电源并网使得配电网网络重构过程需要考虑更多的不确定因素。在利用仿射数对分布式电源出力的不确定性进行合理分析与建模基础上,建立以重构周期内开关动作耗费与网络有功损耗等综合成本最低为目标函数,以网络安全运行为约束条件的配电网鲁棒动态重构模型。为精确求解该数学模型,引入基于最佳等距思想的分段线性逼近方法将原目标函数松弛为线性可解形式,并根据对偶定理将模型进一步等效转化为双层混合整数线性规划问题;最后采用列约束生成算法对模型进行高效求解。修改的 PG&E 69节点系统测试分析结果表明,与现有的配电网确定性动态重构方法比较,所提鲁棒动态重构方法在抗系统不确定性扰动方面具有明显的优势。

2.原理介绍

2.1分布式电源出力区间预测

        这部分是采用粒子群算法和神经网络对风电和光伏的输出功率进行预测,该部分内容和实现原理比较简单,而且不是文献的重点内容,这里不再过多介绍。这部分需要得到的结果就是下面两个公式和两个图。

2.2 配电网鲁棒动态重构模型

        配电网鲁棒重构模型中所有节点注入功率不再用某一确定的预测值模糊表示,而是均以仿射数分别予以刻画,在给定 DG 和负荷不确定范围内搜索到最恶劣波动场景下的最优网损(第一阶段)以及制定出 DG 和负荷处于最恶劣波动场景下,满足网络经济运行的重构方案(第二阶段)。为此,建立如下式所示的配电网鲁棒动态重构数学模型:

1)目标函数。

        由目标函数可知,第一阶段是以负荷需求和分布式电源出力的不确定扰动为决策变量,也即基于当前网络拓扑结构计算出不确定扰动最恶劣情形下的最低网损成本;第二阶段则以支路开关状态为决策变量,也即在所有网络可能存在的拓扑结构中,寻求出能够确保重构周期内开关动作耗费与网络有功损耗等综合成本最低的唯一网络拓扑结构。显然,第二阶段目标函数也即鲁棒重构总的目标函数。

2)约束条件。

        综上所述,所建立的考虑节点注入功率不确定性的配电网鲁棒动态重构数学模型以式(8)为目标函数,以式(9)(12)为约束条件。

2.3模型求解方法

3.文献中的问题分析

3.1 分段线性逼近

        如文献中所述,对于有功功率和无功功率的平方项,可采用分段线性逼近的方法进行处理。由该方法的原理可知,如果分段数太少,线性化后的结果误差会很大,如果分段数太多,又会增加很多额外的变量,加大求解难度。原文3.3.1小节中设分段数为265段,由此增加了265×2×75×96≈384万个变量,模型求解将非常困难,如果设备不是非常好的话建议还是不要参考该方法(我用自己的垃圾电脑大概尝试过,Yalmip+gurobi跑一整天也才收敛到90%,要求收敛精度1%以内的话估计得跑好几个月,文中算例分析上写的只需要400多秒,不知道是怎么得到的)。这个文献对目标函数进行线性化其实就是为了可以将两阶段鲁棒优化子问题转为对偶问题。但实际上,没有线性化之前的子问题是一个二次规划问题,可以采用KKT条件进行转换,得到的结果更精确,也不需要线性化。

3.2 数学模型的细节问题

        1)对于功率平衡方程(12),没有解释变量P_{s,it}的的含义,根据分析可知该变量应为主电源节点的输出功率。

        2)该文章标题是动态重构,但实际上设置的开关状态变量并未考虑时序性,也就是在长时间内都会保持一种运行方案,其实也就是静态重构,不知道他这个动态重构体现在哪里。

        3)目标函数中,支路有功功率和无功功率使用的都是分段后的变量,但是其余约束中支路功率又都用了分段前的变量,上下文没有统一,且没有给出两者之间的关系。

        4)不确定变量没有给定波动的范围(也就是96个时段中最多有多少个数据点可以取得波动上限),那么最恶劣场景一定是所有DG出力取最小值,所有负荷需求取最大值,鲁棒优化结果过于保守。所以我在代码中加入了不确定预算,避免两阶段鲁棒优化的结果过于保守。新增约束公式如下:

3.3 部分参数没有提供

        1)文中并没有提供一天之内的负荷预测值,因此代码是找了一个典型日负荷曲线带入。

        2)文中没有提供支路的最大有功和无功功率,代码里是参考其他文献设置的功率上限。

        3)文中没有提供新增联络线的电阻和电抗,代码中是参考其他文献进行设置。

        4)文中并未提供动态重构时最大的动作次数,代码将其设置为8次。

3.4 算例分析结果的问题

        原文献中表1的结果显示,确定性重构时一天内总有功损耗为481.844kWh,总成本为302.623元,但是式(7)后的解释将C1设置为0.2,C2设置为0.8,0.8×481.844,得到的结果和302.623完全不同,不知道这个结果是怎么得到的。

4.编程思路

4.1参数和变量定义

表1 相关参数

2 决策变量

4.2编程思路

        根据对文献内容的解读,可以设计下面的编程思路:

        步骤1:输入所需数据

        这一步比较简单。PG&E 69节点系统参数来源于matpower工具箱,部分未提供的参数需要自己假设,然后将所有需要的数据,按照表1的定义格式输入即可。需要注意的是,matpower中69节点系统编号和原文中不完全一致,为了编程更方便,代码中以matpower工具箱所提供的编号方式为准,新的编号见下图(其中红色虚线为文中新增的联络线):

        步骤2建立确定性优化模型并求解

        文中将两阶段鲁棒动态重构模型和确定性动态重构的结果进行对比,因此复现时还需要先求出确定性动态重构的结果,具体结果如下:

        步骤3建立两阶段鲁棒优化模型并求解

    可以参考我之前写的博客对该问题的两阶段鲁棒优化形式进行分析(鲁棒优化入门(6)-CSDN博客和鲁棒优化入门(7)-CSDN博客)。标准的两阶段鲁棒优化问题的形式为:

        可以采用Yalmip工具箱中的函数depends、getbase、getbasematrix、see写出约束矩阵取值,具体如何操作可以参考我之前的博客(​​​​​​​Yalmip使用教程(6)-将约束条件写成矩阵形式-CSDN博客)。

4.部分Matlab代码

        程序共有4个m文件和一个mat文件,其中case69.m是69节点系统的数据文件,main_do.m是确定性优化的主程序,运行这个代码即可得到确定性优化结果;main_ro.m是两阶段鲁棒优化的主程序,运行即可得到两阶段鲁棒动态重构的结果;Matrix.m是求系数矩阵的程序,运行即可得到系数矩阵的求解结果,并将结果存在Matrix.mat文件中方便读取,其中main_do.m的部分代码如下所示:

%% 1.确定性动态重构%% 清除内存空间
clc
clear
close all
warning off%% 系统参数
mpc = case69;
nb = length(mpc.bus(:,1));                          % 节点数
ns = 1;                                             % 主电源节点
nl = length(mpc.branch(:,1));                       % 支路数目
nT = 96;                                            % 调度时段数
Y_pv = [6,21,46];                                   % 光伏接入节点
Y_wt = [52 64];                                     % 风电接入节点
Data = xlsread('风光负荷数据.xlsx');                % 读取风光负荷数据
P_PV_max = Data(:,2)'/1000/mpc.baseMVA;             % 光伏出力上限
P_PV_min = Data(:,3)'/1000/mpc.baseMVA;             % 光伏出力下限
P_WT_max = Data(:,4)'/1000/mpc.baseMVA;             % 风电出力上限
P_WT_min = Data(:,5)'/1000/mpc.baseMVA;             % 风电出力下限
PL_curve = Data(:,6);                               % 负荷日变化曲线
P_PV0 = (P_PV_max + P_PV_min)/2;                    % 光伏出力均值
dP_PV0 = P_PV_max - P_PV0;                          % 光伏出力最大波动
P_WT0 = (P_WT_max + P_WT_min)/2;                    % 风电出力均值
dP_WT0 = P_WT_max - P_WT0;                          % 风电出力最大波动
phi = 0.85;                                         % DG的功率因数
P_L0 = mpc.bus(:,3)/mpc.baseMVA*PL_curve';          % 有功负荷
Q_L0 = mpc.bus(:,4)/mpc.baseMVA*PL_curve';          % 无功负荷
P_L0(P_L0 == 0) = 1e-6;                             % 加上一个很小的数防止0注入节点出现
Q_L0(Q_L0 == 0) = 1e-6;                             % 加上一个很小的数防止0注入节点出现
R_ik = mpc.branch(:,3);                             % 线路电阻
L_ik0 = mpc.branch(:,11);                           % 初始线路开断状态
C1 = 0.2;                                           % 支路开关动作一次所需要的成本系数
C2 = 0.8;                                           % 网络重构期间有功损耗所对应的成本系数
P_ik_max = 6;                                       % t时段支路 ik 上允许流过的最大有功功率
Q_ik_max = 5;                                       % t时段支路 ik 上允许流过的最大无功功率
Vi = 1;                                             % 根据文献式(6)后的解释将节点电压设为常数1
N = 8;                                              % 最大重构次数
Ps_max = 10;                                        % 上级电源输出有功功率最大值
Ps_min = 0;                                         % 上级电源输出有功功率最小值
Qs_max = 10;                                        % 上级电源输出无功功率最大值
Qs_min = -10;                                       % 上级电源输出无功功率最小值
branch_to_node = zeros(nb,nl);                      % 流入节点的支路
branch_from_node = zeros(nb,nl);                    % 流出节点的支路
for k = 1:nlbranch_to_node(mpc.branch(k,2),k) = 1;branch_from_node(mpc.branch(k,1),k) = 1;
end%% 决策变量
L_ik = binvar(nl,1);                                % 支路 ik 上开关的状态信息
u_ik = binvar(nb,nb,'full');                        % 表示节点关系Pikt = sdpvar(nl,nT);                               % t时刻支路ik在l断面的有功功率
Qikt = sdpvar(nl,nT);                               % t时刻支路ik在j断面的无功功率
Ps_it = sdpvar(ns,nT);                              % t时刻主电源节点i的有功出力
Qs_it = sdpvar(ns,nT);                              % t时刻主电源节点i的无功出力e_Git = zeros(5,nT);                                % t时段导致 DG 节点 i 注入功率不确定的扰动因子(包含光伏和风机),确定性优化时取值为0
e_Lit = zeros(nb,nT);                               % t时段导致负荷节点i注入功率不确定的扰动因子,确定性优化时取值为0%% 约束条件
Constraints = [];%% 约束(10)
此处省略。。。。%% 约束(11)
此处省略。。。。%% 约束(12)
此处省略。。。。%% 目标函数
此处省略。。。。%% 设求解器
% gurobi求解器
ops = sdpsettings('verbose', 3, 'solver', 'gurobi','showprogress',1,'debug',1);
ops.gurobi.TimeLimit = 7200;                         % 运行时间限制
ops.gurobi.MIPGap = 0.01;                            % 收敛精度限制为0.01% cplex求解器
% ops = sdpsettings('verbose', 3, 'solver', 'cplex','showprogress',1,'debug',1);
% ops.cplex.timelimit = 7200;                        % 运行时间限制
% ops.cplex.mip.tolerances.mipgap = 0.01;            % 收敛精度限制为0.01% mosek求解器
% ops=sdpsettings('verbose', 3, 'solver', 'MOSEK','cachesolvers',1);
% ops.mosek.MSK_DPAR_OPTIMIZER_MAX_TIME = 7200;         % 运行时间限制
% ops.mosek.MSK_DPAR_MIO_TOL_REL_GAP = 0.01;           % 收敛精度限制为0.01sol = optimize(Constraints,objective,ops);%% 分析错误标志
if sol.problem == 0disp('求解成功');
elsedisp('运行出错');yalmiperror(sol.problem)
end%% 结果
L_ik = value(L_ik);
u_ik = value(u_ik);
% disp('******************重构前******************')
% disp('开断支路为:')
% disp([num2str(mpc.branch(70,1)),'-',num2str(mpc.branch(70,2)),',',...
%       num2str(mpc.branch(71,1)),'-',num2str(mpc.branch(71,2)),',',...
%       num2str(mpc.branch(72,1)),'-',num2str(mpc.branch(72,2)),',',...
%       num2str(mpc.branch(73,1)),'-',num2str(mpc.branch(73,2)),',',...
%       num2str(mpc.branch(74,1)),'-',num2str(mpc.branch(74,2))])
% disp(['系统网损为:','36579.1335kW'])
disp('******************确定性优化重构结果******************')
open_branch = find(L_ik~=1)';
disp('开断支路为:')
disp([num2str(mpc.branch(open_branch(1),1)),'-',num2str(mpc.branch(open_branch(1),2)),',',...num2str(mpc.branch(open_branch(2),1)),'-',num2str(mpc.branch(open_branch(2),2)),',',...num2str(mpc.branch(open_branch(3),1)),'-',num2str(mpc.branch(open_branch(3),2)),',',...num2str(mpc.branch(open_branch(4),1)),'-',num2str(mpc.branch(open_branch(4),2)),',',...num2str(mpc.branch(open_branch(5),1)),'-',num2str(mpc.branch(open_branch(5),2))])
disp(['系统网损为:',num2str(value(objective2)*1000*mpc.baseMVA),'kW'])
disp(['开关动作次数为:',num2str(value(objective1)),'次'])
disp(['总运行成本为:',num2str(value(objective)),'元'])figure
plot(P_PV_max*1000*mpc.baseMVA,'k-','linewidth',1)
hold on
plot(P_PV_min*1000*mpc.baseMVA,'k-','linewidth',1)
hold on
plot(P_PV0*1000*mpc.baseMVA,'r:','linewidth',1)
legend('光伏区间出力上限','光伏区间出力下限','光伏实际出力');
xlabel('时间')
ylabel('功率/kw')figure
plot(P_WT_max*1000*mpc.baseMVA,'k-','linewidth',1)
hold on
plot(P_WT_min*1000*mpc.baseMVA,'k-','linewidth',1)
hold on
plot(P_WT0*1000*mpc.baseMVA,'r:','linewidth',1)
legend('风电区间出力上限','风电区间出力下限','风电实际出力');
xlabel('时间')
ylabel('功率/kw')figure
plot(1.1*sum(P_L0)*1000*mpc.baseMVA,'k-','linewidth',1)
hold on
plot(0.9*sum(P_L0)*1000*mpc.baseMVA,'k-','linewidth',1)
hold on
plot(sum(P_L0)*1000*mpc.baseMVA,'r:','linewidth',1)
legend('负荷需求上限','负荷需求下限','负荷实际需求');
xlabel('时间')
ylabel('功率/kw')

        经过测试,如果在main_ro.m中将代码81行的收敛精度ops.gurobi.MIPGap设置为0.05时,两阶段鲁棒优化大约需要10min即可收敛;如果将其设置为0.1时,5min左右即可收敛。大家可以根据自身需求对计算精度和运行时间的要求选择合适的收敛精度。

5.代码运行结果

        原文中数据提供不全,且部分模型问题解释不清,所以代码复现结果和原文献相比会有偏差,但原理完全一样。

5.1 确定性动态重构结果

5.2 两阶段鲁棒动态重构结果

6.完整代码获取链接

        (注意,代码运行需要安装Matpower以及Yalmip工具箱,以及Gurobi求解器,如果有其他求解器,可以在设置中进行更改):

考虑分布式电源不确定性的配电网鲁棒动态重构matlab代码资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/293141.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙HarmonyOS应用开发之HID DDK开发指导

场景介绍 HID DDK(HID Driver Develop Kit)是为开发者提供的HID设备驱动程序开发套件,支持开发者基于用户态,在应用层开发HID设备驱动。提供了一系列主机侧访问设备的接口,包括创建设备、向设备发送事件、销毁设备。 …

负载均衡策略和技术的基本指南

什么是负载均衡器? 负载均衡器将传入的网络流量分布到多个服务器上,以确保没有单个服务器承受过多的负载。通过有效地传播请求,它们提高了应用程序的容量和可靠性。 下面是一些使用负载均衡器的常见场景: 高并发流量:当应用程序面临大量用户请求时,负载均衡器可以将流量分…

【4】单链表(有虚拟头节点)

【4】单链表(有虚拟头节点) 1、虚拟头节点2、构造方法3、node(int index) 返回索引位置的节点4、添加5、删除6、ArrayList 复杂度分析(1) 复杂度分析(2) 数组的随机访问(3) 动态数组 add(E element) 复杂度分析(4) 动态数组的缩容(5) 复杂度震荡 7、单链…

七、函数的使用方法

函数的调用 nameinput()#输入参数并赋值name print(name)#d打印name 格式:返回值函数名(参数) def get_sum(n):#形式参数计算累加和:param n::return: sumsum0for i in range(1,n1):sumiprint…

9.Python类与对象

1 面向对象 类和对象都是面向对象中的重要概念。面向对象是一种编程思想, 即按照真实世界的思维方式构建软件系统。 例如,在真实世界的校园里有学生和老师,学生有学号、姓名、所 在班级等属性(数据),还有…

【苹果MAC】苹果电脑 LOGI罗技鼠标设置左右切换全屏页面快捷键

首先键盘设置->键盘快捷键 调度中心 设置 f1 f2 为移动一个空间(就可以快捷移动了) 想要鼠标直接控制,就需要下载官方驱动,来设置按键快捷键,触发 F1 F2 安装 LOGI OPTIONS Logi Options 是一款功能强大且便于使用…

前端虚拟滚动列表 vue虚拟列表

前端虚拟滚动列表 在大型的企业级项目中经常要渲染大量的数据,这种长列表是一个很普遍的场景,当列表内容越来越多就会导致页面滑动卡顿、白屏、数据渲染较慢的问题;大数据量列表性能优化,减少真实dom的渲染 看图:绿色…

设计模式之工厂方法模式精讲

工厂方法模式又叫虚拟构造函数(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建性工作推迟到子类中。 工厂模式可以分为简单工厂…

第六十三回 呼延灼月夜赚关胜 宋公明雪天擒索超-大模型BERT、ERNIE、GPT和GLM的前世今生

神行太保戴宗报信,关胜人马直奔梁上泊,请宋江早早收兵,解梁山之难。宋江派了花荣到飞虎峪左边埋伏,林冲到右边埋伏,再叫呼延灼带着凌振,在离城十里附近布置了火炮,然后才令大军撤退。 李成闻达…

Kubernetes(K8s)技术解析

1. K8s简介 Kubernetes(简称K8s)是一个开源的容器编排平台,旨在简化容器化应用程序的部署、扩展和管理。为开发者和运维人员提供了丰富的功能和灵活的解决方案,帮助他们更轻松地构建、部署和管理云原生应用程序。以下是关于Kubern…

Oracle 低代码平台 Apex 最新版本 23.2 安装过程

趁春节快结束前,安装了一把APEX ,到目前为此,APEX最新版本为23.2,23.2和21版本有一些变化,只是用于验证,我 是使用的单独模式,没有安装TOMAT,下面列一下安装过程: 1.环境…

云服务器8核32G配置报价大全,腾讯云、阿里云和京东云

8核32G云服务器租用优惠价格表,云服务器吧yunfuwuqiba.com整理阿里云8核32G服务器、腾讯云8核32G和京东云8C32G云主机配置报价,腾讯云和京东云是轻量应用服务器,阿里云是云服务器ECS: 阿里云8核32G服务器 阿里云8核32G服务器价格…

阿里云通用算力型u1云服务器配置性能评测及价格参考

阿里云服务器u1是通用算力型云服务器,CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器,ECS通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xf…

Kafka入门到实战-第五弹

Kafka入门到实战 Kafka常见操作官网地址Kafka概述Kafka的基础操作更新计划 Kafka常见操作 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://kafka.apache.org/Kafka概述 Apache Kafka 是一个开源的分布式事件流平台&…

Unity 使用TrailRenderer制作拖尾效果

使用TrailRenderer实现拖尾效果,具体操作步骤如下: 1、创建一个空对象 在Unity场景中创建一个空对象 2、添加TrailRenderer组件 选择步骤1创建的空对象,然后在Inspector面板中点击“Add Component”按钮,搜索并添加TrailRende…

中间件安全(apache、tomcat)

靶场: vulfocus Apache Apache HTTP Server 是美国阿帕奇( Apache )基金会的一款开源网页服务器。该服务器具有快速、可靠且可通过简单的API进行扩充的特点,发现 Apache HTTP Server 2.4.50 中针对 CVE - 2021 - 41773 的修复…

算法学习——LeetCode力扣图论篇3(127. 单词接龙、463. 岛屿的周长、684. 冗余连接、685. 冗余连接 II)

算法学习——LeetCode力扣图论篇3 127. 单词接龙 127. 单词接龙 - 力扣(LeetCode) 描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk: 每一对相…

REPLUG:检索增强的黑盒语言模型

论文题目:REPLUG: Retrieval-Augmented Black-Box Language Models   论文日期:2023/05/24   论文地址:https://arxiv.org/abs/2301.12652 文章目录 Abstract1. Introduction2. Background and Related Work2.1 Black-box Language Model…

HarmonyOS 应用开发之FA模型绑定Stage模型ServiceExtensionAbility

本文介绍FA模型的三种应用组件如何绑定Stage模型的ServiceExtensionAbility组件。 PageAbility关联访问ServiceExtensionAbility PageAbility关联访问ServiceExtensionAbility和PageAbility关联访问ServiceAbility的方式完全相同。 import featureAbility from ohos.ability…

MySQL经验分享:Shell开发问题

背景 之前整理过Python连接使用MySQL的经验,链接如下: pymysql封装总结_pymysql封装类-CSDN博客 相比高级语言,Shell与MySQL开发使用相对会更麻烦一些;由于 shell是linux命令集的概称,是属于命令行的人机界面。Shel…