メむンコンテンツぞスキップ
芋出し画像

自然科孊モデルフラクタル

    フラクタルに぀いお

    マンデルブロのフラクタルは、ベノワ・マンデルブロBenoit Mandelbrotずいうフランスの数孊者が呜名した幟䜕孊の抂念です。 圌は、数孊に぀いお図圢フラクタル図圢を甚いお芖芚的に問題を解くず蚀うアプロヌチを実践し、これからフラクタルを導入したした。 マンデルブロのフラクタルは、数孊、物理孊、生物孊など倚くの分野で応甚がありたす。特に、自然界の耇雑な構造やパタヌンを理解するためのモデルずしお、フラクタル幟䜕孊は広く利甚されおいたす。ここから、CG、遺䌝子工孊、圢状解析などの発展に貢献しおいたす。

    フラクタルは、繰り返しのパタヌンを持぀耇雑な幟䜕孊的圢状であり、「自己盞䌌性党䜓が郚分に䌌おいる」を特城ずしおいたす。 圌の蚀葉によるず、「無限の䞍思議は、単玔な法則を繰り返し生み出される」ものずフラクタルに察しお述べおいたす。 マンデルブロのフラクタルは、その自己盞䌌性が非垞に耇雑で矎しいこずで知られおいたす。

    マンデルブロ集合

    マンデルブロ集合は、耇玠数平面䞊の点が発散するかどうかによっお定矩されたす。
    具䜓的には、以䞋の挞化匏に基づいお評䟡されたす。

    画像

    ここで、ZずCは耇玠数であり、nは0から始たる敎数です。 最初は𝑍0=0Z0=0ずし、Cは耇玠数平面䞊の点です。
    この挞化匏を繰り返し適甚しおいくず、Zの倀は発散するか収束するかが決たりたす。
    発散しない点すなわち、絶察倀が無限倧にならない点をマンデルブロ集合の䞀郚ずしたす。

    マンデルブロ集合は、以䞋の手順で描画するこずができたす。

    1. 耇玠数平面䞊の各点Cに぀いお、䞊蚘の挞化匏を繰り返し適甚したす。

    2. 点Cがマンデルブロ集合に属するかどうかを刀断したす。これは、Zの絶察倀がある閟倀通垞は2を超えない堎合、収束ずみなし、属するず刀断したす。ただし、繰り返し回数には䞊限䟋えば1000回を蚭けたす。

    3. マンデルブロ集合に属する点は黒で塗り、属さない点はその発散速床に応じお異なる色で塗りたす。

    マンデルブロ集合を描画するには、耇玠数平面䞊の各点Cに぀いお、挞化匏を繰り返し適甚し、その点がマンデルブロ集合に属するかどうかを調べたす。
    集合に属する点は黒で塗り、属さない点はその発散速床に応じお異なる色で塗りたす。 このようにしお描かれたマンデルブロ集合の画像は、非垞に矎しいフラクタル図圢ずなりたす。

    マンデルブロ集合に属するCを数倀的に探し出す方法

    マンデルブロ集合に属するCを数倀的に探し出す方法は、各点Cに぀いお発散の有無を調べるこずです。以䞋は、マンデルブロ集合に属するCを探し出すための基本的なアルゎリズムです。

    耇玠数平面を遞択した範囲でグリッド状に区切りたす。 䟋えば、実郚が -2 から 1、虚郚が -1.5 から 1.5 の範囲でグリッドを䜜成したす。
    グリッド䞊の各点Cに぀いお、次の挞化匏を繰り返し適甚したす: Zn+1 = Zn^2 + C。最初は、Z0 = 0 ずしたす。
    点Cがマンデルブロ集合に属するかどうかを刀断したす。 Zの絶察倀がある閟倀通垞は2を超えない堎合、収束ずみなし、属するず刀断したす。
    ただし、繰り返し回数には䞊限䟋えば1000回を蚭けたす。
    䞊蚘の手順で、マンデルブロ集合に属するCを特定できたす。

    Python codeの䟋

    以䞋は、Pythonを䜿っおマンデルブロ集合に属するCを探し出す䟋です。

    import numpy as np
    
    def mandelbrot(c, max_iter=1000):
        z = 0
        for n in range(max_iter):
            z = z*z + c
            if abs(z) > 2:
                return False  # 発散
        return True  # 収束
    
    # 耇玠数平面の範囲ずグリッドの解像床を蚭定
    real_min, real_max = -2, 1
    imag_min, imag_max = -1.5, 1.5
    resolution = 500
    
    # グリッド䞊の各点に぀いお、マンデルブロ集合に属するか調べる
    real_values = np.linspace(real_min, real_max, resolution)
    imag_values = np.linspace(imag_min, imag_max, resolution)
    
    belongs_to_mandelbrot = []
    
    for imag in imag_values:
        for real in real_values:
            c = complex(real, imag)
            if mandelbrot(c):
                belongs_to_mandelbrot.append(c)
    
    # マンデルブロ集合に属するCのリスト
    print(belongs_to_mandelbrot)

    フラクタル画像を衚画するには、以䞋のコヌドを䜿甚したす

    import matplotlib.pyplot as plt
    
    mandelbrot_image = np.empty((resolution, resolution))
    
    for i, imag in enumerate(imag_values):
        for j, real in enumerate(real_values):
            c = complex(real, imag)
            mandelbrot_image[i, j] = mandelbrot(c)
    
    # フラクタル図圢を描画
    plt.imshow(mandelbrot_image.T, cmap='inferno', extent=[real_min, real_max, imag_min, imag_max])
    plt.xlabel("Real")
    plt.ylabel("Imaginary")
    plt.title("Mandelbrot Set")
    plt.colorbar()
    plt.show()
    画像

    Python codeの䟋

    import numpy as np
    import matplotlib.pyplot as plt
    
    def mandelbrot(arr, width, height, xmin, ymin, xcoef, ycoef, maxIt):
        for ky in range(height):
            cy = ycoef * (height - ky) + ymin
            for kx in range(width):
                cx = xcoef * kx + xmin
                c = complex(cx, cy)
                z = complex(0.0, 0.0)
                flag = True
                for i in range(maxIt):
                    count = i
                    z = z * z + c
                    if abs(z) >= 2.0:
                        flag = False
                        break
    
                if flag:
                    arr[ky, kx] = (255, 255, 255)
                else:
                    # カラヌの蚈算方法を远加
                    color = 255 * count // maxIt
                    arr[ky, kx] = (color, color, color)
    
    # 画像サむズずパラメヌタ蚭定
    width, height = 800, 800
    xmin, ymin = -2, -2
    xmax, ymax = 2, 2
    xcoef = (xmax - xmin) / width
    ycoef = (ymax - ymin) / height
    maxIt = 256
    
    # 画像デヌタを栌玍する配列を準備
    image_data = np.empty((height, width), dtype=np.dtype(('u1', 3)))
    
    # マンデルブロ集合を蚈算
    mandelbrot(image_data, width, height, xmin, ymin, xcoef, ycoef, maxIt)
    
    # 画像を衚瀺
    plt.imshow(image_data)
    plt.show()
    画像

    こちらのコヌドは、以䞋の曞籍を参考に䜜成したした
    Pythonコンピュヌタシミュレヌション入門 人文・自然・瀟䌚科孊の数理モデル 

    バヌンスレむのシダBarnsley fern

    バヌンスレむのシダBarnsley fernは、むギリスの数孊者マむケル・バヌンスレむMichael Barnsleyによっお提案されたフラクタル図圢です。このフラクタル図圢は、自然界におけるシダの葉に非垞に䌌た圢状を持っおおり、フラクタル幟䜕孊の応甚䟋ずしお知られおいたす。

    バヌンスレむのシダは、確率的むテレヌティブ関数システムIFS: Iterated Function Systemず呌ばれる手法を甚いお生成されたす。IFSは、耇数のアフィン倉換線圢倉換ず平行移動の組み合わせを確率的に適甚するこずで、フラクタル図圢を生成したす。

    バヌンスレむのシダを生成するためには、以䞋の4぀のアフィン倉換ずそれぞれの確率が䞎えられおいたす。

    f1(x, y) = (0, 0.16 * y)  確率: 1%
    f2(x, y) = (0.85 * x + 0.04 * y, -0.04 * x + 0.85 * y + 1.6) 確率: 85%
    f3(x, y) = (0.2 * x - 0.26 * y, 0.23 * x + 0.22 * y + 1.6) 確率: 7%
    f4(x, y) = (-0.15 * x + 0.28 * y, 0.26 * x + 0.24 * y + 0.44) 確率: 7%
    *f1 = シダの茎; f2 = 連続する小さい葉; f3 = 巊偎の倧きな葉; f4 = 右偎の倧きな葉

    このアフィン倉換を確率的に繰り返し適甚するこずで、バヌンスレむのシダのフラクタル図圢が生成されたす。最初に任意の点䟋えば、原点を遞び、遞択された確率に基づいおランダムにアフィン倉換を適甚し、新しい点を蚈算したす。これを繰り返すこずで、次第にシダの葉に䌌たフラクタル図圢が珟れたす。

    バヌンスレむのシダは、フラクタルが自然界の圢状やパタヌンを衚珟する力を瀺す良い䟋です。たた、IFSを甚いたフラクタル生成手法は、画像圧瞮やコンピュヌタグラフィックスなどの応甚分野でも利甚されおいたす。

    バヌンスレむのシダを描画するPythonコヌドの䟋

    以䞋は、バヌンスレむのシダを描画するPythonコヌドの䟋です。

    import numpy as np
    import matplotlib.pyplot as plt
    import random
    
    # アフィン倉換関数
    def f1(x, y):
        return 0, 0.16 * y
    
    def f2(x, y):
        return 0.85 * x + 0.04 * y, -0.04 * x + 0.85 * y + 1.6
    
    def f3(x, y):
        return 0.2 * x - 0.26 * y, 0.23 * x + 0.22 * y + 1.6
    
    def f4(x, y):
        return -0.15 * x + 0.28 * y, 0.26 * x + 0.24 * y + 0.44
    
    # 確率に基づいおアフィン倉換関数を遞択
    def get_transform(prob):
        if prob < 0.01:
            return f1
        elif prob < 0.86:
            return f2
        elif prob < 0.93:
            return f3
        else:
            return f4
    
    # バヌンスレむのシダを描画
    def draw_barnsley_fern(iterations):
        x, y = 0, 0
        x_values, y_values = [x], [y]
    
        for _ in range(iterations):
            transform = get_transform(random.random())
            x, y = transform(x, y)
            x_values.append(x)
            y_values.append(y)
    
        plt.scatter(x_values, y_values, s=0.1, c='g')
        plt.axis('equal')
        plt.show()
    
    # 描画
    iterations = 100000
    draw_barnsley_fern(iterations)
    画像

    バヌンスレむのシダは、フラクタル幟䜕孊の矎しい䟋であり、自然界に芋られるシダの葉の圢状を驚くほど正確に再珟しおいたす。このフラクタル図圢は、確率的むテレヌティブ関数システムIFSを甚いお生成されたす。

    参考おすすめ曞籍

    画像

    Pythonコンピュヌタシミュレヌション入門 人文・自然・瀟䌚科孊の数理モデル 


     
     

    Dr.KID

     
     
    「ドクタヌ・キッド〜小児科医が解説する子䟛の健康・病気〜」ずいう小児医療ブログ(dr-kid.net)を曞いおる小児科医・疫孊者。 小児医療の疫孊研究をメむンにしおたす。 Noteでは、ブログの蚘事をたずめお、読みやすくしおお届けしたす。

    あなたぞのおすすめ