cmath
に思いをはせて
cmath
モジュールの活用例を求めて色々と考えた後、まずはMandelbrot集合を書いてみようと思い立った。
Mandelbrot集合の定義はWikipediaを参照してほしい。
簡単に述べると、ある複素数列が収束する初期値の集合である。
最初は定義をよく確認せず実装してしまいうまくいかず、以下のサイトのお世話になった。 以前からMandelbrot集合の存在は知っていたが定義をきちんと理解したのは今回が初めてかもしれない。
方針として、複素数列が収束するかを判定する函数、float
版range
となるジェネレータを実装し、Mandelbrot集合を計算、matplotlib
で描画、いう流れである。
import cmath import decimal import itertools import matplotlib.pyplot as plt def mandelbrot(c): z = complex(10, 10) for _ in range(1000): z = z**2 + c if abs(z) > 2: return False else: return True def drange(x, y, jump): while x < y: yield float(x) x += decimal.Decimal(jump) xs = [] ys = [] for x, y in itertools.product(drange(-2, 2, 0.01), drange(-2, 2, 0.01)): if mandelbrot(complex(x, y)): xs.append(x) ys.append(y) plt.axis('off') plt.plot(xs, ys, ".", color='k') plt.savefig("mandelbrot.png")
実行結果は以下の通りである。
あまりきれいではない。
解析学っぽいことに触れると、自分の中に位相空間の知識が欠落していることにいやでも気づかされる。 しばらく時間ができそうな気配がするので、位相空間という借金を返済しようかと考えている。