跳到主内容

v0.22.0 版本说明

EnerOS v0.22.0 版本说明

发布日期:2025-07-13 版本代号:Physics Git Tag:v0.22.0 支持状态:稳定(Stable) Crate 总数:52(新增 4 个) 测试用例数:6600+(新增 500+)

概述

EnerOS v0.22.0「Physics」是物理约束决策专项版本,将电力系统的物理约束从「事后校验」升级为「事前感知、事中约束、事后回溯」的全生命周期决策框架。电力系统区别于通用 IT 系统的根本特征在于其受物理定律支配:基尔霍夫定律约束潮流分布,热力学定律约束设备载流能力,电压稳定极限约束运行边界。v0.22.0 将这些物理约束内建为决策引擎的一等输入,使得 Agent 的每一次决策都天然符合物理可行性。

本版本引入了四大核心能力:物理约束决策框架(Physics-Constrained Decision)、潮流约束感知(Power Flow Constraint Awareness)、电压稳定约束(Voltage Stability Constraint)、热稳定约束(Thermal Stability Constraint),并集成了约束优化求解器(Constraint Optimization Solver),支持线性规划(LP)、二次规划(QP)、混合整数线性规划(MILP)三类求解。

设计哲学上,v0.22.0 强化了「约束即法律」原则:任何 Agent 的决策建议在执行前都必须经过 ConstraintEngine 的强制投影,违反物理约束的动作会被自动修正或拒绝。这使得 EnerOS 在引入 AI 决策的不确定性时仍能保证电网运行安全。

关键数据

指标数值说明
约束类型12 类电压/电流/频率/热稳定等
约束校验延迟< 10μs单条约束内核态
LP 求解(1000 变量)8ms单纯形法
QP 求解(500 变量)15ms内点法
MILP 求解(100 二元)120ms分支定界
新增 Crate4物理约束相关
新增测试500+含 IEEE 标准算例

新特性

1. 物理约束决策框架

引入 eneros-physics-decision Crate,提供统一的物理约束决策框架。所有 Agent 决策均通过 PhysicsAwareDecision 包装,自动注入当前电网运行状态与约束边界。

决策包装器

use eneros_physics_decision::{PhysicsAwareDecision, DecisionContext};

let ctx = DecisionContext::from_snapshot(&network_snapshot)
    .with_voltage_limits(VoltageLimits {
        normal: (0.95, 1.05),  // pu
        emergency: (0.90, 1.07),
    })
    .with_thermal_limits(thermal_limits_from_equipment(&library));

let decision = PhysicsAwareDecision::new(Action::AdjustGenerator {
    gen_id: 1,
    target_mw: 200.0,
}).with_context(&ctx);

// 执行前自动校验物理约束
match decision.validate().await {
    Ok(projected) => ctx.syscall(Execute(projected)).await?,
    Err(violations) => {
        for v in violations {
            log::warn!("约束违反: {} 越限 {:.2}%", v.constraint, v.margin_pct);
        }
    }
}

约束类型清单

约束类别约束项校验方式
电压约束母线电压上下限解析
电压约束电压变化率解析
电流约束线路载流量解析
电流约束变压器过载解析
频率约束系统频率偏差解析
频率约束频率变化率解析
热稳定约束设备温升数值积分
热稳定约束累积热量数值积分
稳定约束暂态稳定裕度仿真
稳定约束小信号阻尼比特征值
备用约束旋转备用容量解析
拓扑约束电气岛连通性图论

2. 潮流约束感知

引入 eneros-powerflow-aware Crate,使 Agent 在决策时感知潮流分布约束。任何动作(如调整发电机出力、切除负荷、操作开关)都会触发潮流灵敏度分析,评估对全网潮流的影响。

潮流灵敏度

use eneros_powerflow_aware::{Sensitivity, PowerflowAware};

let aware = PowerflowAware::new(&network);

// 计算发电机出力对线路潮流的灵敏度
let sens: Sensitivity = aware.sensitivity()
    .factor(Variable::GeneratorMW(1))
    .on(Monitor::LineFlow(line_id))
    .compute().await?;

// 灵敏度系数:发电机 1 每 1MW 调整对线路 i 潮流的影响
println!("灵敏度系数: {:.6}", sens.coefficient);

潮流约束校验

// 调整发电机出力前,校验是否会导致线路越限
let action = Action::AdjustGenerator { gen_id: 1, target_mw: 250.0 };
let impact = aware.impact_of(&action).await?;

if impact.max_line_loading > 0.95 {
    return Err(DecisionError::ThermalViolation {
        line: impact.bottleneck_line,
        loading: impact.max_line_loading,
    });
}

潮流约束指标

指标阈值触发动作
线路负载率> 95%告警
线路负载率> 100%阻断
变压器负载率> 90%告警
母线电压偏差> 5%告警
母线电压偏差> 7%阻断

3. 电压稳定约束

引入 eneros-voltage-stability Crate,提供电压稳定裕度评估与约束。基于 PV/QV 曲线与连续潮流(CPF)方法,实时计算系统电压稳定裕度。

稳定裕度计算

use eneros_voltage_stability::{VoltageStability, LoadingMargin};

let vs = VoltageStability::new(&network);

// 计算 P-V 曲线与稳定裕度
let margin: LoadingMargin = vs.loading_margin()
    .at_bus(bus_id)
    .direction(LoadIncrease::Proportional)
    .compute().await?;

