☰
MWORKS 全面支持 MATPOWER在 Syslab 中开展电力系统计算与工程分析
2026/10/18 12:20:45 网站建设 项目流程

MATPOWER 是电力系统领域常用的开源计算工具箱,主要用于潮流计算、连续潮流、最优潮流等稳态电力系统仿真与优化任务。它以 M 语言编写,长期服务于高校、科研机构和工程团队的电力系统分析工作。


对很多电力系统工程场景来说,MATPOWER 不只是一个单独的潮流计算程序,而是一套完整的工程分析工具链。例如 N-1 静态安全校核、多场景潮流扫描、风险排序和批量分析等任务,通常都建立在 MATPOWER 的计算流程之上。


目前,Syslab 已支持 MATPOWER 工具箱运行,并完成 MATPOWER 89 个案例的运行验证与结果一致性校验,测试通过率达到 100%。


下面将结合安装过程以及一个 N-1 静态安全校核案例,介绍 MATPOWER 在 Syslab 中的运行情况。

一、使用环境及安装配置

本案例使用:
●MWORKS.Syslab 2026a V26.3:MWORKS官方下载_安装说明_帮助和培训_技术论坛-同元软控
●MATPOWER 8.1:https://matpower.org/download/
安装步骤如下:
1. 解压 MATPOWER 工具箱;
2. 在 Syslab 中打开 matpower8.1 文件夹;
3. 在终端执行:

install_matpower

随后根据提示加载搜索路径即可。

安装完成后,可通过以下命令验证环境:

runpf('case9')

如果能够正常输出潮流计算结果,则说明 MATPOWER 已成功运行。

二、在 Syslab 中使用 MATPOWER:N-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.0

2.构造 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.m
subsref.m
subsasgn.m

构造函数可以写为:

function obj = mpcase(data) %MPCASE Wrap a MATPOWER case struct. if nargin == 0 data = struct(); end obj.data = data; obj = class(obj, 'mpcase'); end

subsref.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); end

subsasgn.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.m
method1.m
method2.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 打下基础。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询