如何在PyPSA模型中使用内置碳排放全局约束
用PyPSA内置全局约束替代手动碳排放限制的实现方法
问题概述
你搭建了一个含11台发电机的电力系统模型,目前通过自定义extra_functionality实现了碳排放总量限制,希望改用PyPSA内置的全局约束功能简化代码。
关键修改步骤
PyPSA内置了针对碳排放总量的全局约束类型CO2Limit,只需两步即可替代手动约束:
- 给每台发电机配置
co2_emissions属性(PyPSA内置约束会自动读取该字段计算排放量) - 使用
network.add_global_constraint添加碳排放总量限制
修改后的完整代码
import pypsa import numpy as np import pandas as pd start_mt = 1 start_yr = 2022 end_mt = 1 end_yr = 2022 end_day = 31 frequency = 60 snapshots = pd.date_range(f"{start_yr}-{start_mt}-01", f"{end_yr}-{end_mt}-{end_day} 23:59", freq=f"{frequency}min") np.random.seed(len(snapshots)) # 创建PyPSA网络 network = pypsa.Network() # 添加母线与负荷 network.add("Bus", "Bus") network.set_snapshots(snapshots) load_profile = np.random.randint(2000, 3000, len(snapshots)) network.add("Load", "Load profile", bus="Bus", p_set=load_profile) # 发电机数据字典(保留原有属性,新增co2_emissions对应原co2_emission_factor) generator_data = { 'coal1': {'capacity': 800, 'ramp up': 0.6, 'ramp down': 0.6, 'variable cost': 10, 'co2_emissions': 0.95}, 'coal2': {'capacity': 600, 'ramp up': 0.6, 'ramp down': 0.6, 'variable cost': 11, 'co2_emissions': 0.95}, 'coal3': {'capacity': 500, 'ramp up': 0.6, 'ramp down': 0.6, 'variable cost': 11, 'co2_emissions': 0.95}, 'gas1': {'capacity': 600, 'ramp up': 0.45, 'ramp down': 0.45, 'variable cost': 12, 'co2_emissions': 0.45}, 'gas2': {'capacity': 600, 'ramp up': 0.45, 'ramp down': 0.45, 'variable cost': 13, 'co2_emissions': 0.45}, 'nuclear1': {'capacity': 300, 'ramp up': 0.01, 'ramp down': 0.01, 'variable cost': 4, 'co2_emissions': 0.03}, 'nuclear2': {'capacity': 400, 'ramp up': 0.01, 'ramp down': 0.01, 'variable cost': 3, 'co2_emissions': 0.03}, 'nuclear3': {'capacity': 250, 'ramp up': 0.01, 'ramp down': 0.01, 'variable cost': 3, 'co2_emissions': 0.03}, 'solar1': {'capacity': 150, 'ramp up': 1, 'ramp down': 1, 'variable cost': 1, 'co2_emissions': 0.0}, 'solar2': {'capacity': 200, 'ramp up': 1, 'ramp down': 1, 'variable cost': 2, 'co2_emissions': 0.0}, 'backup': {'capacity': 2000, 'ramp up': 1, 'ramp down': 1, 'variable cost': 20, 'co2_emissions': 0.0}, } # 添加发电机到网络,新增co2_emissions参数 for name, data in generator_data.items(): network.add("Generator", name, bus="Bus", p_nom=data['capacity'], marginal_cost=data['variable cost'], ramp_limit_up=data['ramp up'], ramp_limit_down=data['ramp down'], co2_emissions=data['co2_emissions'] # 关键:配置碳排放因子 ) # 添加PyPSA内置的碳排放总量约束 # limit值为400000吨(对应原约束的0.04百万吨) network.add_global_constraint( "CO2Limit", type="CO2Limit", carrier_attribute="co2_emissions", limit=400000 ) # 调用lopf求解,无需再传extra_functionality solver_name = "gurobi" network.lopf(network.snapshots, solver_name=solver_name) # 计算并输出碳排放总量 dispatch = network.generators_t.p total_gen = dispatch.sum() co2 = sum([total_gen[gen] * data['co2_emissions'] for gen, data in generator_data.items()]) print('CO2 Emission = ', co2) # 导出结果 dispatch['load profile'] = load_profile dispatch.to_excel('fuel wise dispatch.xlsx')
修改说明
- 发电机属性配置:将原
co2_emission_factor重命名为co2_emissions并赋值给发电机的同名参数,PyPSA的CO2Limit约束会自动读取该属性计算每台机组的排放量。 - 内置约束添加:通过
add_global_constraint创建类型为CO2Limit的全局约束,limit参数直接设置为总排放量上限(单位:吨,对应原约束的400000吨),无需手动编写求和逻辑。 - 移除自定义函数:删除原有的
extra_functionality函数,调用lopf时不再需要传递该参数,代码更简洁且复用PyPSA内置的成熟约束逻辑。
效果验证
修改后的模型会自动将总碳排放量限制在400000吨以内,与原手动约束的效果完全一致,同时减少了自定义代码的维护成本,降低出错概率。
内容的提问来源于stack exchange,提问作者Vesper
相关产品推荐
相关产品推荐

