
èªç¶ç§åŠã¢ãã«ïŒãã©ã¯ã¿ã«
ãã©ã¯ã¿ã«ã«ã€ããŠ
ãã³ãã«ããã®ãã©ã¯ã¿ã«ã¯ãããã¯ã»ãã³ãã«ããïŒBenoit MandelbrotïŒãšãããã©ã³ã¹ã®æ°åŠè ãåœåãã幟äœåŠã®æŠå¿µã§ãã 圌ã¯ãæ°åŠã«ã€ããŠå³åœ¢ïŒãã©ã¯ã¿ã«å³åœ¢ïŒãçšããŠèŠèŠçã«åé¡ãè§£ããšèšãã¢ãããŒããå®è·µãããããããã©ã¯ã¿ã«ãå°å ¥ããŸããã ãã³ãã«ããã®ãã©ã¯ã¿ã«ã¯ãæ°åŠãç©çåŠãçç©åŠãªã©å€ãã®åéã§å¿çšããããŸããç¹ã«ãèªç¶çã®è€éãªæ§é ããã¿ãŒã³ãçè§£ããããã®ã¢ãã«ãšããŠããã©ã¯ã¿ã«å¹ŸäœåŠã¯åºãå©çšãããŠããŸãããããããCGãéºäŒåå·¥åŠã圢ç¶è§£æãªã©ã®çºå±ã«è²¢ç®ããŠããŸãã
ãã©ã¯ã¿ã«ã¯ãç¹°ãè¿ãã®ãã¿ãŒã³ãæã€è€éãªå¹ŸäœåŠç圢ç¶ã§ããããèªå·±çžäŒŒæ§ïŒå šäœãéšåã«äŒŒãŠããïŒããç¹åŸŽãšããŠããŸãã 圌ã®èšèã«ãããšããç¡éã®äžæè°ã¯ãåçŽãªæ³åãç¹°ãè¿ãçã¿åºãããããã®ãšãã©ã¯ã¿ã«ã«å¯ŸããŠè¿°ã¹ãŠããŸãã ãã³ãã«ããã®ãã©ã¯ã¿ã«ã¯ããã®èªå·±çžäŒŒæ§ãéåžžã«è€éã§çŸããããšã§ç¥ãããŠããŸãã
ãã³ãã«ããéå
ãã³ãã«ããéåã¯ãè€çŽ æ°å¹³é¢äžã®ç¹ãçºæ£ãããã©ããã«ãã£ãŠå®çŸ©ãããŸãã
å
·äœçã«ã¯ã以äžã®æŒžååŒã«åºã¥ããŠè©äŸ¡ãããŸãã

ããã§ãZãšCã¯è€çŽ æ°ã§ãããnã¯0ããå§ãŸãæŽæ°ã§ãã æåã¯ð0=0Z0=0ãšããCã¯è€çŽ æ°å¹³é¢äžã®ç¹ã§ãã
ãã®æŒžååŒãç¹°ãè¿ãé©çšããŠãããšãZã®å€ã¯çºæ£ãããåæããããæ±ºãŸããŸãã
çºæ£ããªãç¹ïŒããªãã¡ã絶察å€ãç¡é倧ã«ãªããªãç¹ïŒããã³ãã«ããéåã®äžéšãšããŸãã
ãã³ãã«ããéåã¯ã以äžã®æé ã§æç»ããããšãã§ããŸãã
è€çŽ æ°å¹³é¢äžã®åç¹Cã«ã€ããŠãäžèšã®æŒžååŒãç¹°ãè¿ãé©çšããŸãã
ç¹Cããã³ãã«ããéåã«å±ãããã©ããã倿ããŸããããã¯ãZã®çµ¶å¯Ÿå€ãããéŸå€ïŒéåžžã¯2ïŒãè¶ ããªãå Žåãåæãšã¿ãªããå±ãããšå€æããŸãããã ããç¹°ãè¿ãåæ°ã«ã¯äžéïŒäŸãã°1000åïŒãèšããŸãã
ãã³ãã«ããéåã«å±ããç¹ã¯é»ã§å¡ããå±ããªãç¹ã¯ãã®çºæ£é床ã«å¿ããŠç°ãªãè²ã§å¡ããŸãã
ãã³ãã«ããéåãæç»ããã«ã¯ãè€çŽ æ°å¹³é¢äžã®åç¹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ïŒãçšããŠçæãããŸãã
åèïŒããããæžç±
