You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PyPSA模型中使用内置碳排放全局约束

用PyPSA内置全局约束替代手动碳排放限制的实现方法

问题概述

你搭建了一个含11台发电机的电力系统模型,目前通过自定义extra_functionality实现了碳排放总量限制,希望改用PyPSA内置的全局约束功能简化代码。

关键修改步骤

PyPSA内置了针对碳排放总量的全局约束类型CO2Limit,只需两步即可替代手动约束:

  1. 给每台发电机配置co2_emissions属性(PyPSA内置约束会自动读取该字段计算排放量)
  2. 使用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')

修改说明

  1. 发电机属性配置:将原co2_emission_factor重命名为co2_emissions并赋值给发电机的同名参数,PyPSA的CO2Limit约束会自动读取该属性计算每台机组的排放量。
  2. 内置约束添加:通过add_global_constraint创建类型为CO2Limit的全局约束,limit参数直接设置为总排放量上限(单位:吨,对应原约束的400000吨),无需手动编写求和逻辑。
  3. 移除自定义函数:删除原有的extra_functionality函数,调用lopf时不再需要传递该参数,代码更简洁且复用PyPSA内置的成熟约束逻辑。

效果验证

修改后的模型会自动将总碳排放量限制在400000吨以内,与原手动约束的效果完全一致,同时减少了自定义代码的维护成本,降低出错概率。

内容的提问来源于stack exchange,提问作者Vesper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:12:34