Pythonを用いた複素関数の可視化

Pythonを用いた複素関数の可視化

複素関数の可視化を行うためのコードをPythonで書いた.
コードを動かすと以下の図が得られる.

# coding: utf-8
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
from numpy import arcsin, array, cos, exp, imag, linspace, pi, real, sin


def generate_cmap(colors):
    """
    カラーマップを作るための関数
    https://qiita.com/kenmatsu4/items/fe8a2f1c34c8d5676df8より引用
    """
    values = range(len(colors))

    vmax = np.ceil(np.max(values))
    color_list = []
    for v, c in zip(values, colors):
        color_list.append((v / vmax, c))
    return LinearSegmentedColormap.from_list('custom_cmap', color_list)

# 色の設定
dark = generate_cmap(["#580145", "#543100", "#525700", "#004229", "#110057",])
middle = generate_cmap(["#e42689", "#f98b24", "#d6da21", "#16da9e", "#5558ff",])
light = generate_cmap(["#f79bcb", "#f4d3b4", "#e8e9ad", "#aaf5de", "#bbbcf0",])

# 複素数とその関数値が入ったリストを用意
im = 1.j
N = 30
R = linspace(-pi/2, pi/2, N)
I = linspace(pi/2, -pi/2, N)
v = linspace(0,1,N)

Z = array([[r+i*im for r in R] for i in I])
F = sin(Z)
G = arcsin(Z)

# プロット
Results = [Z, F, Z, G]
Titles = [
    "$z$", "$f(z)=\sin(z)$", "$w$", "$f^{-1}(w)=\mathrm{arcsin}(w)$"
]
fig, ax = plt.subplots(2, 2, figsize=(8, 8))
for i in range(2):
    for j in range(2):
        n = 2*i+j
        for k in range(N):
            cm = generate_cmap([dark(v[k]), middle(v[k]), light(v[k])])
            ax[i][j].scatter(real(Results[n][k]), imag(Results[n][k]), c=v, cmap=cm)

for r in [pi/4,pi/2,pi/8]:
    z = r*exp(linspace(0,2*pi,100)*im)
    ax[0][0].scatter(real(z), imag(z), s=1.5, c="k")
    ax[0][1].scatter(real(sin(z)), imag(sin(z)), s=1.5, c="k")
    ax[1][0].scatter(real(z), imag(z), s=1.5, c="k")
    ax[1][1].scatter(real(arcsin(z)), imag(arcsin(z)), s=1.5, c="k")

for i in range(2):
    for j in range(2):
        n = 2*i+j
        ax[i][j].set_title(Titles[n])
        ax[i][j].set_aspect(1)

fig.tight_layout()
plt.show()

参考

コメント