Circuit analysis for novices

This section is for those who want to analyse a circuit using a minimum of circuit theory!

DC voltage divider

To analyse a voltage divider with Lcapy, it is necessary to create a netlist. For example:

>>> from lcapy import Circuit
>>> a = Circuit("""
... V 1 0 6; down=1.5
... R1 1 2 2; right=1.5
... R2 2 0_2 4; down
... W 0 0_2; right""")
>>> a.draw()

Each line of the netlist specifies a component. It has a name and nodes. The latter are usually numbers but can be alphanumeric. The first node is the more positive node. The options after a semicolon are optional but are useful for customising the schematic.

_images/VRR1.png

The voltage at each node (with respect to the ground node 0) can be found using:

>>> a[1].v
6
>>> a[2].v
4

The voltage across each component can be found using:

>>> a.V.v
6
>>> a.R1.v
2
>>> a.R2.v
4

Similarly, the current through each component can be found using:

>>> a.V.i
1
>>> a.R1.i
1
>>> a.R2.i
1

The units can be printed once this feature is enabled, for example:

>>> state.show_units=True
>>> state.abbreviate_units=True
>>> a.R1.i
1.A
>>> a.R1.v
2.V
>>> state.abbreviate_units=False
>>> a.R1.v
2.volt

AC voltage divider steady state response

An AC source can be created using the ac keyword when defining a voltage source. This has a default angular frequency \(\omega_0\).

>>> from lcapy import Circuit
>>> a = Circuit("""
... V 1 0 ac 6; down=1.5
... R 1 2 2; right=1.5
... C 2 0_2 4; down
... W 0 0_2; right""")
>>> a.draw()

Here, V 1 0 ac 6 is shorthand for V 1 0 {6 * cos(omega_0 * t)}.

The response to AC sources is gnarlier compared to DC sources:

>>> a.V.v
6⋅cos(ω₀⋅t)
>>> a.R.v
     2
384⋅ω₀ ⋅cos(ω₀⋅t)   48⋅ω₀⋅sin(ω₀⋅t)
───────────────── - ───────────────
         2                  2
    64⋅ω₀  + 1         64⋅ω₀  + 1

>>> a.R.v.simplify_sin_cos()
   _______________
  ╱        2
╲╱  2304⋅ω₀  + 36 ⋅cos(ω₀⋅t - atan(8⋅ω₀))
─────────────────────────────────────────
                     2
                64⋅ω₀  + 1

The interpretation is much easier using the concept of phasors.

The voltage across R can be plotted, however, it needs a specific value for \(\omega_0\). For example:

>>> a.R.v.subs(omega0, 3).plot((-1, 10))
_images/VRC1plot.png

AC voltage divider step response

A change in amplitude (frequency or phase) of a signal produces a transient response. Here is a netlist with a voltage source that has a step change.

>>> from lcapy import Circuit
>>> a = Circuit("""
... V 1 0 step 6; down=1.5
... R 1 2 2; right=1.5
... C 2 0_2 4; down
... W 0 0_2; right""")
>>> a.draw()

Here, V 1 0 step 6 is shorthand for V 1 0 {6 * u(t)} where u(t) is Heaviside’s unit step.

The transient voltages are:

>>> a.V.v
6⋅u(t)
>>> a.R.v
   -t
   ───
    8
6⋅ℯ   ⋅u(t)
>>> a.C.v
  ⎛       -t ⎞
  ⎜       ───⎟
  ⎜        8 ⎟
3⋅⎝8 - 8⋅ℯ   ⎠⋅u(t)
───────────────────
         4

The voltage across R can be plotted using:

>>> a.R.v.plot((-1, 10))
_images/VRC1stepplot.png