PyPSA模型中光伏电站无法向电网送电的问题排查与建议
PyPSA光伏电站模型无电网送电问题分析
模型代码
import pandas as pd import pypsa index = pd.date_range("2024-01-01 00:00", "2024-01-01 23:00", freq="H") network = pypsa.Network(snapshots=index) network.add("Bus", "main_bus") network.add("Bus", "grid_bus") pv_pu = pd.Series([ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 0.9, 1.0, 1.0, 0.9, 0.8, 0.5, 0.5, 0.2, 0.1, 0.0, 0.0, 0.0, 0.0 ], index) demand = pd.Series([ 0.3, 0.3, 0.3, 0.3, 0.3, 0.5, 1.0, 2.0, 1.5, 0.8, 0.6, 0.7, 0.8, 0.7, 0.6, 0.7, 0.8, 1.5, 2.5, 2.0, 1.5, 1.0, 0.5, 0.3 ], index) network.add("Generator", "PV", bus="main_bus", p_nom_extendable=True, p_nom_min=5, p_nom_max=15, p_max_pu=pv_pu, capital_cost=400, marginal_cost=0) network.add("Link", "grid_export", bus0="main_bus", bus1="grid_bus", p_nom_extendable=True, p_nom_min=0, p_nom_max=10, efficiency=1, capital_cost=0, marginal_cost=-5.0) network.add("Load", "grid_sink", bus="grid_bus", p_set=0) network.add("Load", "demand", bus="main_bus", p_set=demand) network.add("StorageUnit", "battery", bus="main_bus", p_nom_extendable=True, max_hours=4, capital_cost=150, efficiency_store=0.95, efficiency_dispatch=0.95, standing_loss=0.01, cyclic_state_of_charge=True)
问题描述
优化后发现光伏电站或电池从未向电网送电,需排查是默认目标函数问题还是模型设置有误,并寻求优化建议。
原因分析
- 电网侧无接收机制:你设置的
grid_sink负载p_set=0,相当于电网不接受任何送电,模型没有外送电量的出口,自然不会安排送电。 - 目标函数与成本优先级:PyPSA默认目标是最小化系统总成本。电池的
capital_cost=150远低于光伏的400,模型会优先选择用储能存储多余光伏电量(用于后续负荷高峰),而非通过外送获取收益——因为存储的长期成本更低。 - 光伏装机与负荷匹配:光伏
p_nom_min=5,白天满发时出力完全覆盖最高2.5MW的负荷,多余电量被电池存储,没有外送的必要性。
优化建议
1. 修复电网送电的收益与接收机制
移除无效的grid_sink,添加电网收购电量的逻辑,让外送能产生收益:
# 移除原grid_sink负载 network.remove("Load", "grid_sink") # 添加模拟电网收购的Generator,按单位价格5收购电量 network.add("Generator", "grid_buy", bus="grid_bus", p_nom_extendable=True, marginal_cost=5.0, # 电网收购价格,对应外送的收益 p_max_pu=pd.Series(1.0, index=index)) # 允许电网无限接收电量
2. 调整成本优先级,引导外送行为
如果希望优先外送而非存储,可调整参数:
- 降低外送的收益门槛:将
grid_export的marginal_cost调至更负(如-10.0),提升外送的收益权重; - 提高储能成本:增加电池的
capital_cost,或限制电池的max_hours/p_nom_max,降低储能的优先级。
3. 自定义目标函数(可选)
若需最大化收益而非最小化成本,可替换默认目标:
from pypsa.linopt import get_var def maximize_profit(network, snapshots): # 获取核心变量 link_p = get_var(network, "Link", "p") pv_nom = get_var(network, "Generator", "p_nom") link_nom = get_var(network, "Link", "p_nom") battery_nom = get_var(network, "StorageUnit", "p_nom") # 计算总收益:外送收益 - 投资成本 total_profit = (link_p * 5.0).sum() - (pv_nom * 400).sum() - (link_nom * 0).sum() - (battery_nom * 150).sum() # PyPSA默认最小化目标,因此取负转化为最大化问题 network.model.objective = -total_profit # 调用自定义目标运行优化 network.lopf(snapshots, extra_functionality=maximize_profit)
4. 验证连接逻辑
确认grid_export的方向正确:bus0为送电端(main_bus)、bus1为接收端(grid_bus),当前设置无误,只需确保接收端有电量消耗/收购机制即可。
内容的提问来源于stack exchange,提问作者Jack Tang
相关产品推荐
相关产品推荐

