Matlab|基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究

目录

1 主要内容

目标函数

计算步骤

节点系统

2 部分代码

3 程序结果

4 下载链接


主要内容

程序完全复现文献《A Distributed Dual Consensus ADMM Based on Partition for DC-DOPF with Carbon Emission Trading》,建立了一个考虑碳排放交易的最优模型,首先,对测试系统(6节点或者30节点或者118节点系统)进行了分区,以便后续ADMM算法的应用,其次,构建了DC-DOPF的最优潮流模型作为主要应用场景,以发电+买卖排放配额费用之和为目标函数,考虑碳排放约束、潮流约束以及耦合约束等约束条件,程序考虑了负荷需求响应和碳排放交易,从而符合目前低碳调度的研究热点,算法方面采用ADMM算法,也就是交替方向乘子法,更加创新,而且求解的效果更好,代码质量非常高,保姆级的注释以及人性化的模块子程序,所有数据均明确可靠来源,非常方便学习!

  • 目标函数

  • 计算步骤

  • 节点系统

程序默认节点系统为118节点系统,代码如下:

FileName = 'SCUC_dat/DDOPF118.txt'; %Corresponding to the 118-bus system in literature [7];对应文献[7]中的118-bus system

可以通过修改节点系统名称来验证其他节点(6节点或者30节点)系统模型,程序已经内置了这部分代码,可以通过取消注释即可实现。

%             FileName = 'SCUC_dat/SCUC6.txt';    %Corresponding to the 6-bus System;对应文中6bus例子
%             FileName = 'SCUC_dat/SCUC30.txt'; %Corresponding to the 30-bus System;对应文中30bus例子
%             FileName = 'SCUC_dat/SCUC6-2.txt';  %Corresponding to the 6-bus System in literature [7];对应文献[7]中的6-bus system
%             FileName = 'SCUC_dat/SCUC1062-2.txt';  %Corresponding to the 1062-bus System;对应文中1062-bus例子
%             FileName = 'SCUC_dat/RTS48.txt'; %Corresponding to the RTS-48 bus system.The test system can obtain from [44];对应文中RTS0-48 bus例子
​

