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

7 篇文章 3 订阅
5 篇文章 18 订阅

随着风、光等新能源的普及,在智能电网中加入储能系统有助于提升能源系统规划和运行的灵活性。尤其是考虑到新能源发电的间歇性,储能系统通过充/放电决策可以有效改善配网的能源管理、降低需求响应成本,提升新能源利用率。因此,在文章经济调度问题的建模及求解——考虑爬坡约束的基础上,加入储能约束,实现火力发电机组的经济调度。

Part 1:储能系统的约束介绍

S O C 1 C a p = S O C I n i C a p + P 1 c η c − P 1 d / η d ( 1 ) S O C t C a p = S O C t − 1 C a p + P t c η c − P t d / η d ( 2 ) S O C 24 = S O C E x p ( 3 ) S O C min ⁡ ≤ S O C t ≤ S O C max ⁡ ( 4 ) P min ⁡ c ≤ P t c ≤ P max ⁡ c ( 5 ) P min ⁡ d ≤ P t d ≤ P max ⁡ d ( 6 ) \begin{aligned} & \mathrm{SOC}_{1}Cap=\mathrm{SOC}_{Ini}Cap+P_{1}^{c} \eta_{c}-P_{1}^{d} / \eta_{d} \qquad &(1) \\ & \mathrm{SOC}_{t}Cap=\mathrm{SOC}_{t-1}Cap+P_{t}^{c} \eta_{c}-P_{t}^{d} / \eta_{d} \qquad &(2) \\ & \mathrm{SOC}_{24}=\mathrm{SOC}_{Exp} \qquad &(3)\\ & \mathrm{SOC}_{\min } \leq \mathrm{SOC}_{t} \leq \mathrm{SOC}_{\max } \qquad &(4)\\ & P_{\min }^{c} \leq P_{t}^{c} \leq P_{\max }^{c} \qquad &(5) \\ & P_{\min }^{d} \leq P_{t}^{d} \leq P_{\max }^{d} \qquad &(6) \\ \end{aligned} SOC1Cap=SOCIniCap+P1cηcP1d/ηdSOCtCap=SOCt1Cap+PtcηcPtd/ηdSOC24=SOCExpSOCminSOCtSOCmaxPmincPtcPmaxcPmindPtdPmaxd(1)(2)(3)(4)(5)(6)
其中,储能系统荷电状态(State of charge, SOC)的变化需满足功率平衡约束(1)-(3), S O C I n i \mathrm{SOC}_{Ini} SOCIni S O C E x p \mathrm{SOC}_{Exp} SOCExp分别表示储能系统的初值和终值(期望值), η c \eta_{c} ηc η d \eta_{d} ηd为储能系统的充放电效率, C a p Cap Cap表示储能系统的容量(MW)。为保证储能系统的有效运行,约束(4)-(6)规定了SOC以及充、放电功率的上下边界。
因此,带有储能系统的火电机组经济调度模型可以表示为:
min ⁡ P g , t , S O C t , P t d , P t c 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 ⁡ P g , t − P g , t − 1 ≤ R U g P g , t − 1 − P g , t ≤ R D g S O C t = S O C t − 1 + P t c η c − P t d / η d S O C min ⁡ ≤ S O C t ≤ S O C max ⁡ P min ⁡ c ≤ P t c ≤ P max ⁡ c P min ⁡ d ≤ P t d ≤ P max ⁡ d ∑ g P g , t + P t d ≥ L t + P t c \begin{aligned} \min _{P_{g, t}, \mathrm{SOC}_{t}, P_{t}^{d}, P_{t}^{c}} \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 } \\ & P_{g, t}-P_{g, t-1} \leq \mathrm{RU}_{g}\\ & P_{g, t-1}-P_{g, t} \leq \mathrm{RD}_{g} \\ & \mathrm{SOC}_{t}=\mathrm{SOC}_{t-1}+P_{t}^{c} \eta_{c}-P_{t}^{d} / \eta_{d} \\ & \mathrm{SOC}_{\min } \leq \mathrm{SOC}_{t} \leq \mathrm{SOC}_{\max } \\ & P_{\min }^{c} \leq P_{t}^{c} \leq P_{\max }^{c} \\ & P_{\min }^{d} \leq P_{t}^{d} \leq P_{\max }^{d} \\ & \sum_{g} P_{g, t}+P_{t}^{d} \geq L_{t}+P_{t}^{c} \end{aligned} Pg,t,SOCt,Ptd,PtcminTC=g,tagPg,t2+bgPg,t+cgPgminPg,tPgmaxPg,tPg,t1RUgPg,t1Pg,tRDgSOCt=SOCt1+PtcηcPtd/ηdSOCminSOCtSOCmaxPmincPtcPmaxcPmindPtdPmaxdgPg,t+PtdLt+Ptc
其中,a、b、c表示发电机组的成本系数, P g P_g Pg表示每个发电机组的输出功率,且 P g P_g Pg 满足发电上、下限约束和爬坡约束。

