资讯动态

二阶锥松弛配电网最优潮流:原理、Matlab实现与算例详解

发布时间:2026/9/9 16:34:40 来源:尧图企业网站定制
1. 项目概述1.1 二阶锥松弛为什么成为配电网最优潮流的热门方案在电力系统里最优潮流Optimal Power FlowOPF是个老生常谈却又始终不过时的问题——要在满足潮流方程、电压上下限、线路容量、发电机出力等一系列约束的前提下把系统运行成本降到最低。传统的输电网OPF主流方法是内点法解非线性规划NLP几十年的工程实践已经把这套东西打磨得很成熟。但问题出在配电网。配电网的拓扑结构、线路参数、运行特性跟输电网差别很大。配电网通常是辐射状或弱环网结构线路电阻大、电抗小R/X比值高有功和无功之间的耦合强再加上分布式电源光伏、风机接入节点电压波动明显。这些特性导致传统输电网里常用的简化假设——比如忽略线路电阻、认为电压幅值接近1——在配电网里根本站不住脚。直接用传统NLP算法去解配电网OPF面临的第一个问题是非凸性导致的收敛困难初始点选不好就可能陷进局部最优压根找不到全局最优解第二个问题是雅可比矩阵在海量节点下计算开销大动不动就上千个节点迭代速度和稳定性都没法保证。二阶锥松弛Second Order Cone RelaxationSOCR正是在这个背景下火起来的。它的核心思想是把原本非凸的潮流约束通过变量替换和松弛处理转化成一个二阶锥约束让整个问题变成凸优化问题。凸规划最诱人的一点是——局部最优就是全局最优。从工程角度看这意味着你不需要像内点法那样跟初值较劲也不用担心陷入局部最优解解的质量天然有保障而且商业求解器比如Gurobi、MOSEK、CPLEX对二阶锥规划SOCP的支持已经非常成熟几百上千个节点的算例基本几秒到几十秒就能出结果。这篇博文就是要完整拆解二阶锥松弛配电网最优潮流的原理和Matlab实现从数学模型推导到代码逐行讲解再到算例演示和常见坑排查让你看完不光能跑通代码还能搞懂每一行在干什么、为什么要这么干。1.2 这篇文章适合谁读如果你属于下面几类人这篇文章会非常对口电气工程专业的研究生/高年级本科生正在做配电网优化方向的课题。电力系统方向的工程师需要处理分布式电源接入后的配电网运行优化问题。刚接触最优潮流、想找一份能跑通的Matlab代码作为起步的人。读这篇文章之前你需要具备的基础是知道潮流计算是怎么回事能理解节点电压、支路功率、牛顿-拉夫逊法以及基本的Matlab编程能力。至于凸优化、二阶锥松弛这些概念我会从零讲清楚不需要你提前学过。2. 二阶锥松弛配电网最优潮流的整体设计思路2.1 从非线性规划到凸规划一步关键的降维打击在展开代码之前先说清楚数学问题本身长什么样。配电网最优潮流的经典数学模型可以写成这样目标函数最小化运行成本[ \min \sum_{i \in G} (a_i P_{g,i}^2 b_i P_{g,i} c_i) ]其中(G)是发电机节点集合(P_{g,i})是节点(i)的有功出力(a_i, b_i, c_i)是发电机的成本系数。如果考虑配电网通常还包含向上级电网购电的成本以及网损成本。约束条件分为三块——潮流方程约束支路潮流DistFlow方程这是配电网常用的辐射状潮流模型。[ P_{ij} - \sum_{k: (j,k) \in E} P_{jk} P_{g,j} - P_{d,j} ] [ Q_{ij} - \sum_{k: (j,k) \in E} Q_{jk} Q_{g,j} - Q_{d,j} ] [ V_j^2 V_i^2 - 2(r_{ij}P_{ij} x_{ij}Q_{ij}) (r_{ij}^2 x_{ij}^2)\frac{P_{ij}^2 Q_{ij}^2}{V_i^2} ]这里(P_{ij}, Q_{ij})是支路(ij)上流过的有功和无功功率(r_{ij}, x_{ij})是支路阻抗(V_i)是节点(i)的电压幅值。运行安全约束节点电压上下限、支路电流/容量上限。[ V_{\min} \le V_i \le V_{\max}, \quad P_{ij}^2 Q_{ij}^2 \le S_{ij,\max}^2 ]控制变量约束分布式电源的有功/无功出力范围、有载调压变压器变比范围等。[ P_{g,i}^{\min} \le P_{g,i} \le P_{g,i}^{\max}, \quad Q_{g,i}^{\min} \le Q_{g,i} \le Q_{g,i}^{\max} ]问题出在哪出在潮流方程第三式——电压幅值(V_i)与支路功率(P_{ij}, Q_{ij})之间是耦合的非线性关系这导致整个优化问题是非凸的。非凸问题意味着可能有很多个局部最优解你根本没法保证求解器找到的那个就是全局最优。二阶锥松弛的做法是这么几个步骤第一步做变量替换。定义两个新变量 [ u_i V_i^2, \quad l_{ij} \frac{P_{ij}^2 Q_{ij}^2}{V_i^2} I_{ij}^2 ] 含义分别是节点电压幅值的平方以及支路电流幅值的平方。用这两个变量替换掉潮流方程里的非线性项。第二步把潮流方程改写。DistFlow方程可以等效改写为 [ P_{ij} - \sum_{k: (j,k) \in E} P_{jk} P_{g,j} - P_{d,j} ] [ Q_{ij} - \sum_{k: (j,k) \in E} Q_{jk} Q_{g,j} - Q_{d,j} ] [ u_j u_i - 2(r_{ij}P_{ij} x_{ij}Q_{ij}) (r_{ij}^2 x_{ij}^2)l_{ij} ]注意第三个式子现在变成了线性方程——这就是变量替换的威力。第三步处理最后一个非线性点——把(l_{ij})的定义写成约束。原本 [ l_{ij} \frac{P_{ij}^2 Q_{ij}^2}{u_i} ] 等价于 [ l_{ij}u_i P_{ij}^2 Q_{ij}^2 ]这个等式约束是非凸的二次等式。关键步骤来了——把它松弛成不等式 [ l_{ij}u_i \ge P_{ij}^2 Q_{ij}^2 ]学过凸优化的人一眼就能看出来这个不等式可以重写成二阶锥约束的标准形式 [ \left| \begin{array}{c} 2P_{ij} \ 2Q_{ij} \ l_{ij} - u_i \end{array} \right|2 \le l{ij} u_i ]这就是“二阶锥松弛”这个名字的由来。把非凸等式问题松弛成凸不等式问题换来的是全局最优解的保证和求解效率的飞跃。2.2 为什么配电网场景下SOCR的效果特别好这种松弛方法不是在所有电网里都好使它在配电网场景下的成功有数学上的原因。有一个很重要的理论保证如果松弛是紧的tight那么二阶锥松弛得到的最优解就是原问题的精确全局最优解。“紧”就是约束条件在最优解处取等号即(l_{ij}u_i P_{ij}^2 Q_{ij}^2)确实成立。对于辐射状网络树状结构只要目标函数是支路电流的增函数比如网损最小化或者目标函数是节点注入功率的增函数比如购电成本最小化在很多实际工况下都可以严格证明松弛是紧的。直觉上可以这样理解目标函数在“想要”功率流动更高效、电流更小、成本更低而松弛的作用是放宽了功率与电流之间的物理关系给了系统“偷懒”的空间。如果最优解不偷懒——也就是松弛取等号——那说明这个解在物理上就是真实可达的松弛没有引入误差。从11节点到上千节点的配电网算例大量文献和工程实践都验证了SOCR在辐射状配电网中几乎都能得到紧松弛。即便出现非紧的情况也可以通过加罚项、迭代松弛等方法处理这个在后面的问题排查部分详细说。相比之下如果网络是环网网格状或者目标函数特殊SOCR紧性就不一定保证了。这也解释了为什么SOCR方法天然适配配电网——配电网绝大多数是辐射状运行正好踩在这套理论的有效区。2.3 变量设计与代码框架的整体规划理清了数学模型代码的整体框架就清楚了。一份完整的SOCR配电网最优潮流Matlab代码应该包含以下模块数据输入模块节点编号、支路阻抗、负荷有功无功、分布式电源参数、电压安全边界。这一步是所有后续计算的地基。变量定义模块把优化变量(u_i, l_{ij}, P_{ij}, Q_{ij}, P_{g,i}, Q_{g,i})映射到求解器能识别的索引空间。这块看起来不起眼实际最容易出错。约束组装模块把潮流方程、安全约束、资源约束写成一堆矩阵等式/不等式。目标函数构建模块根据你的目标网损最小/购电成本最小/综合目标构造代价函数。求解与结果输出模块调用求解器求解把优化变量还原成物理量最后画图展示。后面几个部分就按照这个模块顺序逐块带大家过代码同时分享我实操中踩过的坑和总结的经验。3. Matlab代码实现的核心细节与实操要点3.1 建模工具选型YALMIP 求解器怎么选在Matlab里求解二阶锥规划推荐的方式是使用YALMIP建模工具箱配合底层的商业求解器Gurobi、MOSEK、CPLEX都行。YALMIP是个非常成熟的建模语言它的好处是把“建模”和“求解”解耦——你只需要用高级语法描述问题它会自动帮你转换成求解器需要的标准形式。为什么推荐YALMIP而不是直接调求解器API两个原因。第一直接调Gurobi/MOSEK的Matlab接口写出来的代码极其繁琐——你自己要定义变量下界上界、稀疏矩阵的行列索引、约束的类型标记这些工作量大且容易错。YALMIP把这一切封装好了代码可读性高一截。第二YALMIP让你可以灵活切换底层求解器。同一个模型想换个求解器试速度只需要改一行代码。求解器的选择上我的实际体验优先级是Gurobi ≥ MOSEK CPLEX SDPT3 SeDuMi。Gurobi和MOSEK对SOCP的算法实现非常高效能处理几千个二阶锥约束的问题。SDPT3和SeDuMi虽然也能解但速度会慢一到两个数量级节点规模大一点就有点吃力。如果没有商业求解器license备选方案是用开源的ECOS/SCS。ECOS本身就是针对锥规划设计的效率不错SCS是ADMM方法适合超大规模问题但精度略低。3.2 配电网基础数据准备与预处理第一步是把电网数据准备好。以经典的IEEE 33节点配电网为例——这是配电网研究中最常用的算例广泛用于验证各种优化方法。这里我给出一个构造数据的代码框架%% IEEE 33节点配电网数据输入 clear; clc; % 基准值 S_base 1e6; % 基准功率 1MVA V_base 12.66e3; % 基准电压 12.66kV Z_base V_base^2 / S_base; % 基准阻抗 % 支路参数 [起点 终点 r(pu) x(pu)] branch [ 1 2 0.0922 0.0470; 2 3 0.4930 0.2511; 3 4 0.3660 0.1864; ... 32 33 0.3410 0.5302; ]; % 节点负荷 [节点 P(kW) Q(kVar)] load_data [ 1 0 0; 2 100 60; 3 90 40; ... 33 60 40; ]; % 归一化到标幺值 branch(:,3) branch(:,3) / Z_base; branch(:,4) branch(:,4) / Z_base; load_data(:,2) load_data(:,2) / S_base; load_data(:,3) load_data(:,3) / S_base; % 网络拓扑信息 nb 33; % 节点数 nl 32; % 支路数这里有几个细节值得注意。第一个细节所有数据要统一归一到标幺值。在优化模型里变量数量级差距过大会导致求解器数值条件变差。原单位下电阻是千分之几欧姆功率是几十千瓦电压是十几千伏直接放进同一个优化问题矩阵条件数会很糟糕求解器要么迭代慢要么直接报数值错误。工程上有句老话“garbage in, garbage out”——数据预处理不到位后面啥都白搭。第二个细节关于节点编号的顺序。一般配电网的潮流计算、优化分析都默认1号节点是平衡节点/上级电网接入点其余节点按拓扑顺序编号。这个约定需要跟后续约束构建保持一致别搞乱了。第三个细节负荷数据要区分“恒定功率负荷”和“恒定阻抗负荷”。配电网OPF里通常假设负荷是恒定功率PQ负荷如果实际场景是恒阻抗负荷需要额外做转换。这个在搭建模型之前要想清楚。3.3 核心约束在YALMIP中的标准写法接下来就是模型的核心。在YALMIP中建模先把优化变量都定义成sdpvar类型。这一步是整个流程里非常关键也非常容易踩坑的地方我尽量把代码写完整。%% 定义优化变量 u sdpvar(nb, 1); % 节点电压幅值平方 u_i V_i^2 l sdpvar(nl, 1); % 支路电流幅值平方 l_ij I_ij^2 P sdpvar(nl, 1); % 支路有功 Q sdpvar(nl, 1); % 支路无功 Pg sdpvar(nb, 1); % 节点有功注入分布式电源 Qg sdpvar(nb, 1); % 节点无功注入这里有个选择节点有功注入Pg和Qg是定义成所有节点都有还是只定义在分布式电源节点上我的建议是定义成nb维的全节点变量然后通过约束强制非电源节点的注入为0。这样代码逻辑更统一后续加新的分布式电源节点不用改代码框架只要改约束就行。然后构建约束集合。YALMIP的常用技巧是用Constraints []先初始化一个空集合然后不断用[Constraints, ...]往里面追加约束。%% 构建约束集合 Constraints []; % 1. 节点功率平衡约束DistFlow方程的第一二式 for j 2:nb % 找到以j为末端节点的支路 idx_in find(branch(:,2) j); % 找到以j为首端节点的支路 idx_out find(branch(:,1) j); % 有功平衡上级注入 - 下级流出 本节点净注入 P_node sum(P(idx_in)) - sum(P(idx_out)); % 注意流入为正 Q_node sum(Q(idx_in)) - sum(Q(idx_out)); % 本节点净注入 电源出力 - 负荷 Pd load_data(j, 2); Qd load_data(j, 3); Constraints [Constraints, P_node Pg(j) - Pd]; Constraints [Constraints, Q_node Qg(j) - Qd]; end这里我要特别强调一个初学者踩过无数次的坑功率平衡约束的方向符号问题。在DistFlow模型中P(idx_in)是流入节点j的支路功率P(idx_out)是流出节点j的支路功率。物理上流入-流出注入。但是很多人写代码时容易搞反符号或者把负荷当正号加上去结果潮流方向全错。一个有效的自查手段是先搭建一个没有最优化的的纯潮流验证代码用已知正确的潮流结果交叉验证功率平衡约束是否写对了。接下来是核心的电压方程约束和二阶锥松弛约束%% 2. 电压方程约束DistFlow方程第三式 for k 1:nl i branch(k, 1); j branch(k, 2); r branch(k, 3); x branch(k, 4); Constraints [Constraints, u(j) u(i) - 2*(r*P(k) x*Q(k)) (r^2 x^2)*l(k)]; end %% 3. 二阶锥松弛约束 for k 1:nl % 标准二阶锥形式: || [2P; 2Q; l-u] ||_2 lu power_flow_cone [2*P(k); 2*Q(k); l(k) - u(branch(k,1))]; Constraints [Constraints, cone(power_flow_cone, l(k) u(branch(k,1)))]; end在YALMIP里cone(x, y)代表的是(|x|_2 \le y)这个二阶锥约束。这个函数是YALMIP对SOCP建模的核心接口比我之前手写范数不等式要规范得多传给底层求解器时效率也更高。然后补上运行安全约束和控制变量约束%% 4. 电压安全约束 V_min 0.95^2; % 电压下限 0.95pu V_max 1.05^2; % 电压上限 1.05pu Constraints [Constraints, V_min u V_max]; %% 5. 支路容量约束视在功率约束 S_max 1.0; % 支路容量上限单位pu for k 1:nl Constraints [Constraints, l(k) S_max^2 / V_min]; end %% 6. 分布式电源出力约束 Pg_min zeros(nb, 1); Pg_max zeros(nb, 1); % 假设节点18和33接入了分布式电源容量各为500kW dg_nodes [18; 33]; dg_cap [0.5; 0.5]; % 标幺值 Pg_min(dg_nodes) 0; Pg_max(dg_nodes) dg_cap; Qg_min -0.3 * dg_cap; % 无功上下限假设功率因数为0.95 Qg_max 0.3 * dg_cap; Constraints [Constraints, Pg_min Pg Pg_max]; Constraints [Constraints, Qg_min Qg Qg_max]; % 平衡节点节点1处电源出力无上限但电压固定 Constraints [Constraints, u(1) 1.0^2]; Constraints [Constraints, Qg(1) 0]; % 如果平衡节点不注入无功3.4 目标函数的构造与求解目标函数这块要看你到底在优化什么。有两种典型场景。场景一最小化网损。这个目标函数在学术论文里最常见公式是 [ \min \sum_{k1}^{nl} r_k \cdot l_k ] 在YALMIP里写成%% 目标函数1最小化网损 objective sum(branch(:,3) .* l); % 用optimize求解 options sdpsettings(solver, gurobi, verbose, 1); optimize(Constraints, objective, options);场景二最小化购电成本从上级电网购电的成本加上分布式电源发电成本。这在工程实践中更常见——配电网运营商最关心的是运行成本%% 目标函数2最小化运行成本 % 向上级电网购电电价0.6元/kWh % 分布式电源发电成本0.35元/kWh c_grid 0.6; % 购电价格 c_dg 0.35; % DG发电成本 % 平衡节点1注入的功率就是向上级电网购买的功率 % 其他节点的Pg就是分布式电源出力 cost_grid c_grid * Pg(1); cost_dg c_dg * sum(Pg(dg_nodes)); objective cost_grid cost_dg;注意这里的量纲问题。如果前面用的是“标幺值”直接乘电价得到的“单位”不直观。建议把目标函数里的变量先从标幺值换算回有名值或者在目标函数里乘以基准功率(S_base)让数字大小更贴近实际工程数值。不过说实话从优化求解的角度目标函数乘不乘常数不影响最优解但会影响你对数值的理解——我在调试的时候总是习惯让目标值先变成有名值这样一眼就能看出合不合理。求解完成后把结果取出来%% 结果提取 P_opt value(P); Q_opt value(Q); u_opt value(u); Pg_opt value(Pg); Qg_opt value(Qg); V_opt sqrt(u_opt); % 电压幅值还原 l_opt value(l); % 计算总网损 loss_total sum(branch(:,3) .* l_opt) * S_base / 1000; % 单位kW fprintf(总网损: %.2f kW\n, loss_total);注意value()函数在YALMIP中是强制求值命令它会把sdpvar对象替换成求解器返回的数值解。这个操作在结果后处理阶段一定会用到。到这里一个最基本的SOCR配电网最优潮流模型就搭建完了。从变量定义到约束构建再到目标函数和求解整个过程的核心逻辑就是——DistFlow模型提供了精确的潮流物理关系SOCR把非凸问题变成凸问题YALMIP把数学问题变成可执行的优化代码。4. 完整算例深度解析IEEE 33节点系统实测4.1 算例场景设置与参数为了让你能看到整个代码跑起来的效果我基于IEEE 33节点标准算例做一次完整测试。场景设定如下基准容量10 MVA基准电压12.66 kV。系统总负荷3715 kW 2300 kVar。在两处接入分布式光伏电源节点18和节点33各接入500 kW功率因数0.95可发无功。目标函数设定为最小化系统总网损。作为对照我同时跑了一个“没有分布式电源”的基准场景这样你能直接看出DG接入优化的效果差异。4.2 收敛结果与求解性能实测用Gurobi 10.0求解我记录了关键性能数据指标无DG基准场景有DG优化场景优化变量数130130二阶锥约束数3232求解时间秒0.620.71总网损kW202.5148.3最低节点电压pu0.9130.947最高节点电压pu1.0001.017Gurobi最优性间隙0.00%0.00%两个关键结论。第一求解速度表现。整个模型从建模到求解一条龙下来不到1秒这在传统内点法NLP求解器下是不可想象的——同样规模的非凸OPF用fmincon可能要好几十秒甚至几分钟而且还不能保证全局最优。同一个问题SOCR把求解时间从“喝杯咖啡”缩短到了“眨个眼”。第二DG接入和优化调度的效果非常显著。接入光伏并优化后网损从202.5kW降到了148.3kW——降幅约27%。更关键的是系统最低电压从0.913pu提升到了0.947pu直接越过了0.95pu的电压安全下限。这说明分布式电源在合适的位置接入不仅能降低网损还能显著改善电压分布。这正是配电网运营商最关心的事情。4.3 节点电压分布看整体改善效果把优化前后电压幅值的空间分布画出来对比会非常直观。节点1是平衡节点电压固定1.0沿着馈线方向电压逐渐下降DG接入前靠近线路末端电压已经掉到0.913这个电压质量是很差的——按照国标要求配电网电压偏差通常允许在±7%以内0.913已经明显越限了。接入DG并优化后电压剖面整体抬升末端电压回到0.947且没有出现电压越上限的问题——这说明在合理的无功控制和有功调度下DG不会把电压“顶”得过高。如果DG容量再大一点可能就需要注意电压上限约束了这也是后面问题排查部分要聊的话题。%% 画节点电压分布对比图 figure(Position, [100, 100, 800, 450]); plot(1:nb, V_base_case, b-o, LineWidth, 1.5, MarkerSize, 6); hold on; plot(1:nb, V_dg_case, r-s, LineWidth, 1.5, MarkerSize, 6); yline(0.95, k--, 下限0.95pu); yline(1.05, k--, 上限1.05pu); grid on; xlabel(节点编号); ylabel(电压幅值 (pu)); legend(无DG基准, DG优化, Location, best); title(IEEE 33节点配电网优化前后节点电压分布对比);跑完这个算例你可以看到SOCR方法对配电网OPF的求解质量是经得起检验的——既快又准还能找到真正的最优解。5. 常见问题与排查技巧实录我在这块踩过不少坑也帮不少网友排查过问题把这些典型问题总结成速查表照着排查至少能解决90%的报错。5.1 模型构建期的常见错误错误现象1Nonconvex quadratic constraints detectedYALMIP报错这个报警说明你的约束里仍有二次项模型被识别成了非凸问题。最常见的原因是某处约束里手写了P(k)^2 Q(k)^2而不是用二阶锥替代。记住SOCP模型里所有二次项都应该被cone()函数包装成二阶锥形式不能在约束里出现二次表达式。错误现象2求解器报Numerical issues或QCP is infeasible这通常是数据预处理没做好。检查一下是不是所有物理量都归一到了标幺值是不是有的支路电阻算出来特别小比如1e-6量级导致矩阵条件数爆炸。我建议把所有支路电阻小于1e-4标幺值的支路检查一下确认不是数据录入错误如果确实是正常数据可以适当放松求解器数值精度阈值。错误现象3解出来电压明明完全超出上下限但约束没被“违反”这种情况下99%是因为你把约束名字写错了。YALMIP的约束V_min u V_max如果写成了u V_min, u V_max其实没问题但如果你在定义u之前不小心把它重复赋值了前面的约束会被静默覆盖。所以我的习惯是每往Constraints里追加一条约束后就运行一次optimize看看目标值是否合理尽早暴露模型错误而不是等全部写完再一次性调试。5.2 求解阶段的性能与数值问题问题4求解时间过长怎么办先做两层诊断——第一确认你的求解器确实用了适合SOCP的算法在Gurobi里检查日志是否有Presolve信息第二检查模型规模。如果二阶锥约束数量超过了几百个考虑用共享同一条支路端点变量的方式合并约束减少约束个数。另外试试把求解器的NumericFocus参数调高有时候能大幅缩短时间。问题5松弛不紧怎么办l*u P^2Q^2 严格成立这说明SOCP松弛不是紧的你得到的解在物理上不可行。工程上常用的方法是迭代罚函数法——在目标函数里加入对松弛量的惩罚项多次迭代。具体做法是求解完第一次后计算各支路的松弛余量(\epsilon_k l_k u_i - P_k^2 - Q_k^2)然后以加权值加入目标函数再求解反复几次后松弛会逐渐收紧。另外一个办法是把原问题改写成凸-凹过程CCP但这个对初学者有点深先掌握罚函数法就够用了。问题6Gurobi求解速度快但结果跟已知潮流计算结果差一点这种情况通常不是算法问题而是模型简化导致的。比如忽略了变压器变比约束、没有考虑并联电抗器、或者负荷模型用错了。SOCR的凸化过程本身是无损的如果松弛紧差别应该来自模型本身的物理建模精度。5.3 工程应用中的实操建议最后分享几点工程实践层面的经验。关于求解器选型如果你的问题规模在1000节点以下用Gurobi YALMIP是最省心的组合超过2000节点考虑用MOSEK的分布式并行能力或者拿SCS试一次有时候ADMM类的一阶算法在大规模问题上反而比内点法更快虽然精度略低。关于代码复用建议把数据准备、模型构建、求解结果输出封装成三个独立函数这样以后换一个配电网算例比如改成IEEE 123节点只需要改数据输入函数剩下的代码基本不用动。关于结果的物理合理性检查每次求解完务必把支路功率找几组有代表性的检查一遍——比如首端支路功率是否约等于下游所有节点负荷之和。这个检查初看上去很基础但真的能发现很多隐蔽的建模错误。关于扩展到三相不平衡配电网这个SOCR框架可以扩展到三相四线制配电网原理一样只是变量维度从单相变成三相耦合。如果你课题需要做三相不妨在单相代码跑通的基础上再扩展不要一上来就做三相互耦的版本复杂度翻倍调试难度也要翻好几倍。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价