println!("负荷裕度: {:.1} MW ({:.1}%)", margin.mw, margin.percentage);

if margin.percentage < 15.0 {
    return Err(DecisionError::VoltageUnstable {
        margin: margin.percentage,
    });
}

灵敏度指标

// 计算电压稳定指标(L-index)
let l_index = vs.l_index(bus_id).await?;
// L < 0.0 稳定,L = 1.0 临界

// 计算最小奇异值
let min_svd = vs.min_singular_value().await?;
// 越大越稳定

电压稳定等级

等级裕度状态响应
A> 20%充裕正常调度
B15-20%良好监控
C10-15%警戒准备调节
D5-10%警告主动调节
E< 5%紧急紧急控制

4. 热稳定约束

引入 eneros-thermal-stability Crate,提供设备热稳定约束。基于设备热模型(IEEE 738 标准),实时计算线路、变压器的温升与累积热量。

热模型

use eneros_thermal_stability::{ThermalModel, Conductor};

let conductor = Conductor::from_library("LGJ-400/35");
let model = ThermalModel::new(&conductor)
    .ambient_temp(35.0)        // 环境温度 ℃
    .wind_speed(0.5)            // 风速 m/s
    .solar_radiation(800.0);    // 太阳辐射 W/m²

// 计算当前载流下的稳态温度
let steady_temp = model.steady_state_temp(current_amp: 600.0).await?;

// 计算短时过载允许时间
let allowed = model.emergency_rating(
    current_amp: 800.0,
    max_temp: 80.0,
    duration: Duration::minutes(15),
).await?;

println!("允许过载时间: {:?}", allowed.duration);

动态载流量

// 基于气象数据的动态热定额(DLR)
let dlr = model.dynamic_line_rating(&weather).await?;
println!("动态载流量: {:.0} A", dlr.ampacity);

热稳定参数表

导线型号稳态载流(A)紧急载流(A)允许温度(℃)
LGJ-240/3041055070
LGJ-300/2548064070
LGJ-400/3558078070
LGJ-500/4566088070
LGJ-630/55760102070

5. 约束优化求解器

引入 eneros-constraint-solver Crate,集成 LP/QP/MILP 求解器,支持经济调度、最优潮流、机组组合等约束优化问题。

LP 求解(经济调度)

use eneros_constraint_solver::{Problem, Solver, Variable, Constraint, Objective};

let mut problem = Problem::new();

// 决策变量:各发电机出力
let g1 = problem.add_var(Variable::continuous().bounds(0.0, 100.0));
let g2 = problem.add_var(Variable::continuous().bounds(0.0, 200.0));
let g3 = problem.add_var(Variable::continuous().bounds(0.0, 150.0));

// 约束:负荷平衡
problem.add_constraint(Constraint::equal(
    vec![(g1, 1.0), (g2, 1.0), (g3, 1.0)],
    350.0,  // 总负荷 350MW
));

// 约束:备用容量
problem.add_constraint(Constraint::greater_equal(
    vec![(g1, 1.0), (g2, 1.0), (g3, 1.0)],
    380.0,  // 备用 30MW
));

// 目标:成本最小化
problem.set_objective(Objective::minimize(vec![
    (g1, 30.0),  // 成本系数
    (g2, 25.0),
    (g3, 40.0),
]));

let solution = Solver::simplex().solve(&problem).await?;
println!("最优出力: G1={:.1}, G2={:.1}, G3={:.1}",
    solution.value(g1), solution.value(g2), solution.value(g3));

QP 求解(最优潮流)

// 最优潮流:最小化网损
let opf = OpfProblem::new(&network)
    .objective(Objective::MinLoss)
    .constraints(Constraints::all())  // 电压/电流/热稳定
    .solver(Solver::interior_point());

let result = opf.solve().await?;

求解器性能

问题类型规模求解时间算法
LP1000 变量8ms单纯形
LP10000 变量45ms对偶单纯形
QP500 变量15ms内点法
QP5000 变量85ms内点法
MILP100 二元120ms分支定界
MILP1000 二元1.2s分支定界 + 启发式

改进

  • 约束缓存:约束校验结果按拓扑指纹缓存,重复校验从 10μs 降至 1μs
  • 增量校验:仅校验受影响区域,大电网校验时间减少 70%
  • 并行求解:QP 求解器支持多线程,4 核下加速 3.2 倍
  • 约束解释:违反约束时输出人类可读的解释,便于运维排查

Bug 修复

  • 修复 eneros-constraint 在电气岛分裂时约束边界未更新的问题(#2205)
  • 修复 eneros-powerflow 牛顿法在病态系统下不收敛的问题(#2209)
  • 修复 eneros-thermal 环境温度突变的数值振荡问题(#2214)
  • 修复 eneros-constraint-solver MILP 求解器在退化情况下的死循环(#2219)

破坏性变更

  • Constraint::check 返回类型:从 Result<bool> 改为 Result<ConstraintReport>,包含详细越限信息
  • PowerflowSolver::solve:新增 constraints: &ConstraintSet 参数,默认可传 &ConstraintSet::default()

升级指南

  1. 执行 cargo update -p eneros-physics-decision
  2. 更新 Constraint::check 调用以适配新的 ConstraintReport 返回类型
  3. PowerflowSolver::solve 提供 ConstraintSet 参数
  4. 参考 docs/migration/v0.22.0.md 获取详细迁移步骤