# 3. Complex Numbers

The imaginary unit, denoted $i$, is defined as a solution to the quadratic equation

$$z^2 + 1 = 0.$$

In other words, $i = \sqrt{-1}$. As we know, the above equation lacks any real number solutions. For this concept to make sense, we must extend our pre-established notions about what numbers are.

We will let the imaginary unit take part in the usual arithmetic operations of addition and multiplication, treating it as an algebraic quantity that can participate on the same footing as real numbers. It is one of the most profound discoveries of mathematics that this seemingly arbitrary idea gives rise to powerful computational methods with applications in numerous fields.

## Complex algebra

Any complex number $z$ can be written as

$$z = x + i y,$$

where $x$ and $y$ are real numbers that are respectively called the real part and the imaginary part of $z$. The real and imaginary parts are also denoted as $\mathrm{Re}(z)$ and $\mathrm{Im}(z)$, where $\mathrm{Re}$ and $\mathrm{Im}$ can be regarded as functions mapping a complex number to a real number.

The set of complex numbers is denoted by $\mathbb{C}$. We can define algebraic operations on complex numbers (addition, subtraction, products, etc.) by following the usual rules of algebra and setting $i^2 = -1$ whenever it shows up.

 Example Let $z = x + i y$, where $x, y \in \mathbb{R}$. What are the real and imaginary parts of $z^2$?\begin{align}z^2 &= (x+iy)^2 \\&= x^2 + 2x(iy) + (iy)^2 \\&= x^2 - y^2 + 2ixy\end{align}Hence,$$\mathrm{Re}(z^2) = x^2 -y^2, \;\;\; \mathrm{Im}(z^2) = 2xy.$$

We can also perform power operations on complex numbers, with one caveat: for now, we'll only consider integer powers like $z^2$ or $z^{-1} = 1/z$. Non-integer powers, such as $z^{1/3}$, introduce vexatious complications which we'll postpone for now (we will figure out how to deal with them when studying branch points and branch cuts).

Another useful fact: real coefficients (and only real coefficients) can be freely moved into or out of $\textrm{Re}(\cdots)$ and $\textrm{Im}(\cdots)$ operations:

