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 f and 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 [2]. A key part of this is the use of Vandermonde with Arnoldi orthogonalization [1], which is available with the Chebfun commands VAorthog and VAeval. (The latter is actually not needed for this application because the AAA rational functions do the evaluation instead.)

Both conformal and conformal2 are restricted in their applicability to smooth domains. As described in [2], related algorithms have been developed for regions with corners, but these are not currently available in Chebfun.

[1] P. D. Brubeck, Y. Nakatsukasa, and L. N. Trefethen, Vandermonde with Arnoldi, SIAM Review 63 (2021), 405-415.

[2] L. N. Trefethen, Numerical conformal mapping with rational functions, Computational Methods and Function Theory (2020), 1-19.