This module contains the methods required to perform an AC analysis.


Typically, the user does not need to call the functions in this module directly, instead, we recommend defining an AC analysis object through the convenience method ahkab.ahkab.new_ac() and then running it calling ahkab.ahkab.run().

Overview of AC simulations

The AC simulation problem

Our AC analysis problem can be written as:

\[MNA\ x + AC(\omega )\ x + J x + N_{ac}(\omega) = 0\]

We need:

  1. the Modified Nodal Analysis matrix \(MNA\),
  2. the \(AC\) matrix, holding the frequency dependent parts,
  3. \(J\), the Jacobian matrix from the linearized non-linear elements,
  4. \(N_{ac}\), the AC sources contribution.

An Operating Point (OP) has to be computed first if there is any non-linear device in the circuit to perform the linearization.

When all the matrices are available, it is possible to solve the system for the frequency values specified by the user, providing the resulting matrix is not singular (and possibly well conditioned).

Building the AC matrix

It’s easy to set up the voltage lines, since line 2 refers to node 2, etc...

A capacitor between two example nodes n1 and n2 introduces the following elements:

\[ \begin{align}\begin{aligned}\mathrm{(KCL\ node\ n1)}\qquad +j\omega C\ V(n1) - j\omega C V(n2) + ... = ...\\\mathrm{(KCL\ node\ n2)}\qquad -j\omega C\ V(n1) + j\omega C V(n2) + ... = ...\end{aligned}\end{align} \]

Inductors generate, together with voltage sources, Current-Controlled Voltage sources (CCVS), Voltage-Controlled Voltage Sources (VCVS), an additional line in the \(MNA\) matrix, and hence in \(AC\) too. In fact, the current flowing through the device gets added to the unknowns vector, \(x\).

For example, in the case of an inductors, we have:

\[\mathrm{(KVL\ over\ n1\ and\ n2)}\qquad V(n1) - V(n2) - j\omega L\ I(\mathrm{inductor}) = 0\]

To understand on which line is the KVL line for an inductor, we use the order of the elements in ahkab.circuit:

  • first are assembled all the voltage rows,
  • then the current rows, in the same order in which the elements that introduce them are found in ahkab.circuit.Circuit.


For each angular frequency \(\omega\), the simulator solves the matrix equation described.

Since the equation is linear, solving is performed with a single matrix inversion and multiplication for each step.

Module reference

ac_analysis(circ, start, points, stop, sweep_type=None, x0=None, mna=None, AC=None, Nac=None, J=None, outfile=u'stdout', verbose=3)[source]

Performs an AC analysis.


circ : Circuit instance
The circuit to be simulated.
start : float
The start frequency for the AC analysis, in Hz.
points : float,
The number of points to be used to discretize the [start, stop] interval.
stop : float
The stop frequency, in Hz.
sweep_type : string, optional
Either options.ac_log_step (ie 'LOG') or options.ac_lin_step (ie 'LIN'), defaults to options.ac_log_step, resulting in a logarithmic sweep.
x0 : OP results instance, optional
The linearization point. If not set, it will be computed running an OP analysis.
mna, AC, Nax, J : ndarrays, optional
The matrices to perform the analysis. They will be computed if not supplied.
outfile : string, optional
The name of the file where the results will be written. The suffix '.ac' is automatically added at the end of the string to prevent different analyses from overwriting each-other’s results. Set to 'stdout' to write to the standard output. If unset, or set to None, defaults to the standard output.
verbose : int, optional
The verbosity level, from 0 (silent) to 6 (debug).


ACresult : AC solution
The AC analysis results.
  • ValueError – if the parameters are out of their valid range.
  • RuntimeError – if the circuit is non-linear and can’t be linearized.