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.