当电路非常复杂时,如元件数量特别多,或网络结构特别复杂时,我们希望能“用编程的方式”,自动求解各节点处的电势与各支路的电流。

本文设计了一个最简案例,一个仅含电阻的小型网络——

一个仅含电阻的最简电路:3 条支路、2 个独立节点

电路说明:

  1. 圆圈点表示电势参考点,其电势为 0;
  2. 电路的输入和输出电流相等,为 I0I_0;
  3. 电路含有 3 个分支(branch),即 b1、b2、b3;
  4. 和 2 个独立节点(node),即 n1 和 n2。

1. 原理:基尔霍夫定律 + 欧姆定律

1.1 基尔霍夫电流定律

又称“基尔霍夫第一定律”——

对于某一节点,进入电流之和 = 离开电流之和

换言之,节点只负责传输电流,而无法让电流凭空产生或消失。

分别对于 n1 和 n2 两个节点,如果我们定义“流入为负,流出为正”——

{−1⋅Ib1+1⋅Ib2+1⋅Ib3=00⋅Ib1−1⋅Ib2−1⋅Ib3=I0\left\{ \begin{array}{l} -1\cdot I_{\mathrm{b}1}+1\cdot I_{\mathrm{b}2}+1\cdot I_{\mathrm{b}3}=0\\ 0\cdot I_{\mathrm{b}1}-1\cdot I_{\mathrm{b}2}-1\cdot I_{\mathrm{b}3}=I_0 \end{array} \right.

为什么要写出 0 和 1 呢,因为,咱们要变成矩阵形式——

(−1110−1−1)(Ib1Ib2Ib3)=(0I0)\left(\begin{matrix} -1 & 1 & 1\\ 0 & -1 & -1 \end{matrix}\right) \left(\begin{matrix} I_{\mathrm{b}1}\\ I_{\mathrm{b}2}\\ I_{\mathrm{b}3} \end{matrix}\right) = \left(\begin{matrix} 0\\ I_0 \end{matrix}\right)

即

AIb=If\boldsymbol{A}\boldsymbol{I}_{\mathrm{b}}=\boldsymbol{I}_{\mathrm{f}}

其中,A\boldsymbol{A} 就被称为“关联矩阵”,每行对应节点,每列对应支路。Ib\boldsymbol{I}_{\mathrm{b}} 表示各支路的电流,If\boldsymbol{I}_{\mathrm{f}} 表示整体电路的输入输出电流。

1.2 基尔霍夫电压定律

又称“基尔霍夫第二定律”——

闭合回路所有器件两端的电势差(电压)的代数和等于零

这里间接使用这一定律,即,“不闭合的回路 两端点的电势差 = 其间元件的电压”。

前面我们讲了“关联矩阵”A\boldsymbol{A} 中,每行对应节点,每列对应支路。如果我们把 A\boldsymbol{A} 转置,让每一列(支路)形成一个电压方程,则为

(−101−11−1)(Un1Un2)=(Ub1Ub2Ub3)\left(\begin{matrix} -1 & 0\\ 1 & -1\\ 1 & -1 \end{matrix}\right) \left(\begin{matrix} U_{\mathrm{n}1}\\ U_{\mathrm{n}2} \end{matrix}\right) = \left(\begin{matrix} U_{\mathrm{b}1}\\ U_{\mathrm{b}2}\\ U_{\mathrm{b}3} \end{matrix}\right)

即

ATUn=Ub\boldsymbol{A}^{\mathrm{T}}\boldsymbol{U}_{\mathrm{n}}=\boldsymbol{U}_{\mathrm{b}}

其中,Un\boldsymbol{U}_{\mathrm{n}} 表示每个节点的电势,Ub\boldsymbol{U}_{\mathrm{b}} 表示每个支路的电压压降。

1.3 欧姆定律

电压 = 电阻 × 电流 电流 = 电导 × 电压

这里我们要使用电导的形式。电导 SS(electrical conductance)等于电阻的倒数。

咱们直接写出矩阵形式吧——

Ib=S⋅Ub\boldsymbol{I}_{\mathrm{b}}=\boldsymbol{S}\cdot \boldsymbol{U}_{\mathrm{b}}

其中

S=(S1000S2000S3)\boldsymbol{S}=\left(\begin{matrix} S_1 & 0 & 0\\ 0 & S_2 & 0\\ 0 & 0 & S_3 \end{matrix}\right)

1.4 联立化简

至此,我们列出了三个方程——

{AIb=IfATUn=UbIb=S⋅Ub\begin{cases} \boldsymbol{A}\boldsymbol{I}_{\mathrm{b}}=\boldsymbol{I}_{\mathrm{f}}\\ \boldsymbol{A}^{\mathrm{T}}\boldsymbol{U}_{\mathrm{n}}=\boldsymbol{U}_{\mathrm{b}}\\ \boldsymbol{I}_{\mathrm{b}}=\boldsymbol{S}\cdot \boldsymbol{U}_{\mathrm{b}} \end{cases}

联立,简化,得到

ASATUn=If\boldsymbol{A}\boldsymbol{S}\boldsymbol{A}^{\mathrm{T}}\boldsymbol{U}_{\mathrm{n}}=\boldsymbol{I}_{\mathrm{f}}

这个方程,就是一个线性方程,咱们可以直接求解呀。

2. 求解

我用 MATLAB 写了一段极简代码,就实现了上述方程的求解,其中 S 和 If 可以随意设置——

A = [-1 1 1;
    0 -1 -1];
S = diag([1 1 1]);
If = [0 1]';
Un = (A*S*A')\If
Ib = S*(A'*Un)

求解输出为:

Un =
    1.0000
    1.5000
Ib =
   -1.0000
   -0.5000
   -0.5000

这样,就自动地得到了所有节点的电压与所有支路的电流。

最美妙的是,只要修改一下参数矩阵,就可以求解非常复杂的电路网络了。

本文 2022-09-26 原发表于知乎。