电路仿真 MNA 算法:从 STA 稀疏表格到 NA 节点分析的 3 步简化逻辑 📅 2026/7/10 2:23:04 电路仿真 MNA 算法从 STA 稀疏表格到 NA 节点分析的 3 步简化逻辑在电子设计自动化EDA领域电路仿真算法的演进始终围绕着如何在计算精度与效率之间寻找平衡点。改进节点分析Modified Nodal Analysis, MNA作为现代电路仿真器的核心算法其诞生并非一蹴而就而是经历了从稀疏表格分析Sparse Tableau Analysis, STA到节点分析Nodal Analysis, NA的两次关键范式跃迁。本文将揭示这三个算法之间的数学传承关系通过可视化流程图展示变量消去的动态过程并对比它们在方程规模、内存占用和求解复杂度方面的本质差异。1. 电路建模的基础语言STA 稀疏表格分析STA 采用了一种全变量记录的建模哲学将电路中的每一个物理量都显式地表示为方程变量。这种方法的优势在于其普适性——无论是线性电阻、独立电源还是四种受控源VCVS、CCVS、VCCS、CCCS都能用统一的框架处理。STA 方程系统的三大组成部分拓扑约束通过关联矩阵 $M$ 表达KCL 方程$Mi0$KVL 方程$uM^Tv$元件方程线性化表示为 $Zi Yu s$其中 $s$ 是激励源向量组合系统[ M 0 0 ] [ i ] [ 0 ] [ 0 I -M^T] [ u ] [ 0 ] [ Z Y 0 ] [ v ] [ s ]这种方法的代价是巨大的内存开销。对于一个包含 $n$ 个节点和 $m$ 条支路的电路STA 需要建立 $(2mn-1)$ 个方程的庞大系统。下表展示了不同规模电路的理论方程数量电路规模节点数 (n)支路数 (m)STA 方程数小型101544中型100150449大型10,00015,00044,999提示STA 虽然理论完备但在实际仿真中会因为矩阵过于稀疏而导致存储和计算效率低下这促使了后续算法的优化。2. 第一次简化NA 节点分析的变量消去策略NA 算法的突破在于发现当电路不包含电压源时所有支路电流都可以用节点电压表示。这一发现使得变量数量从 $O(mn)$ 骤减到 $O(n)$。NA 的推导过程可分为三个关键步骤从元件方程 $Zi Yu s$ 解出电流 $$ i Y(u - s) $$将 KVL 方程 $u M^Tv$ 代入 $$ i Y(M^Tv - s) $$代入 KCL 方程 $Mi 0$ 得到核心方程 $$ MYM^Tv Ms $$这个推导过程中我们实际上完成了两次变量消去消去所有支路电压 $u$消去所有支路电流 $i$最终得到的节点导纳矩阵 $G MYM^T$ 具有以下特性对称正定对于无源电路稀疏性取决于电路连接结构维度仅为 $(n-1) \times (n-1)$# NA 矩阵构建伪代码示例 def build_NA_matrix(circuit): G zeros(n-1, n-1) # 初始化导纳矩阵 for comp in circuit.components: if comp.type ! voltage_source: n1, n2 comp.nodes # 更新导纳矩阵对应位置 G[n1][n1] comp.Y G[n2][n2] comp.Y G[n1][n2] - comp.Y G[n2][n1] - comp.Y return G然而 NA 存在致命缺陷无法处理理想电压源。因为当支路是理想电压源时其导纳 $Y$ 为无穷大导致上述推导失效。这个限制在模拟集成电路中尤为突出因为基准电压源、运放供电等关键元件都是电压源。3. 第二次简化MNA 的混合变量哲学MNA 的智慧在于采用选择性保留策略只保留必要电流变量其余仍用电压表示。这种混合变量方法完美平衡了通用性与效率。MNA 的变量分类原则Group 1可消去电流电阻独立电流源压控电流源 (VCCS)流控电流源 (CCCS)Group 2需保留电流独立电压源压控电压源 (VCVS)流控电压源 (CCVS)电感时域分析时这种分类导出了 MNA 的标准矩阵形式[ G B ] [ v ] [ j ] [ ] [ ] [ ] [ C D ] [ i ] [ e ]其中$G$节点导纳矩阵来自 Group 1 元件$B$, $C$耦合矩阵描述 Group 2 元件关系$D$通常为零矩阵$j$, $e$激励源向量三种算法复杂度对比算法变量类型矩阵规模适用场景内存占用 (示例电路)STA全部电流电压(2mn-1)×(2mn-1)理论分析100%NA仅节点电压(n-1)×(n-1)纯电阻/电流源网络15%MNA电压部分电流(n-1k)×(n-1k)通用电路 (k为保留电流数)30%-50%注意k 表示需要保留的电流变量数量通常远小于支路数 m。例如在运算放大器电路中可能只需保留5-10个关键支路电流。4. 从理论到实践MNA 矩阵的构建技巧在实际 EDA 工具实现中MNA 矩阵的构建需要处理更多工程细节。以下是一个典型的分步构建流程初始化空矩阵根据电路节点数和需保留的电流数确定维度处理 Group 1 元件电阻更新导纳矩阵 $G$# 添加电阻贡献 def add_resistor(G, n1, n2, R): g 1.0 / R G[n1][n1] g G[n2][n2] g G[n1][n2] - g G[n2][n1] - g处理 Group 2 元件电压源在 $B$, $C$ 矩阵添加 ±1 元素# 添加电压源贡献 def add_voltage_source(G, B, C, n1, n2, idx): B[n1][idx] 1 B[n2][idx] -1 C[idx][n1] 1 C[idx][n2] -1处理受控源VCCS在 $G$ 矩阵添加跨导项VCVS需要引入额外方程稀疏矩阵存储优化 由于 MNA 矩阵通常具有 99% 以上的零元素实际实现中采用以下数据结构struct SparseMatrix { std::vectorint row_ptr; // CSR格式行指针 std::vectorint col_idx; // 列索引 std::vectordouble values; // 非零值 };在仿真高频电路时还需要考虑寄生效应的建模。例如传输线的等效模型可能包含数百个RLC元件此时MNA矩阵的构建需要采用分层方法先构建子电路模块的局部矩阵再通过端口连接关系组装全局矩阵这种模块化方法可以将构建时间从 $O(N^2)$ 降低到 $O(N \log N)$其中 $N$ 是电路规模。