Part 2:Python+Gurobi 代码实现

# 导入包
import gurobipy as gp
from gurobipy import GRB
import numpy as np

# 建立模型
zzy = gp.Model()

# 声明变量
Cap = 100
SOC_ini = 0.3
SOC_exp = 0.8
eta_c = 0.95
eta_d = 0.9
N_g = 4
N_t = 24
a = np.array([0.12, 0.17, 0.15, 0.19])
b = np.array([14.8, 16.57, 15.55, 16.21])
c = np.array([89, 83, 100, 70])
Pg_min = np.array([28, 20, 30, 20])
Pg_max = np.array([200, 290, 190, 260])
RU = np.array([40, 30, 30, 50])
RD = np.array([40, 30, 30, 50])
Load = np.array([510, 530, 516, 510, 515, 544, 646, 686, 741, 734, 748, 760, 754, 700, 686, 720, 714, 761, 727, 714,618, 584, 578, 544])
P = zzy.addVars(N_g, N_t, vtype=GRB.CONTINUOUS, lb=0, ub=300, name='P')
SOC = zzy.addVars(N_t, vtype=GRB.CONTINUOUS, lb=0.2, ub=0.9, name='SOC')
Pc = zzy.addVars(N_t, vtype=GRB.CONTINUOUS, lb=0, ub=60, name='Pc')
Pd = zzy.addVars(N_t, vtype=GRB.CONTINUOUS, lb=0, ub=60, name='Pd')

# 添加约束
zzy.addConstrs((P[g, t] <= Pg_max[g] for t in range(N_t) for g in range(N_g)), 'Pg_max')
zzy.addConstrs((P[g, t] >= Pg_min[g] for t in range(N_t) for g in range(N_g)), 'Pg_min')
zzy.addConstrs((P[g, t+1]-P[g, t] <= RU[g] for t in range(N_t-1) for g in range(N_g)), 'RU')
zzy.addConstrs((P[g, t]-P[g, t+1] <= RD[g] for t in range(N_t-1) for g in range(N_g)), 'RD')
zzy.addConstrs(((sum(P[g, t] for g in range(N_g))+Pd[t] >= Load[t]+Pc[t]) for t in range(N_t)), 'Load')
zzy.addConstr(Cap*SOC[0] == Cap*SOC_ini+(Pc[0]*eta_c-Pd[0]/eta_d), name='SOC_1')

# zzy.addConstrs((Cap*SOC[t+1] == Cap*SOC[t]+(Pc[t+1]*eta_c-Pd[t+1]/eta_d) for t in range(N_t-1)), 'SOC')
zzy.addConstrs((Cap*SOC[t] == Cap*SOC[t-1]+(Pc[t]*eta_c-Pd[t]/eta_d) for t in range(1, N_t)), 'SOC')

zzy.addConstr(Cap*SOC[23] == Cap*SOC_exp, name='SOC_24')

# 给出目标函数
zzy.setObjective(sum(a[g]*P[g, t]*P[g, t]+b[g]*P[g, t]+c[g] for t in range(N_t) for g in range(N_g)), GRB.MINIMIZE)

# 求解目标函数
zzy.optimize()

# 输出结果
print('Obj=', zzy.objVal)
zzy.write('zzy.lp')

Part3:Tips

  • Tip 1:为保证储能系统的连续运行,在调度过程中需要考虑其初始和最终状态,即:
# SOC_Ini
zzy.addConstr(Cap*SOC[0] == Cap*SOC_ini+(Pc[0]*eta_c-Pd[0]/eta_d), name='SOC_1')
# SOC_Exp
zzy.addConstr(Cap*SOC[23] == Cap*SOC_exp, name='SOC_24')
  • Tips2:储能系统SOC表达式的两种表示方式
# t+1 形式
zzy.addConstrs((Cap*SOC[t+1] == Cap*SOC[t]+(Pc[t+1]*eta_c-Pd[t+1]/eta_d) for t in range(N_t-1)), 'SOC')
# t-1 形式
zzy.addConstrs((Cap*SOC[t] == Cap*SOC[t-1]+(Pc[t]*eta_c-Pd[t]/eta_d) for t in range(1, N_t)), 'SOC')

Part 4:创作人员名单

作者| 赵子瑜、李同学
代码| 赵子瑜、李同学
审核| 李同学


欢迎大家关注公众号“菜鸟的能源优化之路”获取最新资讯

在这里插入图片描述

参考文献

  1. A. Soroudi, Power System Optimization Modeling in GAMS. 2017. DOI: 10.1007/978-3-319-62350-4.

往期内容回顾

14. 考虑负荷灵敏度分析的火电机组经济调度
13. 拉格朗日乘子法与KKT条件
12. 经济调度问题的建模及求解——考虑爬坡约束
11. 火电机组经济调度建模及求解——基础篇
10. 基于Distflow的最优潮流模型(OPF)–模型推导篇
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——零基础学优化建模

  • 11
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟的能源优化之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值