经济调度问题的建模及求解——考虑爬坡约束

2024-01-16 01:20

本文主要是介绍经济调度问题的建模及求解——考虑爬坡约束,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:在上期内容火电机组经济调度建模及求解——基础篇中,我们介绍了基础的火电机组经济调度模型,本期内容我们将利用动态规划解决考虑爬坡约束的火电机组经济调度问题,在此问题中我们将涉及爬坡率的概念:

电厂灵活性被认为是管理电力负荷变化和提供电网支持服务的重要工具。衡量这种灵活性的一个指标是爬坡率,即发电厂燃气轮机发电增加或减少产出的速率。(来源:Google)

当负荷变化时,发电机组需要以一定的斜率从一个出力值变为另外一个出力值。由于火电机组存在机械/热力方面的约束,每分钟的出力不能超过规定的最大变化率限值。当电力系统中负荷出现一个小的增量时,为实现最优的经济调度(发电成本最低),需要在满足爬坡率约束的前提下,降低部分机组的发电量的同时增加其他发电机的出力。因此该问题可以视为一个在时间上前后关联的多阶段决策问题,并可以利用动态规划的思想实现问题求解。(来源:《电力系统发电、运行和控制》)

本期推文内容介绍

  • 爬坡约束的建模以及编程实现、排污成本的计算
  • model.addRange()的用法介绍
  • 动态规划中两个连续时间点的约束表述——用于爬坡约束的描述
  • x.sum()对变量求和
  • 得到最优解后,利用最优解计算其他目标值——getValue()的用法介绍

Part 1 考虑爬坡约束的火电机组经济调度模型

基础的火电机组经济调度模型为:
min ⁡ P g , t T C = ∑ g , t a g P g , t 2 + b g P g , t + c g P g min ⁡ ≤ P g , t ≤ P g max ⁡ ∑ g P g , t ≥ L t \begin{aligned} \min _{P_{g, t}} \mathrm{TC}=& \sum_{g, t} a_{g} P_{g, t}^{2}+b_{g} P_{g, t}+c_{g} \\ & P_{g}^{\min } \leq P_{g, t} \leq P_{g}^{\max } \\ & \sum_{g} P_{g, t} \geq L_{t} \end{aligned} Pg,tminTC=g,tagPg,t2+bgPg,t+cgPgminPg,tPgmaxgPg,tLt
在此基础上加入爬坡约束,以避免因为负荷扰动,出现火电机组违反爬坡率的情况:
P g , t − P g , t − 1 ≤ R U g P g , t − 1 − P g , t ≤ R D g \begin{aligned} & P_{g, t}-P_{g, t-1} \leq \mathrm{RU}_{g} \\ & P_{g, t-1}-P_{g, t} \leq \mathrm{RD}_{g} \end{aligned} Pg,tPg,t1RUgPg,t1Pg,tRDg
式中, P g , t P_{g, t} Pg,t P g , t − 1 P_{g, t-1} Pg,t1分别为 t 时刻与 t-1 时刻的发电功率, R U g \mathrm{RU}_{g} RUg R U g \mathrm{RU}_{g} RUg分别表示火电机组单位时间内增加或减少的出力,即:爬坡率上限。由于火电机组发电需要考虑排污费用,在得到最优调度结果以后,需要计算总的排污成本:
E M = ∑ g , t d g P g , t 2 + e g P g , t + f g \begin{aligned} \mathrm{EM}=& \sum_{g, t} d_{g} P_{g, t}^{2}+e_{g} P_{g, t}+f_{g} \end{aligned} EM=g,tdgPg,t2+egPg,t+fg

Part 2 Python+Gurobi 代码实现

