1. 微电网经济调度问题概述
微电网经济调度本质上是一个多目标优化问题,需要在满足电力供需平衡的前提下,综合考虑各类发电设备的运行特性与经济性指标。以一个包含风机、光伏、微型燃气轮机和蓄电池的典型微电网系统为例,我们需要在24小时调度周期内,合理分配各机组的出力,使得总运行成本最低。
这个问题的复杂性主要体现在三个方面:首先,不同发电设备具有完全不同的成本特性——风机和光伏的边际成本接近于零但出力不可控,燃气轮机响应快速但燃料成本高昂,蓄电池则存在充放电效率损失。其次,系统需要满足严格的功率平衡约束,任何时刻的总发电量必须精确匹配负荷需求。最后,各类设备都有其物理运行限制,比如燃气轮机的最小出力限制、蓄电池的SOC安全区间等。
2. 优化模型构建框架
2.1 Pyomo建模基础
Pyomo作为Python下的优化建模工具,其核心优势在于可以用声明式语法描述优化问题。我们首先需要定义模型的基本结构:
python复制from pyomo.environ import *
# 初始化具体模型
model = ConcreteModel()
# 定义时间集合(24小时调度周期)
model.T = RangeSet(1, 24)
# 定义设备集合
devices = ['风机', '光伏', '燃机', '电池放电']
这里特别需要注意的是,蓄电池需要单独建模充放电两种状态,实际操作中通常会将其拆分为两个虚拟设备:"电池充电"和"电池放电",并添加互斥约束防止同时充放电。
2.2 决策变量定义
每个设备的出力都需要定义为决策变量,并设置合理的上下限:
python复制# 风机出力变量(单位:kW)
model.风机出力 = Var(model.T, bounds=(0, 风机额定容量))
# 光伏出力变量
model.光伏出力 = Var(model.T, bounds=(0, 光伏预测出力))
# 燃气轮机出力变量
model.燃机出力 = Var(model.T, bounds=(燃机最小出力, 燃机额定容量))
# 蓄电池充放电功率(正为放电,负为充电)
model.电池充放电 = Var(model.T, bounds=(-充电最大功率, 放电最大功率))
提示:燃气轮机的最小出力通常设定为额定容量的30%,低于这个值会导致燃烧效率急剧下降。
3. 成本函数建模细节
3.1 燃气轮机成本曲线
燃气轮机的成本特性是典型的非线性关系,采用二次函数建模更为准确:
python复制def 燃机成本规则(model, t):
return (0.5 * model.燃机出力[t]**2 # 燃料消耗的二次项
+ 20 * model.燃机出力[t] # 线性项
+ 15) # 固定启动成本
model.燃机成本 = Expression(model.T, rule=燃机成本规则)
这个成本函数包含三个部分:二次项反映燃料消耗随出力增加的非线性增长特性,线性项表示基本运行维护成本,常数项则对应机组启动的固定成本。
3.2 可再生能源运维成本
风光设备的边际成本较低,但需要考虑运维费用:
python复制# 风机运维成本(元/kWh)
model.风机成本 = Expression(model.T,
rule=lambda m,t: 3 * m.风机出力[t])
# 光伏运维成本
model.光伏成本 = Expression(model.T,
rule=lambda m,t: 2 * m.光伏出力[t])
3.3 蓄电池寿命损耗成本
蓄电池成本建模需要特别考虑循环寿命损耗:
python复制model.电池成本 = Expression(model.T,
rule=lambda m,t: 0.1 * abs(m.电池充放电[t])) # 充放电均会产生损耗
这里采用绝对值函数处理充放电功率,因为无论充电还是放电都会对电池寿命产生影响。实际工程中可能需要更精细的寿命模型,考虑SOC波动幅度的影响。
4. 系统约束条件实现
4.1 功率平衡约束
最核心的约束是确保每个时段的发电总量满足负荷需求:
python复制def 功率平衡规则(model, t):
return (model.风机出力[t] + model.光伏出力[t]
+ model.燃机出力[t] + model.电池充放电[t]
== 负荷预测[t])
model.功率平衡 = Constraint(model.T, rule=功率平衡规则)
4.2 蓄电池动态模型
蓄电池的状态变化需要建立递推关系:
python复制# 电池SOC状态变量(20%-80%安全范围)
model.电池SOC = Var(model.T, bounds=(0.2, 0.8))
def 电池逻辑(model, t):
if t == 1:
return model.电池SOC[t] == 0.5 # 初始SOC设为50%
else:
return (model.电池SOC[t] == model.电池SOC[t-1]
+ 0.9*model.电池充放电[t]/电池容量) # 充放电效率90%
model.电池状态 = Constraint(model.T, rule=电池逻辑)
注意:蓄电池的充放电效率通常不对称,实际应用中充电效率可能为85%,放电效率为95%,需要分别建模。
4.3 燃气轮机爬坡约束
燃气轮机出力变化率需要限制:
python复制def 燃机爬坡规则(model, t):
if t == 1:
return Constraint.Skip # 第一个时段无前驱
else:
return (-燃机最大降负荷 <= (model.燃机出力[t] - model.燃机出力[t-1])
<= 燃机最大升负荷)
model.燃机爬坡 = Constraint(model.T, rule=燃机爬坡规则)
5. 目标函数与求解
5.1 综合成本目标
将所有成本项汇总为单一目标函数:
python复制model.总成本 = Objective(
expr=sum(
model.燃机成本[t] +
model.风机成本[t] +
model.光伏成本[t] +
model.电池成本[t]
for t in model.T),
sense=minimize)
5.2 求解器选择与参数设置
对于这类混合整数非线性规划问题(MINLP),推荐使用IPOPT求解器:
python复制solver = SolverFactory('ipopt')
results = solver.solve(model)
关键求解参数设置:
python复制solver.options['max_iter'] = 1000 # 最大迭代次数
solver.options['tol'] = 1e-6 # 收敛容差
6. 结果分析与验证
6.1 出力分配合理性检查
求解完成后需要验证几个关键点:
- 功率平衡验证:每个时段的总发电量是否精确匹配负荷需求
- 设备运行边界:燃气轮机出力是否在30%-100%之间,蓄电池SOC是否维持在20%-80%
- 经济性表现:高电价时段是否优先使用蓄电池放电,低电价时段是否充电
6.2 典型场景分析
观察几种典型场景下的机组响应:
- 风光充足时段:光伏和风机承担主要负荷,燃气轮机维持最小出力,蓄电池可能充电储能
- 早晚峰时段:燃气轮机快速爬升出力,蓄电池协同放电缓解压力
- 风光骤降时段:燃气轮机紧急增加出力,蓄电池提供瞬时功率支撑
6.3 灵敏度分析案例
研究环保政策收紧对调度结果的影响:
python复制# 修改污染成本系数从0.5提高到1.2
def 燃机成本规则(model, t):
return (1.2 * model.燃机出力[t]**2 # 提高污染成本
+ 20 * model.燃机出力[t]
+ 15)
对比调整前后的结果可以发现,燃气轮机出力曲线明显"瘦身",更多依赖蓄电池进行调峰,这体现了环保成本与经济效益的权衡。
7. 工程实践中的注意事项
7.1 预测误差处理
实际应用中需要处理风光出力和负荷预测的不确定性:
- 采用滚动优化策略,每15分钟更新一次预测数据
- 预留5%-10%的旋转备用容量
- 设置蓄电池的应急备用SOC区间
7.2 代码优化技巧
- 稀疏矩阵利用:对于大规模问题,使用
Set和Param的稀疏存储方式 - 热启动策略:利用上一周期解作为初始猜测,加速收敛
- 分段线性化:将非线性成本函数近似为分段线性,提高求解效率
7.3 常见问题排查
-
求解器不收敛:
- 检查约束冲突(如SOC上下限设置过紧)
- 放宽收敛容差(tol参数)
- 提供更好的初始值
-
结果不符合预期:
- 验证单位一致性(kW与kWh的转换)
- 检查成本系数数量级是否合理
- 确认约束条件是否完整
-
求解时间过长:
- 尝试不同的求解器(如Bonmin)
- 简化模型(如忽略次要非线性项)
- 增加迭代次数限制
8. 模型扩展方向
8.1 需求响应集成
引入电价弹性负荷模型:
python复制model.可调负荷 = Var(model.T, bounds=(0, 最大可调量))
def 需求响应规则(model, t):
return 负荷预测[t] - model.可调负荷[t] <= 实际负荷[t]
8.2 多微电网互联
考虑微电网间的功率交换:
python复制model.购电 = Var(model.T, bounds=(0, 联络线容量))
model.售电 = Var(model.T, bounds=(0, 联络线容量))
8.3 鲁棒优化版本
应对最坏场景的鲁棒优化模型:
python复制from pyomo.robust import UncertainParam
model.光伏不确定 = UncertainParam(model.T,
bounds=(0.8*光伏预测, 1.2*光伏预测))
在实际微电网调度系统实施时,建议采用分层优化架构:上层进行日前经济调度计算,下层实时滚动修正。同时需要建立完善的结果可视化界面,直观展示各机组出力曲线、SOC变化趋势和成本构成,方便运营人员决策。