$$\left\{\begin{array}{l}\mathrm{Re}(\alpha z + \beta z') = \alpha \, \mathrm{Re}(z) + \beta\, \mathrm{Re}(z')\\ \mathrm{Im}(\alpha z + \beta z') = \alpha \, \mathrm{Im}(z) + \beta\, \mathrm{Im}(z')\end{array}\right.\qquad\mathrm{for}\;\alpha, \beta \in \mathbb{R}.$$

As a consequence, if we have a complex function of a real variable, the derivative of that function can be calculated from the derivatives of the real and imaginary parts, as shown in the following example:

 Example If $z(t)$ is a complex function of a real input $t$, then $$\mathrm{Re}\left[\frac{dz}{dt}\right] = \frac{d}{dt} \mathrm{Re}\left[z(t)\right], \;\;\textrm{and}\;\;\; \mathrm{Im}\left[\frac{dz}{dt}\right] = \frac{d}{dt} \mathrm{Im}\left[z(t)\right].$$ This can be proven using the definition of the derivative: \begin{align}\mathrm{Re}\left[\frac{dz}{dt}\right] &= \;\; \mathrm{Re}\left[\lim_{\delta t \rightarrow 0} \frac{z(t+\delta t) - z(t)}{\delta t}\right] \\&= \lim_{\delta t \rightarrow 0} \left[\frac{\mathrm{Re}[z(t+\delta t)] - \mathrm{Re}[z(t)]}{\delta t}\right] \\&= \frac{d}{dt} \mathrm{Re}\left[z(t)\right].\end{align} The $\mathrm{Im}[\cdots]$ case works out similarly. Note that the infinitesimal quantity $\delta t$ is real; otherwise, this wouldn't work.

Some examples of manipulating complex numbers in Python are given below.



In :

## Programming note: in Python, complex numbers are
## represented by the notation [x]+[y]j, where x and y
## are numbers.

z = 1.5+0.4j
print('z     = ', z)
print('Re(z) = ', z.real)   # Real part
print('Im(z) = ', z.imag)   # Imaginary part

# You can also write the imaginary unit as 1j:
u = 1j
print('u     = ', u)

## Algebra on complex numbers is handled with the usual notation (+, -, *, etc.):
print('u     = ', u)
print('u + z = ', u + z)
print('u * z = ', u * z)
print('u / z = ', u / z)




z     =  (1.5+0.4j)
Re(z) =  1.5
Im(z) =  0.4
u     =  1j
u     =  1j
u + z =  (1.5+1.4j)
u * z =  (-0.4+1.5j)
u / z =  (0.16597510373443983+0.6224066390041494j)



## Conjugates and Magnitudes

For each complex number $z = x + iy$, its complex conjugate is a complex number whose imaginary part has the sign flipped:

$$z^* = x - i y.$$

Conjugation obeys two important properties:

\begin{aligned}(z_1 + z_2)^* &= z_1^* + z_2^* \\ (z_1 z_2)^* &= z_1^* z_2^*.\end{aligned}
 Example Let us prove that $(z_1 z_2)^* = z_1^* z_2^*$. First, let $z_1 = x_1 + i y_1$ and $z_2 = x_2 + i y_2$. Then,\begin{align}(z_1 z_2)^* &= \left[(x_1+iy_1)(x_2+iy_2)\right]^* \\ &= \left[\left(x_1 x_2 - y_1 y_2\right) + i\left(x_1y_2+y_1x_2\right)\right]^* \\ &= \left(x_1 x_2 - y_1 y_2\right) - i\left(x_1y_2+y_1x_2\right) \\ &= \left(x_1 - i y_1\right)\left(x_2 - i y_2\right) \\&= z_1^* z_2^* \end{align}

For a complex number $z = x + i y$, the magnitude of the complex number is

$$|z| = \sqrt{x^2 + y^2}.$$

This is a non-negative real number. A complex number and its conjugate have the same magnitude: $|z| = |z^*|$. Also, we can show that complex magnitudes have the property

$$|z_1 z_2| = |z_1| \, |z_2|.$$

This property is similar to the "absolute value" operation for real numbers, hence the similar notation.

As a corollary, taking a power of a complex number raises its magnitude by the same power:

$$|z^n| = |z|^n \;\;\;\textrm{for}\;\;n \in \mathbb{Z}.$$


In :

## Here is how to compute magnitudes and conjugates in Python:

z = 1.5+0.4j
print('z = ', z)

## The magnitude operation is handled by the built-in abs function:
print('|z|   = ', abs(z))

## To calculate the conjugate, use the numpy.conj function:
from numpy import conj
print('z^*   = ', conj(z))




z =  (1.5+0.4j)
|z|   =  1.5524174696260025
z^*   =  (1.5-0.4j)



## Euler's formula

Euler's formula is an extremely important result which states that

$$e^{iz} = \cos(z) + i \sin(z).$$

To prove this, recall the definition of the exponential:

$$\exp(z) = 1 + z + \frac{z^2}{2!} + \frac{z^3}{3!} + \frac{z^4}{4!} + \frac{z^5}{5!} + \frac{z^6}{6!} + \cdots$$

Previously, we assumed the input to the exponential to be a real number. But since complex numbers can be added and multiplied using the same rules of algebra as real numbers, we can adopt the same series formula as the definition of the complex exponential, a function that takes complex inputs and gives complex outputs. When the input happens to be real, the complex exponential gives the same result as the original real exponential.

Plugging $iz$ as the input to the complex exponential function gives

\begin{align}\exp(iz) &= 1 + (iz) + \frac{(iz)^2}{2!} + \frac{(iz)^3}{3!} + \frac{(iz)^4}{4!} + \frac{(iz)^5}{5!} + \frac{(iz)^6}{6!} + \cdots \\&= 1 + iz - \frac{z^2}{2!} - i \frac{z^3}{3!} + \frac{z^4}{4!} + i \frac{z^5}{5!} - \frac{z^6}{6!} + \cdots \\& = \left(1 - \frac{z^2}{2!} + \frac{z^4}{4!} - \frac{z^6}{6!} + \cdots\right) + i\left(z - \frac{z^3}{3!} + \frac{z^5}{5!} - \frac{z^7}{7!} + \cdots\right).\end{align}

Now, compare the two terms in parentheses to the series expansions for the cosine and sine functions. We can define the complex cosine and complex sine functions using the corresponding complex series:

\begin{aligned}\cos(z) &= 1 - \frac{z^2}{2!} + \frac{z^4}{4!} - \frac{z^6}{6!} + \cdots \\ \sin(z) &= z - \frac{z^3}{3!} + \frac{z^5}{5!} - \frac{z^7}{7!} + \cdots\end{aligned}

These are perfect matches for the real and imaginary parts of the complex exponential! Hence,

$$e^{iz} = \cos(z) + i \sin(z).$$

One important consequence of Euler's formula is that

$$\left|e^{i\theta}\right| = \sqrt{\cos^2(\theta) + \sin^2(\theta)} = 1 \qquad \mathrm{for}\; \theta \in \mathbb{R}.$$

Another consequence is that

$$e^{i\pi} = -1,$$

which is a formula that relates two transcendental constants $e = 2.7182818285\dots$ and $\pi = 3.141592654\dots$, by means of the imaginary unit. (We saw a different relationship between these two constants when solving the Gaussian integral.)



In :

## Note: the 'exp' function from Numpy can handle complex numbers.
from numpy import exp, sin, cos
theta = 0.75
print('theta        = ', theta)
print('exp(i*theta) = ', exp(1j*theta))
print('cos(theta)   = ', cos(theta))
print('sin(theta)   = ', sin(theta))




theta        =  0.75
exp(i*theta) =  (0.7316888688738209+0.6816387600233341j)
cos(theta)   =  0.7316888688738209
sin(theta)   =  0.6816387600233341



## The complex plane

A convenient way to conceptualize a complex number is to think of it as a point on a two-dimensional plane, called the complex plane. The real and imaginary parts are the horizontal and vertical Cartesian coordinates in the plane. The horizontal ($x$) and vertical ($y$) coordinate axes are called the "real axis" and the "imaginary axis", respectively.

### Polar representation

If we think of a complex number as a point on the complex plane, its position can also be represented using polar coordinates instead of Cartesian coordinates. For a complex number $z = x + i y$, we can introduce polar coordinates $r$ and $\theta$ (both real numbers), such that

$$r = \sqrt{x^2 + y^2}, \;\;\; \theta = \tan^{-1}(y/x).$$

Conversely,

$$x = r\cos\theta, \;\;\; y = r\sin\theta.$$

These are the usual formulas for performing a change of coordinate between two-dimensional Cartesian coordinates and polar coordinates, as shown below. The radial coordinate is the magnitude of the complex number: $r = |z|$. The azimuthal coordinate $\theta$ is called the argument of the complex number, which is also denoted by $\mathrm{arg}(z)$.

Note, by the way, that the complex zero, $z = 0$, has zero magnitude and undefined argument.

Using Euler's formula, we can write

\begin{align}z &= r\cos(\theta) + i r\sin(\theta)\\&= r \left[\cos(\theta) + i \sin(\theta)\right] \\&= r \, e^{i\theta}.\end{align}

Therefore, whenever we can manipulate a complex number into a form $A e^{iB}$, where $A$ and $B$ are real numbers, then $A$ is the magnitude and $B$ is the argument. This is used in the following example:

 Example For $z \in \mathbb{C}$, it can be shown that the magnitude and argument of $\exp(z)$ are:$$\displaystyle\left|\exp(z)\right| = e^{\mathrm{Re}(z)}, \quad \mathrm{arg}\left[\exp(z)\right] = \mathrm{Im}(z).$$Proof: Let $z = x + i y$, where $x, y \in \mathbb{R}$; then $$e^{z} = e^{x + i y} = e^x \, e^{iy}.$$ By inspection, the magnitude of this complex number is $e^x$, and its argument is $y$.


In :

## Verify the above example numerically:
from scipy import exp, angle

z = 1.5+0.4j
print('z           = ', z)
print('|exp(z)|    = ', abs(exp(z)))
print('exp[Re(z)]  = ', exp(z.real))
print('arg[exp(z)] = ', angle(exp(z)))
print('Im(z)]      = ', z.imag)




z           =  (1.5+0.4j)
|exp(z)|    =  4.48168907034
exp[Re(z)]  =  4.48168907034
arg[exp(z)] =  0.4
Im(z)]      =  0.4