import gurobipy as gp
from gurobipy import GRB
'参数设定'
a_g = [0.12, 0.17, 0.15, 0.19]      # 发电二次项系数
b_g = [14.8, 16.57, 15.55, 16.21]   # 发电一次项系数
c_g = [89, 83, 100, 70]             # 发电常数项
d_g = [1.2, 2.3, 1.1, 1.1]          # 排污二次项系数
e_g = [-5, -4.24, -2.15, -3.99]     # 排污一次项系数
f_g = [3, 6.09, 5.69, 6.2]          # 排污常数项
P_g_min = [28, 20, 30, 20]          # 发电量最小值
P_g_max = [200, 290, 190, 260]      # 发电量最大值
RU_g = [40, 30, 30, 50]             # 爬坡率——UP
RD_g = [40, 30, 30, 50]             # 爬坡率——Down
L_t = [510, 530, 516, 510, 515, 544, 646, 686,741, 734, 748, 760, 754, 700, 686, 720,714, 761, 727, 714, 618, 584, 578, 544] # 24小时的负载'定义模型及名称'
model = gp.Model('Cost-Based-DED')'变量'
P_g = model.addVars(4, 24, vtype=GRB.CONTINUOUS, name='P_g')# # 边界约束描述——方法1
# model.addConstrs((P_g[i, t]>=P_g_min[i] for i in range(4) for t in range(23)), name="Con_Pg_min")
# model.addConstrs((P_g[i, t]<=P_g_max[i] for i in range(4) for t in range(23)), name="Con_Pg_max")# 边界约束描述——方法2
for i in range(4):for t in range(24):model.addRange(P_g[i, t], P_g_min[i], P_g_max[i], name="Con_Pg")# 爬坡约束描述——方法1
# model.addConstrs((P_g[i, t] - P_g[i, t-1] <= RU_g[i] for i in range(4) for t in range(1, 24)), name="Ramp_UP1")
# model.addConstrs((P_g[i, t-1] - P_g[i, t] <= RD_g[i] for i in range(4) for t in range(1, 24)), name="Ramp_Down1")# 爬坡约束描述——方法2
model.addConstrs((P_g[i, t+1] - P_g[i, t] <= RU_g[i] for i in range(4) for t in range(23)), name="Ramp_UP2")
model.addConstrs((P_g[i, t] - P_g[i, t+1] <= RD_g[i] for i in range(4) for t in range(23)), name="Ramp_Down2")# # 发电负载功率平衡的描述——方法1
# model.addConstrs(P_g.sum('*', t) >= L_t[t] for t in range(24), name="Banlance1")# 发电负载功率平衡的描述——方法2
model.addConstrs((gp.quicksum(P_g[i, t] for i in range(4)) >= L_t[t] for t in range(24)), name="Banlance2")'目标函数'
T_C = gp.quicksum(a_g[i] * P_g[i, t] * P_g[i, t] + b_g[i] * P_g[i, t] + c_g[i] for i in range(4) for t in range(24))
model.setObjective(T_C, GRB.MINIMIZE)'优化求解'
model.optimize()# 计算排污成本——方法1
E_M1 = gp.quicksum(d_g[i] * P_g[i, t].x * P_g[i, t].x + e_g[i] * P_g[i, t].x + f_g[i] for i in range(4) for t in range(24))# 计算排污成本——方法2
E_M2 = (gp.quicksum(d_g[i] * P_g[i, t] * P_g[i, t] + e_g[i] * P_g[i, t] + f_g[i] for i in range(4) for t in range(24))).getValue()'输出结果'
print('The total emissions1 are:', E_M1)
print('The total emissions2 are:', E_M2)print('The total operating costs are TC:'+str(model.ObjVal))

Part 3 编程技巧汇总

以下为本次编程中出现的多种方法集合,具体操作请看程序表达和Gurobi手册

  • Tips 1: model.addRange() 定义变量边界的使用方法;
  • Tips 2: 当模型中存在 t+1 或者 t-1时,for 循环的表示,尤其是range()的范围 ;
  • Tips 3: x.sum() 表述变量求和的使用方法;
  • Tips 4: EM是总排放成本,其结果是根据变量的最优解进行计算的,不属于本次优化模型的目标函数或者约束;
  • Tips 5: EM的两种计算方法或者说通过变量最优解得到其他函数值的方法——注意 getValue()的使用方法;

Part 4 创作人员名单

作者| 马同学、李同学
代码| 马同学、李同学
审核| 脱同学、钱同学

