当屋顶光伏板、燃气轮机、储能电池这些设备组成混合能源系统时,如何让它们高效协同工作就成了个烧脑问题。最近我用CPLEX完成了一个包含碳交易机制的四能源(冷、热、电、气)系统优化项目,期间踩过的坑和收获的经验,值得和各位同行分享。
这个系统的核心挑战在于:既要满足多元用能需求,又要兼顾经济性和低碳目标。光伏和风机发电看天吃饭,燃气设备受燃料成本和碳排放约束,储能系统效率飘忽不定——就像同时玩转多个魔方,每个面都要对齐。下面我就从设备建模、约束处理、求解技巧三个层面,拆解这个复杂系统的优化方法。
发电单元需要特别关注出力特性:
储能系统的建模最易出错:
python复制# 蓄电池建模示例
m.SOC_BAT = Var(m.BAT, m.T, bounds=(0, 200)) # 电量状态(kWh)
m.P_BAT_ch = Var(m.BAT, m.T, within=NonNegativeReals) # 充电功率
m.P_BAT_dis = Var(m.BAT, m.T, within=NonNegativeReals) # 放电功率
# 充放电互斥约束
for t in m.T:
m.addConstraint(m.P_BAT_ch[t] <= 50 * m.u_ch[t]) # 50kW最大充电
m.addConstraint(m.P_BAT_dis[t] <= 50 * (1 - m.u_ch[t])) # 放电约束
m.addConstraint(m.SOC_BAT[t] == m.SOC_BAT[t-1]
+ 0.95*m.P_BAT_ch[t] - 1.05*m.P_BAT_dis[t]) # 考虑效率损失
能量转换设备要注意效率曲线:
关键经验:所有效率参数必须用设备厂商的实测数据,教科书上的参考值会导致优化结果严重偏离实际
电力平衡是最复杂的部分,需要同时考虑:
热平衡则要注意热惯性带来的延时效应:
python复制# 热网动态平衡方程
m.addConstraint(sum(m.Q_EB[t] for m.EB) + m.Q_HRU[t] + m.Q_HS_dis[t]
== heat_demand[t] + m.Q_HS_ch[t] for t in m.T)
燃气轮机的最小启停时间约束是稳定求解的关键:
python复制# 最小运行4小时约束
for t in range(3, len(m.T)-3):
m.addConstraint(m.status_GT[t] >= m.status_GT[t-1] - m.status_GT[t-3])
m.addConstraint(m.status_GT[t] <= 1 - m.status_GT[t-1] + m.status_GT[t-3])
储能系统的充放电循环限制也容易忽略:
阶梯式碳价是最有效的成本控制手段:
python复制carbon_cost = quicksum(
min(m.carbon_emission[t], quota) * base_price +
max(m.carbon_emission[t] - quota, 0) * penalty_price
for t in m.T)
避坑指南:碳配额分配建议采用历史排放法,基准线法需要至少3年运行数据支撑
python复制cplex = SolverFactory('cplex')
cplex.options['mipgap'] = 0.01 # 设置1%最优间隙
cplex.options['timelimit'] = 600 # 10分钟超时
cplex.options['threads'] = 4 # 多线程加速
问题1:模型不可行时,用CPLEX冲突分析器定位矛盾约束
bash复制cplex.read_conflict("model.conflict")
问题2:遇到震荡解时,增加设备最小运行时间约束
python复制# 强制电锅炉连续运行2小时以上
for t in range(1, len(m.T)-1):
m.addConstraint(m.status_EB[t] >= m.status_EB[t-1] - m.status_EB[t+1])
某商业园区案例的优化效果:
典型日的设备调度策略:
| 时段 | 光伏出力 | 燃气轮机 | 蓄电池 | 电网交互 |
|---|---|---|---|---|
| 0:00 | 0 | 关闭 | 放电 | 购电 |
| 10:00 | 85kW | 开启 | 充电 | 售电 |
| 14:00 | 120kW | 关闭 | 满容 | 售电 |
遇到的意外情况处理:
这个项目给我的最大启示是:能源系统优化不是单纯的数学问题,需要把设备物理特性、市场规则、甚至天气预报都考虑进来。下次我会尝试加入强化学习来应对不确定性——不过那又是另一个掉头发的故事了。