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

参考文献:

[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:nl
    branch_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.01

sol = optimize(Constraints,objective,ops);


%% 分析错误标志
if sol.problem == 0
    disp('求解成功');
else
    disp('运行出错');
    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文库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云防护是怎么能帮助用户做好网络安全

在数字化时代,网络安全威胁呈现出愈发复杂和多样化的趋势。 无论是个人用户、小型企业还是大型企业,都面临着来自全球各地的网络攻击风险。这些攻击可能导致数据泄露、服务中断、财务损失甚至声誉受损。因此,采取有效的安全防护措施变得至关…

数据处理的两个基本问题

文章目录 数据处理的两个基本问题bx、si、di、bp机器指令处理的数据所在位置汇编语言中数据位置的表达寻址方式指令要处理的数据有多长?div 指令伪指令 dddup 数据处理的两个基本问题 我们知道,计算机是进行数据处理、运算的机器,那么有两个基…

基于Tampermonkey 实现自动答题和视频播放

目录 一、环境准备 二、下载Tampermonkey 三、安装脚本 四、启用脚本 一、环境准备 微软自带的 edge 浏览器(电脑端) 二、下载Tampermonkey 安装地址:Tampermonkey 篡改猴(油猴脚本) 下载完成会在浏览器拓展中自动生成一个插件,此时点击管理拓展&…

linux 内核模块入门

内核模块可以动态地被安装到内核,从而扩展内核的功能,使用内核模块时不需要重新编译内核。内核模块常用的场景是驱动,随着芯片种类的增加,硬件种类的增加,这些芯片或者硬件(比如网卡) 的驱动可以以模块的方式进行开发&…

ONT60 旋转链表 思路分享

题干链接:ONT60 旋转链表 ​ 这道题是反转链表题的pro升级版,但比反转链表略微复杂一些。如果有做过旋转数组那道题(链接在这里:https://blog.csdn.net/wyd_333/article/details/126712919,但当时刷这道题的时候我用的…

Linux|centos7-postgresql数据库|yum安装数据库和配置repmgr高可用集群以及repmgr的日常管理工作

一、 前言 postgresql 的yum部署其实还是有点东西的,本文就做一个小小的记录,高可用方面repmgr插件还是非常不错的,但如何部署以及部署后如何使用也是一个难点,因此,也在本文里做一个记录 环境介绍: 第…

【Redis教程0x0A】详解Redis哨兵机制

1. 引言 Redis的哨兵机制是基于主从架构的。 在 Redis 的主从架构中,由于主从模式是读写分离的,如果主节点(master)挂了,那么将没有主节点来服务客户端的写操作请求,也没有主节点给从节点(slav…

java: 错误: 无效的源发行版:17

目录 一、java: 错误: 无效的源发行版:17 报错 原因 解决方法 二、pring-boot-starter-parent下面的版本报红 原因 解决方案 一、java: 错误: 无效的源发行版:17 报错 创建了一个sprintboot项目,运行CommunityApplication时&#xf…

小白从0学习ctf(web安全)

文章目录 前言一、baby lfi(bugku-CTF)1、简介2、解题思路1、解题前置知识点2、漏洞利用 二、baby lfi 2(bugku-CTF)1.解题思路1、漏洞利用 三、lfi(bugku CTF)1、解题思路1、漏洞利用 总结 前言 此文章是…

动态规划刷题(算法竞赛、蓝桥杯)--合唱队形(线性DP)

1、题目链接&#xff1a;[NOIP2004 提高组] 合唱队形 - 洛谷 #include <bits/stdc.h> using namespace std; int n,ans; int a[105],f[105][2];//f[i][2]中2表示正反两个方向int main(){cin>>n;for(int i1;i<n;i){cin>>a[i];}//正方向求最长上升子序列 a[…

HWOD:字符的排序

一、知识点 char的最大值是127&#xff0c;最小值是-128 自己填充的char型数组&#xff0c;以字符串打印&#xff0c;打印之前要手动在末尾加上 \0 二、题目 1、描述 Lily上课时使用字母数字图片教小朋友们学习英语单词&#xff0c;每次都需要把这些图片按照大小&#x…

财务管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. …

Spring Boot单元测试全指南:使用Mockito和AssertJ

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

算法学习15:数论(高斯消元,组合数,卡特兰数)

算法学习15&#xff1a;数论&#xff08;高斯消元&#xff0c;组合数&#xff0c;卡特兰数&#xff09; 文章目录 算法学习15&#xff1a;数论&#xff08;高斯消元&#xff0c;组合数&#xff0c;卡特兰数&#xff09;前言一、高斯消元1.输入一个包含n个方程&#xff0c;n个未…

用vscode仿制小米官网

html内容: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><link rel&quo…

Intellij IDEA 类注释模板设置

1、配置全局USER 在此配置全局USER&#xff0c;用于填充自动生成的注释中的作者author属性。 注释模板中的user参数是默认是获取系统的用户&#xff08;当然注释作者也可以直接写固定值&#xff09;&#xff0c;如果不想和系统用户用同一个信息&#xff0c;可以在IDEA中进行配…

查生意平台联动SFE上海连锁加盟展,呈现口碑招商盛宴

随着中国广告市场规模突破1251亿美元大关&#xff0c;连锁经营企业在其中的营销投放愈发凸显其重要性。查生意&#xff08;www.chasyi.com&#xff09;&#xff0c;作为国内领先的一站式连锁经营口碑评分查询服务平台&#xff0c;携手SFE上海连锁加盟展览会成功举办了一场严选品…

分布式架构商城系统的设计与实现|SpringCloud+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. …

C++格式化输入和输出

格式化输入与输出 除了条件状态外&#xff0c;每个iostream对象还维护一个格式状态来控制IO如何格式化的细节。 格式状态控制格式化的某些方面&#xff0c;如整型值是几进制、浮点值的精度、一个输出元素的宽度等。 标准库定义了一组操纵符来修改流的格式状态。 一个操纵符…

Vue3+.NET6前后端分离式管理后台实战(十)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战&#xff08;十&#xff09;已经在订阅号发布有兴趣的可以关注一下&#xff01; 感兴趣请关注订阅号谢谢&#xff01; 代码已经上传gitee