随着风、光等新能源的普及,在智能电网中加入储能系统有助于提升能源系统规划和运行的灵活性。尤其是考虑到新能源发电的间歇性,储能系统通过充/放电决策可以有效改善配网的能源管理、降低需求响应成本,提升新能源利用率。因此,在文章经济调度问题的建模及求解——考虑爬坡约束的基础上,加入储能约束,实现火力发电机组的经济调度。
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ηc−P1d/ηdSOCtCap=SOCt−1Cap+Ptcηc−Ptd/ηdSOC24=SOCExpSOCmin≤SOCt≤SOCmaxPminc≤Ptc≤PmaxcPmind≤Ptd≤Pmaxd(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,t∑agPg,t2+bgPg,t+cgPgmin≤Pg,t≤PgmaxPg,t−Pg,t−1≤RUgPg,t−1−Pg,t≤RDgSOCt=SOCt−1+Ptcηc−Ptd/ηdSOCmin≤SOCt≤SOCmaxPminc≤Ptc≤PmaxcPmind≤Ptd≤Pmaxdg∑Pg,t+Ptd≥Lt+Ptc
其中,a、b、c表示发电机组的成本系数, P g P_g Pg表示每个发电机组的输出功率,且 P g P_g Pg 满足发电上、下限约束和爬坡约束。
# 导入包
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')
# 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')
# 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')
作者| 赵子瑜、李同学
代码| 赵子瑜、李同学
审核| 李同学
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——零基础学优化建模