Note
Go to the end to download the full example code or to run this example in your browser via JupyterLite.
The Joukowski map: turning circles into airfoils#
\(J(z) = z + 1/z\) flattens the unit circle onto \([-2, 2]\). A circle through \(z = 1\) that encloses \(-1\) maps to an airfoil with a sharp trailing edge, where \(J'(1) = 0\) and the map stops being conformal. Joukowski used this in 1910 to carry the solvable flow around a cylinder over to a wing profile.
import matplotlib.pyplot as plt
from mathematicskit.complex_analysis import circle_contour, complex_derivative, joukowski_map
Circles and their images#
centers = {"unit circle": 0.0, "shifted left": -0.1, "shifted left and up (airfoil)": -0.1 + 0.15j}
fig, axes = plt.subplots(1, 2, figsize=(11, 4.5))
for name, c in centers.items():
circle = circle_contour(c, abs(1 - c)) # every circle passes through z = 1
z = circle.points(600)
w = joukowski_map(z)
axes[0].plot(z.real, z.imag, label=name)
axes[1].plot(w.real, w.imag, label=name)
axes[0].plot([1, -1], [0, 0], "kx")
for ax, title in zip(axes, ("z-plane", "w = z + 1/z"), strict=False):
ax.set_aspect("equal")
ax.set_title(title)
ax.legend(fontsize=8)
print("J'(1) =", complex_derivative(joukowski_map, 1.0), "(the trailing edge is a critical point)")

J'(1) = 0j (the trailing edge is a critical point)
Total running time of the script: (0 minutes 0.127 seconds)