部分代码

                        if isequal(k,1) %第一次形成p_t并记下对应的区间即可
                            p_t_index = []; %存储p_t中每行在XJ中的索引,第一列为初始索引,第二列为结束索引,第三列为行索引
                            seta_t_index = []; %存储seta_t中每行在XJ中的索引,第一列为初始索引,第二列为结束索引,第三列为行索引
                            for i = 1:size(allNodes,1)
                                bus_sequence_index = find(ismember(SCUC_data.busUnits.bus_sequence,allNodes(i,1))==1); %allNodes(i,1)在SCUC_data.busUnits.bus_sequence上的索引
                                P_start_index = (PbusUnitsNumber(i,1) - PbusUnitsNumber(1,1) + i - 1); %allNodes(i,1)对应变量P前面的所有变量P和θ的总数量
                                Seta_start_index = (PbusUnitsNumber(i+1,1) - PbusUnitsNumber(1,1) + i - 1); %allNodes(i,1)对应变量θ前面的所有变量P和θ的总数量
                                if ~isempty(bus_sequence_index) %The bus with unit. 节点上有发电机
                                    for j = 1:size(SCUC_data.busUnits.unitIndex{bus_sequence_index,1},1)
                                        p_t(units_number,:) = XJ(P_start_index*T + (j-1)*T + 1:P_start_index*T + (j-1)*T + T);%P
                                        p_t_index(units_index,1) = P_start_index*T + (j-1)*T + 1;
                                        p_t_index(units_index,2) = P_start_index*T + (j-1)*T + T;
                                        p_t_index(units_index,3) = units_number;
                                        units_number = units_number + 1;
                                        units_index = units_index + 1;
                                    end
                                else %The bus without unit.节点上没有发电机
                                    p_t(units_number,:) = XJ(P_start_index*T + 1:P_start_index*T + T);%P
                                    units_number = units_number + 1;
                                end
                                seta_t(i,:) = XJ(Seta_start_index*T + 1:Seta_start_index*T + T);%θ
                                seta_t_index(i,1) = Seta_start_index*T + 1;
                                seta_t_index(i,2) = Seta_start_index*T + T;
                                seta_t_index(i,3) = i;
                            end
                        else  %按照第一次记下的变量顺序即可
                            p_t = zeros(partitionData.PIUnitsNumber{end}-partitionData.PIUnitsNumber{1},T);
                            seta_t = zeros(size(seta_t_index,1),T);
                            for i = 1:size(p_t_index,1)
                                p_t(p_t_index(i,3),:) = XJ(p_t_index(i,1):p_t_index(i,2));
                            end
                            for i = 1:size(seta_t_index,1)
                                seta_t(seta_t_index(i,3),:) = XJ(seta_t_index(i,1):seta_t_index(i,2));
                            end
                        end
                        
                    elseif isequal(includeDR,'yes')
                        PINumber = partitionData.PINumber;
                        EINumber = partitionData.EINumber;
                        piecewiseNumber = SCUC_data.elasticBus.piecewiseNumber; %分段函数分的段数
                        K = SCUC_data.elasticBus.N;%弹性节点数量
                        dr_t = zeros(K,T); %弹性负荷变量dr
                        hr_t = zeros(piecewiseNumber,T,K); %辅助变量Hr,第一个参数对应分段数,第二个参数对应时段,第三个参数对应节点编号
                        %按照片区顺序
                        for i = 1:n
                            Dindex = 2*(PINumber{i+1}-1)*T + (EINumber{i}-1)*(piecewiseNumber+1)*T; %+2为考虑碳排放的两个变量
                            Hindex = Dindex + T; 
                            %取dr和hr
                            for j = 1:EINumber{i+1}-EINumber{i}
                                %dr的行按照partitionData.allElasticityNodes中节点编号的顺序
                                dr_t(EINumber{i}-1+j,:) = XJ((j-1)*(piecewiseNumber+1)*T+1+Dindex:(j-1)*(piecewiseNumber+1)*T+T+Dindex); %dr
                                for r = 1:piecewiseNumber
                                    hr_t(r,:,EINumber{i}-1+j) = XJ((j-1)*(piecewiseNumber+1)*T+(r-1)*T+1+Hindex:(j-1)*(piecewiseNumber+1)*T+(r-1)*T+T+Hindex); %hr
                                end
                            end
                        end
                        
                        if isequal(k,1) 
                            p_t_index = []; %存储p_t中每行在XJ中的索引,第一列为初始索引,第二列为结束索引,第三列为行索引
                            seta_t_index = []; %存储seta_t中每行在XJ中的索引,第一列为初始索引,第二列为结束索引,第三列为行索引
                            %按照片区顺序
                            for i = 1:n
                                Pindex = 2*(PINumber{i}-1)*T + (EINumber{i}-1)*(piecewiseNumber+1)*T; %+2为考虑碳排放的两个变量
                                Dindex = 2*(PINumber{i+1}-1)*T + (EINumber{i}-1)*(piecewiseNumber+1)*T; %+2为考虑碳排放的两个变量
                                Hindex = Dindex + T; 
                                %取P和θ
                                for j = 1:PINumber{i+1}-PINumber{i}
                                    %xx的行按照partitionData.allNodes(即allNodes)中节点编号的顺序
                                    p_t(PINumber{i}-1+j,:) = XJ(2*(j-1)*T+1+Pindex:2*(j-1)*T+T+Pindex);%P
                                    seta_t(PINumber{i}-1+j,:) = XJ(2*(j-1)*T+T+1+Pindex:2*(j-1)*T+2*T+Pindex);%θ
                                    p_t_index(PINumber{i}-1+j,1) = 2*(j-1)*T+1+Pindex;
                                    p_t_index(PINumber{i}-1+j,2) = 2*(j-1)*T+T+Pindex;
                                    p_t_index(PINumber{i}-1+j,3) = PINumber{i}-1+j;
                                    seta_t_index(PINumber{i}-1+j,1) = 2*(j-1)*T+T+1+Pindex;
                                    seta_t_index(PINumber{i}-1+j,2) = 2*(j-1)*T+2*T+Pindex;
                                    seta_t_index(PINumber{i}-1+j,3) = PINumber{i}-1+j;
                                end
                            end
                        else  %按照第一次记下的变量顺序即可
                            p_t = zeros(size(p_t_index,1),T);
                            seta_t = zeros(size(seta_t_index,1),T);
                            for i = 1:size(p_t_index,1)
                                p_t(p_t_index(i,3),:) = XJ(p_t_index(i,1):p_t_index(i,2));
                            end
                            for i = 1:size(seta_t_index,1)
                                seta_t(seta_t_index(i,3),:) = XJ(seta_t_index(i,1):seta_t_index(i,2));
                            end
                        end
                        
                    else
                        dr_t = []; %弹性负荷变量dr
                        hr_t = []; %辅助变量Hr
                        for i = 1:N
                            p_t(i,:) = XJ((i-1)*2*T+1:(i-1)*2*T+T);%P
                            seta_t(i,:) = XJ((i-1)*2*T+T+1:(i-1)*2*T+2*T);%θ
                        end
                    end

