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

news2024/12/23 14:33:17

参考文献:

[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文库

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

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

相关文章

Decoupled Multimodal Distilling for Emotion Recognition 论文阅读

Decoupled Multimodal Distilling for Emotion Recognition 论文阅读 Abstract1. Introduction2. Related Works2.1. Multimodal emotion recognition2.2. Knowledge distillation3. The Proposed Method3.1. Multimodal feature decoupling3.2. GD with Decoupled Multimodal …

【Gd2O3】Gd2O3栅极电介质增强GaN器件的可靠性

【Effects of Gd2O3 Gate Dielectric on Proton-Irradiated AlGaN/GaN HEMTs】 概括总结: 该研究探讨了质子辐射对使用Gd2O3作为栅极电介质的AlGaN/GaN高电子迁移率晶体管(HEMTs)的影响。通过对比肖特基栅极HEMTs和MOS-HEMTs在2 MeV质子辐射…

SOC内部集成网络MAC外设+ PHY网络芯片方案:MII/RMII 接口与 MDIO 接口

一. 简介 本文来了解一下常用的一种网络硬件方案:SOC内部集成网络MAC外设 PHY网络芯片方案。 其中涉及的 MII接口,RMII接口(MII接口与RMII接口二选一),MDIO接口,RJ45。 二. MII/RMII 接口,M…

数据挖掘|贝叶斯分类器及其Python实现

分类分析|贝叶斯分类器及其Python实现 0. 分类分析概述1. Logistics回归模型2. 贝叶斯分类器2.1 贝叶斯定理2.2 朴素贝叶斯分类器2.2.1 高斯朴素贝叶斯分类器2.2.2 多项式朴素贝叶斯分类器 2.3 朴素贝叶斯分类的主要优点2.4 朴素贝叶斯分类的主要缺点 3. 贝叶斯分类器在生产中的…

随便注【强网杯2019】

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

面试题:JVM 调优

一、JVM 参数设置 1. tomcat 的设置 vm 参数 修改 TOMCAT_HOME/bin/catalina.sh 文件,如下图 JAVA_OPTS"-Xms512m -Xmx1024m" 2. springboot 项目 jar 文件启动 通常在linux系统下直接加参数启动springboot项目 nohup java -Xms512m -Xmx1024m -jar…

动态内存管理-错题合集讲解

空指针的解应用操作(错误信息合集) 越界访问 首先我们上一个代码,看看这个的代码的问题 这个代码的问题显而易见 ,就是在循环里面,产生了越界访问的问题,这里你开辟了10个整形空间,但是从0-1…

谈谈MVCC机制

在MySQL中,MVCC(多版本并发控制)是InnoDB存储引擎使用的并发控制机制。它提供对数据的并发访问,并确保多用户环境中数据的一致性和隔离性。 InnoDB通过“Undo log”存储每条记录的多个版本,提供历史记录供读取&#x…

Python数据结构与算法——数据结构(链表、哈希表、树)

目录 链表 链表介绍 创建和遍历链表 链表节点插入和删除 双链表 链表总结——复杂度分析 哈希表(散列表) 哈希表介绍 哈希冲突 哈希表实现 哈希表应用 树 树 树的示例——模拟文件系统 二叉树 二叉树的链式存储 二叉树的遍历 二叉搜索树 插入 查询 删除 AVL树 …

后端SpringBoot+Mybatis 查询订单数据库奇怪报错加一

排错过程: 看报错意思是SQL语句存在错误,然后使用图形化工具运行这个SQL语句 其实这里稍微细心想一下就能发现问题,但是当时没深入想,就觉得order表前加了数据库名字影响不大,所以感觉SQL语句是没问题的,然…

Java6升级至Java8常用新特性

目录 Java 8 常用新特性1、Lambda 表达式2、方法引用2.1 静态方法引用2.2 特定对象的实例方法引用2.3 特定类型的任意对象的实例方法引用2.4 构造器引用 3、接口中的默认方法4、函数式接口4.1 自定义函数式接口4.2 内置函数式接口 5、Date/Time API6、Optional 容器类型7、Stre…

【Qt】窗口

目录 一、概述二、菜单栏(QMenuBar)三、工具栏(QToolBar)四、状态栏(QStatusBar)五、浮动窗口六、对话框 一、概述 Qt窗口是通过QMainWindow类来实现的。 QMainWindow是一个为用户提供主窗口程序的类&…

程序数据模型由OS还是硬件架构决定?

文章目录 前言硬件架构的作用OS的作用编译器的角色OS的数据模型参考 前言 在文章 1>>32的结果是1还是0 中提到了数据模型 L P 64 LP64 LP64 ,并提出这个数据模型主要是由 U n i x Unix Unix 以及类 U n i x Unix Unix 的操作系统使用居多,例如…

SpringBoot 缓存预热

简介&#xff1a; SpringBoot集合RedisUtil和 CommadnLinRunner实现缓存预热 一、新建一个缓存抽象类 在redis模块里面 新建 /*** 缓存抽象类*/ Component public abstract class AbstractCache {// 初始化缓存public void initCache() {}public <T> T getCache(Strin…

虚拟现实(VR)项目的开发工具

虚拟现实&#xff08;VR&#xff09;项目的开发涉及到多种工具&#xff0c;这些工具可以帮助开发者从建模、编程到最终内容的发布。以下是一些被广泛认可的VR开发工具&#xff0c;它们覆盖了从3D建模到交互设计等多个方面。北京木奇移动技术有限公司&#xff0c;专业的软件外包…

PySpark的学习

一. 什么是PySpark 使用过的bin/pyspark 程序 , 要注意 , 这个只是一个 应用程序 , 提供一个 Python 解释器执行环境来运行 Spark 任务 现在说的 PySpark, 指的是 Python 的运行类库 , 是可以在 Python 代码中 :import pyspark PySpark 是 Spark 官方提供的一个 Python …

MP设置动态表名

Mybatis设置动态表名 Mybatis设置动态表名1.动态表名插件2.传递表名3.注意事项 Mybatis设置动态表名 1.动态表名插件 MybatisPlus中提供了一个动态表名的插件&#xff1a;https://baomidou.com/pages/2a45ff/#dynamictablenameinnerinterceptor 插件的部分源码如下&#xff…

【SpringCloud】Eureka注册中心

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

【MATLAB源码-第24期】基于matlab的水声通信中海洋噪声的建模仿真,对比不同风速的影响。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 水声通信&#xff1a; 水声通信是一种利用水中传播声波的方式进行信息传递的技术。它在水下环境中被广泛应用&#xff0c;特别是在海洋科学研究、海洋资源勘探、水下军事通信等领域。 1. **传输媒介**&#xff1a;水声通信利…

【IC前端虚拟项目】mvu顶层集成的原则与技巧

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 截止目前,所有的子模块编码均宣告完成,接下来就是封装顶层的时刻了。我自己规划和集成顶层一般有一个习惯,就是在top层下面封装core层和其他模块,比如mvu的top层下例化了mvu_reg和mvu_core两个模块,…