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

参考文献:

[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.mzph.cn/news/784377.shtml

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

相关文章

博客页面---前端

目录 主页 HTML CSS 文章详细页面 HTML CSS 登录页面 HTML CSS 文章编辑页 HTML CSS 这只是前端的页面组成&#xff0c;还没有接入后端&#xff0c;并不是完全体 主页 HTML <!DOCTYPE html> <!-- <html lang"en"> --> <head>&…

区间预测 | Matlab实现带有置信区间的BP神经网络时间序列未来趋势预测

区间预测 | Matlab实现带有置信区间的BP神经网络时间序列未来趋势预测 目录 区间预测 | Matlab实现带有置信区间的BP神经网络时间序列未来趋势预测预测效果基本介绍研究回顾程序设计参考资料预测效果 基本介绍 BP神经网络(Backpropagation neural network)是一种常用的人工神…

DisplayPort 的演变

HDMI 2.0的传输带宽18Gbit/s; DP 1.2 的传输带宽17.28Gbit/s理论上HDMI 2.0高一点&#xff0c;实际上没区别.。 HDMI接口和DP接口的区别 1、厂商不同HDMI是电视机厂商主导的,而DP是由PC及芯片制造商联盟开发的.需要注意的是,HDMI需要授权费,DP则不需要. 2、版本进化。 2006 年…

http模块 设置资源类型(mime类型)

虽然浏览器自带websocket功能它会根据响应回来的内容自动去判断资源类型&#xff0c;但是我们加上了mime类型判断代码会更加规范些 一、mime类型概念&#xff1a; 媒体类型是一种标准&#xff0c;它用来表示文档。文件、字节流的性质和格式。HTTP服务可以设置响应头Content-T…

【InternLM 实战营第二期笔记】InternLM1.8B浦语大模型趣味 Demo

体验环境 平台&#xff1a;InternStudio GPU&#xff1a;10% 配置基础环境 studio-conda -o internlm-base -t demo 与 studio-conda 等效的配置方案 conda create -n demo python3.10 -y conda activate demo conda install pytorch2.0.1 torchvision0.15.2 torchaudio2…

Tidb和MySQL性能简单测试对比

一、单SQL性能对比 由于TiDB的并发能力优秀&#xff0c;但是单个SQL执行延迟较差&#xff0c;为了客观对比&#xff0c;所以只用1个线程来压测tidb和mysql&#xff0c;以观察延迟情况 二、并发SQL性能对比 TiDB:v6.5.2 MySQL:8.0.26 &#xff08;单机&#xff09; 三、结论 …

155 Linux C++ 通讯架构实战10,工具telent 和 wireshark的使用

telnet工具使用介绍 windows 上开启telnet linux 上开始telnet 使用telnet //是一款命令行方式运行的客户端TCP通讯工具&#xff0c;可以连接到服务器端&#xff0c;往服务器端发送数据&#xff0c;也可以接收从服务器端发送过来的信息&#xff1b; //类似nginx5_1_1_clie…

上位机图像处理和嵌入式模块部署(qmacvisual形状匹配)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在qmacvisual软件当中&#xff0c;提供了两种模板匹配的方法。除了前面介绍的灰度匹配&#xff0c;就是今天讲的形状匹配。当然&#xff0c;对于使…

嵌入式linux学习之opencv交叉编译

1.下载opencv源码 OpenCV官方源码下载链接为https://opencv.org/releases/&#xff0c;选择3.4.16版本下载。放在ubuntu系统~/opencv文件夹中&#xff0c;解压缩&#xff0c;opencv文件夹中新建build和install文件夹用于存放编译文件和安装文件&#xff1a; 2. 安装编译工具…

设计模式学习笔记 - 设计模式与范式 -行为型:2.观察者模式(下):实现一个异步非阻塞的EventBus框架

概述 《1.观察者模式&#xff08;上&#xff09;》我们学习了观察者模式的原理、实现、应用场景&#xff0c;重点节介绍了不同应用场景下&#xff0c;几种不同的实现方式&#xff0c;包括&#xff1a;同步阻塞、异步非阻塞、进程内、进程间的实现方式。 同步阻塞最经典的实现…

最优算法100例之18-列升序行升序的数组中查找元素

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样一…

AI绘画教程:Midjourney使用方法与技巧从入门到精通

文章目录 一、《AI绘画教程&#xff1a;Midjourney使用方法与技巧从入门到精通》二、内容介绍三、作者介绍&#x1f324;️粉丝福利 一、《AI绘画教程&#xff1a;Midjourney使用方法与技巧从入门到精通》 一本书读懂Midjourney绘画&#xff0c;让创意更简单&#xff0c;让设计…

[图像处理] MFC载入图片并进行二值化处理和灰度处理及其效果显示

文章目录 工程效果重要代码完整代码参考 工程效果 载入图片&#xff0c;并在左侧显示原始图片、二值化图片和灰度图片。 双击左侧的图片控件&#xff0c;可以在右侧的大控件中&#xff0c;显示双击的图片。 初始画面&#xff1a; 载入图片&#xff1a; 双击左侧的第二个控件…

随便注【强网杯2019】

大佬的完整wp&#xff1a;buuctf-web-[强网杯 2019]随便注-wp_取材于某次真实环境渗透,只说一句话:开发和安全缺一不可-CSDN博客 知识点&#xff1a; 单引号字符型绕过堆叠注入 可以执行多条语句multi_query()&#xff1a;该函数可能引发堆叠注入handler用法 mysql专属&#…

Linux之进程间通信

1.进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件&#xff…

Rabbit简单模式理解

简单模式 我们以最普通的方式去理解&#xff0c;并没有整合Springboot的那种 这是最简单的模式&#xff0c;一个生产者&#xff0c;一个消费者&#xff0c;一个队列 测试 1、 导包&#xff0c;没整合&#xff0c;不需要编写配置 2、需要生产者消费者 导包 <dependency…

【SpringCloud】Eureka注册中心

目 录 一.Eureka的结构和作用二.搭建 eureka-server1. 创建 eureka-server 服务2. 引入 eureka 依赖3. 编写启动类4. 编写配置文件5. 启动服务 三.服务注册1. 引入依赖2. 配置文件3. 启动多个user-service实例 四.服务发现1. 引入依赖2. 配置文件3. 服务拉取和负载均衡 总结 假…

Optimizer神经网络中各种优化器介绍

1. SGD 1.1 batch-GD 每次更新使用全部的样本&#xff0c;注意会对所有的样本取均值&#xff0c;这样每次更新的速度慢。计算量大。 1.2 SGD 每次随机取一个样本。这样更新速度更快。SGD算法在于每次只去拟合一个训练样本&#xff0c;这使得在梯度下降过程中不需去用所有训…

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

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

【数据结构】括号匹配问题你学会了吗?来刷刷题检验一下吧!!!

栈在括号问题中的应用 导言一、有效的括号——栈、字符串——简单1.1 题目要求与分析1.2 代码实现 二、 最长有效括号——栈、字符串、动态规划——困难2.1 题目要求与分析2.2 问题解析2.2.1 如何计算有效括号的个数2.2.2 如何记录了连续括号的长度2.2.3 如何寻找最长的子串 2.…