python打印朱莉娅集合

# -*- 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)

posted @ 2019-01-31 14:54  公众号python学习开发  阅读(263)  评论(0编辑  收藏  举报