概要
Python の数値計算ライブラリ NumPy を使って、フラクタルであるマンデルブロ集合 (Mandelbrot set) を作成し、画像で可視化する方法を解説します。
マンデルブロ集合
で定義される複素数列 が で無限大に発散しない条件を満たす複素数 全体の集合をマンデルブロ集合 (Mandelbrot set) といい、 で表します。
例:
- のとき、数列 は となり発散するので、マンデルブロ集合に含まれます。
- のとき、数列 は となり発散しないので、マンデルブロ集合に含まれません。
マンデルブロ集合の性質
コンピューターでは、極限 は計算できないため、発散するかどうかをどのように判定するかが問題になります。この問題に以下の定理が活用できます。
証明は以下を参照してください。
この定理により、第 項まで計算した時点で となれば、 はマンデルブロ集合に含まれないと判定できます。
Numpy による実装例
マンデルブロ集合を作成する
先にマンデルブロ集合を作成するコードを示します。
実軸、虚軸の範囲をそれぞれ real_range
、imag_range
で指定します。
複素平面のこの範囲に解像度 resolution
で格子状の点を作成します。

for
内では、複素数列 を計算します。
で数列を更新していきますが、 の場合は発散することは確定しているので、更新を続けた結果、オーバーフローしてしまうのを防ぐために更新を止めます。
また、 を満たす最大の も計算します。 この計算には、True は1、False は0と同値であることを利用し、比較 の結果である bool 値を足していきます。 この情報はマンデルブロ集合を色付きで画像化する際に利用します。
マンデルブロ集合を白黒画像で可視化する
マンデルブロ集合を白黒画像で画像化する例を示します。
である複素数 は、発散していないので黒色 (0)、そうでないなら発散しているので白色 (255) で画像にします。

マンデルブロ集合をカラー画像で可視化する
マンデルブロ集合をカラー画像で画像化する例を示します。
マンデルブロ集合に含まれる点 ( である点 ) の色は、前項と同様に黒色 にします。
発散している点も発散が確定した反復回数によって色を変えます。step / iterations
で の範囲の値にし、matplotlib のカラーマップで色に変換します。

cmap_name
に matplotlib のカラーマップ名を指定し、カラーマップを変更すると、また違った雰囲気の画像が作成できます。

マンデルブロ集合の一部を拡大する
マンデルブロ集合の一部を拡大して描画したい場合は、real_range
、imag_range
の範囲を狭くします。
以下、 の周辺を画像化した例になります。
タツノオトシゴのような模様があるので、sea horse valley (タツノオトシゴの谷) と呼ばれています。

コメント