PyPSA添加孤立储能与链路后LOPF优化耗时异常求助
问题描述
我有一个包含母线、线路、带max_pu/min_pu曲线的发电机、带p_set的负荷及快照的AC网络,无变压器,通过import_from_csv导入数据,bus.csv中包含平衡母线。使用PyPSA v0.23执行network.lopf()进行机组组合(调度)优化,无容量扩展需求,原网络可在30秒内完成优化并实现所有母线功率平衡,代码如下:
try: network.lopf(network.snapshots) except Exception as e: print("An error occurred during optimization: " + str(e))
为平衡光伏过剩功率添加储能单元后,LOPF优化一直无法得到结果。我尝试在新母线"bus1"上添加孤立储能、负荷及充放电链路(代码如下),优化仍无进展:
# Add a store to the network network.add("Bus", "bus1", v_nom=380, carrier='AC', control='Slack', ) # Add a store to the network network.add("Store", "store1", bus="bus1", e_nom=100, e_initial=50, e_min_pu=0, e_max_pu=1, marginal_cost=1, ) # Add two links to the network, representing the charging and discharging of the storage unit network.add("Link", "charging_link", bus0="bus1", bus1="bus1", p_nom=100, efficiency=0.9) network.add("Link", "discharging_link", bus0="bus1", bus1="bus1", p_nom=100, efficiency=0.9) # Add a load to the network network.add("Load", "load1", bus="bus1", p_set=1)
添加GLPK求解器选项后还出现了找不到线路名称的异常:
# Setting solver options as a dictionary for GLPK solver_options = {"msg_lev": "GLP_MSG_ALL"} try: network.lopf(network.snapshots,solver_options=solver_options) except Exception as e: print("An error occurred during optimization: " + str(e))
求助如何合理配置储能及链路以实现LOPF优化,希望能先通过随机参数运行再适配真实数据,确保优化能在1分钟内完成。
解决方案建议
1. 修正储能充放电链路的逻辑错误
当前充放电链路都连接同一母线,无法正确模拟储能的充放电功率流向。正确的配置需要明确功率的吸收/释放方向,建议直接在光伏接入的现有母线上添加储能,避免孤立母线:
# 在现有光伏接入母线上添加储能(替换为实际母线名称) network.add("Store", "pv_storage", bus="光伏接入母线名", e_nom=100, e_initial=50, e_min_pu=0, e_max_pu=1, marginal_cost=1, ) # 充电链路:从母线吸收功率(p_min_pu=-1允许反向功率,p_max_pu=0限制仅充电) network.add("Link", "storage_charge", bus0="光伏接入母线名", bus1="光伏接入母线名", p_nom=100, efficiency=0.9, p_min_pu=-1, p_max_pu=0, ) # 放电链路:向母线释放功率(p_min_pu=0限制仅放电,p_max_pu=1允许满额输出) network.add("Link", "storage_discharge", bus0="光伏接入母线名", bus1="光伏接入母线名", p_nom=100, efficiency=0.9, p_min_pu=0, p_max_pu=1, )
2. 移除多余的Slack母线
原网络已存在平衡母线,新增的bus1设置为Slack母线会导致潮流计算的自由度冲突,这是优化无法收敛的核心原因之一。直接在现有电网母线上配置储能即可,无需新增独立Slack母线。
3. 修复GLPK求解器选项的传递格式
PyPSA中求解器选项需要嵌套在对应求解器的字典下,错误的格式会引发参数解析异常,正确写法如下:
# 正确传递GLPK求解器选项 solver_options = {'glpk': {'msg_lev': 'GLP_MSG_ALL'}} try: network.lopf(network.snapshots, solver_options=solver_options) except Exception as e: print("优化过程中出错:" + str(e))
4. 提升优化收敛速度的额外措施
- 先做小规模测试:用随机生成的3-5个母线、1台发电机、1个负荷和1组储能验证配置,确认能快速收敛后再替换真实数据。
- 调整储能边际成本:设置为弃光成本的50%-80%,避免优化器因成本过高/过低跳过储能使用。
- 限制快照数量:先测试1-2个快照的优化,再逐步扩展到全时段,减少计算量。
- 切换高效求解器:如果GLPK性能不足,可尝试CBC(开源)或Gurobi/CPLEX(商业),只需在
lopf中指定solver_name='cbc'即可。
内容的提问来源于stack exchange,提问作者Antonio Dominguez-Ramos
相关产品推荐
相关产品推荐

