# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
# 複素数列の計算回数を出力する関数loopmax
def loopmax(z, c):
# 複素数列の初項
z_next = z
# 最大計算回数
num = 1000
# 計算回数まで計算
for i in range(1, num + 1):
# 発散しない限り
if abs(z_next) <= 2:
# 次の項を計算
z = z_next
z_next = z ** 2 + c
else:
# 発散したら終了
break
# 発散した際の計算回数を返す
return i
# 複素平面上のloopmaxの結果を配列で出力する関数calc_n
def calc_n(x_min, x_max, y_min, y_max, a, b, num):
# 実数軸の座標を等間隔でx_minからx_maxまで定義
x_array = np.linspace(x_min, x_max, num)
# 虚数軸の座標を等間隔でy_minからy_maxまで定義
y_array = np.linspace(y_min, y_max, num)
# 複素平面の定義(複素数なのでdtype=np.complex)
z_array = np.zeros((num, num), dtype=np.complex)
# 各座標でのnを格納する配列
n_array = np.zeros((num, num))
# a, bから定数の複素数cを定義
c = a + b * 1j
# 複素平面座標とその座標における計算回数の格納
for i in range(0, num):
for j in range(0, num):
# 複素平面座標
z_array[j, i] = x_array[i] + y_array[j] * 1j
# 計算回数の配列
n_array[j, i] = loopmax(z_array[j, i], c)
# 計算回数を格納した配列を出力
return n_array
# ジュリア集合を描く関数show_patterns
def show_patterns(U, ax=None):
ax.imshow(U, cmap=plt.cm.hot,
interpolation='bilinear')
ax.set_axis_off()
# メイン関数
if __name__ == "__main__":
# プロットする区間を選択
x_min = -1.5
x_max = 1.5
y_min = -1.5
y_max = 1.5
# 定数項のパラメータ
a = 0.285
b = 0.01
# 複素平面上に定義する各軸の座標の個数
num = 500
# 計算回数の配列を上記のパラメータから出力
n_array = calc_n(x_min, x_max, y_min, y_max, a, b, num)
# プロット
fig, ax = plt.subplots(1, 1, figsize=(8, 8))
show_patterns(n_array, ax=ax)
# 画像の保存
plt.savefig('Julia.png', dpi=1500)