6.4 Python による Jordan 領域の等角写像の計算プログラム

$ \Omega=D_1$ の等角写像を考えよう。$ \Omega $$ D_1$ が等しいので、 $ \Omega $ から $ D_1$ への双正則写像として、 恒等写像 $ \mathrm{id}(z)=z$ が取れるのは自明である。

正規化条件によっては、それ以外のものが得られる。実際、 $ z_0\in\Omega$ として、$ \Omega $ の写像関数 $ \varphi\colon\Omega\to D_1$ のうち、正規化条件

$\displaystyle \varphi(z_0)=0,\quad \varphi'(z_0)>0
$

を満たすものは、実は1次分数変換

(6.5) $\displaystyle \varphi(z)=\frac{z-z_0}{1-\overline{z_0}z}
$

であることが知られている。$ z_0=0$ のとき、 $ \varphi=\mathrm{id}$ となる訳である。


ここでは、前項で説明した天野の方法で $ \Omega $ の近似等角写像を求めて、 真の等角写像 (B.13) と比べてみることにする。

(答えの分かっている問題を解くことによって、 アルゴリズムやプログラムの正しさをチェックする、 というしばしば使われるテクニック。)

天野の方法では、 $ \left\{
\zeta_k\right\}_{k=1}^N$, $ \left\{z_j\right\}_{j=1}^N$ を適切に選ぶ必要があるが、 今の場合は $ \Omega $ は円盤領域であるから、 $ \left\{
\zeta_k\right\}_{k=1}^N$として

$\displaystyle \zeta_k=R \exp\frac{2\pi i k}{N}$   ( $ k=1,\cdots,N$)   ($ R$$ 1$ より大きい数)$\displaystyle ,$

$ \left\{z_j\right\}_{j=1}^N$ として

$\displaystyle z_j= \exp\frac{2\pi i j}{N}$   ( $ j=1,\cdots,N$)$\displaystyle .
$

を採用するのが自然であろう。$ R$ として、とりあえず $ R=2$ で計算してみる。

conformalmap.py

import numpy as np
import matplotlib.pyplot as plt

def amanomap(z,z0,n,Q0,Q,zeta):
    s=Q0
    for k in range(n):
        s += Q[k]*np.log((z-zeta[k])/(z0-zeta[k]))
    return (z-z0) * np.exp(s)

z0=0.6
R=2
N=80
dt=2*np.pi/N
I=1j
thetas=np.linspace(0.0,2.0*np.pi,N,endpoint=False)
zetas=R*np.exp(I*thetas)
zs=np.exp(I*thetas)
a=np.empty((N,N))
for j in (range(N)):
    for k in (range(N)):
        a[j,k]=np.log(abs(zs[j]-zetas[k]))
b=-np.log(abs(zs-z0))
# Qk (k=1,...N) と Q0 を求める
Q=np.linalg.solve(a,b)
Q0=0
for k in (range(N)):
    Q0 += Q[k]*np.log(abs(z0-zetas[k]))

# 計算の方はまあまあだけど、可視化はどうするものかな
plt.clf()
fig=plt.figure()
fig.set_size_inches(5, 5)
plt.axes().set_aspect('equal')
m=20
nr=m
rs=np.linspace(0.0,1.0,nr+1)
nt=4*nr
ts=np.linspace(0.0,2.0*np.pi,nt+1)
#zs=np.empty((nr+1,nt+1),dtype=np.complex128)
ws=np.empty((nr+1,nt+1),dtype=np.complex128)
for i in range(nr+1):
    for j in range(nt+1):
        zs=rs[i]*np.exp(1j*ts[j])
        ws[i,j]=amanomap(zs,z0,N,Q0,Q,zetas)
for i in range(nr+1):
    plt.plot(ws[i,:].real,ws[i,:].imag)
for j in range(nt+1):
    plt.plot(ws[:,j].real,ws[:,j].imag)

plt.show()

conformalmap-v2.py

# conformalmap-v2.py

import numpy as np
import matplotlib.pyplot as plt

def amanomap(z,z0,n,Q0,Q,zeta):
    s = Q0+np.dot(Q,np.log(np.divide(z-zeta,z0-zeta)))
    return (z-z0) * np.exp(s)

z0=0.6
R=2
N=80
I=1j
thetas=np.linspace(0.0,2.0*np.pi,N,endpoint=False)
zetas=R*np.exp(I*thetas)
zs=np.exp(I*thetas)
a=np.empty((N,N))
for j in (range(N)):
    for k in (range(N)):
        a[j,k]=np.log(abs(zs[j]-zetas[k]))
b=-np.log(abs(zs-z0))
# Qk (k=1,...N) と Q0 を求める
Q=np.linalg.solve(a,b)
Q0=np.dot(Q,np.log(abs(z0-zetas)))

# 計算の方はまあまあだけど、可視化はどうするものかな
plt.clf()
fig=plt.figure()
fig.set_size_inches(5, 5)
plt.axes().set_aspect('equal')
m=20
nr=m
rs=np.linspace(0.0,1.0,nr+1)
nt=4*nr
ts=np.linspace(0.0,2.0*np.pi,nt+1)
#zs=np.empty((nr+1,nt+1),dtype=np.complex128)
ws=np.empty((nr+1,nt+1),dtype=np.complex128)
for i in range(nr+1):
    for j in range(nt+1):
        zs=rs[i]*np.exp(1j*ts[j])
        ws[i,j]=amanomap(zs,z0,N,Q0,Q,zetas)
for i in range(nr+1):
    plt.plot(ws[i,:].real,ws[i,:].imag)
for j in range(nt+1):
    plt.plot(ws[:,j].real,ws[:,j].imag)

plt.show()

図 8: 天野の方法による近似等角写像
Image conformalmap_fig



桂田 祐史