基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究(matlab代码)

news2025/4/16 21:59:11

目录

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 下载链接

点击直达! 

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

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

相关文章

3年测试工作经验裸辞,现在有点后悔了····

2020年毕业,现在有3年的测试工作经验,刚毕业前半年在一家知名上市公司,后面则进入一家传统行业公司待到现在2年半。 由于看不到技术成长以及其他原因,上上周辞职了,目前交接中,下个月中旬就得离开了&#…

ChatGPT免费国内在线直连入口,2023持续分享中

这个国内在线版ChatGPT可以提供与OpenAI官方ChatGPT相同的使用效果,让你在不懂技术的情况下轻松接触人工智能。 国内镜像: ChatGPT国内直连版(点我)http://test.ai111.top 随着OpenAI不断推出更新版本,现在GPT3.5和…

如何成为机器学习工程师

如何成为机器学习工程师 又到一年一度的毕业季。今年的毕业季有点不同,这是迎着 AI 爆发元年的毕业季,很多同学想投身 AI 和机器学习行业,向我咨询了很多如何成为一名机器学习工程师的问题。在此,我结合自身入行十年的经理&#…

科聪控制系统助力铸造行业向“智能”实现“质”的突破!

此项目现场为传统铸造业,铸造是装备制造业发展不可或缺的重要环节,是众多主机和重大技术装备发展的重要支撑。该现场以往由人工遥控车辆来进行物资的挪动,现投运搭载科聪控制系统的AGV来代替人工用遥控车辆来移动物资。实现上位机上一键发送任…

TF卡被格式化后要如何找到照片

TF卡在日常使用时,具有体积小存储大的优势而被我们用来存储一些重要的照片,但由于内存比较小,TF卡用户需要经常对TF卡中的照片进行清理,避免内存不足等问题,接下来讲下TF卡被格式化后要如何找到照片。TF卡被格式化后要…

什么是IPAM(IP地址管理)?

我们目前生活在一个依赖IP的世界,IPAM(IP地址管理)已成为网络管理不可避免的一部分。在 IP 连接设备爆炸式增长之前,IPAM 网络通常随着连接用户数量的增加而增长。但是,现在网络必须根据我们用于工作的 IP 设备数量为每…

消防安全知识答题活动小程序v4.1.0

消防安全知识答题活动小程序v4.1.0 v4.1.0 1&#xff09;支持多选题 .wxml <checkbox-group class"checkbox-group" bindchange"checkboxChange"><label class"checkbox" wx:for"{{questionList[index].option}}" wx:for…

网络货运系统开发,网络货运系统源码,货主端APP源码、司机端APP源码、PC后台管理系统源码

网络货运系统开发&#xff0c;网络货运系统源码&#xff0c;货主端APP源码、司机端APP源码、PC后台管理系统源码 网络货运为无车承运人更名而来&#xff0c;网络货运平台的好处可以节省找车找货的时间与成本。根据国家对智慧物流行业的发展规划&#xff0c;及《网络平台道路货…

Wincc报表:利用用户归档制作报表查询+打印输出

本文需要结合案例及教学视频共同观看 wincc报表项目案例及完整教学视频下载地址&#xff1a; http://www.zhikonglianmeng.com/t-1635.html 一、创建变量 1、分别创建1个系统变量和1个内部变量&#xff1a;用于时间和日期存储。 WINCC组态项目编辑器——变量管理——单击添加…

Angular学习笔记:environment.ts文件,路由

本文是自己的学习笔记&#xff0c;主要参考资料如下。 - B站《Angular全套实战教程》&#xff0c;达内官方账号制作&#xff0c;https://www.bilibili.com/video/BV1i741157Fj?https://www.bilibili.com/video/BV1R54y1J75g/?p32&vd_sourceab2511a81f5c634b6416d4cc1067…

navicat 导出字段信息

1&#xff0c;在新建查询创建sql如下 SELECT TABLE_NAME 表名, COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, IS_NULLABLE 是否为空, COLUMN_DEFAULT 默认值, COLUMN_COMMENT 备注 FROM information_schema. COLUMNS WHERE T…

斑梨电子0.96寸LCD显示屏扩展板80X160 IPS适配Air10X开发板/海凌科W806开发板

spotpear.cn/index/product/detail/id/1338.html detail.tmall.com/item.htm?id720906602241&spma211lz.success.0.0.6cc02b90cwGrbH 【产品参数】 [] 尺寸&#xff1a;0.96寸 [] 显示面板&#xff1a;IPS [] 分辨率&#xff1a;80x 160 [] 驱动芯片&#xff1a;默认…

创意无限,纪念不止——我的创作纪念日

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

Linux系统编程 进程相关概念

1. 进程相关概念 程序(Program)”是一个静态的概念&#xff0c;一般对应于操作系统中的一个可执行文件 执行中的程序叫做进程(Process)&#xff0c;是一个动态的概念 ,现代的操作系统都可以同时启动多个进程。 程序&#xff1a;死的。只占用磁盘空间。 ——剧本。 进程&#xf…

服务(第三十三篇)Zookeeper集群 + Fafka集群

kafka是什么&#xff1f; 是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 为什么需要消息队列&#xff1f; 主要原因是由于在高并发环境下&#xff0c;同步请求来不及处理&…

JavaScript 高级程序设计 - 第 8 章 理解对象 学习笔记

JavaScript 高级程序设计 - 第 8 章 理解对象 学习笔记 本章内容量挺大的&#xff0c;因此笔记的话我也会分成 3-4 个部分去写&#xff0c;想要理解的细一点&#xff0c;顺便之后回顾的时候不会看的套类。 本章主要就是了解一下和理解一下什么是对象&#xff0c;包括 Object …

一文读懂DEM数字地形“全家桶“(附5m 12.5m 30m 90m DEM下载)

在今年自然资源部发布的《实景三维中国建设技术大纲&#xff08;2021版&#xff09;》中&#xff0c;空间数据部分包括“数字高程模型 &#xff08;DEM&#xff09;、数字表面模型&#xff08;DSM&#xff09;、数字正射影像&#xff08;DOM&#xff09;、 真正射影像&#xff…

ChatGPT火到独立站领域,对FP独立站收款到底有什么影响?

做F牌独立站的商家或多或少都知道&#xff0c;从今年3月份开始&#xff0c;FP独立站的收款就频频出现问题&#xff0c;很多人都跑来问我&#xff0c;第一句话就是&#xff1a;有没有靠谱点的收款渠道&#xff1f; 为什么最近几个月的收款渠道如此稀缺&#xff0c;以前常用的渠道…

防火墙日志记录和监控在网络安全中的重要性

防火墙监视进出网络的流量&#xff0c;并保护部署网络的网络免受恶意流量的侵害。它是一个网络安全系统&#xff0c;根据一些预定义的规则监控传入和传出的流量。它以日志的形式记录有关如何管理流量的信息。日志数据包含流量的源和目标 IP 地址、端口号、协议等。为了有效地保…

代码随想录训练营Day55|● 392.判断子序列 ● 115.不同的子序列

目录 学习目标 学习内容 392.判断子序列 115.不同的子序列 学习目标 392.判断子序列 115.不同的子序列 学习内容 392.判断子序列 392. 判断子序列 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/is-subsequence/ class Solution:def isSubsequ…