MATPOWER 是电力系统领域常用的开源计算工具箱主要用于潮流计算、连续潮流、最优潮流等稳态电力系统仿真与优化任务。它以 M 语言编写长期服务于高校、科研机构和工程团队的电力系统分析工作。对很多电力系统工程场景来说MATPOWER 不只是一个单独的潮流计算程序而是一套完整的工程分析工具链。例如 N-1 静态安全校核、多场景潮流扫描、风险排序和批量分析等任务通常都建立在 MATPOWER 的计算流程之上。目前Syslab 已支持 MATPOWER 工具箱运行并完成 MATPOWER 89 个案例的运行验证与结果一致性校验测试通过率达到 100%。下面将结合安装过程以及一个 N-1 静态安全校核案例介绍 MATPOWER 在 Syslab 中的运行情况。一、使用环境及安装配置本案例使用●MWORKS.Syslab 2026a V26.3MWORKS官方下载_安装说明_帮助和培训_技术论坛-同元软控●MATPOWER 8.1https://matpower.org/download/安装步骤如下1. 解压 MATPOWER 工具箱2. 在 Syslab 中打开 matpower8.1 文件夹3. 在终端执行install_matpower随后根据提示加载搜索路径即可。安装完成后可通过以下命令验证环境runpf(case9)如果能够正常输出潮流计算结果则说明 MATPOWER 已成功运行。二、在 Syslab 中使用 MATPOWERN-1 静态安全校核MATPOWER 安装到 Syslab 后不仅可以执行单次潮流计算也可以支撑更接近工程应用的批量校核任务。下面以电力系统分析中常见的N-1 静态安全校核为例在基准运行方式下逐一退出某条输电线路检查系统是否出现潮流不收敛、电压越限或线路过载。本案例采用 MATPOWER 标准算例 case30。其核心数据结构如下function mpc case30 %% MATPOWER Case Format : Version 2 mpc.version 2; %% system MVA base mpc.baseMVA 100; %% bus data % bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin mpc.bus [ 1 3 0 0 0 0 1 1 0 135 1 1.05 0.95; 2 2 21.7 12.7 0 0 1 1 0 135 1 1.10 0.95; 3 1 2.4 1.2 0 0 1 1 0 135 1 1.05 0.95; % ... ]; %% generator data % bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin ... mpc.gen [ 1 23.54 0 150 -20 1 100 1 80 0; 2 60.97 0 60 -20 1 100 1 80 0; 22 21.59 0 62.5 -15 1 100 1 50 0; % ... ]; %% branch data % fbus tbus r x b rateA rateB rateC ratio angle status angmin angmax mpc.branch [ 1 2 0.02 0.06 0.03 130 130 130 0 0 1 -360 360; 1 3 0.05 0.19 0.02 130 130 130 0 0 1 -360 360; 2 4 0.06 0.17 0.02 65 65 65 0 0 1 -360 360; % ... ];可以看到MATPOWER case 本质上是一个结构化电网模型bus 描述母线负荷、电压上下限等信息gen 描述发电机出力和容量约束branch 描述线路或变压器的阻抗、容量和运行状态。case30 的支路表中status 列用于表示线路是否投入运行取值为 1 表示在运取值为 0 表示退出。因此N-1 校核可以直接通过修改 branch 中的线路状态实现。1.基准工况计算首先加载 case30并执行基准潮流计算define_constants; mpc loadcase(case30); mpopt mpoption(verbose, 0, out.all, 0); res_base runpf(mpc, mpopt);基准工况用于确认原始系统是否可行并为后续 N-1 扰动分析提供对照。如果基准潮流本身不收敛或者已经存在明显电压越限和线路过载就需要先修正原始运行方式。本案例采用的基本安全约束为电压约束0.95 V 1.10 p.u.线路约束Loading 1.02.构造 N-1 线路退出场景在基准网络上对每一条在运线路逐条退出并重新执行潮流计算active_idx find(mpc.branch(:, BR_STATUS) 0); for kk 1:numel(active_idx) br active_idx(kk); mpc_k mpc; mpc_k.branch(br, BR_STATUS) 0; % 当前线路退出 res_k runpf(mpc_k, mpopt); % 后续统计该场景下的电压和线路载荷 end这一过程体现了 MATPOWER 工程工作流的典型特征通过修改结构体中的矩阵字段构造扰动场景再批量调用潮流计算接口最后对返回结果进行统计分析。Syslab 工程实践同样采用 case30 作为演示网络并对在运支路逐条退出构造对应 N-1 校核场景。3.安全指标统计与风险排序每个 N-1 场景完成后可以从结果中提取母线电压、线路潮流和收敛状态等指标。典型统计代码如下vm res_k.bus(:, VM); vmin min(vm); vmax max(vm); v_low_cnt sum(vm 0.95); v_high_cnt sum(vm 1.10);为了便于比较不同线路退出场景可以进一步构造统一的风险评分。例如v_dev max([0.95 - vmin, vmax - 1.10, 0]); score 100 * (v_low_cnt v_high_cnt) ... 10 * line_over_cnt ... 1000 * v_dev;其中电压越限数量反映安全约束是否被破坏线路过载数量反映热稳约束风险电压偏离量进一步刻画风险严重程度。对于潮流不收敛场景可以直接赋予较高风险评分避免在工程校核中漏报高风险扰动。4.工程分析结果完成全部线路退出场景扫描后可以按照风险评分对 N-1 场景排序识别重点风险线路根据工程实践中的计算结果部分线路退出后出现潮流不收敛说明对应扰动下系统稳态可行性明显下降。在可收敛场景中L25 (10-20) 退出后风险最高系统最低电压下降至约 0.927866 p.u.并出现 3 个低压越限母线。与此同时该场景下线路最大载荷率约为 0.96尚未触及线路热稳约束上限因此该案例中的主导风险主要来自电压约束而非线路热稳约束。这个案例说明MATPOWER 在 Syslab 中不仅能够完成单次潮流计算还能够支撑“模型加载、扰动构造、批量求解、指标统计、风险排序”的完整工程分析流程。对于已有 MATPOWER 工程资产的用户而言相关电力系统稳态分析脚本可以在保持原有建模方式和代码习惯的基础上迁移到 Syslab 环境中继续使用。除了本文中的 case30 N-1 静态安全校核案例外我们也进一步对 MATPOWER 中的自带 case 进行了批量运行验证覆盖基础潮流网络、中大规模 IEEE 标准测试系统以及部分大规模稀疏网络下表列出了部分典型网络。类型典型 Case节点规模典型场景基础潮流网络case9 / case14 / case309 ~ 30 Bus潮流计算、教学验证IEEE 标准网络case57 / case11857 ~ 118 Bus中等规模潮流分析大规模网络case300300 Bus大规模潮流计算稀疏网络case1354pegase1354 Bus稀疏矩阵与大规模网络验证OPF 场景case30 / case118多规模最优潮流计算这些 case 在运行过程中会持续涉及稀疏矩阵计算、结构体访问、搜索路径、长调用链以及批量场景循环等典型工程行为也进一步验证了 Syslab 对真实 M语言工程工作流的支撑能力。三、从工具箱支持到生态兼容MATPOWER 的价值不仅在于提供电力系统计算函数也在于它体现了一类典型 M 语言科学计算工程的组织方式脚本函数、结构体访问、类文件夹、命名空间、稀疏矩阵运算和线性系统求解共同构成了完整工作流。因此对 MATPOWER 的适配可以看作是 Syslab M 语言兼容能力的一次系统验证。本次适配重点新增和完善了以下机制1.稀疏矩阵与稀疏线性系统求解2.subsref / subsasgn 重载机制3.class 类文件夹结构4.package 命名空间机制这些能力共同支撑 Syslab 运行和维护更复杂的 M 工程项目。1.稀疏矩阵与稀疏线性系统求解电力系统计算天然具有稀疏性。无论是节点导纳矩阵、潮流计算中的雅可比矩阵还是最优潮流问题中的约束矩阵通常都规模较大但非零元素只占一小部分。在 MATPOWER 中稀疏矩阵不是附属功能而是核心计算路径的一部分。潮流计算、牛顿迭代、灵敏度分析和优化求解都依赖稀疏矩阵的存储与求解能力。为了支撑 MATPOWER 在 Syslab 中运行Syslab 重点补齐了以下能力● 稀疏矩阵构造与存储● 稀疏矩阵基本运算● 稀疏线性系统求解● 与 M 语言矩阵语义兼容的稀疏计算接口。这样一来在 Syslab 中运行 MATPOWER 时电力系统模型中的大规模线性代数问题可以按稀疏矩阵方式处理避免退化为低效的稠密矩阵计算。对电力系统仿真来说这一点很关键。随着电网节点数、支路数和约束数量增加稀疏矩阵能力会直接影响计算效率、内存占用和模型可扩展性。2. subsref / subsasgn 重载M 语言工具箱大量依赖灵活的下标访问机制。例如mpc.bus(:, VM) mpc.branch(i, RATE_A) results.gen(:, PG) obj.field obj(idx) obj{key}这些访问形式背后对应的是 subsref 和 subsasgn 机制● subsref 用于重载对象、结构体、数组等数据的读取访问● subsasgn 用于重载赋值行为● 二者共同支撑点访问、圆括号索引、花括号索引和链式访问。MATPOWER 的数据大量以 case struct、矩阵和配置结构组织。潮流计算结果、母线数据、支路数据、发电机数据等都需要频繁进行字段访问、切片读取和局部赋值。因此Syslab 对 subsref / subsasgn 的支持是保持原有数据组织方式和代码习惯的基础。下面给出一个简化的 mpcase 示例用来说明如何为一个包装 MATPOWER case 的对象实现字段访问和局部赋值。示例中mpcase 对象内部保存一个 data 结构体外部仍然可以像访问普通 MATPOWER case 一样读写 bus、branch、gen 等字段。mpcase/mpcase.msubsref.msubsasgn.m构造函数可以写为function obj mpcase(data) %MPCASE Wrap a MATPOWER case struct. if nargin 0 data struct(); end obj.data data; obj class(obj, mpcase); endsubsref.m 负责读取访问。它先识别点访问字段再把后续索引继续交给内置 subsref 处理因此能够支持 obj.branch(:, RATE_A) 这样的链式访问。function value subsref(obj, S) %SUBSREF Overload field and matrix-style reads for mpcase. switch S(1).type case . name S(1).subs; if isfield(obj.data, name) value obj.data.(name); else error(mpcase:subsref:UnknownField, ... Unknown MATPOWER case field %s., name); end if numel(S) 1 value builtin(subsref, value, S(2:end)); end case () data struct(obj); value builtin(subsref, data.data, S); case {} error(mpcase:subsref:CellIndexNotSupported, ... Cell indexing is not supported for mpcase objects.); otherwise error(mpcase:subsref:UnsupportedIndex, ... Unsupported indexing type %s., S(1).type); endsubsasgn.m 负责赋值访问。它既支持直接替换字段也支持对字段内部的矩阵切片赋值例如 obj.branch(i, BR_STATUS) 0。function obj subsasgn(obj, S, value) %SUBSASGN Overload field and matrix-style writes for mpcase. switch S(1).type case . name S(1).subs; if numel(S) 1 obj.data.(name) value; return; end if ~isfield(obj.data, name) error(mpcase:subsasgn:UnknownField, ... Unknown MATPOWER case field %s., name); end field_value obj.data.(name); field_value builtin(subsasgn, field_value, S(2:end), value); obj.data.(name) field_value; case () data struct(obj); data.data builtin(subsasgn, data.data, S, value); obj.data data.data; case {} error(mpcase:subsasgn:CellIndexNotSupported, ... Cell assignment is not supported for mpcase objects.); otherwise error(mpcase:subsasgn:UnsupportedIndex, ... Unsupported indexing type %s., S(1).type); end有了上述重载后用户可以保留接近 MATPOWER 原生结构体的写法define_constants; raw loadcase(case30); mpc mpcase(raw); vm mpc.bus(:, VM); mpc.branch(3, BR_STATUS) 0; mpc.bus(:, VM) min(max(vm, 0.95), 1.10);这个例子虽然是简化实现但它展示了 subsref / subsasgn 在工具箱迁移中的关键作用上层算法仍然使用熟悉的数据访问方式底层对象则可以根据需要封装校验、缓存、延迟计算或与 Syslab 内部数据结构的转换逻辑。3.class 类文件夹结构在传统 M 语言生态中class 文件夹是一种经典的类组织方式。例如一个类可以通过如下目录结构定义myclass/myclass.mmethod1.mmethod2.m这种结构在许多较早形成的 M 工具箱中很常见。它不仅是一种代码组织习惯也承载了 M 语言早期面向对象机制的工程实践。MATPOWER 的核心数据结构以矩阵和结构体为主但它所处的 M 语言工具箱生态中存在大量 class 组织方式。Syslab 支持 class 类文件夹后M 导入能力不再局限于单个 .m 函数文件而是能够识别并组织具有类语义的文件夹结构。从迁移角度看这意味着 Syslab 正在从“函数级兼容”走向“工程级兼容”。4.package 命名空间机制随着 M 工具箱规模扩大命名冲突和模块划分会成为实际问题。M 语言中的 package 机制正是为命名空间管理而设计的。例如mp/ option.m utility.m 对应调用方式可以写作mp.option(...) mp.utility(...)对大型科学计算工具箱来说命名空间机制主要解决两个问题。首先不同模块可以拥有相同或相近的函数名而不会相互覆盖。其次包层级能够表达模块边界让工具函数、求解器模块、数据处理模块和接口模块保持清晰。Syslab 支持 package 命名空间后可以更好地承接模块化 M 工程而不仅是执行扁平化脚本集合。这对 MATPOWER 这类大型开源工具箱的适配很重要也为更多 M 语言工具箱迁移到 Syslab 打下基础。四、结语对大型科学计算工具箱来说命名空间机制主要解决两个问题。首先不同模块可以拥有相同或相近的函数名而不会相互覆盖。其次包层级能够表达模块边界让工具函数、求解器模块、数据处理模块和接口模块保持清晰。Syslab 支持 package 命名空间后可以更好地承接模块化 M 工程而不仅是执行扁平化脚本集合。这对 MATPOWER 这类大型开源工具箱的适配很重要也为更多 M 语言工具箱迁移到 Syslab 打下基础。