### Geometrical interpretation of complex operations

Using the complex plane, we can give useful geometric interpretations to the basic operations on complex numbers:

• Addition of two complex numbers can be interpreted as the addition of two coordinate vectors. If $z_1 = x_1 + i y_1$ and $z_2 = x_2 + i y_2$, then $$z_1 + z_2 = \left(x_1 + x_2\right) + i\left(y_1 + y_2\right).$$ Hence, the point corresponding to $z_1 + z_2$ is obtained by adding the two coordinate vectors corresponding to $z_1$ and $z_2$. From this, we can geometrically prove a useful inequality relation between complex numbers, called the "triangle inequality": $$|z_1 + z_2| \le |z_1| + |z_2|.$$
• Complex multiplication can be interpreted as a scaling together with a rotation. If $z_1 = r_1e^{i\theta_1}$ and $z_2 = r_2e^{i\theta_2}$, then $$z_1 z_2 = \left(r_1 r_2\right) \,\exp[i(\theta_1 + \theta_2)].$$ Hence, the point corresponding to $z_1 \, z_2$ is obtained by scaling the $z_1$ coordinate vector by a factor of $|z_2|$, and rotating it by an angle of $\theta_2$ around the origin. In particular, multiplication by $e^{i\theta}$ is equivalent to a rotation by angle $\theta$.
• Complex conjugation is equivalent to reflection about the real axis. It moves a point from the upper half of the complex plane to the lower half, or vice versa.

