For a couple of years Chebfun has had a command
conformal for computing a conformal map of a smooth simply connected region onto the unit disk, and now there is a companion command
conformal2 for mapping a smooth doubly-connected region onto a circular annulus. The conformal modulus, which is the ratio of the inner to outer radii of the annulus, is determined in the process.
For example, here we map a region $\Omega$ bounded by two ellipses to the annulus $A_\rho$ with $\rho \approx 0.409705$.
circle = chebfun('exp(1i*pi*t)','trig'); ellipse = real(circle) + .6i*imag(circle); C1 = 3*ellipse - 1; C2 = exp(.5i)*ellipse; tic, [f, finv, rho] = conformal2(C1,C2,'plots'); toc rho
Elapsed time is 3.344638 seconds. rho = 0.409705344001635
Here we do it again but to 12-digit accuracy instead of the default 6 digits:
tic, [f, finv, rho] = conformal2(C1,C2,'plots','tol',1e-12); toc rho
Elapsed time is 7.900462 seconds. rho = 0.409705344001634
As with the simply-connected
conformal, the red dots show poles associated with the numerical representations of these maps. The objects
finv are function handles corresponding to AAA rational approximations of the maps from $\Omega$ to $A_\rho$ and from $A_\rho$ to $\Omega$, respectively. The accuracy in much of the domain is actually better than 12 digits, as we verify by mapping the points $1, i$ back and forth:
z = [1 1i]; finv(f(z))
ans = Column 1 1.000000000000036 - 0.000000000000013i Column 2 0.000000000000006 + 0.999999999999992i
These rational representations are fantastically efficient. We can map a million points back and forth in 1 second.
z = 1 + .1*rand(1e6,1) + .1i*rand(1e6,1); tic, finv(f(z)); toc
Elapsed time is 0.515038 seconds.
Here is a wigglier example.
circle = chebfun('exp(1i*pi*t)','trig'); C1 = circle*chebfun('2+.1*cos(8*pi*t)','trig'); C2 = circle*chebfun('1+.1*cos(5*pi*t)','trig'); tic, [f, finv, rho] = conformal2(C1,C2,'plots'); toc rho
Elapsed time is 3.736870 seconds. rho = 0.515907564661642
Here is a "hyperellipse" enclosing a disk. Note how we define the hyperellipse via a level curve of a chebfun2.
F = chebfun2(@(x,y) x.^8 + y.^8); C1 = roots(F-.5); C2 = .5*circle; tic, [f, finv, rho] = conformal2(C1,C2,'plots'); toc rho
Elapsed time is 3.156300 seconds. rho = 0.506114112297563
The algorithm used by
conformal2 consists of solving a Laplace problem (computing a Green's function) by Laurent expansion with least-squares collocation on the boundary, as described in . A key part of this is the use of Vandermonde with Arnoldi orthogonalization , which is available with the Chebfun commands
VAeval. (The latter is actually not needed for this application because the AAA rational functions do the evaluation instead.)
conformal2 are restricted in their applicability to smooth domains. As described in , related algorithms have been developed for regions with corners, but these are not currently available in Chebfun.
 P. D. Brubeck, Y. Nakatsukasa, and L. N. Trefethen, Vandermonde with Arnoldi, SIAM Review 63 (2021), 405-415.
 L. N. Trefethen, Numerical conformal mapping with rational functions, Computational Methods and Function Theory (2020), 1-19.