程序结果

原文结果图:

该图和上述结果图1趋势完全一致,验证代码的可行性。

4 下载链接

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

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

相关文章

【测试开发学习历程】MySQL分组查询与子查询 + MySQL表的联结操作

目录 1 MySQL分组查询与子查询 1.1 数据分组查询 1.2 过滤分组 1.3 分组结果排序 1.4 select语句中子句的执行顺序 1.5 子查询 2 MySQL表的联结操作 2.1 关系表 2.2 表联结 2.3 笛卡尔积 2.4 内部联结 2.5 外联结 2.6 自联结 2.7 组合查询 1 MySQL分组查询与子查询…

Java学习路线一条龙

说在前面 讲真,虽然我是正规计算机专业出身,但十多年来,Java这语言和它那一大堆配套的工具、框架,变化得太快了。 我也是一边学新的,一边扔旧的,忙得不可开交。 现在回想起来,走过的弯路、浪费…

2024年【危险化学品经营单位安全管理人员】新版试题及危险化学品经营单位安全管理人员模拟考试题

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员新版试题考前必练!安全生产模拟考试一点通每个月更新危险化学品经营单位安全管理人员模拟考试题题目及答案!多做几遍,其实通过危险化学品经营单位安…

C++默认构造函数(二)

目录 构造函数补充 构造函数初始化列表的使用 赋值运算符重载函数 运算符重载函数介绍 运算符重载函数的使用 赋值运算符重载函数 赋值运算符重载函数的使用 拷贝构造函数和赋值运算符重载函数 重载前置和后置 前置 后置 重载流插入<<与流提取>> 流插…

ngrok实现内网穿透

在使用jenkins进行自动化部署时&#xff0c;需要设置github的webhook钩子来触发构建&#xff0c;由于jenkins运行在自己的电脑上&#xff0c;因此需要通过内网穿透来接受http请求。 Install ngrok via Homebrew with the following command: brew install ngrok/ngrok/ngrokP…

微信小程序开发学习笔记——4.2showModal和showLoading界面交互操作

>>跟着b站up主“咸虾米_”学习微信小程序开发中&#xff0c;把学习记录存到这方便后续查找。 课程连接&#xff1a;https://www.bilibili.com/video/BV19G4y1K74d?p27&vd_source9b149469177ab5fdc47515e14cf3cf74 一、showModal 显示模态对话框 1、属性 https:/…

电商爬虫系统|电商数据采集|电商API商品数据采集

1、基本的说明 当初为了在几个电商网站抓取商品信息数据搭建的系统。该系统主要用来抓取电商网站上面的一百个左右品类的商品的价格信息、商品信息和折扣信息等。抓取的电商网站主要是某宝和某东。其他的电商网站抓取信息的方式无外乎这两种。跟其他的示例代码不同&#xff0c…

【redis】服务器架构演进

架构演进 单机架构应用数据分离架构应⽤服务集群架构读写分离 / 主从分离架构冷热分离架构垂直分库微服务架构 单机架构 所有的应用服务、业务所需的数据、业务处理等都在一台服务器上。 在初期&#xff0c;用户访问量很少&#xff0c;对服务器的的性能和安全没有很高的要求&am…

抖音视频无水印批量下载软件|爬虫视频采集工具

抖音视频无水印批量下载软件&#xff0c;轻松实现视频提取和下载 概述&#xff1a; 想要快速、方便地提取和下载抖音视频无水印&#xff1f;我们的抖音视频无水印批量下载软件将是您的得力助手&#xff01;不仅支持通过关键词批量提取视频&#xff0c;还可以针对特定视频进行提…