### Complex numbers have no ordering

One consequence of the fact that complex numbers reside in a two-dimensional plane is that inequality relations are undefined for complex numbers. This is one important difference between complex and real numbers.

Real numbers can be ordered, meaning that for any two real numbers $a$ and $b$, one and only one of the following is true:

$$a < b \;\; \mathrm{OR} \;\; a = b \;\; \mathrm{OR}\;\; a > b.$$

In geometrical terms, these ordering relations exist because the real numbers reside along a one-dimensional line.

But since complex numbers lie in a two-dimensional plane, it is nonsensical to write something like $z_1 < z_2$, where $z_1$ and $z_2$ are complex numbers. (It is, however, valid to write $|z_1| < |z_2|$, since magnitudes are real.)

## Complex functions

When deriving Euler's formula, we introduced complex functions that were defined by taking real mathematical functions, like the exponential, and making them accept complex number inputs. Let us take a closer look at how these complex functions behave.

### Complex trigonometric functions

The complex sine and cosine functions are defined using the same series expansions as the real cosine and sine functions, except that the inputs $z$ are allowed to be complex:

$$\left\{\begin{array}{l}\displaystyle\sin(z) = z - \frac{z^3}{3!} + \frac{z^5}{5!} - \frac{z^7}{7!} + \cdots\\ \displaystyle\cos(z) = 1 - \frac{z^2}{2!} + \frac{z^4}{4!} - \frac{z^6}{6!} + \cdots,\end{array}\right.\quad\quad z\in \mathbb{C}$$

It is important to note that the outputs of the complex trigonometric functions are complex numbers too.

Some familiar properties of the real trigonometric functions do not apply to the complex versions. For instance, $|\sin(z)|$ and $|\cos(z)|$ are not bounded by 1 when $z$ is not real, as shown in the following example:



In :

from numpy import sin
abs(sin(1j)) # It's larger than one!




Out:

1.1752011936438014



We can also write the complex cosine and sine functions in terms of the exponential:

\begin{aligned}\cos(z) &= \;\;\frac{1}{2}\left(e^{iz} + e^{-iz}\right) \\ \sin(z) &= -\frac{i}{2}\left(e^{iz} - e^{-iz}\right).\end{aligned}

This is often a convenient step when solving integrals, as shown in the following example.

 Example Consider the real integral$$I = \int_0^\infty dx \; e^{- x} \, \cos(x).$$One way to solve this is to use integration by parts, but another way is to use the complex expansion of the cosine function:\begin{align}I &= \int_0^\infty dx \; e^{- x} \,\frac{1}{2}\, \left[e^{ix} + e^{-ix}\right] \\ &= \frac{1}{2} \int_0^\infty dx \; \left[e^{(-1+i)x} + e^{(-1-i)x}\right] \\ &= \frac{1}{2} \left[ \frac{e^{(-1+i) x}}{-1+i} + \frac{e^{(-1 - i) x}}{-1 - i}\right]_0^\infty \\ &= -\frac{1}{2} \left(\frac{1}{-1+i} + \frac{1}{-1 - i}\right) \\ &= \frac{1}{2}.\end{align}

### Complex trigonometric identities

Euler's formula provides a convenient way to deal with trigonometric functions. Consider the addition formulas

\begin{align}\sin(z_1 + z_2) &= \sin(z_1) \cos(z_2) + \cos(z_1)\sin(z_2) \\ \cos(z_1 + z_2) &= \cos(z_1) \cos(z_2) - \sin(z_1)\sin(z_2).\end{align}

As discussed previously, the standard proofs for these formulas are geometric: you draw a figure, and solve a bunch of relations between the angles and sides of the various triangles, making use of the Pythagorean formula. But using the Euler formula, we can prove these algebraically. For example,

\begin{align}\cos(z_1)\cos(z_2) &= \frac{1}{4}\left(e^{iz_1} + e^{-iz_1}\right) \left(e^{iz_2} + e^{-iz_1}\right)\\&= \frac{1}{4}\left[e^{i(z_1+z_2)} + e^{i(-z_1 + z_2)} + e^{i(z_1 -z_2)} + e^{-i(z_1+z_2)}\right] \\ \sin(z_1)\sin(z_2) &= -\frac{1}{4}\left(e^{iz_1} - e^{-iz_1}\right) \left(e^{iz_2} - e^{-iz_1}\right) \\ &= -\frac{1}{4}\left[e^{i(z_1+z_2)} - e^{i(-z_1 + z_2)} - e^{i(z_1 -z_2)} + e^{-i(z_1+z_2)}\right].\end{align}

Thus,

$$\cos(z_1) \cos(z_2) - \sin(z_1)\sin(z_2) = \frac{1}{2}\left[e^{i(z_1+z_2)} + e^{-i(z_1+z_2)}\right] = \cos(z_1 + z_2).$$

As a bonus, these addition formulas now hold for complex inputs as well, not just real inputs.

### Hyperbolic functions

Euler's formula also provides us with a link between the trionometric and hyperbolic functions. From the definition of the hyperbolic functions:

$$\sinh(z) = \frac{1}{2}\left(e^{z} - e^{-z}\right), \quad\; \cosh(z) = \frac{1}{2}\left(e^{z} + e^{-z}\right)$$

Compare this to the following formulas for the complex trigonometric functions:

$$\sin(z) = -\frac{i}{2}\left(e^{iz} - e^{-iz}\right), \;\;\; \cos(z) = \;\;\frac{1}{2}\left(e^{iz} + e^{-iz}\right)$$

From this, we can see that the trigonometric and hyperbolic functions are related by

\begin{aligned}\sin(z) &= -i \sinh(iz), \quad \cos(z) = \cosh(iz) \\ \sinh(z) &= -i \sin(iz), \quad \cosh(z) = \cos(iz)\end{aligned}

Using these relations, we can relate the addition formulas for trignometric formulas to the addition formulas for hyperbolic functions, e.g.

\begin{align}\cosh(z_1+z_2) &= \cos(iz_1 + iz_2) \\ &= \cos(iz_1)\cos(iz_2) - \sin(iz_1)\sin(iz_2) \\&= \cosh(z_1)\cosh(z_2) + \sinh(z_1)\sinh(z_2).\end{align}


In :

## Note: Python's trigonometric and hyperbolic functions accept
## complex inputs, and handle them correctly.  For example,
from numpy import sin, sinh

z = 1.5+0.2j
val1 = sin(z)
val2 = -1j * sinh(1j*z)

print('sin(z)      = {}'.format(val1))
print('-i sinh(iz) = {}'.format(val2))




sin(z)      = (1.0175114747314913+0.014241945414718512j)
-i sinh(iz) = (1.0175114747314913+0.014241945414718512j)



## Trajectories in the complex plane

If we have a function $z(t)$ which takes a real input $t$ and outputs a complex number $z$, it is often useful to plot a curve in the complex plane called the "parametric trajectory" of $z$. Each point on this curve indicates the value of $z$ for a particular value of $t$. We will give a few examples below.

First, consider

$$z(t) = e^{i\omega t}, \quad \omega \in \mathbb{R}.$$

The trajectory is a circle in the complex plane, centered at the origin and with radius 1. To see why, observe that the function has the form $z(t) = r(t)\,e^{i\theta(t)}$, which has magnitude $r(t) = 1$, and argument $\theta(t) = \omega t$ varying proportionally with $t$. If $\omega$ is positive, the argument increases with $t$, so the trajectory is counter-clockwise. If $\omega$ is negative, the trajectory is clockwise.



In :

## Plot the complex plane trajectory of z(t) = exp(i omega t)
%matplotlib inline
from ipywidgets import interact, FloatSlider
from numpy import linspace, sin, cos, pi, exp
import matplotlib.pyplot as plt

def plot_circle(t, omega):
plt.figure(figsize=(10,5))
plt.axes().set_aspect('equal', 'datalim')

phi = linspace(-pi, pi, 50)
plt.plot(cos(phi), sin(phi), color="grey")  # Plot unit circle as a guide to the eye.

z = exp(1j * omega * t)
plt.plot(z.real, z.imag, 'o', color="red", linewidth=4)
plt.ylim(-1.2, 1.2)
plt.xlabel('Re(z)'); plt.ylabel('Im(z)');
plt.show()

interact(plot_circle,
t     = FloatSlider(min=-5., max=5., step=0.2, value=0.),
omega = FloatSlider(min=-2., max=2., step=0.2, value=1.));




var element = $('#98342ec3-e85a-490d-b3bb-78a3955e39fd'); {"model_id": "929110fcb27047998be1456a5c9a2802", "version_major": 2, "version_minor": 0}  Next, consider $$z(t) = e^{(\gamma + i \omega) t},$$ where$\gamma,\omega \in \mathbb{R}.$For$\gamma = 0$, this reduces to the previous example. For$\gamma \ne 0$, the trajectory is a spiral. To see this, we again observe that this function can be written in the form $$z(t) = r(t) \;e^{i\theta(t)},$$ where$r(t) = e^{\gamma t}$and$\theta = \omega t.$The argument varies proportionally with$t$, so the trajectory loops around the origin. The magnitude increases with$t$if$\gamma$is positive, and decreases with$t$if$\gamma$is negative. Thus, for instance, if$\gamma$and$\omega$are both positive, then the trajectory is an anticlockwise spiral moving outwards from the origin. Try checking how the trajectory behaves when the signs of$\gamma$and/or$\omega$are flipping.  In : ## Plot the above complex plane trajectory %matplotlib inline from ipywidgets import interact, FloatSlider from numpy import linspace, exp, sin, cos, pi import matplotlib.pyplot as plt def plot_spiral(t,omega, gamma): plt.figure(figsize=(10,5)) plt.axes().set_aspect('equal') ## Plot the point z at the specific t z = exp((gamma + 1j * omega) * t) plt.plot(z.real, z.imag, 'o', color="red", linewidth=4) ## Plot the trajectory over a range of t, as a guide to the eye t1 = linspace(-30, 30, 1000); z1 = exp((gamma + 1j * omega) * t1) plt.plot(z1.real, z1.imag, color="grey") plt.ylim(-5., 5.) plt.xlabel('Re(z)'); plt.ylabel('Im(z)') plt.show() interact(plot_spiral, t = FloatSlider(min=-6.0, max=6.0, step=0.1, value=0.0), omega = FloatSlider(min=-2.0, max=2.0, step=0.2, value=1.0), gamma = FloatSlider(min=-0.3, max=0.3, step=0.05, value=0.1));   var element =$('#a8bb695b-4888-40d3-b977-536a580a9635');

{"model_id": "ff14505f8fa54639be6ab047e1b8f912", "version_major": 2, "version_minor": 0}



Finally, consider

$$z(t) = \frac{1}{t + ib}, \quad b \in \mathbb{R}.$$

This trajectory is a circle which passes through the origin, as shown below. The center of the circle is located at $z_0 = -i/(2b)$. Showing this requires a bit of ingenuity, and is left as an exercise. This is an example of something called a Möbius transformation.



In :

## Plot the above complex plane trajectory
%matplotlib inline
from ipywidgets import interact, FloatSlider
from numpy import linspace, exp, sin, cos, pi
import matplotlib.pyplot as plt

def plot_moebius(t, b):
rlim = 4.0
plt.figure(figsize=(10,5))
plt.axes().set_aspect('equal')
if abs(b) > 1e-6: # Avoid errors for b = 0
z = 1./(t + 1j * b)
plt.plot(z.real, z.imag, 'o', color="#e20000", linewidth=4)
## Plot overall trajectory via Mobius transform (see Exercises)
phi = linspace(-pi, pi, 40)
z0 = -0.5j/b*(1 + exp(1j*phi))
plt.plot(z0.real, z0.imag, color="#a2a2a2", linewidth=2)
## Plot guides to the eye, axis labels, etc.
plt.plot([-rlim, rlim], [0., 0.], "--", color="grey")
plt.plot([0., 0.], [-rlim, rlim], "--", color="grey")
plt.xlabel('Re(z)'); plt.xlim(-rlim, rlim)
plt.ylabel('Im(z)'); plt.ylim(-rlim, rlim)
plt.show()

interact(plot_moebius,
t = FloatSlider(min=-5., max=5.0, step=0.1, value=0.0),
b = FloatSlider(min=-1.6, max=1.6, step=0.1, value=0.5));