\documentclass[nojss]{jss} \usepackage{amsfonts,amsmath,amssymb} %\VignetteIndexEntry{ResistorArray: resistor networks in R} %\VignetteDepends{ResistorArray} %\VignetteKeywords{ResistorArray, resistors} %\VignettePackage{ResistorArray} %% just as usual \author{Robin K. S. Hankin} \title{Resistor networks in R: the ResistorArray package} %\VignetteIndexEntry{ResistorArray: resistor networks in R} %\VignetteDepends{ResistorArray} %\VignetteKeywords{ResistorArray, resistors} %\VignettePackage{ResistorArray} %% for pretty printing and a nice hypersummary also set: %% \Plainauthor{Achim Zeileis, Second Author} %% comma-separated \Plaintitle{Resistor networks in R: the ResistorArray package} %% an abstract and keywords \Abstract{ This paper introduces the \pkg{ResistorArray} package of \proglang{R} routines, for analysis of resistor networks. An earlier version of this vignette was published as~\citet{hankin2006}. } \Keywords{Resistors, Resistor Arrays} \Address{ Robin K. S. Hankin\\ Auckland University of Technology\\ 2-14 Wakefield Street\\ Auckland\\ New Zealand\\ E-mail: \email{hankin.robin@gmail.com} } %% need no \usepackage{Sweave.sty} \SweaveOpts{echo=FALSE} \begin{document} \newcommand{\bu}{\mathbf{u}} \newcommand{\bv}{\mathbf{v}} \newcommand{\bi}{\mathbf{i}} Many elementary physics courses show how resistors combine in series and parallel (Figure~\ref{series_and_parallel}); the equations are \begin{eqnarray} R_\mathrm{series} &=& R_1 + R_2 \label{series}\\ R_\mathrm{parallel} &=& \frac{1}{R_1^{-1} + R_2^{-1}}\label{parallel} \end{eqnarray} However, these rules break down for many systems such as the Wheatstone bridge (Figure~\ref{wheatstone}); the reader who doubts this should attempt to apply equations~\ref{series} and~\ref{parallel} and find the resistance between nodes~1 and~4 in the general case. This paper introduces \pkg{ResistorArray}, an \proglang{R}~\citep{rcore2012} package to determine resistances and other electrical properties of such networks. \begin{figure}[htbp] \begin{center} \includegraphics[width=8cm]{series_and_parallel.pdf} \caption{Two resistors in series (top)\label{series_and_parallel} and parallel (bottom)} \end{center} \end{figure} \begin{figure}[htbp] \begin{center} \includegraphics[width=8cm]{wheatstone.pdf} \caption{The Wheatstone bridge\label{wheatstone}} \end{center} \end{figure} Although this paper uses the language of electrical engineering, the problem considered is clearly very general: many systems are composed of isolated nodes between which some quantity flows and the steady states of such systems are generally of interest. Package \pkg{ResistorArray} has been applied to such diverse problems as the diffusion of nutrients among fungal hyphae networks, the propagation of salinity between (moored) oceanographical buoys, and hydraulic systems such as networks of sewage pumps. The general problem of determining the resistance between two nodes of a resistor network requires matrix techniques. Consider a network of $n$ nodes, with node $i$ connected to node $j$ by a resistor of resistance~$R_{ij}$. Then the network has a ``conductance matrix'' $\mathcal{L}$ with \begin{equation}\label{Ldef} \mathcal{L}_{ij} = \begin{cases} -1/R_{ij} & \mbox{if } i\neq j\\ \sum_{k\neq j}1/R_{kj} & \mbox{if } i =j \end{cases} \end{equation} Thus~$\mathcal{L}$ is a symmetrical matrix, whose row sums and column sums are zero (and is therefore singular). Then the analogue of Ohm's law (viz $V = IR$) would be \begin{equation}\label{matrixeqn} \mathcal{L}\mathbf{v}=\mathbf{i} \end{equation} where~$\mathbf{v} = \left(v_1,\ldots, v_n\right)$ is a vector of potentials and~$\mathbf{i} = \left(i_1,\ldots, i_n\right)$ is a vector of currents; here~$i_p$ is the current flow in to node $p$. Equation~\ref{matrixeqn} is thus a restatement of the fact that charge does not accumulate at any node. Each node of the circuit may either be fed a known current\footnote{This would include a zero current: in the case of the Wheatstone bridge of Figure~\ref{wheatstone}, nodes~2 and 3 have zero current flux so~$i_2$ and~$i_3$ are known and set to zero.} and we have to calculate its potential; or it is maintained at a known potential and we have to calculate the current flux into that node to maintain that potential. There are thus $n$ unknowns altogether. Thus some elements of~$\bv$ and $\bi$ are known and some are unknown. Without loss of generality, we may partition these vectors into known and unknown parts: $\bv^\prime=\left( {\bv^k}^\prime, {\bv^{u\vphantom{k}}}^\prime\right)$ and~$\bi^\prime=\left({\bi^{u\vphantom{k}}}^\prime, {\bi^k}^\prime\right)$. Thus the known elements of $\bv$ are $\bv^k = \left(v_1,\ldots,v_p\right)'$: these would correspond to nodes that are maintained at a specified potential; the other elements $\bv^u =\left(v_{p+1},\ldots,v_n\right)'$ correspond to nodes that are at an unknown potential that we have to calculate. The current vector $\bi$ may similarly be decomposed, but in a conjugate fashion; thus elements $\bi^u = \left(i_1,\ldots,i_p\right)'$ correspond to nodes that require a certain, unknown, current to be fed into them to maintain potentials $\bv^k$; the other elements $\bi^k = \left(i_{p+1},\ldots, i_n\right)'$ would correspond to nodes that have a known current flowing into them and whose potential we seek. Equation~\ref{matrixeqn} may thus be expressed in terms of a suitably partitioned matrix equation: \begin{equation} \left( \begin{array}{cc} \mathbf{A} & \mathbf{B}\\ \mathbf{B}^\prime & \mathbf{C} \end{array} \right)\left( \begin{array}{cc} \bv^k\\\bv^u \end{array} \right)= \left( \begin{array}{cc} \bi^u\\\bi^k \end{array} \right) \end{equation} \noindent where, in R idiom, \verb+ A=L[1:p,1:p]+, \code{B=L[1:p,(p+1):n]}, and \code{C=L[(p+1):n,(p+1):n]}. Straightforward matrix algebra gives \begin{eqnarray} \bv^u = \mathbf{C}^{-1}\left(\bi^k-\mathbf{B}^\prime\bv^k\right)\label{vu}\\ \bi^u = \left(\mathbf{A} -\mathbf{B}\mathbf{C}^{-1}\mathbf{B}^\prime\right)\bv^k + \mathbf{B}\mathbf{C}^{-1}\bi^k\label{iu} \end{eqnarray} Equations~\ref{vu} and~\ref{iu} are implemented by \verb+circuit()+. \section{Package ResistorArray in use} Consider the Wheatstone Bridge, illustrated in Figure~\ref{wheatstone}. Here the resistance between node~1 and node~4 is calculated; all resistances are~$1\,\Omega$ except $R_{34}$, which is~$2\,\Omega$. This resistor array may be viewed as a skeleton tetrahedron, with edge~1 missing. We may thus use function \verb+tetrahedron()+ to generate the conductance matrix; this is <>= require(ResistorArray) @ <>= L <- tetrahedron(c(1, 1, Inf, 1, 1, 2)) @ Observe that \verb+L[1,4]==L[4,1]==0+, as required. The resistance may be determined by function \verb+circuit()+; there are several equivalent methods. Here node~1 is earthed---by setting it to zero volts---and the others are given a floating potential; viz \verb+v=c(0,NA,NA,NA)+. Then one amp is fed in to node~4, zero amps to nodes 2 and 3, and node 1 an unknown current, to be determined; viz \verb+currents=c(NA,0,0,1)+. The node 1-to-node 4 resistance will then be given by the potential at node 4: <>= circuit(L,v=c(0, NA, NA, NA),currents=c(NA, 0, 0, 1)) @ Thus the resistance is about~$1.181818\,\Omega$, comparing well with the theoretical value of $117/99\,\Omega$. Note that the system correctly returns the net current required to maintain node 1 at $0\,V$ as $-1\,A$ (which is clear from conservation of charge). The potential difference between nodes~2 and 3 indicates a nonzero current flow along~$R_{23}$; currents through each resistor are returned by function \verb+circuit()+ if argument \verb+give.internal+ is set to \verb+TRUE+. Package \pkg{ResistorArray} solves a problem that is frequently encountered in electrical engineering: determining the electrical properties of resistor networks. The techniques presented here are applicable to many systems composed of isolated nodes between which some quantity flows; the steady states of such systems generally have an electrical analogue. This paper explicitly presents a vectorized solution method that uses standard numerical techniques, and discusses the corresponding R idiom. \bibliography{resistors} \end{document}