Linux安装Nacos

安装前必要准备 准备Java环境 &#xff0c;8以上的版本&#xff0c;mysql&#xff08;集群相关信息&#xff09;&#xff0c;nginx&#xff08;进行代理&#xff09; 安装Nacos 首先我们要有一个nacos的包&#xff0c;我们可以在线下载&#xff0c;也可以提前下载好&#xf…

IRIS 和 Caché 是什么关系

我们都知道真正一个数据库通常是 2 个部分组成的&#xff0c;存储和进程。 Cach Cach 的定义就是一个数据库&#xff0c;在这个数据库中有存储和进程。 与我们常用的 MySQL 来说&#xff0c;我们安装好 MySQL 后我们就可以通过客户端进行连接了&#xff0c;同时我们还可以通过…

二叉树的链式结构和遍历(下)

又见面了&#xff0c;小伙伴们。今天我们继续来学习二叉树&#xff0c;今天的内容相对来说比较容易理解&#xff0c;前提是需要你们自己动手画图才会好理解。眼过千遍不如手过一遍。所以小伙伴们要多动手哦。直接开始今天的学习吧 1.二叉树链式结构的实现 1.1 前置说明 在学习…

Stability AI发布Stable Video 3D模型:可从单张图像创建多视图3D视频,视频扩散模型史诗级提升!

Stability AI发布了Stable Video 3D (SV3D)&#xff0c;这是一种基于稳定视频扩散的生成模型&#xff0c;推动了3D技术领域的发展&#xff0c;并大大提高了质量和视图一致性。 该版本有两个版本: SV3D_u:该变体基于单图像输入生成轨道视频&#xff0c;无需相机调节。 SV3D_p:扩…

鸿蒙Harmony应用开发—ArkTS(@Link装饰器:父子双向同步)

子组件中被Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。 说明&#xff1a; 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 概述 Link装饰的变量与其父组件中的数据源共享相同的值。 限制条件 Link装饰器不能在Entry装饰的自定义组件中使用…

伊理威科技:抖音开网店新手刚做选啥品

在数字浪潮中&#xff0c;抖音不仅是展示才艺的舞台&#xff0c;更是创业者的新天地。新手若想在这片热土上开垦网店&#xff0c;选品便是首要课题。选择产品如同种下希望的种子&#xff0c;既要考量土壤肥沃度&#xff0c;也得预测风雨适宜期。 兴趣与专长是选品的罗盘。热爱所…

STM32之HAL开发——RCC外设CubeMX配置时钟

RCC外设介绍 RCC是Reset and Clock Control (复位和时钟控制)的缩写&#xff0c;它是STM32内部的一个重要外设&#xff0c;负责管理各种时钟源和时钟分频&#xff0c;以及为各个外设提供时钟使能。RCC模块可以通过寄存器操作或者库函数来配置。 RCC是复位和时钟控制模块&#…

GeoAI 简明教程

想象一下&#xff0c;能够在野火发生后立即发现它&#xff0c;可视化全球人口变化&#xff0c;或者立即从地图中提取线条。 GeoAI&#xff0c;即地理空间人工智能&#xff0c;是指地理信息系统 (GIS)、人工智能 (AI) 和机器学习 (ML) 的交叉点。 这个领域正在彻底改变我们与世界…

数据结构 - 二叉树非递归遍历

文章目录 前言一、前序二、中序三、后序 前言 本文实现二叉树的前中后的非递归遍历&#xff0c;使用栈来模拟递归。 文字有点简略&#xff0c;需要看图和代码理解 树节点&#xff1a; typedef char DATA; //树节点 typedef struct Node {DATA data; //数据struct Node* left…

基于springboot+vue的物资仓储物流管理系统(源码+论文)

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

数据治理的迷失:揭开“屎上雕花”现象的真相

数据治理是企业信息化建设的核心环节&#xff0c;它直接关系到数据的质量、安全性和价值实现。然而&#xff0c;在实际操作中&#xff0c;不少企业却陷入了“屎上雕花”的误区&#xff0c;即在数据本身存在问题的情况下&#xff0c;试图通过表面的修饰来提升数据的外在表现&…