5.1 修正节点分析法与稀疏矩阵 本节摘要:修正节点分析法(MNA)是所有 SPICE 内核的列方程标准:节点电压做主未知量,电压源与电感的支路电流作为附加未知量补进方程。本节手工组装一个三节点电路的 MNA 矩阵并解出答案,再讲稀疏矩阵为什么让百万节点规模的求解成为可能。 从节点法的困境说起 最朴素的节点分析法只用基尔霍夫电流定律:每个节点,流入等于流出,未知量是节点电压。对电阻网络它完美工作——每条支路的电流都能用欧姆定律写成节点电压的函数。但两类器件让它卡壳:理想电压源的电流不由电压决定(它想供多少电流就供多少),电感的电压电流关系里藏着导数。这两类器件的支路电流无法用节点电压直接表达,方程组缺方程。
本节摘要:修正节点分析法(MNA)是所有 SPICE 内核的列方程标准:节点电压做主未知量,电压源与电感的支路电流作为附加未知量补进方程。本节手工组装一个三节点电路的 MNA 矩阵并解出答案,再讲稀疏矩阵为什么让百万节点规模的求解成为可能。
最朴素的节点分析法只用基尔霍夫电流定律:每个节点,流入等于流出,未知量是节点电压。对电阻网络它完美工作——每条支路的电流都能用欧姆定律写成节点电压的函数。但两类器件让它卡壳:理想电压源的电流不由电压决定(它想供多少电流就供多少),电感的电压电流关系里藏着导数。这两类器件的支路电流无法用节点电压直接表达,方程组缺方程。
MNA 的解法聪明而直接:把这些"不听话"的支路电流也拉进未知量队伍,每个电压源、每个电感多占一列一行,同时补上它们的器件方程——电压源补"电压差等于源值",电感补"电压等于电感乘电流变化率"。节点方程照旧,方程数与未知数重新对齐。这就是名字里"修正"二字的含义:修正的不是节点法本身,而是它的适用边界。
用第 1 章的分压电路做样本:五伏电源接在节点一与地之间,九千欧从节点一到节点二,一千欧从节点二到地。未知量三个:两个节点电压,外加电源支路电流。逐块组装:
v1 v2 iV1 行1 [ 1/9k -1/9k 1 ] [v1] [ 0 ] 行2 [ -1/9k 1/9k+1/1k 0 ] [v2] = [ 0 ] 行3 [ 1 0 0 ] [i ] [ 5 ]
三行各有出处。行一、行二是节点一与节点二的电流守恒:对角线上是接到该节点的所有电导之和,非对角线是节点间电导的负值,电源支路电流在行一出现(它流入节点一),系数为一。行三是电压源的器件方程:两端电压差等于五伏,翻译成矩阵行就是 v1 项系数一、常数项五。左边是九乘九都嫌大的三乘三矩阵,右边是常数向量——这就是仿真器眼中的"电路"。
手工求解验证:由行三 v1 等于五伏;代入行一得电源电流等于(v2 减五)除九千欧的负向表达;代入行二化简后得 v2 等于五乘一千除一万,零点五伏——与第 1 章 .OP 的读数完全一致。你刚才做的就是仿真器做的事,差别只是它做的是十万乘十万的矩阵。
电容与电感的处理是 MNA 的另一半:电容的电流等于电容乘以电压变化率,离散化后变成"等效电导加等效电流源"进矩阵(下一节展开);电感则类似电压源,支路电流进未知量。至此所有电路元件都能机械地翻译成矩阵行列——列方程这一步完全自动,无需任何智慧。

矩阵里每一行只与"接到该节点的元件"有关,所以万节点电路的矩阵里绝大多数元素是零——非零元占比常常不足百分之一。直接套用教科书的高斯消元会为那些零浪费天文数字的运算,稀疏求解器只存非零元、只算非零元,复杂度从立方向接近平方回落。工程上还有一层讲究:消元过程中零元素会被"填充"成非零,填充多少取决于消元顺序,马克维茨排序等启发式算法专门寻找填充最少的消元路径。同一张网表,矩阵排序的好坏能让求解时间差出数倍——现代仿真器默认做降序优化,你唯一需要知道的是它的存在与代价。
💡 一个反直觉的事实值得记住:把理想电压源直接并联、或让两个电压源经零电阻互相顶牛,MNA 矩阵会直接奇异——消元时除以零。仿真器报"矩阵奇异"或"无直流通路"时,根源常在这里。这类错误与其说是数值问题,不如说是电路本身就无解。
方程列出来了,但含二极管、晶体管的方程组没有解析解。下一节看牛顿迭代如何一步步逼近答案——以及它为什么偶尔会"冲过头"。
受控源按"控制量与被控量的类型组合"进矩阵:压控电流源在两个节点行各盖一个跨导章;压控电压源要像理想电压源一样增加支路电流未知量,同时把控制方程写进新增行。传输线在交流分析里按特征阻抗与传播延迟转成两端口方程。规则不变:每个元件一个固定模板,模板拼起来就是矩阵——你甚至可以自己给新器件推导模板,这正是 Verilog-A 等行为建模语言在底层做的事。
经验阈值在数百节点量级:再往上,稠密求解的立方增长就开始让仿真时间难以接受,而稀疏求解的近平平方增长才刚刚起步。万节点电路用稠密法单次求解要以小时计,稀疏法只要秒级。现代芯片仿真动辄百万器件,稀疏技术加上排序优化是从"能算"到"算得完"的分水岭,没有它就没有今天的晶体管级验证。
条件数衡量解对扰动的敏感度。电路里悬空的纯电容节点、极小电阻与极大电阻并存,都会让矩阵条件数恶化,表现为收敛慢、读数对选项敏感、平台间结果漂移。对策优先级:先修电路(给悬空节点并大电阻、给极端比值找中庸取值),再用选项兜底(GMIN 并联、收紧容差)。条件数问题与第 6 章的收敛调试共享同一套哲学:能改电路就别硬调数值。
有,而且高频。调试奇异矩阵报错时,手工把出错区域的节点方程写出来,哪个节点缺直流路径一目了然;给新器件推导行为模型时,先手推它的矩阵模板再写成代码;面试与教学场景更是直接考这个。建议拿一个五元件电路(两电阻一电容一源一受控源)亲手组装一次完整矩阵——这一小时的练习,让你对"仿真器在看什么"有一辈子的透视感。
拿三乘三的分压矩阵做手工消元:第一列消元会在第二行第一列位置原本为零的地方产生非零——这就是填充。把消元顺序换一下(先消对角占优最强的行),填充数量随之变化。亲手做一遍这个最小实验,你就明白了为什么排序算法值得写论文:同一电路,消元路径不同,填充量与求解时间差数倍毫不稀奇。