1 模型框架
VALUE 模拟电力系统的半小时运行及其年度资产变化。发电、储能和进口电力按报价参与市场出清;各资产的年度收入、运行成本和扩容空间决定投资与退役提案;项目按建设周期和地区成功率进入后续年份的在役资产。结果包括发电量、储能充放电、供电缺口、价格、系统成本、碳排放及各技术的在役容量。
时间、单位与空间
模型以 UTC 半小时为运行步长,每年固定为 365 天、17,520 期,2 月取 28 天。功率以 MW 表示,每期电量以 MWh 表示;在 0.5 小时内,1 MW 对应 0.5 MWh。完整运行年的结果进入年度投资计算,项目投运和退役在年与年之间更新。
全国单节点模型将大不列颠的需求与供给汇总出清,互联线以外部电力报价参与交易。分区模型按资源位置和需求份额形成各区电力平衡,并施加区间线路与边界约束。第 7 章给出 23 区输入、资源落点、网络约束和数值求解过程。
金额采用起始年不变币值的情景设定,默认起始年为 2025 年。输入表保留技术成本、进口电价和政策参数各自的价格年份。第 2 章列出输入及换算方式,第 5 章列出以 2025 年英镑表示的机组重启成本。
运行方法
默认全国运行使用 value-corrected 配置和 value-bid-at-cost-psm 模块,该模块的 Native 内核采用 native-corrected-v1 的报价排序、统一边际结算、储能充放电和火电下调规则。每期先根据预测需求和可用出力形成计划,再根据当期需求、可用出力及剩余调节能力执行平衡。第 5 章按这一顺序描述完整算法。
value-staged-bid-at-cost-psm 将全国计划传递给独立的平衡模块。value-copperplate-balancing 求单节点平衡,value-zonal-redispatch-balancing 求网络约束下的分区再调度。第 4 章说明计划、平衡和储能状态的连接,第 7 章说明分区再调度的目标函数、约束及结算。
完全预见调度在给定求解时窗内同时使用全部需求与可用出力序列,并联合优化发电、进口和储能。value-perfect-foresight-lp 的目标、时序约束及储能终值见第 8 章。该章同时给出径流和水库从天然入流到可用水电的计算。
初始条件与年度顺序
一次计算由输入数据包、起止年份、所选模块和数值参数共同确定。native_initial_state 根据机组表、REPD 项目、成本表、建设周期和地区成功率构造 initial_state。在役资产带有技术、地区、功率容量、储能能量容量、成本与寿命;规划项目带有容量、状态和预计投运年。第 2 章给出输入字段、取值和初始化规则。
模型每年先推进规划项目,再运行全年市场,最后形成下一年的资产与项目状态。AnnualModelOrchestratorV2.run 按下表顺序调用各模块;各项计算的公式、初始值与边界条件在相应章节展开。
| 顺序 | 计算内容 | 变量与函数 | 章节 |
|---|---|---|---|
| 1 | 按项目投运年更新当年在役资产 | planning.advance_year 生成 advanced.operating_state |
6 |
| 2 | 整理需求、天气、可用出力和外部交换 | psm_input_factory 生成 model_input |
2、3 |
| 3 | 逐期出清并汇总运行结果 | psm.run 生成 market |
4、5、7、8 |
| 4 | 由当年需求、出力及储能使用量计算扩容空间 | policy.evaluate 生成 headroom |
6 |
| 5 | 按投资主体与技术地区分组评价收益 | adapt_market_for_investment 整理账户,investment.decide 生成 decision.proposals |
6 |
| 6 | 按建设周期与成功率准入投资项目 | planning.admit_projects 生成 admission |
6 |
| 7 | 执行资产寿命、退役和新项目更新 | transition.apply 生成 next_state |
6 |
储能的期内库存与年度成本观察值分别更新。全国运行在每个运行年创建储能对象;上一年售电量和储存时长用于下一年的动态储能成本。第 4、5 章给出库存初值、效率、自放电、逐期功率限制和年度处理。
年度投资依据实际收入、总资本支出、目标回收期和偏好收益率作出决策。燃气和生物质的投资净收入扣除运行成本;风电、光伏和储能按其收入计算投资收益。第 6 章给出逐项成本、四级决策规则、建设时长、成功率和资产更新的伪代码。
年度输出由逐期结果求和或按电量加权。供电量等于需求电量扣除未供电量,系统成本汇总运行与年化资本支出,碳排放按发电量、进口电量和设备容量核算。第 5、6、9 章分别定义这些量、单位和分母。
返回目录 ↑2 初始数据与输入处理
VALUE 用需求、天气、运行资产、规划项目、技术参数以及外部市场价格和交换上限构建电力系统研究。来源年份确定观测样本,研究起始年确定初始机组及后续投资日历。默认 value-corrected 配置采用下列 public2 数据包,可从数据页取得。
| 研究输入 | 数据包 | 内容 |
|---|---|---|
| 英国全国系统 | value-uk-open-data-pack-public2 |
需求、代表点天气、机组、规划、成本及五个外部市场 |
| 英国 2025–2034 年日历平均天气研究 | value-uk-calendar-vx-trade001-public2 |
R029 配置,采用 2022 年需求与 2020–2024 年天气 |
| 英国 23 区系统 | value-uk-research-suite-v1-public2 |
全国输入、分区需求、资产分配、走廊与外部边界 |
| VALUE 101 | 合成教学输入 | 2025–2026 年研究,包含完整的 17,520 时段年和 48 时段练习;生成规则见下文 |
输入角色将文件与物理量相连接。数据包的 manifest.json 为每个角色指定文件,并声明列名、单位及时间分辨率。下表列出 R029 文件和它们向计算提供的量。
| 输入角色 | 主要数据或字段 | 计算用途 |
|---|---|---|
| 实际需求、需求预测 | actual_mw.csv 的 demand_mw;forecast_mw.csv 的 forecast_mw |
实时平衡、日前出清及需求误差 |
| 机组与初始资产 | fleet.json、年度 operating_state |
技术参数、代表位置和进入调度的容量 |
| 项目及规划 | repd_projects_normalized.csv、regional_technology_success_rates.csv、planning_timelines.json |
初始投运资产、项目成功率与阶段时间 |
| 天气 | calendar_mean_solar_2020_2024.nc、calendar_mean_wind_2020_2024.nc |
代表点风光可用出力 |
| 技术平均曲线 | sa.csv、wa.csv、we.csv |
光伏、陆风、海风的技术平均投资输入 |
| 资本与政策 | capital_costs.json、model_parameters.json、mechansim cost.xlsx |
投资成本、财务参数及政策支出 |
| 外部市场 | 各国 flow_mw、price_gbp_per_mwh |
互联线可用交换量与外部报价 |
| 分区网络 | 区域、走廊、边界、资产映射、分区需求 | 空间供需平衡和传输约束 |
模型时钟与单位
运行年在 365 日 UTC 日历上包含 17,520 个半小时。第零期从 1 月 1 日 00:00 开始,2 月包含 28 日。资产容量以 MW 表示,储能电量以 MWh 表示,金额以 GBP 表示,电价以 GBP/MWh 表示。period_start_utc 为每个时段确定日历时间。
需求以 MW 功率载入。默认全国算法由 _kernel_inputs 将 read_role 取得的 MW 数值传给 run_simulation;分阶段与优化接口通过 canonical_psm_data 的 build_chronology 构造时段电量,其中 series["demand.real"].values、series["demand.forecast"].values 存储 MW,demand、forecast_demand 存储 MWh/时段。对从零开始的时段编号 t,
全年需求电量为 demand 各项之和。用户提供的需求列若以 MWh/源时段表示,先除以该源时段的小时数得到 MW,再对齐至半小时。VALUE 101 在名为 mwh 的列中写入合成功率值,这些数值也按上述 MW 至 MWh 关系进入计算。
列选择、缺失值与全年对齐
时序载入按声明的列名和表头执行。read_series 在 csv_header=true 时读取 csv_column,要求该列每个单元格均为有限数值。空序列、缺少指定列或无效数值会终止载入。自动选列若得到至少三个连续递增整数且步长为一,则要求显式声明列名。
表头和列名的推断依据文件内容。声明的 csv_header 优先;其余情况下,首行至少有一个非空单元格且所有非空单元格均为非数值时,将该行作为表头。缺少 csv_column 时,严格读取选择唯一的全数值列;多列全为数值时要求指定其中一列。用户工作区读取在多列情形下选择第一列全数值列,声明列名后由该声明确定选择。
逐时输入先展开,再截取运行所需窗口。align_clock 对 interval_minutes=60 的输入将每个源值复制两次,对 interval_minutes=30 的输入按每半小时一个值读取。缺少时间间隔声明时,8,760 或 8,784 个数值对应逐时年;其他声明分辨率会终止载入。逐时至半小时的转换执行一次。
闰年需求在 365 日日历上保留全年电量。逐时展开后的 17,568 时段年移除从 (31 + 28) * 48 开始的 48 个值,即 2 月 29 日。normalize_half_hour_year 中,numbers 为源值,reduced 为保留值;保留值之和为正时,
全零需求序列保持为零。保留值之和为零且原总量为正时,转换终止。其他时序角色移除相同的 48 个值并保留其余数值。显式设置 leap_policy="keep" 时保留源日历,再取所需的前若干期。
运行从足够长的对齐序列中取前 periods 个值。较短的序列在 cyclic=true 或该角色约定循环时从开头重复,外部市场流量和价格采用这一约定。严格数据包读取要求较短的需求或投资曲线显式声明循环;用户工作区读取按重复方式补足短序列。这组规则共同确定全年或部分年份运行实际使用的数值。
下列步骤返回对齐序列。path 为绑定文件,spec 包含其声明,policy.strictness 选择严格数据包读取或用户工作区读取,cyclic 为角色的默认重复规则。
read = read_series(path, spec, mode="declared-v2", strictness=policy.strictness)
values = align_clock(read.values, periods, spec, mode="declared-v2",
strictness=policy.strictness, cyclic_default=cyclic)
return values
观测需求与缺失结算时段
英国需求形状采用 NESO 的 2022 年半小时实际需求及日前预测。UTC 预处理后,actual_mw.csv 和 forecast_mw.csv 各包含 17,520 个值;后续模型年依次重复使用这两条已对齐的 2022 年需求序列。功率统计与全年电量为
| 序列 | 最小功率 MW | 最大功率 MW | 平均功率 MW | 年电量 MWh |
|---|---|---|---|---|
| 实际需求 | 15,080 | 46,042 | 26,587.967637 | 232,910,596.5 |
| 日前预测 | 14,240 | 46,760 | 26,611.131963 | 233,113,516 |
需求预处理先合并结算记录,再插值补齐时段。对于同一结算日期和结算时段,按发布时间排序后取最新记录,发布时间相同时取最后一行;随后将英国本地结算时刻转换到 UTC 半小时时间轴。17,518 条源记录形成 17,516 个独立时段,留下四个半小时缺口。
缺失需求由相邻已知值作线性插值。缺一期间取两个端点的均值;连续缺两期间,依次在前一值上加端点差值的三分之一、三分之二。2022 年输入的四个补值均位于 10 月 30 日:
| UTC 时刻 | 预测需求 MW | 实际需求 MW |
|---|---|---|
| 2022-10-30 09:00 | 22,638.666667 | 24,649 |
| 2022-10-30 09:30 | 22,899.333333 | 24,727 |
| 2022-10-30 23:00 | 19,063.333333 | 20,494.666667 |
| 2022-10-30 23:30 | 19,086.666667 | 19,689.333333 |
用户需求时间戳先转换为 UTC,再进入相同的模型年对齐。映射接受 UTC 或 Europe/London 时区,以及声明的 DD/MM/YYYY 或 MM/DD/YYYY 日期顺序。时间戳须严格递增并具有规则的 30 或 60 分钟步长;重复、无法解析的日期和时间缺口会终止映射。转换后的行序从各模型年 1 月 1 日 00:00 UTC 起排列,保留输入中星期和节假日效应的先后顺序。
初始运行资产
初始风光和电池装机取自 DESNZ《Renewable Energy Planning Database》2025 年第二季度、7 月发布版本。原表含 12,977 个项目和 53 个字段,经过技术及正容量筛选后形成 10,653 行、14 个字段。normalize_repd 保留陆风、海风、光伏、电池和气电,将 capacity_mw、x_coordinate、y_coordinate 转换为数值,转换失败的值记为缺失。
规范化项目表保存日期与位置筛选需要的信息。字段为 project_id、site_name、technology、technology_source、capacity_mw、development_status、region、country、planning_application_submitted、planning_permission_granted、under_construction、operational、x_coordinate、y_coordinate。日期字符串由资产和规划读取步骤继续解析。
初始风光储项目须具有 Operational 状态、早于或等于研究起始年的有效投运日期,以及正的 MW 装机。build_repd_operational_snapshot 按日优先顺序解析日期,跳过日期缺失或容量无效的记录。光伏与陆风首先采用第 3 章的地区至城市映射;剩余项目按坐标选择同技术最近的代表点,必要时将 OSGB 坐标由 EPSG:27700 转换为 EPSG:4326。地区和坐标均无法给出分配的项目,对映射后初始风光装机的贡献为零。
初始电池 MW 按权重分配至抽蓄以外的储能条目。各条目的 weighted[asset_id] 取其 pool_limit 与 1 的较大值,weight_total 为这些权重之和。native_initial_state 按 capacity = operational_storage_mw * weighted[asset_id] / weight_total 分配功率,再以 capacity * duration 计算电量,其中 duration 取技术目录的持续时间。2025 年抽蓄独立指定为 2,828 MW 和 26,700 MWh。
R029 的 2025 年初始装机如下。其聚合核电可用率为 0.723,径流水电以 0.3487 乘以第 5 章的季节形状计算出力。GBP1 按电站计划选择核电机组,逐站可用率与退运规则也在第 5 章定义。
| 技术 | 资产行数 | 功率 MW | 储能电量 MWh |
|---|---|---|---|
| 联合循环燃气 CCGT | 1 | 28,000 | — |
| 径流式水电 | 1 | 2,000 | — |
| 核电 | 1 | 5,958 | — |
| 开式循环燃气 OCGT | 1 | 4,146 | — |
| 生物质与废弃物 | 1 | 4,762 | — |
| 海上风电 | 18 | 14,679 | — |
| 陆上风电 | 11 | 14,711.65 | — |
| 光伏 | 11 | 10,066.98 | — |
| 0.25C 电池 | 1 | 299.984165 | 1,199.936659 |
| 0.5C 电池 | 1 | 2,465.869834 | 4,931.739667 |
| 1C 电池 | 1 | 74.996041 | 74.996041 |
| 氢储能 | 1 | 0.749960 | 187.490103 |
| 抽水蓄能 | 1 | 2,828 | 26,700 |
规划输入
项目开发采用按技术和地区给定的成功率,以及按技术给定的阶段时间。regional_technology_success_rates.csv 包含 46 条记录,planning_timelines.json 给出以月计的时间。development_stage_timelines、repd_status_to_timeline、success_rates 存入初始状态,同时服务于已有规划项目和新增投资提案。
输入中位数分别描述开发期和施工期。状态映射确定项目尚需经过的阶段。下述预处理构造初始项目清单,第 6 章推进这些项目并在各年接收新增投资提案。
| 技术 | 开发期中位数 月 | 施工期中位数 月 |
|---|---|---|
| 光伏 | 27.8 | 4.9 |
| 陆风 | 62.5 | 15.0 |
| 海风 | 110.1 | 32.2 |
| 电池 | 31.3 | 10.1 |
初始规划项目按容量、开发状态和进展日期筛选。native_initial_state 采用下表控制量,默认 planning.success_mode="expected" 读为 success_mode="expected_capacity"。year 为研究起始年,capacity 为源项目的 MW 容量。
| 参数 | 默认值 | 用途 |
|---|---|---|
planning.minimum_project_size_mw |
1 MW | 进入清单的最小正容量 |
planning.include_uncertain_projects |
true |
接收申请、上诉和修订状态 |
planning.zombie_filter_enabled |
true |
启用状态、进展和施工超期筛选 |
planning.zombie_status_stale_year |
2015 | 不确定项目最新进展年份的截止值 |
planning.construction_grace_years |
2 年 | 加至估计施工完成年份的宽限期 |
planning.max_completion_year |
2040 | 接收项目的最晚完成年份 |
planning.timeline_statistic |
median |
选择阶段时间中位数或均值 |
planning.defer_spread_years |
3 年 | 推算完成日期的最大附加延期 |
planning.random_seed |
0 | 项目成功率抽样的输入 |
planning.repd_battery_assignment |
value_proportional_split |
将通用电池容量分至四类储能 |
替代申请取代其旧项目记录。预处理读取 REPD 原表的 Ref ID 与 Are they re-applying (New REPD Ref);后者给出不同于原标识、非空且确实存在于原表的替代标识时,移除旧记录。容量低于 minimum_size、容量非正或无法解析的记录也被移除。
开发状态按去除两端空白并转为小写后的标签筛选。terminal_statuses 始终移除 operational、abandoned、planning permission refused、application withdrawn。zombie_filter=true 时还移除 application refused、appeal refused、appeal withdrawn、decommissioned、application expired、finished。设置 include_uncertain=false 后,仅保留 under construction、awaiting construction、planning permission granted。
进展年份筛选作用于 application submitted、appeal lodged、revised。_date_year 从日期字符串提取首个以 19 或 20 开头的四位年份,缺少年份时返回 None;latest_progress_year 再取 planning_application_submitted、planning_permission_granted、under_construction、operational 中最近的已知年份。进展筛选启用时,该年份早于或等于 zombie_stale_year 的不确定项目被移除;进展年份缺失的项目通过此项筛选。
完成年份优先采用记录中的未来年份,其余项目按剩余阶段时间推算。timeline_months(source_technology, status) 从 repd_status_to_timeline 选择 timeline_type,将其均值或中位数后缀换为 timeline_statistic,再读取 development_stage_timelines 中对应技术的数值。状态映射缺失时默认采用 total_median;阶段条目缺失时采用 development_timelines,最终缺省值为 12 个月。储能组件采用电池阶段时间表。
推算完成日期附加零至 defer_spread_years 个整年的确定性延期。下列步骤由源项目的 project_id 计算延期;已经给定未来日期的项目直接采用该日期。
completion = next((candidate for candidate in (
_date_year(row.get("operational")),
_date_year(row.get("under_construction")),
) if candidate is not None and candidate > year), None)
if completion is None:
months = timeline_months(source_technology, status)
completion = year + max(1, int(math.ceil(months / 12.0)))
if defer_spread_years > 0:
completion += int(
hashlib.sha256(project_id.encode("utf-8")).hexdigest()[:8], 16
) % (defer_spread_years + 1)
施工中项目另作历时检查。对于状态为 under construction 且 construction_year 已知的项目,预处理计算 construction_end = construction_year + max(1, math.ceil(timeline_months(source_technology, status) / 12)) + construction_grace。zombie_filter=true 且该值早于 year 时移除项目;completion 晚于 maximum_completion 的项目也被移除。
初始项目成功率按技术和地区查表。_planning_probability 读取 technology、region、success_rate,将可解析的成功率限制在 [0,1],跳过无法解析的值;缺少必要列时,成功率表为空。查询时先查项目地区的小写标签,再查同技术的 gb 条目,最终缺省为 1.0。下式给出成功率 probability、无量纲抽样值 draw 与接收容量,同一实体电池项目的全部组件采用同一个抽样值。
probability_key = "battery" if source_technology == "battery" else _technology(source_technology)
probability = success_rates.get(
(probability_key, region.strip().lower()),
success_rates.get((probability_key, "gb"), 1.0),
)
draw = int(
hashlib.sha256(f"{random_seed}:{project_id}".encode("utf-8")).hexdigest()[:13], 16
) / float(16 ** 13 - 1)
realised_failure = success_mode == "seeded_stochastic" and draw > probability
components = typed_project_components(project_id, source_technology, capacity)
for component_id, technology, declared_component_capacity, assignment_method in components:
effective_capacity = (
declared_component_capacity * probability
if success_mode == "expected_capacity" else declared_component_capacity
)
通用电池项目先拆分,再记录经过成功率处理的容量。typed_project_components 采用 scheme_c_storage_weights,按初始电池装机使用的正机组权重,将源 MW 分至 1c_battery、0.5c_battery、0.25c_battery、hydrogen_battery;各 declared_component_capacity 等于源容量乘以该权重占总权重的比例。all_1c、all_0.5c、all_0.25c 分别将全部容量分给一种技术,exclude_untyped 从初始清单移除通用电池项目。技术已经明确的项目保留其技术与容量。
期望容量模式将组件声明 MW 乘以成功概率。随机模式 planning.success_mode="stochastic" 读为 seeded_stochastic,保留全部声明 MW;draw > probability 时设为 phase="failed"、outcome="failed_planning",两者相等时通过。通过抽样的项目与期望容量项目采用 phase="active"、outcome="active"。储能电量为 effective_capacity * duration_hours,单位 MWh。PlanningProject 将这些值与 expected_completion_year=completion、起始年、状态、技术和地区一并保存,供第 6 章逐年推进。
新增投资提案采用 endogenous_planning._success_rate 查询成功率。它依次选择地区成功率、同技术各地区均值和缺省值 0.75。第 6 章规定提案容量及后续规划过程。
资本成本与储能参数
资本成本、目标收益率和回收期分别作为财务输入。R029 从 capital_costs.json 和 model_parameters.json 读取参数;资本成本材料包括 BEIS《Electricity Generation Costs 2020》及 Arup。下表给出赋予初始资产的财务参数。年度资本回收采用 capital_discount_rate=0.05,投资计算和实际决策门槛见第 6 章。
| 技术 | 资本成本 GBP/MW | preferred_rate |
投资回收目标 年 |
|---|---|---|---|
| 光伏 | 659,000 | 0.076 | 25 |
| 陆风 | 1,588,000 | 0.076 | 30 |
| 海风 | 3,976,000 | 0.089 | 30 |
| CCGT / OCGT | 2,400,000 | 0.089 | 25 |
| 生物质与废弃物 | 1,500,000 | 0.089 | 25 |
| 1C 电池 | 330,000 | 0.0825 | 10 |
| 0.5C 电池 | 350,000 | 0.165 | 10 |
| 0.25C 电池 | 415,000 | 0.0825 | 10 |
| 氢储能 | 600,000 | 0.01375 | 25(默认) |
储能损耗由充电效率与放电效率分别描述。往返效率为 charge_efficiency * discharge_efficiency,0.5C 电池对应 。技术目录还提供持续时间、经济寿命和
maximum_cycles,这些量进入第 4、6 章的库存递推与成本计算,初始库存随运行算法在第 4 章给定。
| 技术 | 目录持续时间 h | 充电效率 | 放电效率 | 目录经济寿命 年 | 循环参数 maximum_cycles |
|---|---|---|---|---|---|
| 抽水蓄能 | 4 | 0.87 | 0.87 | 30 | 1,000,000 |
| 1C 电池 | 1 | 0.81 | 0.81 | 15 | 3,000 |
| 0.5C 电池 | 2 | 0.98 | 0.98 | 15 | 5,000 |
| 0.25C 电池 | 4 | 0.81 | 0.81 | 15 | 8,000 |
| 氢储能 | 250 | 0.57 | 0.57 | 10 | 1,000 |
各输入沿用其来源价格年的数值。储能成本与政策预算以 2025 年英镑计价;BEIS 资本成本输入保留 2020 年值,欧洲电价样本在币种换算后保留 2022 或 2021 年值,核电政策条目带有其声明的 2015 或 2024 价格年。重启成本采用第 5 章的换算。币种读取器按 eur_per_gbp 将欧元转换为英镑。
年度政策支出采用 mechansim cost.xlsx 中的序列。该表汇集 NESO 容量市场与平衡成本、Ofgem RO/FIT/REGO 材料以及 LCCC CfD 数据,第 6 章定义这些输入进入年度核算的方式。
外部市场与分区需求
外部电力交换由时变交换上限和对应市场价格描述。R029 为法国、比利时、荷兰、挪威和爱尔兰各提供一个 17,520 行文件,包含 flow_mw、price_gbp_per_mwh 及其时段和来源时间戳。NESO 线路名将 NEMO_FLOW 对应到比利时、BRITNED_FLOW 对应到荷兰、NSL_FLOW 对应到挪威。
外部价格采用 Ember 汇集的 ENTSO-E 日前市场数据。法国、比利时、荷兰和挪威取 2022 年,爱尔兰取 2021 年;每个逐时 EUR/MWh 值除以 1.1 EUR/GBP,再用于对应的两个半小时,负价保留其符号。R029 保存已转换的 GBP/MWh 值;GBP1 的 Belgium_price.csv 等文件由 Price (EUR/MWhe) 列提供输入,通过 read_series 执行相同换算。
flow_mw 的正值定义进口上限,负值定义出口上限。乘以 period_hours 得到带符号的时段电量 raw_availability,再计算两个非负电量界限:
默认全国市场在日前出清中接受进口报价。第 5 章给出交换上限在出清与平衡中的用法,第 7 章将外部边界容量用于分区模型。R029 的输入范围与平均价格为
| 边界 | 流量范围 MW | 价格年 | 平均价格 GBP/MWh |
|---|---|---|---|
| 比利时 | −1,022 至 1,020 | 2022 | 222.292608 |
| 法国 | −3,091 至 2,997 | 2022 | 250.789325 |
| 爱尔兰 | −987 至 998 | 2021 | 123.937076 |
| 荷兰 | −1,076 至 1,062 | 2022 | 219.917959 |
| 挪威 | −1,263 至 1,399 | 2022 | 126.503575 |
分区需求由全国研究总量和网络输入的地区份额确定。align_zonal_demand 按 period_ids 对应网络和研究时段,要求时段标识唯一且具有对应记录。实际需求和预测需求均须为有限非负电量,长度须与时段列表相同。在 scenario_scaled_zonal_shares 模式下,output_real 为研究实际电量,network_national 为该 index 的网络全国电量,单位均为 MWh:
最后一个区域接收全国电量扣除此前各区分配后的余量。两组全国输入均为零时,scale=1.0;研究需求为正而网络全国需求为零时终止对齐。以下步骤给出完整分配过程,zone_ids 保留网络声明的区域顺序:
aligned = {zone_id: [] for zone_id in zone_ids}
for index, period_id in enumerate(periods):
network_national = network_national_mwh[index]
if network_national == 0.0 and output_real[index] == 0.0:
scale = 1.0
elif network_national == 0.0:
raise ValueError("Zonal demand requires positive network national demand")
else:
scale = output_real[index] / network_national
remaining = output_real[index]
for zone_id in zone_ids[:-1]:
value = network_demand_mwh_by_zone[zone_id][index] * scale
aligned[zone_id].append(value)
remaining -= value
aligned[zone_ids[-1]].append(remaining)
可选模式 network_pack_absolute_demand 将 output_real 设为 network_national_mwh,并取 scale=1.0;预测电量为 output_real[index] * forecast[index] / real[index]。当 real[index] 为零时,要求 forecast[index] 和 output_real[index] 同为零,此时预测也取零。最后一区仍采用余量分配,以保留全国电量总和。
VALUE 101 合成输入
VALUE 101 采用确定性需求、天气和投资曲线。_demand 返回从零开始的半小时时段编号 period 对应的 MW,day 和 hour 表示该期的日与小时。day % 7 < 5 时 weekday 取 1,其余取 0.92;第 0、182 日的 period % 48 == 31 时,teaching_peak 取 30 MW,其余为零:
日前预测为 _demand(period) + balancing_margin,保留六位小数。第 0、182 日的 period % 48 == 30 时,balancing_margin 取 12 MW,其余为零。这两次 12 MW 附加量分别位于实际需求峰值前半小时。
光伏投资系数由日照项与季节项相乘得到。hour < 6 或 hour > 18 时 _solar_profile 返回零;日照窗口内沿用同一 day、hour 定义:
风电投资系数叠加日内、29 日和年度分量。_wind_profile 将结果限定在 0.08–0.92,并保留六位小数:
海风投资系数取 _wind_profile(period) 的 1.08 倍,上限为 1,保留六位小数。光伏、陆风、海风数组分别绑定至 profiles.vre_solar、profiles.vre_onshore、profiles.vre_offshore。
合成天气在 52°N、0°E 处设一个格点,给定 8,760 个小时值。此处 hour 为从零开始的全年小时编号,hourly_solar 为 J/m² 累计辐射,hourly_wind 为 m/s 风速:
调度按第 3 章风电曲线转换上述风速,并按该章瞬时输入规则转换太阳序列;投资采用前述系数。法国边界采用恒定 12 MW 进口上限和 82 GBP/MWh 电价,其余四个边界交换容量为零,价格输入为 200 GBP/MWh。build_value_101_packs 将这些序列写入教学输入。
3 天气与可用出力
风光资产的可用出力由装机容量和其代表位置的天气共同计算。capacity_mw 为装机 MW,availability 为无量纲天气转换系数,available_mw 为可用功率,available_mwh 为单个运行时段的可用电量:
天气计算为市场出清提供供给上限,第 4、5、7 章的调度算法确定实际接纳电量。年度投资使用本章末尾的技术平均曲线和第 6 章的容量上限。
天气输入与空间采样
R029 以 2020–2024 年 ERA5 中相同月、日、小时的平均值表示各日历小时。源序列包含 43,848 个小时,移除两个闰日的 48 小时后,8,760 个保留日历小时各有五个观测值。取算术平均得到的全年序列用于各模型年。
风速先由每个源小时的矢量分量求模,再作日历平均。预处理先计算 u100 平方与 v100 平方之和的平方根,其日历均值记为 wind_speed,同时保留 u100 和 v100。太阳文件保存向下水平累计辐射 ssrd;R029 的两个文件分别为 calendar_mean_wind_2020_2024.nc 和 calendar_mean_solar_2020_2024.nc。
天气网格以 0.25° 分辨率覆盖英国及邻近海域。文件的坐标范围与数组大小为
| 输入 | 纬度范围 | 经度范围 | 纬度 × 经度 × 日 × 小时 |
|---|---|---|---|
| 太阳辐射 | 45°–65°N | 14°W–4°E | 81 × 73 × 365 × 24 |
| 100 m 风 | 46°–65°N | 14°W–5°E | 77 × 77 × 365 × 24 |
各代表点采用最近的网格纬度和经度。point_series 中,站点 latitude、longitude 与网格数组 lats、lons 均以度表示;lat_index、lon_index 分别选择坐标绝对差最小的位置,等距时取网格数组中的第一项:
空间抽取接受纬度—经度—日—小时数组和时间—纬度—经度数组,将选定点按源顺序展平为逐时序列。空序列、掩码缺失值、非有限值或其他数组布局会终止天气载入。各站点的 lat、lon 由 fleet.locations 提供,representative_sites 将这些位置与 fleet.json 的机组名称对应。
逐时天气与半小时调度
天气值按时间戳的物理含义分配至调度时段。默认天气方法采用 clock="v2",绑定中的 time_convention 优先;其余情况下,GRIB_stepType="accum" 表示截至该时间戳的逐时累计值,其他场采用瞬时约定。hour_index 将从零开始的半小时编号 t 映射为源索引 index,并在 hours 个源值后循环:
截至 01:00 的小时累计量分配给从 00:00 和 00:30 开始的两个时段。瞬时规则将 00:00 样本分配给从 00:00 开始的时段,将 01:00 样本分配给从 00:30 和 01:00 开始的时段。太阳几何在每个接收时段的中点计算。
R029 日历平均文件声明瞬时输入,因此采用索引公式第二行。受支持的 clock="v1" 设置采用 index = (t // 2) % hours,每个源值用于连续两个半小时。这些索引规则作用于声明的源顺序,并包含从最后一小时至第一小时的循环。
风电曲线与损耗
风电可用系数由 3 m/s 切入、立方增长、恒定额定出力和切出上限组成。hourly_unit_cf 在输入提供 wind_speed 时读取该变量,其余情况下由 u100、v100 求矢量模。wind_unit_output 采用 20 单位出力尺度,结果除以 20 后得到无量纲小时系数 hourly。风速 speed、额定风速 rated、切出风速 cut_out 均以 m/s 表示:
陆风采用 rated=9.7、cut_out=25,海风采用 rated=10.5、cut_out=30。恰好达到切出风速时维持额定出力,高于该值时出力为零。立方增长段先限定在 0–20,再转换为 hourly。
送出风电系数由已分配的 hourly[index] 乘以尾流、能量可用率和电气系数的乘积得到。默认 loss_factors=true 时,method.multiplier(technology) 从 value_uk_vre_loss_factors_v1.json 读取下列数值:
| 技术 | 尾流系数 | 能量可用率系数 | 电气系数 | multiplier |
|---|---|---|---|---|
| 陆上风电 | 0.95 | 0.97 | 0.98 | 0.90307 |
| 海上风电 | 0.88 | 0.945 | 0.98 | 0.814968 |
风速为 8 m/s 时,陆风曲线给出 0.5476061707,乘以 0.90307 得约 0.49453,对应 100 MW 装机的可用功率约为 49.453 MW。受支持的 loss_factors=false 设置取 multiplier=1.0,直接使用曲线出力。
水平辐射与光伏转换
光伏计算先将源小时辐射量表示为辐照度。hourly_unit_cf 将 ssrd 读为 J/m² 的 raw,返回 kW/m² 的 hourly,输入筛选和单位换算为
默认光伏方法采用 plane_of_array=true 和 0.83 的性能比。clock="v2" 且 time_convention="accumulation_end_of_hour" 时,在每个半小时中点将水平辐照度转换到朝南倾斜平面。R029 和 VALUE 101 等瞬时来源将水平辐照度直接乘以 0.83;plane_of_array=false 时,全部来源采用这一水平计算。loss_factors=false 将性能比设为 1.0。
阵列倾角由站点纬度确定。默认 tilt_rule="jacobson-jadhav-2018" 采用 Jacobson 和 Jadhav(2018),Solar Energy 169,55–66 的 0°–65°N 多项式。在 optimal_tilt_jacobson_jadhav 中,phi 为北纬度数,函数返回的度数在 plane_of_array 中记为 tilt:
倾角参数还支持 tilt_rule="site_latitude",取纬度绝对值,以及 tilt_rule="fixed",取 [0,90] 度内的 fixed_tilt_deg。三种规则均采用朝南平面。PlaneOfArrayParameters 给定 albedo=0.2、solar_constant_w_m2=1361、max_zenith_deg=87;允许的反照率范围为 [0,1],太阳常数范围为 1,300–1,400 W/m²,天顶角阈值范围为 [80,90) 度。
太阳几何
太阳几何采用运行时段的 UTC 中点。period_clock 返回年内日 day_of_year 和小时 utc_hours,day_angle 计算以弧度表示的年角 g。对从零开始的时段 t,
赤纬和轨道修正由 declination、equation_of_time_minutes、eccentricity_factor 的下列系数计算。所得 decl 以弧度表示,时差以分钟表示,轨道距离因子为无量纲:
经度和时差确定当地太阳时及小时角。longitude_deg 以东经为正,solar_time 以小时表示,omega 以弧度表示。incidence_cosines 将纬度和倾角转换为弧度量 phi、beta,返回天顶角和入射角的余弦 cos_z、cos_theta:
散射分解与阵列平面辐照度
水平辐照度被分解为散射与直射分量。plane_of_array 将 ghi_kw_m2 的非负部分记为 kW/m² 的 ghi,extraterrestrial_normal 等于 parameters.solar_constant_w_m2 / 1000.0 * eccentricity_factor(day_of_year),默认乘数为 1.361 kW/m²。ghi 为正且天顶角小于 87° 时,晴朗指数为
散射比例采用 Erbs、Klein 和 Duffie(1982),Solar Energy 28(4),293–302 的逐时关系。kd 取决于无量纲晴朗指数 kt,middle 为中间区间的多项式值:
Hay–Davies(1980)转换 将直射、天空散射和地面反射辐照度合并。dhi、bhi、dni 分别为水平散射、水平直射和法向直射辐照度,单位为 kW/m²;anisotropy、beam_ratio、sky_view、ground_view 为无量纲,默认 albedo 为 0.2。阵列平面辐照度 poa 为
天顶角达到或超过 87° 或 ghi 为零时,取 kt=0、kd=1、dhi=ghi、bhi=0、dni=0、anisotropy=0、beam_ratio=0,所得 poa 保留散射和地面反射分量。调整参数后,条件中的 87° 改用选定的 max_zenith_deg。
阵列平面辐照度经性能比转换为出力系数,再取上限 1。默认参数下,site_cf_by_source 返回的无量纲系数 values 为
出力系数上限在阵列平面转换之后施加。水平转换将性能比直接作用于 hourly[index]。以下算法覆盖风电、瞬时光伏和累计光伏输入:ds 为已打开的 NetCDF,binding 声明时间约定,periods 为所需半小时数,method 包含 clock、loss_factors、plane_of_array。
hourly, evidence = hourly_unit_cf(ds, technology, latitude, longitude, binding)
index = hour_index(periods, len(hourly), method.clock, evidence["time_convention"])
values = hourly[index]
poa_applied = False
if technology == "solar" and method.plane_of_array:
poa_applied, reason = plane_of_array_applies(method, evidence["time_convention"])
if poa_applied:
values, poa_evidence = plane_of_array(values, latitude_deg=latitude,
longitude_deg=longitude, parameters=plane_of_array_parameters())
multiplier = method.multiplier(technology)
values = values * multiplier
if poa_applied:
values = np.minimum(values, 1.0)
return values
项目位置与天气混合
资产按技术和位置取得代表天气。英国模板列出 11 个光伏、11 个陆风代表点及 21 个海风代表点名称;R029 的 2025 年装机中,正容量资产分别为 11、11、18 个。运行资产在第 2 章的初始筛选时完成映射,规划项目在投运前获得代表点。
规划项目的显式位置优先。attach_project_weather 先读取项目的 latitude、longitude,再按 physical_project_id 查找原始 REPD 行,坐标仍缺失时按站名查找。有限坐标被分配至同技术最近的代表点。nearest_site 将项目坐标转为弧度量 lat1、lon1,将代表点坐标转为 lat2、lon2,以 km 表示的距离为
等距时选择声明顺序中的第一个代表点。缺少坐标的规划光伏、陆风项目采用 REPD 地区与下表的城市映射。初始运行资产读取也使用该表,在初始步骤中地区优先于坐标。
| REPD 地区 | 代表点 |
|---|---|
| East Midlands | Nottingham |
| Eastern | Ipswich |
| London | London |
| North East | Newcastle |
| North West | Manchester |
| Scotland | Edinburgh |
| South East | Portsmouth |
| South West | Bournemouth |
| Wales | Cardiff |
| West Midlands | Birmingham |
| Yorkshire and Humber | Sheffield |
位置缺失的项目在投运时获得按容量加权的天气组合。commissioned_project_weather 先将代表点运行容量累加为 stock[name],再加入当年到期、具有显式位置的全部项目,随后按技术汇总其余项目。total_stock 为相应运行 MW,total_new 为新增 MW,names 为该技术的代表点列表:
total_stock = sum(stock[name] for name in names)
total_new = sum(p.capacity_mw for p in projects)
if total_new <= 0 or total_stock <= 0:
weights = {names[0]: 1.0}
else:
names.sort()
remaining, weights = total_new, {}
for i, name in enumerate(names):
amount = remaining if i == len(names) - 1 else total_new * stock[name] / total_stock
remaining -= amount
weights[name] = amount / total_new if amount > 1e-6 else 0.0
同组位置缺失的项目获得相同的 weights。分配量超过 0.000001 MW 时,天气权重取 amount / total_new;较小分配量取零权重。字母排序和最后一点的余量确定浮点分配顺序,总运行容量为零时将第一代表点的权重设为 1。
投运后,资产保留其 weather_source_weights。source_weights 优先读取这一显式映射,再读取单一 weather_source_asset_id,随后依次按资产、指定机组、投资所有者、源代理和基础资产标识匹配。来源名称须对应同技术代表点,权重须为有限非负值,其和至多为 1 加 0.000000000001。若 deficit = 1.0 - sum(weights.values()) 超过该容差,cohort 取正的有限 weather_allocation_cohort_mw,skipped 计数零权重;接收条件为 deficit <= skipped * 1e-6 / cohort + 1e-12。
资产可用系数为各来源曲线的加权和。_map_lineages 对每个来源的 values 应用 weights;下标 name 用于选择对应来源数组,所得 combined 为
分区分配在保留天气曲线的同时拆分资产物理容量。StagedBidAtCostPSM 将 capacity_mw 乘以各区 share,份额之和为 1;储能的 charge_power_mw、discharge_power_mw、energy_capacity_mwh、initial_soc_mwh 也乘以同一份额。第 7 章定义资产至区域的映射与网络约束。
可选接口 REPDERA5AggregatedWeather.build 在各所有者—技术—区域组内合并调用方提供的项目曲线。对分配记录 rows,total 为总 MW,values 为项目无量纲曲线,weighted 为该组曲线:
这一聚合要求项目曲线等长、全部有限且位于 [0,1],并要求 total 为正。weighted 乘以总 MW 等于各项目可用功率之和。分区调度接口也可将代表曲线直接用于资产各区分配部分。
技术平均投资曲线
年度扩张为光伏、陆风和海风各使用一条技术平均曲线。输入将 2022 年 ERA5 数据与 sa.csv、wa.csv、we.csv 中的机组及项目设定结合;每个 public2 文件包含 8,760 个小时值,声明 interval_minutes=60,各值按源行序用于连续两个半小时。
得到的 availability 为无量纲量,用于第 6 章的 peak 和年度容量余量计算。投资规则直接使用这些曲线,调度可用出力则采用上文的站点采样、时间分配、转换与损耗步骤。
4 运行与储能
VALUE 按半小时时段计算需求与供应,发电、进口、出口及储能受各自物理容量约束。本章给出运行时钟、分阶段市场出清与储能成本计算。第 5 章说明全国 Native 调度算法,第 7 章加入网络约束,第 6 章将年度运行结果接入投资决策。
运行时钟与储能初始状态
模型年采用 UTC 时钟,包含 365 天、17,520 个半小时时段。period_start_utc 将从零开始的 period 分解为日序号 day_index 和日内序号 offset,再将 offset×period_hours 小时加到 model_day 给出的日期上。period_hours=0.5 时,计算为:
model_day 跳过 2 月 29 日。源数据在调度前对齐到这一时钟,声明为 Europe/London 的记录逐行转换为 UTC。输出时间戳采用带 Z 的 ISO 8601 格式。时段电量以 MWh 计,额定功率以 MW 计,库存以 MWh 计。
储能在每个模型年开始时具有规定的初始库存。Native 每年创建储能代理时将 stored_energy 设为空,第 5 章给出年内批次更新。分阶段、LP 与 DC 调度采用的逐时序输入取 initial_soc_mwh=0.5×energy_capacity_mwh。这些初值逐年应用;上一年的售电量与持有时间观察值保留,用于下一年的储能成本准备。
提前市场与平衡调度
分段 PSM 先满足预测需求,再针对实际需求进行平衡。对每个非储能 resource,_ahead_offers 读取当期可用率与边际成本。availability 为输入可用率与零的较大值;physical_cost 优先采用逐时段成本,其次采用恒定边际成本。multiplier 来自 market.bid_multiplier,默认值为 1。可报价电量与价格为:
储能报价同时受放电功率和库存约束。soc[resource.asset_id] 为时段开始时的储能侧库存,discharge_efficiency 将其换算为输出电量:
available_mwh = min(
resource.discharge_power_mw * model_input.period_hours,
soc[resource.asset_id] * resource.discharge_efficiency
)
clear_ahead 按 price_gbp_per_mwh、offer_id 依次排序报价。初始 remaining=forecast_demand_mwh,每次接纳剩余需求与报价电量中的较小值,再扣减剩余需求。最后接纳的报价成为 clearing_price_gbp_per_mwh,全部接纳电量按该价格结算。剩余需求达到 10⁻¹² MWh 时结束出清;接纳电量为零时,出清价为零,预测缺口记入 unserved_forecast_mwh。
平衡调度处理实际需求与提前计划之间的差额。在 CopperplateBalancing.clear 中,final_dispatch 初始取 schedule_mwh_by_asset,gap_mwh=real_demand_mwh−sum(final_dispatch.values())。发电与进口将剩余可用电量作为上调报价,将计划电量作为下调报价。储能下调先撤回计划放电,再按充电功率、剩余库容及效率吸收电量。出口以负注入进入其声明的接入位置与容量范围。
下调报价与结算
下调结算按接纳的减发电量与报价乘积退回款项。因此,上调的有符号调整量 delta 为正,下调的 delta 为负,两者均采用 cashflow=delta×price_gbp_per_mwh。分阶段与网络路径采用 network-economic-v2 生成报价。
火电下调将提前计划分成运行区间与最小稳定出力区间。thermal_dec_segments 取 shutdown_mwh=min_stable_fraction×scheduled_mwh,其余电量记为 running_mwh。运行区间报价为应用下调乘数后、扣除政策支持的可避免边际成本;停机区间再扣除按预计停机时长分摊的重启费用。在 RestartParameters.net_saving 中,avoided_cost 的单位为 GBP/MWh,restart_cost(horizon_h) 为每次启动的 GBP/MW,horizon_h 以小时计:
shutdown_horizon_hours 统计当前时段及其后预测需求可由声明风光与核电可用电量覆盖的连续时段,返回 (1+run_after[period])×period_hours。预计时长小于 min_down_time_h 时,last_resort_price 将停机报价置于普通下调报价的最低舍入价格以下至少 0.01 GBP/MWh;达到最短停机时长时,报价取停机净节省。普通报价集合为空时也采用净节省价格。
CCGT 的最小稳定出力比例为 0.50,最短停机时间为 6 h,热、温、冷启动费用分别为 113.7、134.4、155.0 GBP/MW。OCGT 对应值为 0.50、0.5 h、175.7 GBP/MW,生物质对应值为 0.35、6 h、129.2 GBP/MW。CCGT 在停机少于 12 h 时采用热启动,12 至 48 h 采用温启动,超过 48 h 采用冷启动。费用均以 2025 年英镑计。运行区间先于本机组的停机区间下调;停机净节省为正时,停机区间先于无支持的风电下调,价格相同时风电先下调。
其他下调价格由 resource_dec_price 给出。进口取 marginal×dec_multiplier;风电、光伏及径流水电取 −support;核电取 marginal×dec_multiplier−support−premium;其他燃料资源取 marginal×dec_multiplier−support。market.dec_multiplier 默认值为 1,上限为 market.bid_multiplier。未列出的政策支持为零,核电默认溢价为 100 GBP/MWh。储能下调价值为其上调报价乘充放电效率。storage_dec_price 还以当期最低可用上调报价及自身上调报价限制该值;以下价格均以 GBP/MWh 计:
value = up_price_gbp_per_mwh * charge_efficiency * discharge_efficiency
if lowest_inc_price_gbp_per_mwh is not None:
value = min(value, lowest_inc_price_gbp_per_mwh)
value = min(value, up_price_gbp_per_mwh)
铜板平衡按价格从低到高排列上调报价,同价时发电先于储能,VoLL 以上的报价留在接纳集合之外。下调按舍入至 0.01 GBP/MWh 的价格从高到低排序,再依次按类别和精确价格排序。类别顺序为燃料机组运行区间、进口、储能、径流水电、风光、火电停机、核电、短停机时长区间。同方向、同类别、同价格报价按可用电量比例分配接纳量。
对每个同价组,total 为可用 MWh,fraction 取待平衡电量与可用电量之比及 1 的较小值。由此得到的 delta 更新 final_dispatch,并产生 cashflow。正的剩余需求记为 blackout_mwh,最终供应加停电量与实际需求的差额须在 10⁻⁸ MWh 内。分区平衡在第 7 章网络约束内采用相同计划与报价定义,先按精确价格优化,再处理物理同价选择。
以 50 MWh 预测需求说明两阶段结算。风电按 £0/MWh 报价 30 MWh,燃气按 £60/MWh 报价 30 MWh。提前计划接纳风电 30 MWh、燃气 20 MWh,按统一的 £60/MWh 支付 £3,000。实际需求为 55 MWh 时,燃气再发 5 MWh,获得 £300 平衡收入;其物理支出按最终 25 MWh 计算,为 £1,500。
储能库存与报价
储能库存随每期最终净注入更新。在 CopperplateBalancing.clear 中,opening 是初始储能侧 MWh,dispatch 是最终向电网输出的 MWh,负值表示充电。更新后的 soc 为:
库存范围为零至 energy_capacity_mwh,舍入容差为 10⁻⁸ MWh。充电与放电分别受 charge_power_mw×period_hours 和 discharge_power_mw×period_hours 限制。分区调度将两个方向分别表示,每期至多一个方向超过 10⁻⁸ MWh。期末库存成为下一期的 opening,每年的初始库存按上文设定。
DynamicAnnualStorageCost 将设备成本回收分为循环折旧与持有回收。capital_recovery_factor 接收 discount_rate 与 lifetime_years;折现率非正时返回寿命的倒数,正折现率时采用:
年度成本为资产年化建设费用与固定维护费之和。prepare_year 接收资产实际的 capital_cost_gbp、power_capacity_mw、energy_capacity_mwh 和 discharge_efficiency,spec 提供目录寿命、时长、循环寿命与固定维护费率。计算保留资产声明的能量功率比。
capex = max(capital_cost_gbp, 0)
annualized_capital_cost_gbp = capex * capital_recovery_factor(
discount_rate, spec.economic_lifetime_years)
annual_fixed_opex_gbp = (
max(power_capacity_mw, 0) * 1000 * spec.fixed_opex_gbp_per_kw_year)
annual_levelized_project_cost_gbp = (
annualized_capital_cost_gbp + annual_fixed_opex_gbp)
参考年销量采用按寿命平均的年循环次数与可实现充放电次数中的较小值。_reference_observation 分别按循环寿命与充放电时长计算 life_cycles_per_year 和 physical_cycles_per_year,取其较小值为 cycles_per_year,再计算以 MWh 计的年度交付销量 sold 及以模型时段数计的持有时间 dwell_periods:
life_cycles_per_year = spec.maximum_cycles / spec.economic_lifetime_years
physical_cycles_per_year = 8760 / max(2 * spec.duration_hours, 1e-9)
cycles_per_year = min(life_cycles_per_year, physical_cycles_per_year)
sold = (max(energy_capacity_mwh, 0) * max(discharge_efficiency, 0)
* cycles_per_year)
dwell_periods = max(spec.duration_hours / period_hours, 2)
定价基准优先采用为正的上一年销量,并以参考销量的一定比例作为下限。reference 是 _reference_observation 返回的观察值,将 sold 保存为 sold_energy_mwh,将参考持有时间保存为 average_dwell_periods;previous 保存上一年观察值。选出的 basis_sold 以 MWh 计,average_dwell 为输出 MWh 加权的持有时段数:
observed = previous
minimum_sold = reference.sold_energy_mwh * max(utilisation_floor, 0)
if observed.sold_energy_mwh > 0:
basis_sold = max(observed.sold_energy_mwh, minimum_sold)
average_dwell = max(observed.average_dwell_periods, 2)
else:
basis_sold = reference.sold_energy_mwh
average_dwell = reference.average_dwell_periods
默认 utilisation_floor=0、discount_rate=0.05。电池按输出 MWh 回收循环折旧,抽水蓄能和氢储能的循环折旧分量为零。
usable_cycle_output = energy_capacity_mwh * discharge_efficiency
cycle_depreciation_gbp_per_mwh = (
capex / (usable_cycle_output * spec.maximum_cycles))
expected_cycle_recovery = cycle_depreciation_gbp_per_mwh * basis_sold
remaining_annual_recovery = max(
annual_levelized_project_cost_gbp - expected_cycle_recovery, 0)
weighted_basis = basis_sold * max(average_dwell, 1)
holding_recovery_gbp_per_mwh_period = (
remaining_annual_recovery / weighted_basis)
当 has_cycle_depreciation 为假或分母任一因子为零时,循环折旧项为零;当 weighted_basis=0 时,持有回收项为零。Native 采用 cycle_only 报价设定,bid_price_gbp_per_mwh 返回 cycle_depreciation_gbp_per_mwh:三类电池按循环损耗报价,抽水蓄能与氢储能报价为零。同价储能批次按充电顺序释放,最早存入者先放电。
储能成本计算同时给出每个持有时段的回收率。线性持有报价为 cycle_depreciation_gbp_per_mwh + max(dwell_periods,0)×holding_recovery_gbp_per_mwh_period。分阶段调度传入 dwell_periods=0,相应持有报价项为零。目录提供第 2 章所列寿命、循环与维护参数;固定维护费为抽水蓄能 13.4 GBP/kW/年、三类电池 6.6 GBP/kW/年、氢储能 19.7 GBP/kW/年。
售电记录形成下一年的成本计算基础。record_sale 接收交付电量及从充电到放电经过的时段数,在 current 中累计售电量与售电量加权持有时间。销量为正时,average_dwell_periods 等于加权总量除以销量;销量为零时取零:
delivered = max(delivered_mwh, 0)
dwell = max(dwell_periods, 0)
current.sold_energy_mwh += delivered
current.dwell_weighted_sold_mwh_periods += delivered * dwell
年末,storage_cost_observations 按储能代理保存这些量。下一年度准备将其作为 previous,计算新的成本回收量,并将 current 清零。观察值用于成本计算,物理库存按上文初值与调度递推更新。
5 全国市场出清
全国市场在每个半小时先出清预测需求,再按实际需求完成平衡。默认模块 value-bid-at-cost-psm 采用 native-corrected-v1:发电和进口报出可用功率,储能报出满足条件的库存批次,最终调度更新下一期的物理状态。
输入、代理与可用出力
调度量以 MW 表示,period_hours = 0.5。变量 forecast_demand、real_demand、capacity_limit、real_gen_energy 和 alter_limit 分别表示预测需求、实际需求、可用出力、实际出力和每期爬坡额度;机组下标为 ,时段下标为
,其他资产下标在相应计算处定义。UTC 模型年含 17,520 期。Native 内核读取以 MW 表示的需求,在电量输出和结算时将接纳功率乘
period_hours。canonical_psm_data.py 的 chronology 接口按第 2 章规则向分阶段与优化模块提供期间 MWh。
发电报价由运行费用和取决于上期接纳集合的启动加价构成。燃气和生物质采用 gen_cost + fuel_cost + carbon_price + unit_time_cost;核电、风光和天然水电采用 gen_cost + unit_time_cost。输入行的费用相加后写入运行对象的 gen_cost,单位为 GBP/MWh;carbon_price 已表示每 MWh 发电的费用。设报价倍率为 、综合运行费用为
、启动加价为
,则
报价倍率默认取 1,水电与风光的启动加价为零。GB 输入行中,生物质综合费用为 0.2 + 80 + 4.8 = 85 GBP/MWh,启动加价为 83 GBP/MWh;CCGT 和 OCGT 的综合费用分别为 55.07 和 74.92 GBP/MWh。生物质收入按市场结算计量。
年度适配器先按名称、再按技术与标准化区域,将在运和当年投运资产映射到市场代理。多个候选依次采用已映射容量、构造器容量或等份作为权重。weights 与 total_weight 将资产的 capacity_mw 分配至 generator_sources,这些容量均以 MW 计量,其中 表示市场代理,
表示资产。
_allocate_runtime_income 再按分配容量,将 raw_income 分到资产账户 allocated,二者均以 GBP 计量:
风电采用 20 MW 参考机组和 倍率,光伏采用 1 MW 参考机组和
倍率,储能功率与能量按技术聚合。
scheme_c_native_psm.py 每年建立代理,并恢复上一年售电量及按售电量加权的持有时间,用于计算报价。每年创建的储能代理采用空的 stored_energy;上一年期末库存作为丢弃电量记入 storage_year_boundary。
风光可用出力采用与标准输入适配器相同的逐期数组。site_weather.site_cf_by_source 执行第 3 章的天气、损耗及组件平面辐照换算,kernel_injection.KernelSiteInputs 将容量因子 传入内核:
核电可用率在换算模型容量时保留各站 PRIS 参考出力。nuclear_load_factor 读取 pris_load_factor、pris_reference_mw 和 capacity_mw;generation_end_period 给出宣布停发月份后第一期 end,全年可用的电站在各期保留该负荷率。以 为电站下标,
asset_availability 生成各站数组 values,kernel_availability 按容量合并:
2019–2024 年固定平均负荷率为 Heysham 1 的 0.668、Hartlepool 的 0.689、Heysham 2 的 0.752、Torness 的 0.792 和 Sizewell B 的 0.801。具有电站政策的输入将四座 AGR 的可用率从 2030 年第 4,320 期,即 4 月 1 日 00:00 UTC 起设为零;Sizewell B 在声明的退役年之前保持全年覆盖。回退负荷率分别为新建 PWR/EPR 的 0.801、未指定 AGR 的 0.727、全国合并核电资产的 0.723。GBP1 public2 采用 VALUE-UK 核电电站政策(value_uk_nuclear_policy_v1.json:五座 EDF 电站及其宣布的停发时间),其机组输入表只有一行合并核电;R029 保留全国合并资产,在全国调度中采用 0.723。参数由 value_uk_firm_availability_v1.json 与 firm_availability.py 提供。
径流水电采用 DUKES 6.3 平均年负荷率,并结合 Energy Trends 季度数据形成的月度形状:
形状的月度算术均值为 1,按 365 天加权的均值为 0.99883,对应模型年可用率 0.3483。核电与水电在各模型年采用这些固定曲线。
核电在年初设为在运,属于 ;燃气与生物质位于该集合之外。机组参数行给出初始
real_gen_energy,核电将其设为 capacity_limit。水电与生物质的 have_gen_energy 初始化为各自的 real_gen_energy,随后每期将 add_energy 加入 energy_limit,按剩余预算接纳发电,并将下调量返回预算。预算量采用 MW·时段,乘 period_hours 后得到 MWh。
储能报价与期间头寸
储能代理将各充电期的内部 MWh 记入以充电期 为索引的
stored_energy, 表示当前期。
Battery.charge 根据 power_capacity_mw、energy_capacity_mwh、充电效率 n_1 和本期已有充电后的剩余功率限制输入。对各储能,计算为
Battery.discharge 从指定批次扣除 output_power * period_hours / n_2 MWh,其中 n_2 为放电效率。全部批次及各阶段共享额定功率,日前采用已有批次,上调采用年龄至少两期的批次。期间账户中的 discharged_mw、charged_mw 及 stored_energy 合计满足
吸收盈余时,储能先回购本期放电,并将撤回的电量返回原批次;剩余放电降至零后,继续到达的盈余才能充电。本期已经充电的储能在后续阶段提供零放电。盈余吸收先处理预测差额盈余,再处理其他可用盈余,并按时段结束时的净头寸记录售电。被回购的出力保留日前储能报酬。
自放电在每期将库存乘 。电池及其他默认类型的
为 0.000021,抽蓄为 0.000001,氢储能为 0.000005。小于 0.001 MWh 的批次被移除,并进入库存核对。
默认动态储能成本模块按循环折旧报价。电池报价为 ,抽蓄和氢储能报价为零,最老批次先行报价:
第 4 章定义储能状态与报价费用的计算。年度送出 MWh 和售电量加权持有时间进入下一年的定价输入,其年度费用处理见第 6 章。
预测出清与平衡
市场按稳定排序键排列发电、进口和储能批次报价。同一 0.01 £/MWh 档内,发电和进口位于储能之前,再按未取整价格和输入顺序处理并列:
普通机组满足剩余预测需求,其出力上限为
水电与生物质还受剩余累计预算 约束,该预算以 MW·时段表示,乘
后转为 MWh。核电接纳量可高于剩余需求
:当其上限高于
时,供应
,超出部分成为已经发出的刚性盈余。风光高于需求接纳量的可用出力保留为可用盈余。
互联线以对侧价格乘 报出正的可用进口容量,参与日前出清。进口报价受容量约束,爬坡和启动加价均为零。平衡阶段仅报出
。负的传输容量表示出口能力,在对侧价格为正时接纳出口。
日前结束后,以可用量减接纳量重建风光盈余,并先使用已经发出的核电盈余。风光盈余被储能、出口或柔性需求使用时,计入风光毛发电量。因此,vre_accepted 表示风光毛出力,curtailed 表示可用风光减毛出力,excess 表示非风光溢出。已进入日前供给与结算的核电盈余在平衡阶段仅分配一次;在平衡阶段进入供给的风光盈余接受平衡结算。
日前出清依次接纳报价,在剩余预测需求降为零或全部报价耗尽时结束。日前阶段没有核电机组被接纳时,核电的 real_gen_energy 在平衡前乘 0.99。实际调度结束后,最终出力为零的机组将 real_gen_energy 设为零,其余机组将最终出力传入下一期。
实时阶段按实际需求与预测需求的比较选择分支。实际需求较低时,执行盈余吸收和下调;较高或相等时,执行上调平衡。日前供给低于预测需求时,仍采用这一比较规则:较低实际需求的分支继续要求下调 ,留下的需求缺口进入下文电量账户。
accepted_bids = initial_running_rows(generators)
for period in range(periods):
Read availability, forecast_demands[period], real_demands[period]
Read period external_price and transfer_constraint
ahead_market_bidding(...):
Add add_energy to each hydro/biomass energy_limit
Apply storage self-discharge; construct offers
Sort by merit_key; accept forecast demand subject to physical bounds
rebuild_surplus(...); uniform_income(...)
realise_period(...):
if real_demand < forecast_demand:
curtailment_market_bidding(...):
Buy back discharge, charge, export, supply electrolysis
economic_downward_stack(...): reduce remaining output
else:
balancing_market_bidding(...):
Use surplus; buy back discharge and charge
Offer eligible batches, generation and residual imports
Export remaining surplus and supply electrolysis
Clear upward demand; record remaining blackout
Set real_gen_energy to zero for generators with zero final output
battery.close_period(period) for each battery
physical_cost_terms(...): record period expenditure components
return period dispatch, prices, income, inventory and annual totals
低需求分支按 storage_fee、per_storage_fee、n_1 * n_2 的升序依次处理储能,上调平衡按储能输入顺序处理。每项储能先回购本期放电,再接纳充电。正价格出口在低需求分支按对侧价格降序接纳,在上调平衡按对侧价格升序接纳,各自受负 transfer_constraint 的绝对值限制。
上调出清从最后一台日前接纳机组开始,加入后续发电报价、年龄至少两期的储能批次和剩余进口容量。对这台边际机组,valid_energy 为当前受爬坡约束的出力上限减日前已接纳 MW;后续机组采用完整的受爬坡约束上限。水电和生物质还遵循剩余预算。每次接纳量减少初值为 real_demand - forecast_demand 的 energy_provided,该量降为零或全部报价耗尽时结束,剩余量记为 blackout。
公共电解槽作为柔性需求吸收盈余。源参数为 10 MW 容量、每期 0.125 MW 爬坡和 0.65 转换效率,选定数值由数据包参数行提供。可用风光先进入市场出清,再按盈余分配顺序供应储能、出口和电解。本期电解槽限额为 energy_cell = min(real_energy + rampup_rate, capacity_limit),单位 MW。接纳量 min_value 取该限额与剩余盈余的较小值:低需求分支采用 excess_energy + need_curtailed_energy,上调平衡采用 excess_energy;随后更新 real_energy = min_value 和 green_hy = min_value * energy_efficiency。
经济下调顺序
在储能、出口和柔性需求吸收盈余后,比较下调能够避免的运行支出。ramp_floor_mw 取零与上期 real_gen_energy 减 alter_limit 的较大值,风光和进口的下限为零。avoided_cost 读取综合 gen_cost,核电扣除 NUCLEAR_DEC_PREMIUM_GBP_PER_MWH = 100,进口采用 external_price。普通报价行按保留两位小数的避免费用降序排列。
燃气与生物质将当期日前接纳出力 拆为不停机段与停机段。在此排序规则中,
代表聚合机组在线容量,
为最小稳定出力比例:
不停机段每 MWh 避免 英镑费用;停机段将预计停机时长
内的节省与重启费用
比较,后者按每 MW 装机每次启动计量:
SurplusOutlook.run_after 统计当前期之后连续满足“预测需求不高于预测风光加核电可用量”的期数,当前下调期另计一期。缺少注入可用率数组时,horizon_h = 0.5 h。在稳定出力比例处减少 1 MW,需要停运 1 / min_stable_fraction MW 装机;重启比较因此将费用除以该比例及预计停机时长。
当 时,停机段与其他资源按净节省降序排列。
为正时排在零成本风光之前;为零或负时排在风光之后,取整后同值也按风光在前处理。当
时,该段排在其他全部可下调资源之后。这些量共同定义连续出力的排序规则;物理费用账户采用前文启动报价加价
。
| 技术 | 热/温/冷重启费用,2025 年 GBP/MW | 最小稳定出力比例 | 最短停机时间,h |
|---|---|---|---|
| CCGT | 113.7 / 134.4 / 155.0 | 0.50 | 6 |
| OCGT | 175.7 / 175.7 / 175.7 | 0.50 | 0.5 |
| 生物质 | 129.2 / 129.2 / 129.2 | 0.35 | 6 |
CCGT 在 h 时采用热启动值,
h 时采用温启动值,
h 时采用冷启动值。
value_thermal_restart_v1.json 综合 Kumar 等(2012) 的循环磨损估计与 Staffell 和 Green(2016) 的 GB 启动燃料和碳费用估计。最小出力和停机时间参考 Elexon 申报值及参数表记录的技术资料。参数表以 ONS CPI D7BT 的 将选定的 2024 年英镑值换算为 2025 年英镑,并将重启费用保留一位小数;记录的换算系数为 1.0336。
RestartParameters.break_even_hours 将重启费用除以 min_stable_fraction 与避免费用的乘积。按 GB 运行费用,热启动 CCGT、OCGT、生物质的盈亏平衡时长分别为 4.13 h、4.69 h、4.34 h。因此,满足 6 h 条件的 CCGT 和生物质停机段具有正净节省,OCGT 在半小时时钟上从 5 h 开始取得正净节省。CCGT 六小时停机对应的费用边界为 113.7 / (0.5 × 6) = 37.9 £/MWh。
相同的取整净节省依次采用类别值:火电 0、进口 0.5、水电与生物质 1、风光 2、停机段 2.5、核电 3,再按名称和输入顺序排列。每次接纳的下调量消耗一次剩余需求:
limit 为报价段可下调 MW,item[2] 为该行剩余接纳出力,remaining 为尚需下调的量。水电与生物质将下调量返回累计预算,受爬坡下限保留的出力记为调度内溢出。native_corrected.economic_downward_stack 执行这些下调。下调在 remaining 至多为 MW 或所有可下调段耗尽时结束。
结算、显示价格与物理费用
市场对各阶段全部接纳供给采用统一边际价。日前取包含进口与储能在内的最高接纳报价,uniform_income 将接纳 power_mw 乘时段长度及阶段 price_gbp_per_mwh;平衡价格同样包含接纳进口报价。income 为 GBP,power_mw 为 MW,价格为 GBP/MWh;空接纳类别向最大值计算提供零:
储能费用在本期内结算。被回购的储能出力保留日前报酬,物理调度及年度送出电量采用期末净头寸。
市场显示价格的标签为“Average period cost (£/MWh demand)”,即每 MWh 需求的时段平均费用。设 为接纳报价、储能、下调及上调费用的累加器,其单位为 GBP/小时。价格单位为 GBP/MWh,对应期间费用为 GBP:
这一统计量描述实际需求的每 MWh 费用;发电与储能收入根据前述结算账户计算。 仅包含本期储能费用。最终边界供给进入年度发电量统计,储能放电量另行报告。
物理运营费用按综合 gen_cost 计量实际发电、按 external_price 计量进口,并以 startup_cost 乘启动期发电 MWh 计量启动加价。physical_cost_terms 返回各期的 generation_variable_gbp、import_variable_gbp 和 startup_adder_gbp。第 6 章将这些分项与储能折旧、缺电估值和年度资本费用合并。
电量平衡与年度输出
期间电量平衡边界包含接纳毛供给、充电、出口、柔性需求和非风光溢出。本节各量均以 MWh 表示。设接纳供给为 、记录切负荷为
、实际需求为
、储能充电为
、出口为
、柔性需求为
、非风光溢出为
,则期间残差为
电量账户通过 compatibility_adjustment_mwh 吸收浮点运算的小幅残差,该数值项仅在期间容差以内生效:
电量账户根据物理残差和调度分支记录的缺电量,计算全部未满足需求:
仅含未满足需求的时段以 闭合。同一年内连续出现缺口的时段构成一次事件。年度输出包含事件数、时段数和未满足 MWh;第 6 章将各缺口分项各扣除一次,得到已服务需求。
年度输出合计机组与进口 MWh、储能充放电、风光弃电、非风光溢出、出口、柔性需求、期间价格、资产收入和未满足电量。期间状态将实际出力与储能批次传入下一期,年度模型随后执行第 6 章的核算与投资规则。
返回目录 ↑6 年度核算与投资
VALUE 每个模型年更新一次在役容量。全年调度给出售电量、运行费用与可再生能源剩余电量,进而确定投资和退役。获准新增的容量进入建设队列,在完工年成为在役资产。年度计算由此连接当期机组、市场收入、建设时长与未来容量。
年度输入与计算顺序
年度输入 YearState 包含年份、在役资产、规划项目和储能成本观察值。各资产带有以 MW 表示的 capacity_mw,储能还带有以 MWh 表示的 energy_capacity_mwh,并记录技术、地区及投资主体。经济字段包括总资本 total_capex_gbp、年度固定费用 annual_fixed_opex_gbp、年化资本 annualized_capital_cost_gbp、寿命 economic_lifetime_years、要求的年度收益率 preferred_rate 和目标回收期 target_payback_years。第 2 章给出初始机组、项目清单与输入值。
项目在当年调度开始前投运。SchemeCPlanningPipelineDefinition.advance_year 将成功且满足 expected_completion_year≤state.year 的项目容量及经济字段加入在役机组,并从当前建设队列移除。后续完工的项目保留在队列中。水电项目在站点与水文输入齐备后投运,失败项目对在役容量的贡献为零。
调度产生年度 MarketYearResult,记为 market。逐期汇总包括实际需求、已接纳风光发电、储能充放电、停电电量和价格,资产账户包括发电 MWh 与市场收入。随后按下列顺序计算技术扩容上限、投资量、规划准入与下一年状态:
advanced = planning.advance_year(run, state)
model_input = psm_input_factory(run, advanced.operating_state)
market = psm.run(model_input)
headroom = []
for slot in sorted(expansion_policies):
policy = expansion_policies[slot]
headroom.append(policy.evaluate(run, advanced.operating_state, market))
investment_market = adapt_market_for_investment(
market, advanced.operating_state)
decision = investment.decide(
run, advanced.operating_state, investment_market, tuple(headroom))
decision = inherit_frozen_zone_shares(decision, advanced.operating_state)
admission = planning.admit_projects(
run, advanced.operating_state, decision.proposals)
其中 advanced.operating_state 为当年可用机组,headroom 为各技术允许增加的 MW,decision 包含新增提案与资产退役量,admission.next_pipeline 包含继续建设及新获准的项目。输入工厂按第 2—3 章处理更新后的机组,第 4—5、7—8 章定义所选调度计算。最终状态更新见本章末节。
资产资本与年度系统成本
资产资本按经济寿命通过资本回收因子年化。build_asset_economic_extensions 读取以 GBP 表示的 total_capex、以年表示的 life 及 discount_rate,并令 annualized_capital_cost_gbp=total_capex×crf。crf=capital_recovery_factor(discount_rate,life) 使用第 4 章公式,默认利率为 0.05。发电资本为容量乘以 GBP/MW 单位造价,储能资本与固定维护费按第 2 章技术目录声明的功率或能量计价基础计算。
年度系统成本汇总在役资产的资源费用。调度结果中的 total_levelized_capital_cost_gbp 包含年化资本与固定维护费,total_operational_cost_gbp 包含实际运行支出。Native 的实际运行支出由第 5 章发电与进口费用、停电电量乘以 market.voll_gbp_per_mwh(默认 17,000 GBP/MWh),以及储能循环折旧组成。用于下调排序的重启费用进入相应报价计算。选择网络扩建时,网络资产的资本与固定维护费进入年度资源账户。
系统成本将风电、光伏和储能的固定维护费视为已包含在其平准化资本中,单独记录的维护费保留为备忘项。已有径流式水电的 existing_stock_compatibility_capital_gbp 也列为备忘项。火电固定维护费与已投运网络的资源费用进入成本总额。
build_cem_cost_ledger 将输入资本总额读为 capital,并用 excluded 扣除上述两类备忘项。network_capex 与 network_fom 分别为年度网络资本与维护费,operating_sum 汇总各项实际运行费用。以下成本单位均为 GBP/模型年,demand、blackout 与 served 为年度 MWh:
network_resource_cost = network_capex + network_fom
non_network_capital = max(capital - network_resource_cost, 0)
excluded = vre_storage_fom + compatibility
headline_fleet_capital = max(non_network_capital - excluded, 0)
headline_capital = capital - (non_network_capital - headline_fleet_capital)
system_cost = headline_capital + operating_sum
served = max(demand - blackout - a2_hidden_unserved_mwh(market), 0)
vre_storage_fom 与 compatibility 分别保存风光储固定维护费及已有径流式水电资本的备忘金额。a2_hidden_unserved_mwh 从年度能量平衡账户读取额外未供电量;该账户记录的额外缺口为零时,函数返回零。输出为 cem_system_cost_gbp=system_cost,已供需求为正时,cem_system_cost_gbp_per_mwh_served=system_cost/served;已供需求为零时,每 MWh 成本留空。市场支付、政策转移、建设承诺支出与剩余价值分别记账,运行资源费用按上述实际支出汇总。
年度收入与投资分组
投资分组汇集同一主体、技术和地区下具有正容量的资产。主体名称依次取 investment_owner_id、source_agent_id 和现有资产标识。标记为 investment_eligible=False 的资产继续参加调度,其内生投资为零。SchemeCAgentInvestmentDefinition.decide 按排序后的 (owner,technology,region) 顺序处理各组。
投资计算采用归属于各资产的年度市场收入。Native 按第 5 章将市场代理收入分配给对应资产。主体层面结算由 adapt_market_for_investment 按在役 MW 分配:allocated[asset.asset_id]=income×asset.capacity_mw/capacity,其中 capacity 是该主体的总 MW。直接提供的资产账户按其记录进入投资计算。
火电投资收入扣除发电量乘以发电、燃料、碳及单位时间费用。资产的 agent_cashflow 行提供 generated_mwh 及四项 GBP/MWh 费用,乘积形成 operating_cost_gbp,组内汇总为 operational。风电、光伏、三类电池和氢储能采用 operational=0。储能投资由此使用已记账的日前与平衡收入,包括回购后保留的日前报酬。剩余电量充电的购电费用为零,循环折旧和固定维护费进入上述各自的资源成本账户。
各组的 capacity 汇总在役 MW,income 汇总年度 GBP 收入,replacement 汇总 total_capex_gbp。单位资本费用 cost_per_mw 为 GBP/MW,roi 为年度净收入与资本之比,payback 为年数:
重置资本为零时,roi=0。当 abs(net)≤10⁻⁹×max(abs(income),operational) 时,火电 net 置零,以吸收同组现金流分别求和产生的差值。preferred 取成员中最大的 preferred_rate,life 取最短的 economic_lifetime_years,target_payback 取最短的 target_payback_years。缺失或零值分别采用 0.08、25 年和 life。初始默认资产构造将生物质、CCGT 和 OCGT 的目标回收期设为 25 年,其余初值见第 2 章。决策直接通过 roi 与 payback 比较年度输入金额。
年度风电与光伏扩容上限
风电和光伏扩容受需求峰值与技术可用出力曲线限制。在 canonical_psm_data 中,demand 为半小时需求 MWh,period_hours=0.5,availability 为无量纲技术出力曲线,capacity_by_technology[technology] 为在役 MW。输入采用第 3 章的投资曲线,曲线最大值为 peak,新增容量空间计算如下:
SchemeCVREExpansionPolicyDefinition.evaluate 从 expansion.vre_cap_fraction 读取 fraction,默认 0.20,返回以 MW 表示的 limits。需求峰值为 1,000 MW、peak=0.8、在役容量为 300 MW 时,headroom=950 MW,年度上限为 190 MW。曲线峰值为零时,分母取下限 10⁻¹²。光伏、陆上风电与海上风电分别计算各自上限。
年度储能扩容上限
储能扩容采用现有储能充电后剩余的可再生电量。corrected_storage_headroom 将 storage_headroom_inputs 中的 leftover_excess_mwh 读为 leftover,并将逐期 vre_accepted_mwh、real_demand_mwh 和 storage_discharge_mwh 分别读为 vre、demand 和 discharge。这些数组均为每期 MWh,新增储能可用剩余电量与剩余需求缺口为:
虚拟储能将上述序列转为充放电曲线。_simulate_virtual_pool 从 soc=0 开始,取 power_mw=10⁹ MW、energy_cap_mwh=10⁹ MWh,并将往返效率 rte=0.98 全部作用于充电侧。PERIOD_HOURS=0.5,exc、dfc、ch 和 dis 为每期 MWh。每期先充电,再放电:
max_period_mwh = power_mw * PERIOD_HOURS
soc = 0
charge = zeros(len(excess))
discharge = zeros(len(excess))
for t in range(len(excess)):
exc = excess[t]
dfc = deficit[t]
if exc > 1e-9 and soc < energy_cap_mwh - 1e-9:
ch = min(exc, max_period_mwh, (energy_cap_mwh - soc) / max(rte, 1e-9))
soc += ch * rte
charge[t] = ch
if dfc > 1e-9 and soc > 1e-9:
dis = min(dfc, max_period_mwh, soc)
soc -= dis
discharge[t] = dis
充放电量除以 0.5 h 后得到 charge_mw 与 discharge_mw。aligned_max_mw 求两条曲线均至少超过 min_hours 的最大功率,hours_above_power(power_mw,p_mw) 统计严格高于 p_mw 的期数并乘 0.5 h。搜索上界 peak 取充、放电峰值中较小者。峰值为零,或高于零的时数不足时,结果为零;min_hours≤0 时返回 peak。对可达到的正时长,从 lo=0、hi=peak 开始,执行 64 次二分:
for _ in range(64):
mid = 0.5 * (lo + hi)
if (hours_above_power(charge_mw, mid) >= min_hours
and hours_above_power(discharge_mw, mid) >= min_hours):
lo = mid
else:
hi = mid
return lo
aligned_utilisation_spectrum 分别在 730、365、52 和 0 小时求解,得到 mw_730、mw_365、mw_52 和 mw_0。依次划分的容量段均以 MW 表示:
输出将 daily 存为 daily_loop,将 interday 存为 intraday。corrected_storage_headroom 将后者读入 intraday,计算 power_room=max(daily+intraday,0),并令 power_cap=fraction×power_room。1c_battery、0.5c_battery 和 0.25c_battery 分别获得这一技术上限,氢储能获得 hydrogen_cap=fraction×max(seasonal,0)。fraction 取自 expansion.storage_cap_fraction,默认 0.20;周尺度容量段保留在报告结果中。同年各组按前述顺序使用所属技术的剩余上限。
储能计算使用完整的 17,520 期及现有储能充电后的剩余电量序列,Native 调度提供该序列。时序较短、期长异于 0.5 h,或缺少该剩余电量序列时,储能上限返回零。分阶段、LP 或 DC 调度提供的年度结果缺少该序列时,也按这一规则将储能投资上限设为零。
投资量与退役
各技术采用 investment_eligibility.json 规定的准入方式。光伏、陆上风电、海上风电、三类电池和氢储能采用 headroom_required;CCGT、OCGT、gas 和 bio_and_waste 采用 explicit_uncapped。核电容量按外部项目及退役日程更新,抽水蓄能和径流式水电按站点项目推进;通用利润规则对这些技术生成零提案。
并行扩容规则按各技术最小限额合并。caps 保存该最小值,每年以 remaining_caps=dict(caps) 开始分配。前期项目继续留在建设队列中,只有当年投资计算产生的新增提案扣减 remaining_caps,因此多个决策年可以围绕同一容量空间保留待建项目。
当一组资产满足 net<0 且 cost_per_mw 为正时,该组退役部分容量。退役量受组内现有 MW 限制,并按各成员的 MW 比例分摊。其余分组在 roi>preferred 时选择 Invest_High,否则在 payback≤target_payback 时选择 Invest_Profit,剩余分组选择 Do_Nothing。两类投资均请求 net/cost_per_mw,请求退役量与允许新增量为:
在 headroom_required 下,allowed=remaining_caps.get(technology,0),正的 addition 扣减该剩余额度;在 explicit_uncapped 下,allowed=requested。Do_Nothing、非正单位资本费用和非正 addition 均产生零新增容量。例如,一个 100 MW 分组拥有 1 亿英镑总资本、1,000 万英镑净收入、preferred=0.08 和 20 MW 剩余空间,则 roi=0.10、payback=10 年、requested=10 MW,规划成功率应用前的提案为 10 MW。
新增储能保留组内能量与功率之比。对带有能量容量的成员,duration=sum(asset.energy_capacity_mwh)/capacity,单位为小时,提案能量为 proposal_energy=addition×duration MWh。提案经济字段由技术资本参数与 life 构造,非储能固定维护费按 fixed_om×addition/capacity 分配,储能资本及维护费采用技术目录。提案保留投资主体,后续调度收入继续进入该主体分组。分区运行中的 inherit_frozen_zone_shares 按成员容量加权,给新增提案分配分区份额。
建设时长与规划成功率
每项内生新增容量从 Application Submitted 阶段进入规划。初始载入将 development_stage_timelines、repd_status_to_timeline、success_rates 和 timeline_statistic 复制到 state.extensions["planning_parameters"],后续年份继续使用这些表。endogenous_planning_terms 按提案的 technology、owner 和 decision_year 读取这些参数。
技术决定规划表的匹配标签。光伏使用 Solar Photovoltaics,陆上风电使用 Wind Onshore,海上风电使用 Wind Offshore,普通电池和电解槽使用 Battery。Gas、CCGT、OCGT 和生物质使用 Wind Onshore,hydrogen_battery 使用 Solar Photovoltaics。相应建设时长键为 solar、onshore、offshore 和 battery。
阶段表提供项目阶段时长 months。_timeline_months 通常读取 Application Submitted 的总时长中位数;planning.timeline_statistic=mean 选择相应均值。缺少该技术时长时采用 solar,缺少总时长均值时采用总时长中位数。所需时长为有限非负值,数据与初始项目时长规则见第 2 章。
项目时长包含由主体名称确定的 −6 至 +6 个月偏移。model_project_key(owner) 返回 Model Decision: <owner>,stable_int_hash 取其 MD5 结果前 16 个十六进制位转为整数。以下计算得到完工年。round 的中点取偶数规则使 58.5 个月舍入为 58:
key = model_project_key(owner)
jitter = (stable_int_hash(key) % 13) - 6
rounded_months = int(round(max(1, months + jitter)))
year = int(decision_year)
source_completion = year + rounded_months // 12
completion = max(source_completion, year + 1)
提案将 completion 存为 expected_completion_year,内生项目最早在投资决策次年投运。按 public2 参数表,2025 年海上风电提案在 2033 或 2034 年完工,陆上风电在 2029—2030 年,光伏在 2026—2027 年,普通电池在 2027 年,火电在 2030 年。VALUE 101 使用较短工期,2025 年提案在 2026 年投运。
成功概率按技术标签与地区读取。source_success_region 将光伏和陆上风电主体名中的城市映射为地区:Nottingham—East Midlands、Ipswich—Eastern、London—London、Newcastle—North East、Manchester—North West、Edinburgh—Scotland、Portsmouth—South East、Bournemouth—South West、Cardiff—Wales、Birmingham—West Midlands、Sheffield—Yorkshire and Humber。包含 offshore 的主体名映射为 All Offshore,其余主体映射为 England。_success_rate 依次采用匹配地区值、该技术各地区记录的算术均值和 0.75,概率范围为 [0,1]。
public2 的海上风电概率约为 0.917,陆上风电地区值约为 0.22—0.71,光伏约为 0.84—0.95。普通电池主体通过技术均值采用约 0.873,火电主体采用约 0.547。VALUE 101 的成功概率为 1。这些概率在新增提案进入规划时应用。
默认 planning.success_mode=expected 选择 mode=expected_capacity,接纳 capacity=proposal.capacity_mw×probability。能量容量、总资本、年化资本与年度固定费用同时乘以该概率一次,单位价格、寿命与收益率参数保留原值。零概率对应零准入容量,后续年份按日程将获准容量投入运行。
planning.success_mode=stochastic 选择 mode=seeded_stochastic,在确定性抽取值低于成功概率时接纳完整提案。seed 来自 planning.random_seed,默认 0。提案标识结合 run.run_id、决策年、主体及排序后投资组从零开始的序号;相同输入产生相同抽取值,变更运行标识将改变该值:
proposal_id = f"{run.run_id}:{market.year}:{owner}:{index}"
digest = hashlib.sha256(f"{seed}:{proposal_id}".encode("utf-8")).hexdigest()
draw = int(digest[:13], 16) / float(16 ** 13 - 1)
success = probability > 0 and (probability == 1 or draw < probability)
capacity = proposal.capacity_mw if success else 0
SchemeCPlanningPipelineDefinition.admit_projects 将获准项目加入当前建设队列。后续年份开始时,到期项目成为名为 commissioned:<project_id> 的资产,并保留获准 MW、MWh、主体和经济字段。径流式水电项目要求 hydrology_profile_id、capital_cost_scope=new_build 和 new_build_cost_source_id,抽水蓄能还要求 site_constraint_id 与 energy_capacity_mwh。缺少站点字段的到期项目继续在队列中推迟。
状态更新与年度输出
退役改变下一年的容量与经济量。SchemeCStateTransitionDefinition.apply 令 next_year=current_state.year+1;达到资产声明的 model_unavailable_from_year 时整项退役,其余资产按请求退役量调整。resize_asset_economics 将容量下限设为零,并按剩余资产比例缩放能量容量、固定维护费与资本:
new_capacity = max(capacity_mw, 0)
ratio = new_capacity / old_capacity
new_energy = old_energy * ratio
total_capex = (capital_cost_per_mw * new_capacity
+ capital_cost_per_mwh * new_energy)
annual_fixed_opex_gbp *= ratio
annualized_capital_cost_gbp = total_capex * capital_recovery_factor(
capital_discount_rate, economic_lifetime_years)
其中 capacity_mw 为原有容量减请求退役量,old_capacity 与 new_capacity 为 MW;储能的 old_energy 与 new_energy 为 MWh。项目级资本的两个单位造价字段均为零时,total_capex 取原资本乘 ratio。剩余容量为零时,资产状态设为 retired。经济寿命用于年化和投资回收期的默认值;退役时间按声明的停用年或上述亏损退役量确定。
下一年 YearState 包含剩余资产、admission.next_pipeline 和本年的储能成本观察值。transition_state 向 transition.apply 提供已投运机组、继续建设的项目和更新后的观察值,输出年份增加一。物理储能按第 4 章初始条件重新开始,售电观察值进入下一年成本计算。
年度输出包含调度电量、收入、系统成本、技术上限、投资提案、规划准入及下一年容量。每已供 MWh 成本按上述账户计算。第 9 章定义运行与建设排放、储能碳记录及可选新增网络的建设排放。在研究期末,report_only 返回最终状态,pipeline_tail 推进已在建设队列中的项目,full_extension 继续年度运行与投资。
7 传输与网络约束
分区再调度的空间表示
分区再调度在全国日前市场之后确定各区发电调整、储能运行和传输。每个半小时采用无损运输模型,使最终注入满足分区需求、走廊限额与地理边界容量。英国输入包含 23 个分区和 22 条计算走廊;下述 DC 与 AC 方法采用节点和支路输入。
英国网络输入由 value-uk-research-suite-v1-public2 提供。zones 定义分区,corridors 给出有向连接,cutsets 将走廊归入地理边界,ratings 给出时变限额,asset-map 分配资源位置,demand 给出分区 MWh,interconnector-landings 分配进出口资产的登陆区域。B6 和 B7a 的双向容量分别为 6,700 和 9,400 MW。给定的 2025–2034 年配置保持这些容量固定。
资产位置按固定优先级确定。_zone_shares_with_source 先取 frozen_zone_shares,再用 asset_id 匹配 asset-map,随后匹配 interconnector-landings,最后归入唯一标为 is_unconstrained_fallback 的分区。份额之和在 容差内等于 1。跨区资产按份额拆为各区的物理单元,装机、储能功率、能量与初始库存均乘该份额,各单元保留原投资主体。
随模型提供的映射按站点定位风电与光伏,将 CCGT、OCGT、生物质、径流水电、核电、储能和进口分配至 ENGLAND_FALLBACK。该节点连接声明的中央运输分区。电站政策生成的核电站通过这一规则进入回退区,其中包括地理位置在 B6 以北的 Torness。进口资源名称采用 import:<country>,登陆表采用 interconnector:<line>,精确标识匹配因此将这些进口归入回退区。这些分配决定 B6 和 B7a 约束中使用的区域注入。
需求按案例指定的空间规则分配。align_zonal_demand 在 23 区研究中保留网络包的分区份额,并缩放至全国情景需求。数组 aligned、output_real、network_demand_mwh_by_zone 和 network_national_mwh 均为 MWh,区域和时段下标为 :
最后一个分区取全国需求减去前面各区已分配量。两个全国合计均为零时,缩放系数取 1;全国情景需求为正时,网络需求合计须为正。demand_mwh_by_zone 与资产位置、实际可用率和互联线进出口限额共同进入期间问题。
日前计划与调整报价
网络模块根据期间资源可用量和初始储能库存生成日前计划。_ahead_offers 按 capacity_mw * availability * period_hours 给出各资源可用 MWh,报价为期间边际费用乘 market.bid_multiplier,倍率默认 1。储能报出时段放电功率限额与 soc * discharge_efficiency 的较小值,价格为 bid_price_gbp_per_mwh(0.0) 乘同一倍率。clear_ahead 先按 price_gbp_per_mwh、再按 offer_id 排序,每次接纳可用量与剩余预测 MWh 的较小值;剩余需求至多为 1e-12 MWh 或全部报价耗尽时结束。最后接纳价格用于日前结算。
资源调整量以 schedule_mwh_by_asset 为起点。_flexibility_bids 将可用量减计划量的正值报为上调 MWh,将计划量报为最大下调 MWh。上调价格为边际费用乘 market.bid_multiplier。network-economic-v2 下调规则采用默认取 1 的 market.dec_multiplier、各技术政策支持费用及核电下调附加值:
| 资源 | 下调价格,GBP/MWh |
|---|---|
| 燃料发电 | 边际费用 × 下调倍率 − 政策支持费用 |
| 进口 | 期间进口价格 × 下调倍率 |
| 风电、光伏与径流水电 | − 政策支持费用 |
| 核电 | 边际费用 × 下调倍率 − 政策支持费用 − 下调附加值 |
resource_dec_price 从 market.policy_support_gbp_per_mwh_by_technology 读取政策支持费用,默认取零;从 network.inflexible_dec_premium_gbp_per_mwh_by_technology 读取附加值,核电默认 100 GBP/MWh。燃气和生物质将计划 MWh 拆成 running_mwh 与 shutdown_mwh,后者等于计划量乘 min_stable_fraction。thermal_dec_segments 保留不停机段价格,并按第 5 章的 net_saving 和重启参数表给停机段定价。预计停机时间计入当前期以及随后连续由声明风光和核电可用量覆盖预测需求的时段,每期长度为 period_hours。短于 min_down_time_h 的停机段,其价格取净节省和低于其他全部下调价格档 0.01 GBP/MWh 的数值中较小者。
储能调整报价覆盖从计划放电到最终放电或充电的变化。maximum_discharge 取 discharge_power_mw * period_hours 与 soc * discharge_efficiency 的较小值,上调量为 max(maximum_discharge - scheduled, 0)。下调量为计划 MWh 加上时段充电功率限额与剩余内部容量除以充电效率的较小值。storage_dec_price 取储能上调价格、该价格乘往返效率、期间最低可用上调价格三者中的最小值;期间存在上调报价时才使用第三项。声明的出口限额另形成下调取电报价,价格取出口价格的非负部分。
储能从 initial_soc_mwh 开始,每期求解后的库存成为下一期初值。发电遵循逐期可用量与下文接纳调整量的边界。算法沿给定时序逐期计算,返回最终注入、充电、放电、库存、走廊流量、未满足需求与结算。
调整目标与运行约束
再调度依次求解四个线性目标:包含缺电费用的报价支出、调整电量、加权物理吞吐和固定变量顺序。SinglePeriodProblem 将目标系数数组记为 primary_objective、secondary_objective、physical_tie_objective 和 stable_tie_objective。各目标值为对应数组与期间决策向量 values 的内积,后者由 solve_lexicographic 返回。
决策向量采用实现中的变量标签。bid:<bid_id> 为非负接纳报价电量,flow:<corridor_id> 为带方向走廊电量,load-shedding:<zone_id> 为未满足需求,storage-charge:<asset_id> 与 storage-discharge:<asset_id> 为电网侧充放电量,absolute-flow:<corridor_id> 限制走廊绝对流量,单位均为 MWh。公式的数组下标保留这些已有标识。
第一目标按报价方向计算支出。上调量乘 price_gbp_per_mwh,下调量取该乘积的相反数;缺电量乘 voll_gbp_per_mwh,默认值为 17,000 GBP/MWh:
第二目标合计接纳报价电量与缺电量。第三目标对充电、放电和走廊绝对电量赋权 1,再加非储能下调报价的类别权重。physical_dec_weight 提供下表权重,bid_dec_rank 选择类别:
| 下调类别 | 权重 |
|---|---|
| 燃料机组不停机段 | 0 |
| 进口 | 0.5 |
| 径流水电 | 2 |
| 风电和光伏 | 3 |
| 燃料机组停机段 | 3.5 |
| 核电 | 4 |
| 短于最小停机时间的燃料机组停机段 | 5 |
同一区域内,第一目标价格完全相同时,储能充电先于径流水电、风光及核电下调;燃料机组停机段位于风光之后、核电之前。跨区时,类别权重同时与走廊流量竞争。第一目标采用原始价格。第四目标按报价、走廊、区域和储能标识的固定顺序,依次给变量赋权 1、2、……。
资产最终注入等于日前计划加接纳的带方向调整。final_dispatch_mwh_by_asset 与 schedule_mwh_by_asset 均为 MWh。索引 表示报价,其
asset_id 指定资产 ,
asset_zone_id_by_asset 指定分区 :
分区守恒要求最终供给和流入满足需求及流出。走廊方向由 from_zone_id 与 to_zone_id 定义:
报价接纳量位于零与 bid_capacity 之间,MW 报价乘 period_hours = 0.5 后成为期间电量。缺电量介于零与分区需求之间。发电注入介于零与 realised_availability_mw_by_asset 乘时段长度之间;互联线注入介于负的 export_capacity_mwh 与正的 import_capacity_mwh 之间。
同价非储能报价按可自由接纳量比例分配。上调分组采用相同区域、方向、网络作用和价格,下调还要求类别相同。_forced_down_by_bid 先分出实际可用率或互联线限额要求的强制下调量。对组内某报价及该组第一报价,实现采用
每个地理边界限制其成员走廊的带方向合计流量。coefficient 为成员方向系数,forward_capacity 与 reverse_capacity 为将 MW 输入换算后的期间 MWh:
各边界同时约束流量。单独声明的走廊限额进一步限制该走廊,absolute-flow 至少等于正、负两个方向的流量值。因此,B6 的 6,700 MW 在每半小时对应 3,350 MWh。缺少自身限额的走廊仍受分区守恒和所属边界约束。
储能再调度以实际充放电更新内部库存。opening 取自 initial_soc_mwh_by_asset,capacity 取自 energy_capacity_mwh。各储能满足
充放电分别介于零与对应功率乘 period_hours 之间,期末库存介于零与 capacity 之间。储能报价采用 convex_net_power_v1,每个方向至多一条,下调价格至多为上调价格加 GBP/MWh。最终同时充放电量至多为
MWh。期末库存传入下一期,全国计划与提交报价提供当前决策中的跨期价值。
物理资源支出与报价支付分别核算。resource_cost_gbp_per_mwh_by_asset 乘资产正的最终注入,缺电按 VoLL 计价:
网络约束费用将该结果与合并为单节点、移除走廊和边界后的同一线性规划比较。solve_network_free_counterfactual 保留报价、出口套利、进出口限额、储能物理约束、缺电估值和求解设置。两种情况共用逐期单位费用表:优先取给定的时变资源费用,其余采用年度边际费用、储能循环折旧及零出口资源费用。负进口价格可使期间资源支出为负。
第一目标的差额记为 network_constraint_bid_objective_gbp,表示接纳报价支付与缺电估值的变化;physical_resource_cost_gbp 表示资源支出。
数值求解与边界边际价值
求解器先固定第一目标最优解的缺电总量,再限制其中的报价费用。lock_primary_shedding 在第一阶段缺电总量为零时将各区缺电固定为零,其余情况以上一最优解的缺电合计作为上界。bid_cost_coefficients 提供下一条约束使用的纯报价费用系数。
目标约束采用随数值尺度变化的浮点容差。compute_lock_tolerance 读取目标系数 coefficients、前次最优解 optimum、下限 unit_floor 和有效 solver_tolerance,计算
nonzero_terms 为非零系数数目,epsilon 为机器精度。有效容差取适用求解容差与边界归整容差的较大值。报价费用约束的下限为 GBP,默认求解容差为
;MWh 目标的下限为
MWh,求解容差下限为
。报价费用接纳上限为每期 1 GBP。后续求解保留前面目标的上界。HiGHS 对偶单纯形法启用预求解,原始与对偶容差均为
,最终等式、不等式及变量界偏差至多为
。
for period in the half-hour chronology:
align_zonal_demand(...): obtain zonal demand
build_single_period_problem(...): build bids and physical constraints
solve_lexicographic(problem):
minimise primary_objective; retain primary boundary marginals
lock_primary_shedding(...); bound bid_cost_coefficients(problem)
minimise secondary_objective; retain its objective bound
minimise physical_tie_objective; retain its objective bound
minimise stable_tie_objective; validate_solution(...)
solve_network_free_counterfactual(...): compute matched comparison
record actual injections, storage inventory, flows, shortage and costs
pass final_soc_mwh_by_asset to the next period
return all period results
边界边际价值表示第一目标对传输容量的响应。boundary_marginal_values 在增加目标约束前读取正、反向容量行的对偶值:
边界价值为正对应正向限额生效,为负对应反向限额生效。多个生效边界共享走廊时,可有多组对偶分配对应同一最优解。年度输出还合计边界价值绝对值乘传输 MWh,作为拥塞量度。
直流网络调度
直流网络模块在完整时序上联合选择发电、储能运行和节点电压相角。ReferenceDCNetworkPSM 在 layout 中建立 generation、charge、discharge、soc、blackout、angle 和 flow 变量块,公式沿用这些名称表示其解值。前五项为 MWh,angle 为弧度,flow 为 MW。资源、储能、节点、支路和时段索引为 。
marginal_costs、variable_degradation_gbp_per_mwh_discharged 和 voll_gbp_per_mwh 的单位为 GBP/MWh。固定装机下的运行支出为
跨节点资产通过 expand_share_mappings 拆为各位置独立的资源单元。每项资产的映射字段 share 合计为 1,按份额缩放发电装机、储能充放电功率、电量容量和期初库存。求解器在指定节点调度这些单元,再按原资产汇总。VoLL 读取 market.voll_gbp_per_mwh,默认 17,000 GBP/MWh。
节点守恒用 period_hours 将支路功率换为电量。对节点 上的单元,
资源上界为 capacity_mw、share、availability 与 period_hours 的乘积。储能按相同映射份额采用第 8 章的充放电和库存约束,库存更新为
期末规则可以为自由、等于期初库存的循环规则,或固定目标。启用 allow_blackout 时,缺电介于零与节点需求之间,其余情况固定为零。资源可用率位于 ,边际费用非负。
交流线路与变压器采用声明的等效电抗及相角差。base_mva 默认 100 MVA,tap 默认 1,phase 将 phase_shift_degrees 换为弧度:
回路数缩放热容量,声明的等效电抗进入相角方程。每个电气孤岛有一个零相角参考节点,其余相角位于 。停运支路流量为零,直流联络线以声明范围内的可控流量进入节点平衡。
HiGHS 在一次线性规划中求解全部时段,原始与对偶容差为 ,完成条件为求解状态最优且等式残差至多为
。节点电量平衡的对偶值给出 GBP/MWh 边际运行价格,系统显示价格按需求加权。输出包括完整时域的期间调度、储能库存、节点价格和支路流量。
交流可行性计算
交流模块计算给定有功计划下的稳态潮流。输入包含有功与无功需求、发电机有功和无功限额、电压设定、支路阻抗与充电电纳、固定变比及相移、电压范围和 MVA 额定值。每个电气孤岛有一个平衡资产,PV 和平衡节点配置发电机,同一节点的发电机采用共同电压设定。储能按给定的有功充放电计划运行。PQ 节点根据给定有功与无功注入求电压幅值和相角;PV 节点固定电压幅值及有功;各平衡节点固定电压幅值和零相角,并平衡所在孤岛。
节点复功率由求得的电压及节点导纳矩阵计算。vm 为标幺电压幅值,theta 为弧度,voltage 为复数标幺电压,injection 的实部和虚部分别为 MW、Mvar。ybus 为 base_mva 基准下的标幺导纳,:
支路采用 π 型阻抗表示。_ybus 将 resistance_pu 加 倍
reactance_pu 后取倒数得到 series;charging 为虚数充电电纳的一半;tap 为变比乘复数相移因子。两端导纳为
求解器拟合非平衡节点有功平衡与 PQ 节点无功平衡,固定 PV 和平衡节点电压幅值。平衡资产提供剩余有功和网损,节点无功发电受该节点发电机合计限额约束。两端复功率 s_from 与 s_to 包含 MW 与 Mvar,losses 的单位为 MW;它们采用声明的端点 :
两端视在功率均受 apparent_power_rating_mva 乘 circuits 约束。在役支路按声明阻抗进入导纳矩阵,拓扑和设备设定保持固定。
AC 求解分别从平坦电压和另一组初值开始:后者相角均匀分布于 0.01–0.03 弧度,PQ 节点电压取上下界中点;声明的初始电压构成第三组初值。各组初值先投影到相角和电压边界。least_squares 采用 xtol = ftol = gtol = 1e-12、max_nfev = 2000,要求成功终止且最大不平衡量至多为 residual_tolerance,默认 MW 或 Mvar,再选择残差最小的有效解。
接纳的 AC 解在不同初值间的电压及相角差至多为 ,雅可比矩阵条件数至多为
。有功、无功、电压和支路端点视在功率在
equipment_tolerance 内满足声明限额,默认容差为各自单位下的 。每期返回电压、发电、端点潮流和损耗,随后进入下一期;某期求解失败时计算结束。
可选线路扩建
线路扩建根据观测拥塞和声明年度收益筛选外部候选。候选记录包含端点、回路数、支路参数及限额、建设费用、固定运维、寿命、折现率、建设期、延误、规划成功率和预算组。ReferenceTransmissionExpansion.propose 计算峰值利用率 utilisation、年费用 annual_cost 和效益费用比 ratio:
资本回收函数 _crf 使用年度折现比例 rate 与按年计量的寿命 life;annual_cost 为 GBP/年,total_capex_gbp_per_build 为 GBP,ratio 为无量纲比值:
已投运或已进入规划队列的候选从下一轮决策中移除,其余候选按 ratio 降序和标识升序排列,最早决策年、最低触发利用率、最低效益费用比、总预算与预算组额度共同决定准入。年费用为零时比率为无穷大。注册参数默认年度总资金为 0 GBP,每组额度为 GBP。每个接纳提案扣除完整建设费用,预计投运年为决策年加
lead_time_years 和 delay_years。
ReferenceTransmissionExpansion.admit 在可重复抽样值 draw 至多为 success_probability 时接纳规划。seed 取自 network.expansion.random_seed,默认 0;提案标识为 network-proposal:{run_id}:{year}:{candidate_id}。这些输入按下式确定 draw:
digest = hashlib.sha256(
f"{seed}:{proposal.proposal_id}".encode()
).hexdigest()
draw = int(digest[:13], 16) / float(16 ** 13 - 1)
if draw <= candidate.success_probability:
admit the proposal into the planning queue
年初将已完成项目投运;线路按投运年加 economic_life_years 向上取整的年份退役。apply_commissioned_network_assets 将投运支路接入年度网络。线路扩建通过候选表与年度预算启用;随模型提供的 23 区配置保持网络固定。
8 完全预见调度与天然水文
完全预见单节点调度
完全预见模块在固定装机下,联合安排完整输入时序中的发电、进口和储能。PerfectForesightPSM.run 读取 PSMInput.chronology,年度外层模型提供投资及其形成的装机。各期输入包括需求、资源可用率和边际费用;储能输入包括功率、电量容量、效率和期初库存。
资源可用率接受单元素序列或完整时序,数值须有限且位于 。边际费用接受标量、单元素序列或完整时序,数值须有限且非负。需求采用有限非负 MWh,时段标识唯一,完整序列均遵循同一时序。充电与放电效率位于
,初始库存及固定期末库存位于能量容量以内。该输入中的水电作为具有给定电力可用率的资源。下述水文函数从来水构造可用电量,或优化常规水库运行。
目标函数最小化资源运行支出、储能衰减费用和缺电费用。resource_period、charge_period、discharge_period、soc_period 和 blackout 均为 MWh 数组,下标 、
、
分别对应资源、储能和时段。
resource_marginal_costs 与 variable_degradation_gbp_per_mwh_discharged 的单位为 GBP/MWh,voll_gbp_per_mwh 为缺电估值。目标为
单节点平衡以资源供给、储能放电和记录缺电满足需求及充电:
储能库存表示内部电量。电网侧充电量乘 charge_efficiency 后进入库存,送出电量除以 discharge_efficiency 后从库存扣除:
容量约束通过 period_hours 将 MW 换为期间 MWh:
期初与期末库存决定储能在整个时域内的净电量交换。第一期从 initial_soc_mwh 开始;默认 terminal_soc_rule = cyclic 要求期末等于期初,fixed 采用 terminal_soc_mwh_by_asset,free 允许期末库存位于容量界内。启用 allow_blackout 时,缺电量介于零与 demand_mwh 之间,其余情况的上界为零。默认 period_hours = 0.5、voll_gbp_per_mwh = 17000,衰减费用为零。Study 参数 market.voll_gbp_per_mwh 接受 0–1,000,000 GBP/MWh,并进入调度目标。
第二次线性规划在第一次解的费用容差内最小化储能吞吐。primary.fun 为第一次求解的最小费用,单位 GBP;第二次保留全部物理约束,并增加
两次求解均采用 HiGHS,原始与对偶可行性容差为 ,各阶段成功达到最优后才进入后续计算。返回的物理轨迹为
secondary.x,最大同时充放电量 simultaneous 须小于等于 MWh。未使用的风光电量为可用量减已接纳资源供给。
页面显示的“Balance shadow price”为第一阶段需求的边际运行费用。资源收入为需求平衡对偶值与接纳 MWh 的乘积,储能收入为该对偶值乘放电减充电,消费者支付采用已供应需求。系统费用在变量支出、衰减和缺电费用上,加年化资本及非风、非光、非储能资产的固定运维。固定费用输入为 annual_fixed_opex_gbp;风、光和储能的固定运维按第 6 章作为备查分项。
PerfectForesightPSM.run(model_input):
data = model_input.chronology
validate_chronology(data, model_input.period_hours)
_availability(...) and _marginal_costs(...): expand inputs to every period
_layout(data): allocate resource, charge, discharge, soc and blackout
assemble objective, throughput_objective, equality, rhs and bounds
primary = linprog(objective, A_eq=equality, b_eq=rhs,
bounds=bounds, method="highs")
primary_tolerance = max(1e-7, abs(primary.fun) * 1e-10)
secondary = linprog(
throughput_objective, A_ub=objective.reshape(1, -1),
b_ub=[primary.fun + primary_tolerance], A_eq=equality, b_eq=rhs,
bounds=bounds, method="highs")
extract resource_period, charge_period and discharge_period
extract soc_period and blackout
check balance and simultaneous storage operation
return costs and demand duals
径流式水电可用电量
天然水文方法根据来水时序和站点参数计算可用电量。run_of_river_dispatch 读取 HydroSite 与 CanonicalInflow;默认全国 PSM 采用第 5 章的统计负荷率和季节曲线。
归一化电力可用率按时段长度缩放装机功率。输入为 inflow.unit = p.u. 时,inflow.values 位于 ,
capacity_mw 单位为 MW,interval_hours 单位为小时:
水量输入乘站点水电转换系数和涡轮效率,再受发电功率约束:
接纳发电量介于零与 available 之间,默认接纳全部可用电量,curtailed 记录剩余电力潜力。返回结果中,三个数组分别记为 available_energy_mwh、accepted_generation_mwh 和 curtailed_energy_mwh。10 MW 电站在 0.5 h 时段内采用可用率 ,得到
MWh。各期独立计算。
常规水库调度
常规水库在完整来水与电力价值时序上分配水量,以最大化发电价值。reservoir_dispatch 的四类期间变量为涡轮放水 q、生态旁路 bypass、弃水 spill 和期末库存 storage,均采用声明的水量单位,前三项表示期间水量。电量转换为
线性规划最小化发电价值的相反数与小额弃水惩罚之和。energy_value_gbp_per_mwh 为外部给定的电力价值时序:
水量连续性连接相邻库存与来水,第一期从 initial_volume 开始:
涡轮、普通放水及生态要求共同限制水量分配:
普通放水上限和生态下限同时约束涡轮放水加旁路,弃水单独进入水量平衡。给定 terminal_volume 时,期末库存固定为该值;其余情况下,期末库存位于 min_volume 与 max_volume 之间。参数检查要求普通放水上限至少等于涡轮放水上限,最大涡轮放水转换的电量至多为 turbine_capacity_mw 乘 interval_hours,容差为 MWh。
求解器读取完整来水与价值序列,调用一次 SciPy/HiGHS 线性规划。成功求解后返回水量轨迹、发电量和守恒残差,objective_gbp 为发电价值减弃水惩罚;问题不可行时按求解失败结束。给定的来水和电力价值序列决定完整优化时域。
reservoir_dispatch(parameters, inflow, *, energy_value_gbp_per_mwh):
inflow.validate(); parameters.validate(inflow.interval_hours)
conversion = (parameters.conversion_mwh_per_water_unit
* parameters.turbine_efficiency)
allocate q, bypass, spill and storage for every period
assemble objective, water equalities, release inequalities and bounds
use parameters.terminal_volume as the final storage bound when supplied
solved = linprog(objective, A_ub=inequalities, b_ub=upper,
A_eq=equalities, b_eq=rhs, bounds=bounds, method="highs")
generation = q * conversion
check previous + inflow.values[period] - q - bypass - spill - storage
return generation, water trajectories and residuals
水文输入的组装
天然水文输入包括站点表、资产到站点映射、径流式水电来水、水库来水和水库参数。站点声明技术、装机、涡轮效率、节点、来源及许可;抽蓄采用电储能模型。每项资产分配至一个站点,映射份额位于 ,同一资产份额合计至多为 1。
来水 CSV 提供带时区的时间戳、时段长度、站点标识、数值及水量或电力可用率单位。适配器要求数值有限且非负、时间戳唯一、单位一致;给定预期时序时逐期核对。站点、映射及参数表接受 JSON 或 CSV,缺失值处理声明为 none。
load_hydrology_inputs_from_pack 按 site_id 连接站点、映射、来水及参数表,adapt_hydrology_csv 保留声明的间隔与单位。独立函数 run_of_river_dispatch 接收站点与来水记录,返回以 MWh 表示的 available_energy_mwh、accepted_generation_mwh 和 curtailed_energy_mwh。reservoir_dispatch 接收水库参数、来水和电量价值,返回以 MWh 表示的 generation_mwh 及以声明水量单位表示的水量轨迹。
9 碳排放核算参数
VALUE 将运行排放和设备建设排放分别计算,再按所选核算情景汇总。运行排放随实际发电量和进口电量变化,建设排放随在役设备容量及年化规则变化。因子集由 value_current_authoritative_v1 指定。
发电与进口电力
运行排放按发电或进口电量乘以所选因子计算。在 build_operational_carbon_ledger 中,activity 是从 generation_mwh_by_asset 读取的各 asset_id 电量,单位为 MWh;kg 是换算为 kg/MWh 的因子。各条 emissions_tco2e 记录排放吨数,operational 汇总这些记录:
结果单位为吨,气体范围随所用因子的 CO₂ 或 CO₂e 定义保留。表中的零值对应发电环节的直接运行边界,设备建设排放通过下一节按容量计量的排放因子计算。进口因子采用固定的国家均值或备用值。
| 发电技术或进口来源 | 因子 kg/MWh | 气体口径 | 数据依据 |
|---|---|---|---|
| 联合循环燃气 | 394 | CO₂ | NESO 2024 年区域碳强度方法 |
| 开式循环燃气 | 651 | CO₂ | NESO 2024 年区域碳强度方法 |
| 生物质 | 120 | CO₂e | NESO 2024 年区域碳强度方法 |
| 风电 光伏 核电 天然水电 抽水蓄能 | 0 | CO₂ | NESO 发电环节边界 |
| 法国进口 | 53 | CO₂ | NESO 固定备用因子 |
| 荷兰进口 | 474 | CO₂ | NESO 固定备用因子 |
| 比利时进口 | 179 | CO₂ | NESO 固定备用因子 |
| 爱尔兰进口 | 458 | CO₂ | NESO 固定备用因子 |
| 挪威进口 | 11.9 | CO₂e | NVE 2024 年实物供电年均值 |
各因子统一为 kg/MWh,1 g/kWh 与 1 kg/MWh 数值相同。挪威原单位为 gCO₂e/kWh。
生物质计算采用表中固定因子 120 kgCO₂e/MWh,其原来源给出 ±120 gCO₂/kWh 的不确定范围。
按功率容量年化的建设排放
设备建造排放按各在役资产进行年度分摊。在 _asset_embodied_lines 中,capacity_mw 为在役功率,单位为 MW;factor.value 为所选年度因子,单位为 tCO₂e/(MW·年)。单项结果 emissions 写入 line.emissions_tco2e,embodied 汇总这些建造排放记录:
年度建设因子取自 embodied_factors_desnz_unece.csv。开式循环燃气使用联合循环燃气的建设因子,电解槽使用该表列出的代理值。
| 技术 | 年度因子 tCO₂e/(MW·年) |
|---|---|
| 光伏 | 38.544 |
| 陆上风电 | 47.304 |
| 海上风电 | 96.1848 |
| 核电 | 43.362 |
| 天然水电 | 61.32 |
| 抽水蓄能 | 98.55 |
| 联合循环燃气 | 16.2936 |
| 开式循环燃气 | 16.2936 |
| 生物质 | 22.0752 |
| 电解槽 | 1.25 |
按能量容量计量的储能排放
电池制造排放按额定能量容量与设备寿命进行年度分摊。所选制造因子为 89 kgCO₂e/kWh 容量,来自 Longfield Solar Farm 2022 年环境声明所用的中间值。_asset_embodied_lines 读取以 MWh 表示的 asset.energy_capacity_mwh,并从 economic_lifetime_years 读取以年表示的 economic_life。年度制造排放为
氢储能将功率设备与能量储存部分分别计量。能量储存部分采用 0.0006 tCO₂e/MWh 容量的全寿命因子,按资产声明的经济寿命年化;该值对应 factor_catalog.csv 的 ch4_h2_store_lifetime 参数项。电解槽的功率部分采用上一节的年度因子。
储能电量的碳记录
电池放电作为已存电力的转移记入 storage_carried_transfer,该项新增运行排放取零。抽水蓄能按表中的零运行因子计量。充电电源的排放已计入发电或进口电量。提供 storage_trace 时,模型另行按混合库存法追踪储能中留存的排放;输入包含每期 charge_mwh、discharge_mwh、charge_source_kgco2e_per_mwh 及充放电效率。
库存碳从零开始,充电按电源强度增加库存碳,放电按取出的库存能量比例移出库存碳。以下计算中的 inventory_energy 以 MWh 表示,inventory_kg 以 kg 表示;期末 ending_inventory 换算为吨。每期检查取出量 withdrawn 与现有库存,超出量大于 MWh 时以
ValueError 终止计算。
inventory_energy = 0.0
inventory_kg = 0.0
for charge, discharge, intensity in zip(
storage_trace["charge_mwh"],
storage_trace["discharge_mwh"],
storage_trace["charge_source_kgco2e_per_mwh"]):
admitted = charge * storage_trace["charge_efficiency"][0]
inventory_energy += admitted
inventory_kg += charge * intensity
withdrawn = discharge / storage_trace["discharge_efficiency"][0]
if withdrawn > inventory_energy + 1e-7:
raise ValueError("Storage withdrawal exceeds available inventory")
share = withdrawn / inventory_energy if inventory_energy > 0 else 0.0
inventory_kg *= 1.0 - share
inventory_energy -= withdrawn
ending_inventory = inventory_kg / 1000.0
氢储能的运行活动在当前账本中进入 unresolved。_normalise_technology 将 hydrogen_battery 转为 hydrogen_storage,该名称对应的运行因子为空;该活动使 operational 和 total 返回 None。氢储能设备建设部分仍按前述功率与能量容量因子计算。
年度排放与强度
年度排放 total 是运行排放 operational 与年化建设排放 embodied 之和。各活动具有匹配的排放因子、储能具有能量容量和正的经济寿命时,模型汇总这些分项。delivered_demand_mwh 是已供电量;其为正时,模型按以下分母计算 kg/MWh 强度:
线路扩建的建设排放
线路建设排放在投运年一次计入 network_construction_embodied,并加入该年的 total。adjust_carbon_ledger_for_network 选择 commissioning_year == year 且 status == "commissioned" 的网络资产。各资产的 rating 以 MW 表示,factor 读取以 tCO₂e/MW 表示的 asset.embodied_carbon_factor_tco2e_per_mw,emissions 以吨表示:
更新后的总排放用于 overall_kgco2e_per_mwh 和 delivered_demand_kgco2e_per_mwh,以正的已供电量 denominator 为分母。所选线路缺少排放因子时,其建设条目进入待求值状态,总排放返回 None。随附的固定 23 区网络保留其声明的线路;上述新增计算随可选线路扩建模块执行。
数据与实现对应
factor_catalog.csv 保存因子、单位、核算边界和来源定位,sources.csv 保存来源名称。CarbonFactorDatabase 读取 value_carbon_factors.sqlite,build_operational_carbon_ledger 将调度电量、在役资产与所选因子集连接,_asset_embodied_lines 计算设备的年化建设排放。