美しいのか奇妙なのか・・・マンデルブロ集合を可視化した図【Python×matplotlib×ChatGPT】

さて、こんばんわ!今回もPythonで図を描画したいと思います。

前回はまるっこい三角形や四角形を描画しました。
こんな図です。



今回は趣を変えて、マンデルブロ集合です。

マンデルブロ集合、ご存知ですか?私は知りませんでした。

なにやら数学が絡んでいて、ちゃんとした数式があるのですが、私には理解できません。

ということで割り切って、図、のみに着目します。

さて、マンデルブロ集合、こんな図です。

眩しい・・・こんな図があるのですね。

Pythonのコードはこちらです。ChatGPTから情報を得ました。


import numpy as np
import matplotlib.pyplot as plt

def mandelbrot(c, max_iter):
    z = c
    for i in range(max_iter):
        if abs(z) > 2:
            return i
        z = z * z + c
    return max_iter

def create_mandelbrot(width, height, real1, real2, imag1, imag2, max_iter):
    image = np.zeros((height, width))

    for x in range(width):
        for y in range(height):
            zx = np.interp(x, [0, width], [real1, real2])
            zy = np.interp(y, [0, height], [imag1, imag2])
            c = zx + zy * 1j
            color = mandelbrot(c, max_iter)
            image[y, x] = color

    return image

def plot_mandelbrot(image):
    plt.figure(figsize=(8, 8))
    plt.imshow(image, cmap='hot', extent=[-1.5, -1.3, -0.1, 0.1])
    plt.axis('off')
    plt.show()

def main():
    width = 512
    height = 512
    real1 = -1.5  # ズームインしたい範囲の左端の実部
    real2 = -1.3  # ズームインしたい範囲の右端の実部
    imag1 = -0.1  # ズームインしたい範囲の下端の虚部
    imag2 = 0.1   # ズームインしたい範囲の上端の虚部
    max_iter = 500

    image = create_mandelbrot(width, height, real1, real2, imag1, imag2, max_iter)
    plot_mandelbrot(image)

if __name__ == '__main__':
    main()



ここで、マンデルブロ集合の特徴を、ChatGPTに教えてもらいました。

マンデルブロ集合は非常に複雑で美しい幾何学的なパターンを持つことがあります。
可視化には、プログラミングや数値計算の手法が一般的に使用されます。
座標やズームレベルを変更することで、異なる部分を拡大したり、興味深い規則正しいパターンを見つけたりすることができます。
数学的に興味深く、美しい視覚表現が可能になります。



なるほど。
ということで、座標やズームレベルを変更してみました。

# 座標1
x_c1 = -0.743643135
y_c1 = 0.131825963
zoom1 = 0.000014628
max_iter1 = 1000


かなりダイナミックです。


# 座標2
x_c2 = -0.8
y_c2 = 0.156
zoom2 = 0.003
max_iter2 = 1000


なんかかっこいい!と個人的には思いました。

すごいです。

プログラミングでこんな図が描けるのですね。

こうやって色々ためして、自分のお気に入りの図を持つのも良さそうです。