複素関数を視覚化する
複素関数を視覚化します。
複素数 z=a+bi を用いた複素関数 f(z)において、実部 a、虚部 b に対して偏角 arg z および 絶対値 |r| が決まります。これら4つのパラメータを図示するために実部 a をx軸、虚部 b をy軸とした2次元グラフに、偏角 arg z を対応する色相、絶対値 |r| を対応する明度もしくは彩度でプロットする方法があります。
ここでは絶対値については図示せず偏角を色相表示します。色相はopencvのHSV色空間の色相Hを用い、一周分の偏角に色相0~179を対応させます。
環境
(1) f = z の場合
複素関数 f = z では色相環そのものの角度分布を示します。
aおよびbの範囲は-2.5~2.5としています。
コード
import cmath import math import cv2 import numpy as np width = 500 height = 500 img = np.zeros((height, width, 3), np.uint8) for y in range(width): for x in range(height): a = (x-250)/100 # 実部。-2.5~2.5の範囲 b = (y-250)/100 # 虚部。-2.5~2.5の範囲 z = complex(a, b) f = (z) # 複素関数 size, angle = cmath.polar(f) # 複素関数の大きさ、偏角を取得 h = int(math.degrees(angle+math.pi)/2) #偏角を色相hに変換 color_hsv = np.uint8([[[h ,255, 255]]]) # 求めた色相からhsvカラーを設定(彩度、明度は255) color_bgr = cv2.cvtColor(color_hsv, cv2.COLOR_HSV2BGR) #hsv→bgr変換 b = int(color_bgr[0][0][0]) # bの輝度 g = int(color_bgr[0][0][1]) # gの輝度 r = int(color_bgr[0][0][2]) # rの輝度 img[y, x] = [b, g ,r] #img[y, x]のピクセルを求めたbgrカラーで置き換える cv2.imwrite('complex.png', img)
実行結果
(2) f = z**2 (zの2乗)の場合
複素関数 f = z**2 では色相環の角度の回転が倍になります。
aおよびbの範囲は-2.5~2.5としています。
コード
import cmath import math import cv2 import numpy as np width = 500 height = 500 img = np.zeros((height, width, 3), np.uint8) for y in range(width): for x in range(height): a = (x-250)/100 # 実部。-2.5~2.5の範囲 b = (y-250)/100 # 虚部。-2.5~2.5の範囲 z = complex(a, b) f = (z**2) # 複素関数 size, angle = cmath.polar(f) # 複素関数の大きさ、偏角を取得 h = int(math.degrees(angle+math.pi)/2) #偏角を色相hに変換 color_hsv = np.uint8([[[h ,255, 255]]]) # 求めた色相からhsvカラーを設定(彩度、明度は255) color_bgr = cv2.cvtColor(color_hsv, cv2.COLOR_HSV2BGR) #hsv→bgr変換 b = int(color_bgr[0][0][0]) # bの輝度 g = int(color_bgr[0][0][1]) # gの輝度 r = int(color_bgr[0][0][2]) # rの輝度 img[y, x] = [b, g ,r] #img[y, x]のピクセルを求めたbgrカラーで置き換える cv2.imwrite('complex2.png', img)
実行結果
(3) f = sin(z) の場合
aおよびbの範囲は-2.5~2.5としています。
コード
import cmath import math import cv2 import numpy as np width = 500 height = 500 img = np.zeros((height, width, 3), np.uint8) for y in range(width): for x in range(height): a = (x-250)/100 # 実部。-2.5~2.5の範囲 b = (y-250)/100 # 虚部。-2.5~2.5の範囲 z = complex(a, b) f = (cmath.sin(z)) # 複素関数 size, angle = cmath.polar(f) # 複素関数の大きさ、偏角を取得 h = int(math.degrees(angle+math.pi)/2) #偏角を色相hに変換 color_hsv = np.uint8([[[h ,255, 255]]]) # 求めた色相からhsvカラーを設定(彩度、明度は255) color_bgr = cv2.cvtColor(color_hsv, cv2.COLOR_HSV2BGR) #hsv→bgr変換 b = int(color_bgr[0][0][0]) # bの輝度 g = int(color_bgr[0][0][1]) # gの輝度 r = int(color_bgr[0][0][2]) # rの輝度 img[y, x] = [b, g ,r] #img[y, x]のピクセルを求めたbgrカラーで置き換える cv2.imwrite('complex3.png', img)
実行結果
以下のサイトを参考にさせていただきました
色相と複素関数
定義域の着色『ウィキペディア(Wikipedia)』