Pythonでジュリア集合を描画!条件変更で動画にしてみた

  • このエントリーをはてなブックマークに追加

複素力学系で有名な図にマンデルブロ集合がありますが、同じ漸化式を異なる条件で計算するとジュリア集合を計算する事が出来ます。ここでは、Pythonによるジュリア集合を描画し、さらに変数を連続的に変化させた場合で動画にする方法を紹介します。

こんにちは。wat(@watlablog)です。マンデルブロ集合の次はジュリア集合を描画してみます

ジュリア集合とマンデルブロ集合の関係

漸化式はマンデルブロ集合と同じ

ジュリア集合の説明をする前に、まずはマンデルブロ集合をおさらいしてみましょう。

マンデルブロ集合とは、以下の漸化式を初期値\(z_{0}=0\)、複素数\(c\)に複素平面上の座標を代入した条件下で反復計算を行って収束するか発散するかを調べ、結果をプロットして出来る図です。

\[
z_{n+1}=z_{n}^{2}+c
\]

マンデルブロ集合を描画すると、以下のように非常に不思議な図を得ることが出来ます。

マンデルブロ集合の例

マンデルブロ集合は拡大して見ていくとフラクタル図形の世界を旅することが出来ます。詳しくは「Pythonで描くマンデルブロ集合!フラクタルの旅を体感してみる」の記事をご覧下さい。

ジュリア集合の条件

一方、ジュリア集合もマンデルブロ集合と同じ上記の漸化式を使います。先ほどは\(z_{0}=0\)として\(c\)を変動させていましたが、ジュリア集合をプロットするためにはその逆に\(c\)を固定して\(z_{0}\)に複素平面上の座標を代入させます。

詳細は本ページの後半に載せるプログラムコードを参照下さい。

ちなみにジュリア集合を計算すると、以下のような図を得ることが出来ます。

ジュリア集合(Julia set):a=-0.8, b=0.15

それでは早速プログラムを書いてみましょう。

Pythonでジュリア集合を描画するコード

Advertisements

固定変数で単一のジュリア集合を描く

まずは基本の描画として、複素数の実部(コードではa)と虚部(コードではb)を1つだけ設定してジュリア集合を描画するプログラムを以下に示します。

プログラムはほぼマンデルブロ集合の時と同じなので、詳しい説明は先の記事のコード部分をご確認下さい。

また、このプログラムはnumbaをimportしてJIT(Just In Time compile)を使って高速化しています。高速化を行うと僕の環境では約1[s]ほどで計算が終了しますが、JITを使わないと数十倍の計算時間になってしまいます。

numbaについては「NumbaのJITでPythonを高速化したら40倍も速くなった」に詳細を書きましたのでご確認下さい。

上記コードを実行すると以下の図を得ます。これがジュリア集合です。

ジュリア集合:a=-0.8, b=0.15

cの実部と虚部を少し変更すると、また違った図を得ますので、是非色々試してみて下さい!

ジュリア集合:a=-0.7, b=0.3

変動変数で動画用の連続画像を作成する

ジュリア集合はcの値を変化させることで様々な模様の変化をします。
このことから「実部と虚部の値を連続的に少しずつ変化させたらどうなるのか?」という興味が湧いてきたので、プログラムで表現してみます。

以下のコードはジュリア集合計算部分をforループで囲み、変数を少しずつ変化させながらプロットを画像として保存していくプログラムです。
(動画化はフリーソフトを使ってやった方が簡単だったのでPythonでは実装していません)

これだけの計算量をこなせるのは、numbaのおかげ。

上記コードを実行すると50枚ほどの画像が生成されます。その画像をフリーソフトでまとめたものが以下のGIF動画です。

全体的に時計回りに回転しながら、まるで花が咲いて散り、また咲くような面白い動きを観測することが出来ました!

まとめ

本記事ではマンデルブロ集合の親戚であるジュリア集合を紹介し、Pythonプログラムで描画する方法を紹介しました。

また、ジュリア集合は条件によって模様を変える特徴を持つため、プログラム内で連続的に値を変化させた時の挙動を観測することを行ってみました。
結果、その模様変化は連続的で大変美しいものと確認出来ました。

変数の取り方によってはまだ見ぬ模様になる可能性も多くあり、さらにグラフの範囲(コード内のhとv)を変更して拡大していくとさらなるフラクタル図形を確認できると思います。

是非本コードを使って遊んでみて下さい!

マンデルブロ集合も面白かったけど、ジュリア集合はさらに変化に富んでいて興味深かったです!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

SNSでもご購読できます。

コメントを残す

*