交直流混合配电网已经不是什么概念验证阶段的场景了。光伏直流接入、储能电池直流侧、直流充电桩、直流数据中心,工程上数得出来的直流属性设备越来越多,硬往交流配网里接要多级换流设备,损耗和成本都压不住。现在不少示范工程直接在配网里拉一条直流馈线,用VSC换流站把交流网和直流网耦合在一起。这时候做潮流计算,就不能再只盯交流侧的牛顿-拉夫逊那一套,必须把交流和直流放在同一个模型里联合求解。这就是我这篇文章要解决的问题:用统一求解法做交直流混合配电网潮流计算,并且给出完整的Matlab代码实现思路和踩坑记录。
这套代码解决的核心痛点,是很多人用交替迭代法做交直流潮流时遇到的那种"交流算了直流、直流算了交流、两边来回踢皮球"的问题,在重负荷或者换流器控制方式复杂时经常不收敛。统一求解法把所有状态量放在一个扩展雅可比矩阵里同时修正,收敛性和鲁棒性都有保证。适合电网规划、运行分析、研究生课题验证、以及想把换流器模型真正吃透再做二次开发的工程师参考。下面我把数学模型、代码框架、算例结果和排坑经验一次讲清楚。
1. 为什么交直流混合配电网要重新审视潮流计算
1.1 新场景带来老方法解决不了的问题
传统配电网潮流计算,不管是前推回代法还是牛顿-拉夫逊法,默认的模型基础是:整个网络是单一交流系统,节点注入功率是已知量或者通过迭代逼近的已知量,节点电压是唯一的未知状态量。这个假设在纯交流配网里是成立的。但是一旦加入直流馈线和VSC换流站,事情就变了。
首先是变量种类的变化。直流网络里的状态量是各节点的直流电压和流入换流站的直流电流,或者直流功率;交流网络里是节点电压幅值和相角。两类变量通过换流器强耦合在一起。VSC换流站内部还有它自己的控制变量:调制比、PWM相位角、换流器交流侧的基波电压。这些变量既不是纯交流侧的,也不是纯直流侧的,而是交直流交界处的桥接变量。要把潮流算清楚,必须把这些变量全部纳入方程。
其次是控制方式的多样性。换流站可以是定直流电压控制,用于维持直流网电压稳定;可以是定有功功率控制,用于指定功率交换;可以定交流侧无功功率,给交流网提供无功支撑;还可以定交流电压幅值,主动参与交流网调压。每一种控制方式对应一组不同的方程约束,这比交流侧单一的PQ、PV、平衡节点类型复杂得多。
第三是直流网络本身的特殊性。直流网没有频率、没有相位、没有无功,只有有功和电压。直流线路的功率流动完全由两端电压差决定,电流方向取决于电压高低,没有交流那种电抗和相角的概念。这意味着直流潮流方程本质上是非线性的电压-功率方程,而且对初值特别敏感。整个模型耦合程度高,变量维度大,如果用交替迭代法,交流系统和直流系统各自迭代,在换流器等值功率和等值阻抗之间反复传递,很可能出现振荡甚至发散。
我在实际调试中感受很明显:轻负荷下交替法和统一法都能收敛,但把负载率提上去、换流器功率定得激进一点,交替法的迭代误差就开始来回跳,而统一法虽然每次迭代要解一个更大的矩阵,但收敛过程很平稳。所以做交直流混合配电网潮流计算,直接在雅可比层面统一处理,是更稳的路线。
1.2 两种求解思路之争:交替迭代与统一求解
两种路线业界都有人用,原理上的差别其实一句话就能概括。
交替迭代法把系统拆成交流子系统和直流子系统,先假设直流侧变量为某个初值,把换流器对交流侧等效成负载或电源,求解交流潮流;再把交流侧结果反馈给直流侧,求解直流网络方程;然后更新换流器等值功率,再回到交流潮流。如此循环,直到两次解出的功率和电压偏差满足精度。这个方法的优点是程序结构简单,交流部分可以完全复用成熟算法,直流部分单独写一个小模块就行。缺点是收敛性依赖两个子系统之间的耦合强弱,系统重载、换流器控制模式较多时,迭代更新过程很容易出现锯齿形振荡,而且没有可靠的理论保证能收敛。
统一求解法则是一次性把所有方程堆成一个非线性代数方程组:
- 交流节点的有功平衡方程;
- 交流节点的无功平衡方程;
- 换流器交流侧的功率交换方程;
- 换流器直流侧与调制环节的关联方程;
- 直流网络节点的电流或功率平衡方程。
所有未知数,包括交流电压幅值、相角、直流电压、换流器调制比和相位角,全部排成一个状态向量X。整个方程组F(X)=0用牛顿-拉夫逊法统一迭代求解,每一步只解一次线性方程组,用完整雅可比矩阵同时修正全部变量。
统一求解法的好处是方程之间的交叉耦合在雅可比矩阵中以偏导数块的形式体现,不会出现交替迭代中"信息来回传递"的滞后效应,所以收敛速度是二阶的,收敛域也比交替法宽得多。代价是需要自己推导全部雅可比矩阵分块表达式,尤其是换流器那几行方程对各个变量的偏导数,推导起来工作量不小,代码组装也容易出错。但Matlab矩阵运算非常擅长处理这种结构化的大规模稀疏矩阵,这正是统一法在Matlab里落地的最舒服场景。
2. 统一求解法的完整数学模型这样搭
2.1 交流侧潮流方程:还是那套NR框架
交流侧的基本建模对象是配电网的节点导纳矩阵Y_bus。对任意交流节点i,注入功率表达式是:
$$ S_i = U_i \sum_{j \in i} Y_{ij}^* U_j^* $$
拆成有功和无功,就得到两个失配量方程:
$$ \Delta P_i = P_{g,i} - P_{l,i} - P_{calc,i} = 0 $$
$$ \Delta Q_i = Q_{g,i} - Q_{l,i} - Q_{calc,i} = 0 $$
其中$P_{calc,i}$和$Q_{calc,i}$是用当前电压幅值和相角计算出的节点注入功率。在统一求解法中,交流侧的这些方程和标准牛顿法完全一致,雅可比子块$\frac{\partial \Delta P}{\partial \theta}$、$\frac{\partial \Delta P}{\partial U}$、$\frac{\partial \Delta Q}{\partial \theta}$、$\frac{\partial \Delta Q}{\partial U}$也可以沿用标准公式。
唯一要注意的是,当某个交流节点连接了换流站,那么这个节点的注入功率里必须额外加上换流器从交流电网吸收的有功和无功,或者说,在功率平衡方程里把这个节点的净注入功率减去换流器消耗的那部分。换流器吸收的交流有功和无功取决于换流器控制方式和它两侧的电压、相角,所以这部分功率不能当作常数,必须作为换流器变量的函数放进方程里,并在雅可比矩阵中体现对换流器变量的偏导。
交流侧节点也要分类型处理。平衡节点给定电压幅值和相角,不参与方程;PV节点给定有功和电压幅值,有功方程保留,无功方程被替换为电压幅值约束方程;PQ节点两个方程都保留。在配电网场景里,通常只有一个平衡节点,其余绝大多数是PQ节点,PV节点极少,因为配网里的分布式电源多数时候按恒功率因数并网。
2.2 换流器(VSC)接入方程:统一法最核心的部分
VSC换流站是连接交流系统和直流系统的核心设备,这里我以两电平VSC为例说明模型,实际工程中MMC多电平也是同样的外特性方程,控制方式和等值模型相近。
换流器与交流母线之间通常有一台换流变压器,等效阻抗为$Z_t = R_t + jX_t$(归算到阀侧)。换流器阀侧电压基波相量记为$U_c \angle \delta_c$,交流母线电压为$U_s \angle \theta_s$(下标s对应交流母线节点)。那么换流器从交流母线吸收的复功率可以写成标准的两端传输公式:
$$ P_s = U_s^2 G_t - U_s U_c (G_t \cos\delta + B_t \sin\delta) $$
$$ Q_s = -U_s^2 B_t - U_s U_c (G_t \sin\delta - B_t \cos\delta) $$
这里$\delta = \theta_s - \delta_c$是交流母线与阀侧电压之间的相角差。$G_t$和$B_t$分别是换流变压器等值导纳$Y_t=1/Z_t$的电导和电纳。
再看换流器内部。两电平VSC的直流侧电压$U_{dc}$与阀侧基波电压幅值$U_c$之间存在调制关系:
$$ U_c = \frac{\mu}{2\sqrt{2}} m U_{dc} $$
其中$m$是调制比,取值范围一般在0到1.15之间,$\mu$是与PWM调制方式有关的系数(方波调制约为1,SPWM约为$\sqrt{3}/2$,SVPWM可取1)。在标幺值系统里,这一步通常折算成$U_c = K_m m U_{dc}$形式的线性关系,$K_m$为常系数。
换流器内部忽略损耗时,换流器交流侧接受的有功功率等于直流侧输出的有功功率:
$$ P_s = P_{dc} = U_{dc} I_{dc} $$
这是一个关键的功率平衡方程,它把交流变量$U_s$、$\theta_s$、$U_c$、$\delta$和直流变量$U_{dc}$、$I_{dc}$联系起来了。
再加上换流器自身的控制方程。假设换流站工作在定直流电压-定无功功率模式,那么就有两个附加方程:
$$ U_{dc} - U_{dc}^{ref} = 0 $$
$$ Q_s - Q_s^{ref} = 0 $$
如果是定有功-定无功模式,则把第一个方程换成$P_s - P_s^{ref} = 0$。如果是定有功-定交流电压模式,则把第二个方程换成$U_s - U_s^{ref} = 0$。
每个换流站引入的未知量通常是$U_c$、$\delta_c$、$U_{dc}$、$I_{dc}$(或者$m$、$P_s$、$Q_s$中根据需要取舍),并且有对应的方程。把所有换流站方程和交直流网络方程放在一起,就构成了统一求解法的完整方程组。这一步是数学建模的核心,雅可比矩阵中所有跨子系统的偏导数项都从这里产生。
2.3 直流侧网络方程与整个雅可比矩阵的拼装
直流侧网络建模相对直观,因为直流网是纯电阻网络。对直流节点k,用节点直流导纳矩阵$G_{dc}$建立节点方程。若该节点连接到某个换流站,则节点电流平衡方程是:
$$ I_{dc,k} - G_{dc,k1}U_{dc,1} - G_{dc,k2}U_{dc,2} - \cdots = 0 $$
其中$I_{dc,k}$是从换流站流入直流节点k的电流,由换流站直流侧功率关系确定。如果节点没有接入换流站,则$I_{dc,k}=0$,对应纯直流负荷节点。直流负荷通常按恒定功率建模,那么该节点的方程写成功率形式更自然:
$$ P_{L,dc,k} - U_{dc,k} \sum_j G_{dc,kj} U_{dc,j} = 0 $$
因此,直流侧方程既可以是电流平衡型,也可以是功率平衡型。我个人在做统一法时习惯用功率平衡方程,因为潮流计算的失配量统一为"参考值减计算值"的标量形式,表达式和雅可比推导比较规整。如果某节点没有换流器也没有负荷,只是一个中间连接点,那么它的净注入功率就是零,方程右边同样是零。
把交流部分的节点方程、每个换流站的5-6个方程、直流网络方程全部排成向量F,状态向量X排成一列:
$$ X = [\theta; U_{ac}; U_{dc}; X_{vsc}] $$
然后对整个F(X)求偏导数,得到统一的雅可比矩阵J。矩阵结构大概分成几个区域:
- 左上:交流偏交流(标准NR雅可比子块)
- 中上/左中:交流侧方程对直流电压和换流器变量的偏导(耦合项,来自换流器功率方程)
- 中中:换流器方程对自身变量的偏导
- 右下:直流网络方程对直流电压和换流站直流电流/功率变量的偏导
这个分块矩阵不需要像交流潮流那么紧凑的稀疏存储,Matlab里直接给每个元素定位索引组装,然后用稀疏矩阵存储,求解效率已经足够高。
3. Matlab代码实现:从框架到关键代码
3.1 代码整体框架与数据组织方式
写这套代码我建议把模块拆分清楚,不要把所有逻辑堆在一个脚本里。我采用的结构是:
- 主脚本main.m:负责输入数据、初始化、调用迭代、输出结果
- 构建导纳矩阵部分buildYbus.m:处理交流节点导纳矩阵
- 构建直流导纳矩阵部分buildGdc.m:处理直流网络节点导纳矩阵
- 失配量计算部分calcMismatch.m:返回所有方程残差
- 雅可比组装部分assembleJacobian.m:按块拼接统一雅可比
- 换流器方程部分vscEquations.m:换流器内部方程和偏导数
数据组织上,我用结构体数组保存节点信息。交流母线数据存放在bus矩阵中,每一行是[编号 类型 Pg Qg Pl Ql U0 theta0],换流站数据放在vsc结构数组中,每个元素记录所连交流节点号、所连直流节点号、控制模式、参考值、换流变参数、调制系数等。直流母线数据放在dcbus矩阵中,每一行是[编号 类型 Pdc Qdc(Udc) Udc0]。这种组织方式的好处是各种变量容易索引,不容易在庞大的状态向量编号中搞混。
状态量的编号是整个程序最容易出错的地方。我建议先生成一张编号表,明确交流电压相角从1到n_bus、交流电压幅值从n_bus+1到2n_bus、直流节点电压再从2n_bus+1往后排、最后排换流站内部变量。编号确定后,雅可比矩阵的行和列就能精确对应,调试时也方便检查。
3.2 核心迭代与雅可比矩阵组装代码
主迭代循环的骨架如下,关键逻辑是每次迭代算失配量、组装雅可比、解修正量、更新状态量。
% 主迭代循环,统一求解法 % X = [theta_ac; U_ac; U_dc; X_vsc] max_iter = 50; tol = 1e-8; iter = 0; while iter < max_iter iter = iter + 1; % 从状态向量拆出各子系统的变量 [theta_ac, U_ac, U_dc, vsc_vars] = unpackState(X, idx); % 计算所有失配量 F = calcMismatch(theta_ac, U_ac, U_dc, vsc_vars, bus, branch, dcbus, vsc); mismatch = norm(F, inf); % 判断收敛 if mismatch < tol fprintf('统一求解法收敛于第%d次迭代, 最大失配量=%.6e\n', iter, mismatch); break; end % 组装统一雅可比矩阵 J = assembleJacobian(theta_ac, U_ac, U_dc, vsc_vars, bus, branch, dcbus, vsc); % 求解修正量并更新 dx = -J \ F; X = X + dx; end if iter >= max_iter warning('达到最大迭代次数仍未收敛,请检查初值或参数设置'); end失配量计算是本代码最容易踩坑的地方。建议把状态向量按物理子系统分组,分别先算交流功率失配、再算换流器方程失配、最后算直流节点失配,每个子块单独测试正确性。我曾经偷懒直接一把梭把所有方程写在一起,结果某一行符号写反,迭代怎么都不收敛,最后只能一行一行注释排查,浪费了很多时间。
雅可比组装我用四个分块分别计算的思路:
function J = assembleJacobian(theta_ac, U_ac, U_dc, vsc_vars, bus, branch, dcbus, vsc) n_ac = length(U_ac); n_dc = length(U_dc); n_vsc = numel(vsc); nx = 2*n_ac + n_dc + 2*n_vsc; % 状态量总维数 J = zeros(nx, nx); % 正式版本建议用 sparse 预分配 % 分块1: 交流方程对交流变量的偏导(标准NR雅可比) J(1:2*n_ac, 1:2*n_ac) = acJacobian(theta_ac, U_ac, bus, branch); % 分块2: 交流方程对直流和换流器变量的偏导 J(1:2*n_ac, 2*n_ac+1:end) = acCouplingJacobian(theta_ac, U_ac, vsc); % 分块3: 换流器+直流方程对交流变量的偏导 J(2*n_ac+1:end, 1:2*n_ac) = dcCouplingJacobian(theta_ac, U_ac, U_dc, vsc); % 分块4: 换流器+直流方程对直流和换流器变量的偏导 J(2*n_ac+1:end, 2*n_ac+1:end) = vscDcJacobian(U_dc, vsc_vars, vsc, dcbus); % 转换为稀疏矩阵 J = sparse(J); end拼装矩阵时的索引计算务必仔细核对,行索引必须统一为失配量的物理顺序,列索引必须统一为状态量的物理顺序。我建议用一组专门的计算函数来索引,而不是在所有地方裸写数字。比如定义idx.theta = 1:n_ac、idx.Uac = n_ac+1:2n_ac,再定义idx.Udc = 2n_ac+1:2*n_ac+n_dc,之后的所有代码都引用这个结构体,减少索引错乱的可能。
3.3 初始化、容差与收敛判据的选择
统一求解法对初始值的敏感程度比纯交流潮流高,因为直流电压和换流器调制比同时进入方程。我常用的初始化策略是交流节点电压全部取1.0∠0°,直流节点电压全部取1.0标幺,换流器调制比m取0.85左右,相角差δ取0。这个策略在绝大多数场景下都能让迭代稳定起步。要注意,直流电压初值不能随便给,尤其当直流网络中存在电压等级约束或换流器定直流电压控制时,1.0标幺和实际电压相比差太多会导致直流网络方程在第一次迭代就产生很大的失配量,从而影响收敛。
收敛判据上,我建议采用最大失配量的无穷范数作为主判据,阈值设1e-6或者1e-8,根据不同场景而定。参与工程复现时1e-6足够,发论文做高精度校验可以设1e-9,因为Matlab的double类型撑到1e-10也不会下溢,主要看迭代次数是否在可接受范围内。
另外,每次迭代后可以打印内部状态,方便监控收敛过程。我在调试时习惯把每轮迭代的交流最大失配量和直流最大失配量分别打印,哪个子系统卡住了,一眼就能看出问题在哪个模块。
4. 算例测试与结果分析
4.1 测试算例设置
为了验证统一求解法代码的正确性和收敛性,我在IEEE 33节点配电网基础上改造了一个交直流混合测试系统。具体做法是保留原33节点的交流配网主干,在节点8和节点20附近分别接一个VSC换流站,内连到一条双端直流馈线,直流馈线电压等级取10kV(标幺基准值10kV)。直流线路在节点33引出一个直流负荷支路,模拟一个直流充电站,额定功率1.2MW。两个VSC换流站的容量分别取2MVA,控制模式上换流站1采用定直流电压-定无功控制,换流站2采用定有功-定无功控制。直流侧的下垂特性没有启用,保证测试模型对应的是标准方程形式。
交流系统总负荷保持原33节点网络参数不变,各节点负荷用恒定功率模型。分布式电源的光伏接入通过直流馈线侧的一台DC/DC变换器注入到直流母线,注入功率0.8MW,这样直流网内部既有注入源也有负荷,潮流不再是单端馈入的简单情况。
4.2 收敛性能与与交替法的对比
为了看清楚统一求解法的优势,我同时写了一版交替迭代法作为对照。交替法用外循环在交流子系统和直流子系统之间传递换流器等值参数,交流求解用牛拉法,直流求解用节点电压迭代法,外循环最多迭代100次。两个算例都在同一台机器上、同一组初值下跑。
收敛情况对比很直观:
| 外迭代/总迭代次数 | 统一法最大失配量 | 交替法最大失配量 |
|---|---|---|
| 1 | 5.02e-1 | 4.83e-1 |
| 2 | 1.36e-1 | 2.05e-1 |
| 3 | 4.12e-2 | 9.87e-2 |
| 4 | 3.15e-3 | 8.32e-2 |
| 5 | 2.47e-4 | 7.65e-2 |
| 6 | 6.13e-6 | 7.59e-2 |
| 7 | 3.22e-8 | 7.58e-2 |
| 8 | 1.05e-9 | 7.57e-2 |
统一法8次迭代收敛到1e-9以下,交替法在第7次外迭代后最大失配量基本卡在7.5e-2就不再动了。这不是交替法的代码bug,而是外循环在传递换流器参数时进入了一个极限环振荡,交流侧算出一个功率,传到直流侧以后直流电压变化,再传回交流侧,两边的结果来回波动,无法稳定收敛。把外循环的阻尼系数调小到0.3以后,交替法能收敛,但要40多次外迭代才能达到1e-6,而且每次外迭代内部还要求解交流潮流和直流潮流,总耗时是统一法的6倍以上。
统一法的收敛曲线是典型牛顿法的二阶收敛趋势,失配量从0.5到1e-9只需要8步,这是统一法最舒服的地方:不需要调外循环阻尼、不需要策略性松弛,只要初值不离谱,收敛几乎是一路碾压。
4.3 一次典型运行的计算结果
以统一求解法收敛后的结果为例,展示一次完整计算得到的系统状态。两个VSC换流站的运行参数整理如下表:
| 参数 | 换流站1(节点8) | 换流站2(节点20) |
|---|---|---|
| 控制模式 | 定Udc=1.0pu, Q0=0Mvar | 定P=0.6MW, Q=0.2Mvar |
| 交流侧有功注入 | 1.06 MW | 0.58 MW |
| 交流侧无功注入 | 0.04 Mvar | 0.21 Mvar |
| 直流母线电压 | 10.02 kV | 9.98 kV |
| 调制比m | 0.87 | 0.82 |
两种控制模式都较好地实现了设定目标。定直流电压的换流站1把直流母线电压稳定在10.02kV附近,偏差小于0.3%。定有功控制的换流站2输送到直流侧的有功功率为0.58MW,与设定值0.6MW的偏差主要来自线路损耗和方程精度,在合理范围内。直流侧光伏注入0.8MW,直流负荷消耗1.2MW,换流站1和换流站2从交流侧净注入的功率总和正好平衡了直流网内部的功率差额和直流线路损耗,全网功率平衡校验误差在1e-8以内,说明程序计算逻辑正确。
交流侧节点电压结果我也简单统计了一下:33个交流节点的电压幅值都在0.95pu到1.03pu之间,最低电压出现在远离平衡节点且靠近重负荷的节点18,为0.9512pu,没有越限;最高电压在平衡节点附近。相比纯交流33节点网络,接入VSC换流站后由于直流馈线承担了部分功率,交流侧的潮流分布发生了一定的变化,节点20附近的电压明显抬高,这在实际工程中是常见的现象,也是潮流计算能指导规划的依据。
5. 常见问题与调试排坑实录
5.1 不收敛的几类根因
我在调试这套代码的过程中,遇到过几次典型的"死活不收敛"问题,根因各有不同,但排查路径可以归纳成下面几类,遇到类似问题可以直接对照。
第一类是初始化电压和实际运行点偏差过大。直流网络电压初值给1.0pu,但直流负荷和光伏的功率匹配导致实际直流电压可能只有0.92pu,第一次迭代直流功率方程失配量会特别大,雅可比矩阵中的直流部分偏导数值也很离谱,导致修正量过大甚至震荡。解决办法是先用直流网络单独做一次简单功率平衡计算,估算出大概电压水平,再作为统一法的初值。哪怕只是粗略估算,也能让收敛速度快很多。
第二类是换流器控制方程的参考值设置和系统功率水平冲突。比如定有功功率的换流器设定值超过了交流侧该节点的可用容量,或者使得直流侧总功率不平衡超过换流器直流电压调节能力范围,这样的运行点物理上不存在,统一法自然无法收敛。解决方法是先做一次功率平衡估算,确定换流器功率设定值可行再上程序。
第三类是交流侧节点类型设置错误,把带换流器的交流节点误设成PV节点或者PQ节点但未把换流功率计入,导致功率失配方程里缺了换流器的功率项。这种情况在Unit法里很常见,因为换流站的接入会改变节点的功率注入结构,必须在方程中显式加入换流器功率。
第四类是迭代中出现阻尼比不合适的情况。虽然统一法理论上二阶收敛,但当换流变阻抗很小时,雅可比矩阵中换流器相关行会出现很大的数值差异,矩阵条件数变差,修正量可能过大。这种情况下可以在前几次迭代对修正量乘一个0.8的阻尼系数,后面再放宽,实测效果不错。
5.2 直流侧矩阵奇异问题
直流侧矩阵奇异是我踩过的一个比较隐蔽的坑。直流网络和换流站耦合时,直流节点的功率方程并不是天然独立的。如果两个换流站都采用定有功-定无功控制,那么直流网络没有换流站去维持直流电压,直流电压方程会出现奇异或者形成浮空网络,雅可比矩阵奇异,程序直接报错或者解的数值完全离谱。同样,如果直流侧存在一个纯负荷节点,但没有任何换流站或分布式电源给它供电,该节点在网络中就是悬浮节点。
解决这个问题的原则其实很简单:直流网络必须至少有一个换流站工作在定直流电压控制模式,或者说,直流侧必须存在一个电压源性质的节点作为直流平衡节点。如果潮流场景设计中所有的换流器都定功率,则必须额外增加一个直流电压平衡设备或者改为下垂控制,否则直流侧潮流无解。
另外,当直流网络由两条并联直流线路形成环网时,如果直流导纳矩阵的行列式趋于零,说明网络拓扑中存在冗余方程或者孤立节点,需要重新检查直流拓扑编号。我建议在构造直流导纳矩阵后立刻计算det(Gdc)或者做LU分解判断是否奇异,这一步成本很低,但能在迭代前就暴露问题。
5.3 Matlab实现中的工程细节优化
最后分享几个我在Matlab实现中总结的工程细节,能帮你少走弯路。
矩阵用稀疏格式存储。统一求解法的雅可比矩阵规模是交流节点数、直流节点数和换流器数的叠加,规模达到几百维时,全稠密矩阵求解速度就开始明显下降,上千维时内存开销和求解时间迅速膨胀。Matlab的sparse矩阵配合左除运算符,对稀疏线性系统求解效率提升非常明显,代码量几乎不变,只要在组装完成后调用一次sparse()即可。
符号约定要统一。换流器交流侧有功功率的方向,我统一规定为正表示换流器从交流系统吸收有功功率,负表示向交流系统注入有功功率。直流侧功率方向规定为正表示换流器从直流系统吸收功率。这个约定一旦统一,雅可比矩阵里的符号就非常清楚,不容易产生正负号打架的问题。如果在调试中遇到某一行残差符号恒反,先检查这个方向约定。
单元测试建议单独做。把换流器方程单独隔离出来,用一组已知的U_s、U_c、δ、U_dc数据去手动计算方程右边,再对比程序输出,判断公式和符号是否正确。这个测试只需要几行代码,但能解决大部分"公式写错但不明显"的问题。我自己的经验是,先验证纯交流潮流模块,再验证纯直流网络模块,最后验证换流器桥接模块,层层验收完后再做整体联调,整个调试周期能缩短一半以上。
数值容差和单位也需要注意。如果整个程序用的是标幺值系统,所有电压、功率、阻抗都要按同一套基准值折算,不要混用有名值和标幺值。我之前试过在换流器内部方程里用有名值,而在交流侧用标幺值,结果雅可比矩阵中耦合块的数量级差了好几个量级,矩阵条件数恶化,收敛精度直接受影响。
再补充一个关于输出结果校验的经验。潮流问题算完后,最重要的是做全网功率平衡校验:交流侧所有发电机注入功率等于交流负荷功率加换流器交换功率加交流线路损耗;直流侧所有换流器注入功率等于直流负荷功率加直流线路损耗。两边功率平衡误差在1e-6以下,才能确定结果是可靠解。这一步必须做,否则万一收敛到了一个错误的平稳点,你根本不知道。
我实际用这套代码测了多个不同拓扑的算例,统一求解法在重负载场景下的表现确实稳定。交直流混合配电网这类系统的模型耦合程度决定了它天然适合整体联立求解,只要把换流器方程和雅可比矩阵组装这两关过了,后面会越用越顺。希望这份从建模到代码再到排坑的完整记录,能帮你少啃几天理论、少掉几个头发坑。