欢迎大家关注公众号获取最新资讯

参考文献

  1. A. Soroudi, Power System Optimization Modeling in GAMS.

往期内容回顾

11. 基于Distflow的最优潮流模型(OPF)–模型推导篇
10.火电机组经济调度建模及求解——基础篇
9. 火电机组经济调度建模及求解——基础篇
8. Python|Gurobi——零基础学优化建模-终章
7. Python|Gurobi——零基础学优化建模-压轴篇:多目标优化
6. Python|Gurobi——零基础学优化建模-分段模型线性化(PWL)
5. Python|Gurobi——零基础学优化建模-QCP
4. Python|Gurobi——零基础学优化建模-NLP
3. Python|Gurobi——零基础学优化建模-MIP
2. Python|Gurobi——零基础学优化建模-LP
1. Python|Gurobi——零基础学优化建模

这篇关于经济调度问题的建模及求解——考虑爬坡约束的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/610868

相关文章

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Idea插件MybatisX失效的问题解决

《Idea插件MybatisX失效的问题解决》:本文主要介绍Idea插件MybatisX失效的问题解决,详细的介绍了4种问题的解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录一、重启idea或者卸载重装MyBATis插件(无需多言)二、检查.XML文件与.Java(该文件后缀Idea可能会隐藏

Nginx 访问 /root/下 403 Forbidden问题解决

《Nginx访问/root/下403Forbidden问题解决》在使用Nginx作为Web服务器时,可能会遇到403Forbidden错误,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录解决 Nginx 访问 /root/test/1.html 403 Forbidden 问题问题复现Ng

Python的pip在命令行无法使用问题的解决方法

《Python的pip在命令行无法使用问题的解决方法》PIP是通用的Python包管理工具,提供了对Python包的查找、下载、安装、卸载、更新等功能,安装诸如Pygame、Pymysql等Pyt... 目录前言一. pip是什么?二. 为什么无法使用?1. 当我们在命令行输入指令并回车时,一般主要是出现以

Nginx部署React项目时重定向循环问题的解决方案

《Nginx部署React项目时重定向循环问题的解决方案》Nginx在处理React项目请求时出现重定向循环,通常是由于`try_files`配置错误或`root`路径配置不当导致的,本文给大家详细介... 目录问题原因1. try_files 配置错误2. root 路径错误解决方法1. 检查 try_f

Python解决雅努斯问题实例方案详解

《Python解决雅努斯问题实例方案详解》:本文主要介绍Python解决雅努斯问题实例方案,雅努斯问题是指AI生成的3D对象在不同视角下出现不一致性的问题,即从不同角度看物体时,物体的形状会出现不... 目录一、雅努斯简介二、雅努斯问题三、示例代码四、解决方案五、完整解决方案一、雅努斯简介雅努斯(Janu

MySQL索引失效问题及解决方案

《MySQL索引失效问题及解决方案》:本文主要介绍MySQL索引失效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql索引失效一、概要二、常见的导致MpythonySQL索引失效的原因三、如何诊断MySQL索引失效四、如何解决MySQL索引失

一文教你如何解决Python开发总是import出错的问题

《一文教你如何解决Python开发总是import出错的问题》经常朋友碰到Python开发的过程中import包报错的问题,所以本文将和大家介绍一下可编辑安装(EditableInstall)模式,可... 目录摘要1. 可编辑安装(Editable Install)模式到底在解决什么问题?2. 原理3.

Redis中的数据一致性问题以及解决方案

《Redis中的数据一致性问题以及解决方案》:本文主要介绍Redis中的数据一致性问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Redis 数据一致性问题的产生1. 单节点环境的一致性问题2. 网络分区和宕机3. 并发写入导致的脏数据4. 持

vscode不能打开终端问题的解决办法

《vscode不能打开终端问题的解决办法》:本文主要介绍vscode不能打开终端问题的解决办法,问题的根源是Windows的安全软件限制了PowerShell的运行,而VSCode默认使用Powe... 遇到vscode不能打开终端问题,一直以为是安全软件限制问题,也没搜到解决方案,因为影响也不大,就没有管