[Click here for a PDF of this post with nicer formatting]
Disclaimer
Peeter’s lecture notes from class. These may be incoherent and rough.
Assembling system equations automatically. Node/branch method
Consider the sample circuit of fig. 1.
Step 1. Choose unknowns:
For this problem, let’s take
- node voltages: \(V_1, V_2, V_3, V_4\)
- branch currents: \(i_A, i_B, i_C, i_D, i_E\)
We do not need to introduce additional labels for the source current sources.
We always introduce a reference node and call that zero.
For a circuit with \(N\) nodes, and \(B\) resistors, there will be \(N-1\) unknown node voltages and \(B\) unknown branch currents, for a total number of \(N – 1 + B\) unknowns.
Step 2. Conservation equations:
KCL
- 0: \(i_A + i_E – i_D = 0\)
- 1: \(-i_A + i_B + i_{S,A} = 0\)
- 2: \(-i_B + i_{S,B} – i_E + i_{S,C} = 0\)
- 3: \(i_C – i_{S,C} = 0\)
- 4: \(-i_{S,A} – i_{S,B} + i_D – i_C = 0\)
Grouping unknown currents, this is
- 0: \(i_A + i_E – i_D = 0\)
- 1: \(-i_A + i_B = -i_{S,A}\)
- 2: \(-i_B -i_E = -i_{S,B} -i_{S,C}\)
- 3: \(i_C = i_{S,C}\)
- 4: \(i_D – i_C = i_{S,A} + i_{S,B}\)
Note that one of these equations is redundant (sum 1-4). In a circuit with \(N\) nodes, we can write at most \(N-1\) independent KCLs.
In matrix form
\begin{equation}\label{eqn:multiphysicsL2:20}
\begin{bmatrix}
-1 & 1 & 0 & 0 & 0 \\
0 & -1 & 0 & 0 & -1 \\
0 & 0 & 1 & 0 & 0 \\
0 & 0 & -1 & 1 & 0
\end{bmatrix}
\begin{bmatrix}
i_A \\
i_B \\
i_C \\
i_D \\
i_E \\
\end{bmatrix}
=
\begin{bmatrix}
-i_{S,A} \\
-i_{S,B} -i_{S,C} \\
i_{S,C} \\
i_{S,A} + i_{S,B}
\end{bmatrix}
\end{equation}
We call this first matrix of ones and minus ones the incidence matrix \(A\). This matrix has \(B\) columns and \(N-1\) rows. We call the known current matrix \(\overline{I}_S\), and the branch currents \(\overline{I}_B\). That is
\begin{equation}\label{eqn:multiphysicsL2:40}
A \overline{I}_B = \overline{I}_S.
\end{equation}
Observe that we have both a plus and minus one in all columns except for those columns impacted by our neglect of the reference node current conservation equation.
Algorithm for filling \(A\)
In the input file, to describe a resistor of fig. 2, you’ll have a line of the form
R name \(n_1\) \(n_2\) value
The algorithm to process resistor lines is
\begin{equation*}
\begin{aligned}
&A \leftarrow 0 \\
&ic \leftarrow 0 \\
&\text{forall resistor lines} \\
&ic \leftarrow ic + 1, \text{adding one column to \(A\)} \\
&\text{if}\ n_1 != 0 \\
&A(n_1, ic) \leftarrow +1 \\
&\text{endif} \\
&\text{if}\ n_2 != 0 \\
&A(n_2, ic) \leftarrow -1 \\
&\text{endif} \\
&\text{endfor} \\
\end{aligned}
\end{equation*}
Algorithm for filling \(\overline{I}_S\)
Current sources, as in fig. 3, a line will have the specification (FIXME: confirm… didn’t write this down).
I name \(n_1\) \(n_2\) value
\begin{equation*}
\begin{aligned}
&\overline{I}_S = \text{zeros}(N-1, 1) \\
&\text{forall current lines} \\
&\overline{I}_S(n_1) \leftarrow \overline{I}_S(n_1) – \text{value} \\
&\overline{I}_S(n_2) \leftarrow \overline{I}_S(n_1) + \text{value} \\
&\text{endfor}
\end{aligned}
\end{equation*}
Step 3. Constitutive equations:
\begin{equation}\label{eqn:multiphysicsL2:60}
\begin{bmatrix}
i_A \\
i_B \\
i_C \\
i_D \\
i_E
\end{bmatrix}
=
\begin{bmatrix}
1/R_A & & & & \\
& 1/R_B & & & & \\
& & 1/R_C & & & \\
& & & 1/R_D & & \\
& & & & & 1/R_E
\end{bmatrix}
\begin{bmatrix}
v_A \\
v_B \\
v_C \\
v_D \\
v_E
\end{bmatrix}
\end{equation}
Or
\begin{equation}\label{eqn:multiphysicsL2:80}
\overline{I}_B = \alpha \overline{V}_B,
\end{equation}
where \(\overline{V}_B\) are the branch voltages, not unknowns of interest directly. We can write
\begin{equation}\label{eqn:multiphysicsL2:100}
\begin{bmatrix}
v_A \\
v_B \\
v_C \\
v_D \\
v_E
\end{bmatrix}
=
\begin{bmatrix}
-1 & & & \\
1 & -1 & & \\
& & 1 & -1 \\
& & & 1 \\
& -1 & &
\end{bmatrix}
\begin{bmatrix}
v_1 \\
v_2 \\
v_3 \\
v_4
\end{bmatrix}
\end{equation}
Observe that this is the transpose of \(A\), allowing us to write
\begin{equation}\label{eqn:multiphysicsL2:120}
\overline{V}_B = A^\T \overline{V}_N.
\end{equation}
Solving
- KCLs: \(A \overline{I}_B = \overline{I}_S\)
- constitutive: \(\overline{I}_B = \alpha \overline{V}_B \Rightarrow \overline{I}_B = \alpha A^\T \overline{V}_N\)
- branch and node voltages: \(\overline{V}_B = A^\T \overline{V}_N\)
In block matrix form, this is
\begin{equation}\label{eqn:multiphysicsL2:140}
\begin{bmatrix}
A & 0 \\
I & -\alpha A^\T
\end{bmatrix}
\begin{bmatrix}
\overline{I}_B \\
\overline{V}_N
\end{bmatrix}
=
\begin{bmatrix}
\overline{I}_S \\
0
\end{bmatrix}.
\end{equation}
Is it square? We see that it is after observing that we have
- \(N-1\) rows in \(A\) , and \(B\) columns.
- \(B\) rows in \(I\).
- \(N-1\) columns.