本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》
论文与完整源程序_电网论文源程序的博客-优快云博客https://blog.youkuaiyun.com/liang674027206/category_12531414.html
研究背景与意义
- 随着“双碳”目标下中国新型电力系统建设的推进,风电、光伏等可再生能源在电力系统的电量占比逐步提升,未来电网将呈现高新能源渗透率特征.由于新能源存在随机性、波动性,高新能源渗透率下电力系统的日内平衡难度加剧,在极端天气场景出现时更为严峻,如广东省电网在2023年春节期间和夏季台风期间出现的新能源出力预测偏差和运行方式急剧变化问题.
- 为应对极端天气下新能源极端运行场景对电力系统功率平衡带来的挑战,电力系统前瞻调度的概念应运而生,利用日内超短期预测,综合考虑前瞻窗口内短期预测误差导致的调度方案与日前计划偏差,滚动修正日内调度方案,有效保证调度方案的安全性与经济性.
研究方法
- 前瞻调度决策模式:以时间Δt为一个决策周期,调度计划每Δt滚动更新一次,全天共计24/Δt个决策时段.前瞻调度决策模式是在当前决策时段根据实时更新的未来NF个时段的预测数据制定未来NP个时段的发电计划,NF和NP都取为N,称为前瞻调度窗口.
- 前瞻调度三层两阶段鲁棒优化模型:
- 鲁棒不确定集:考虑风电、光伏新能源不确定性,描述为盒式鲁棒不确定集,引入保守度系数Γ调节不确定集的保守度.
- 目标函数:综合考虑水电、火电、储能和联络线多种资源的协调控制,构建min-max-min结构的三层两阶段鲁棒调度模型,第1阶段考虑系统调节成本和网络安全,第2阶段考虑风电/光伏最恶劣情况下系统的消纳和保供目标.
- 约束条件:包括火电功率和爬坡约束、水电功率和电量约束、外部联络线功率约束、储能约束、风电和光伏的弃电功率及切负荷约束、有功平衡约束、基态网络安全约束和故障态网络安全约束.
- 基于GCN-LSTM的冗余约束快速辨识模型:通过建立图模型描述线路网络的空间特性,同时通过建立时间序列模型来描述节点资源的时间特性,并综合两者判断当前模型中的冗余约束,实现前瞻调度鲁棒模型冗余约束的快速辨识.
- 两阶段鲁棒优化模型求解:采用列与约束生成算法求解两阶段鲁棒优化模型,将原问题分解为主问题和子问题,通过在迭代过程中对主问题引入子问题相关的变量和约束交替求解,以得到原问题的最优解.
实验与结果
- 算例设置:基于IEEE 118节点系统进行分析,选取3天场景,其中2天为极端运行场景,验证策略对于电力系统新能源消纳和保供能力的提升效果,1天为对照场景,验证策略在非极端运行场景下的优化效果.
- 冗余约束快速辨识模型性能比较与分析:模型训练后,输出模型的训练集损失为0.0299,验证集损失为0.0343.本文模型相较于单GCN模型与单LSTM网络模型在准确率、召回率、冗余约束辨识率方面均有提升,平均辨识时间仍处在毫秒级,符合冗余约束快速辨识要求.
- 前瞻鲁棒决策方法有效性分析:
- 优化调度结果分析:在极端运行场景下,前瞻计划通过对多个时段不断进行滚动鲁棒优化,为可能到来的极端场景预留充足的调节能力,仅利用第1阶段调节资源即可平抑波动,无须再进行弃电/切负荷操作,提升电力系统的新能源消纳能力和负荷保供能力.
- 求解效率验证:约束削减后的模型相较于未经削减的模型在计算时间与迭代次数方面存在较大提升,列与约束生成算法相较于Benders分解法的求解效率更高.
关键结论
- 提出的冗余约束快速辨识模型能够快速有效地辨识优化模型中的冗余约束,在不影响优化模型结果一致性的前提下,提升模型的求解效率.
- 提出的前瞻鲁棒决策方法在面对极端运行场景时,能够快速求解修正日前计划,有效地再调度各项资源,提升电力系统的新能源消纳能力和负荷保供能力,提高电力系统运行的安全性和经济性.
以下是基于Python语言的仿真复现思路,包括程序代码和步骤注释:
# 导入所需库
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import ReduceLROnPlateau
from gurobipy import Model, GRB, LinExpr
import matplotlib.pyplot as plt
# 定义电力系统和资源类
class PowerSystem:
def __init__(self, num_nodes, num_generators, num_loads, num_renewables, num_storage):
self.num_nodes = num_nodes # 节点数量
self.num_generators = num_generators # 发电机数量
self.num_loads = num_loads # 负荷数量
self.num_renewables = num_renewables # 可再生能源数量
self.num_storage = num_storage # 储能数量
class Generator:
def __init__(self, min_power, max_power, ramp_up, ramp_down):
self.min_power = min_power # 最小功率
self.max_power = max_power # 最大功率
self.ramp_up = ramp_up # 向上爬坡速率
self.ramp_down = ramp_down # 向下爬坡速率
class Renewable:
def __init__(self, capacity, forecast):
self.capacity = capacity # 容量
self.forecast = forecast # 预测出力
class Storage:
def __init__(self, capacity, min_soc, max_soc, charge_power, discharge_power):
self.capacity = capacity # 容量
self.min_soc = min_soc # 最小荷电状态
self.max_soc = max_soc # 最大荷电状态
self.charge_power = charge_power # 充电功率
self.discharge_power = discharge_power # 放电功率
# 初始化电力系统和资源参数
num_nodes = 118
num_generators = 54
num_loads = 90
num_renewables = 25
num_storage = 6
generators = [Generator(100, 500, 50, 50) for _ in range(num_generators)]
renewables = [Renewable(100, np.random.normal(80, 10, 24)) for _ in range(num_renewables)]
storage = [Storage(200, 0.2, 0.8, 50, 50) for _ in range(num_storage)]
power_system = PowerSystem(num_nodes, num_generators, num_loads, num_renewables, num_storage)
# 构建冗余约束快速辨识模型
def build_redundant_constraint_model(X_train, y_train):
# 定义模型结构
model = Sequential()
model.add(LSTM(64, input_shape=(X_train.shape[1], X_train.shape[2]), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(32, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))
# 编译模型
model.compile(optimizer=Adam(learning_rate=0.001), loss='binary_crossentropy', metrics=['accuracy'])
# 训练模型
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=5, min_lr=0.0001)
model.fit(X_train, y_train, epochs=200, batch_size=32, validation_split=0.1, callbacks=[reduce_lr])
return model
# 构建两阶段鲁棒优化模型
def build_two_stage_robust_optimization_model(power_system):
# 创建优化模型
model = Model('TwoStageRobustOptimization')
# 定义第一阶段决策变量
generator_power = model.addVars(power_system.num_generators, 24, lb=0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='GeneratorPower')
storage_charge = model.addVars(power_system.num_storage, 24, lb=0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='StorageCharge')
storage_discharge = model.addVars(power_system.num_storage, 24, lb=0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='StorageDischarge')
# 定义第二阶段决策变量
renewable_spillage = model.addVars(power_system.num_renewables, 24, lb=0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='RenewableSpillage')
load_shedding = model.addVars(power_system.num_loads, 24, lb=0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='LoadShedding')
# 设置目标函数
objective = LinExpr()
for t in range(24):
for g in range(power_system.num_generators):
objective += generator_power[g, t] * generators[g].ramp_up
for s in range(power_system.num_storage):
objective += storage_charge[s, t] * storage[s].charge_power
objective += storage_discharge[s, t] * storage[s].discharge_power
for r in range(power_system.num_renewables):
objective += renewable_spillage[r, t] * renewables[r].capacity
for l in range(power_system.num_loads):
objective += load_shedding[l, t] * 100 # 假设负荷削减成本为100
model.setObjective(objective, GRB.MINIMIZE)
# 添加约束条件
for t in range(24):
# 发电机功率约束
for g in range(power_system.num_generators):
model.addConstr(generator_power[g, t] >= generators[g].min_power, 'GeneratorMinPower')
model.addConstr(generator_power[g, t] <= generators[g].max_power, 'GeneratorMaxPower')
# 储能约束
for s in range(power_system.num_storage):
model.addConstr(storage_charge[s, t] <= storage[s].charge_power, 'StorageChargePower')
model.addConstr(storage_discharge[s, t] <= storage[s].discharge_power, 'StorageDischargePower')
model.addConstr(storage_charge[s, t] + storage_discharge[s, t] <= storage[s].capacity, 'StorageCapacity')
# 可再生能源弃电约束
for r in range(power_system.num_renewables):
model.addConstr(renewable_spillage[r, t] <= renewables[r].forecast[t], 'RenewableSpillage')
# 负荷削减约束
for l in range(power_system.num_loads):
model.addConstr(load_shedding[l, t] <= 100, 'LoadShedding') # 假设最大负荷削减为100
# 有功平衡约束
power_balance = LinExpr()
for g in range(power_system.num_generators):
power_balance += generator_power[g, t]
for s in range(power_system.num_storage):
power_balance += storage_discharge[s, t] - storage_charge[s, t]
for r in range(power_system.num_renewables):
power_balance += renewables[r].forecast[t] - renewable_spillage[r, t]
model.addConstr(power_balance == 1000, 'PowerBalance') # 假设总负荷为1000
return model
# 主程序
if __name__ == "__main__":
# 生成训练数据
num_samples = 14400
X = np.random.rand(num_samples, 24, 5) # 假设输入特征为5个
y = np.random.randint(0, 2, num_samples) # 假设冗余约束标签为0或1
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42)
# 标准化数据
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train.reshape(-1, X_train.shape[-1])).reshape(X_train.shape)
X_test = scaler.transform(X_test.reshape(-1, X_test.shape[-1])).reshape(X_test.shape)
# 训练冗余约束快速辨识模型
redundant_constraint_model = build_redundant_constraint_model(X_train, y_train)
# 构建两阶段鲁棒优化模型
robust_optimization_model = build_two_stage_robust_optimization_model(power_system)
# 求解优化模型
robust_optimization_model.optimize()
# 输出
本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》
论文与完整源程序_电网论文源程序的博客-优快云博客https://blog.youkuaiyun.com/liang674027206/category_12531414.html